On 06/07/2011 07:49 AM, Ronald S. Bultje wrote:
My apologies. I was wondering if this triggers for all vc1 files, or
just wvp2/wmvp ones (this is where read_sequence_header sets size,
IIRC). Alternatively, maybe we can compare w/h before and after
read_sequence_header so we don't needlessly reinitialize (it is quite
heavy, so prefer to prevent it if not necessary).
But the idea of the patch is good, I'm OK with applying it with the
above reoslved.
read_sequence_header is called in all cases through vc1_decode_init. In all cases, it is pulling the sequence header
information out of extradata which must be initialized by the caller before doing avcodec_open. I have only tested the
vc1/wvc1/wvp2 path, but it's obvious by inspecting the code that it is always called.
Here's an updated patch that only re-initializes if w/h changes.
diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
index 5c931b1..186610e 100644
--- a/libavcodec/vc1dec.c
+++ b/libavcodec/vc1dec.c
@@ -3398,7 +3398,7 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx)
VC1Context *v = avctx->priv_data;
MpegEncContext *s = &v->s;
GetBitContext gb;
- int i;
+ int i, cur_width, cur_height;
if (!avctx->extradata_size || !avctx->extradata) return -1;
if (!(avctx->flags & CODEC_FLAG_GRAY))
@@ -3419,8 +3419,8 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx)
if (vc1_init_common(v) < 0) return -1;
ff_vc1dsp_init(&v->vc1dsp);
- avctx->coded_width = avctx->width;
- avctx->coded_height = avctx->height;
+ cur_width = avctx->coded_width = avctx->width;
+ cur_height = avctx->coded_height = avctx->height;
if (avctx->codec_id == CODEC_ID_WMV3)
{
int count = 0;
@@ -3491,6 +3491,19 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx)
}
v->res_sprite = (avctx->codec_tag == MKTAG('W','V','P','2'));
}
+ // Sequence header information may not have been parsed
+ // yet when ff_msmpeg4_decode_init was called the fist time
+ // above. If sequence information changes, we need to call
+ // it again.
+ if (cur_width != avctx->width ||
+ cur_height != avctx->height) {
+ MPV_common_end(s);
+ if(ff_msmpeg4_decode_init(avctx) < 0)
+ return -1;
+ avctx->coded_width = avctx->width;
+ avctx->coded_height = avctx->height;
+ }
+
avctx->profile = v->profile;
if (v->profile == PROFILE_ADVANCED)
avctx->level = v->level;
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel