diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2011-08-13 11:32:10 +0200 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2011-08-16 23:07:25 +0200 |
commit | 4f00519d9508e07aac58a00a9b514dae8ad95723 (patch) | |
tree | 389556b9ed992e87d2c6bcc0b59a181d72bb242a /libavcodec/vc1.c | |
parent | 86ca51acb089e74d9b86dfbb25dce2c6b3568047 (diff) | |
download | ffmpeg-4f00519d9508e07aac58a00a9b514dae8ad95723.tar.gz |
Fix VC-1 width/height handling.
avcodec_set_dimensions should be used for size changes to ensure
compatibility with future changes.
avctx->width/avctx->height may not be set to display-only dimensions.
Even more so since vc1dec.c would later set coded_width/height based
on this.
coded_width/coded_height should be used instead of width/height for
decoder setup.
This fixes playback of e.g. zz-mcr-nsqr.vc1 sample (containing
display width/height settings) in MPlayer and should fix a crash
with MPC: http://forum.doom9.org/showthread.php?t=162221.
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
Diffstat (limited to 'libavcodec/vc1.c')
-rw-r--r-- | libavcodec/vc1.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index 41cc1c8d21..3cb556c3d4 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -388,8 +388,9 @@ int vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitConte v->finterpflag = get_bits1(gb); //common if (v->res_sprite) { - v->s.avctx->width = v->s.avctx->coded_width = get_bits(gb, 11); - v->s.avctx->height = v->s.avctx->coded_height = get_bits(gb, 11); + int w = get_bits(gb, 11); + int h = get_bits(gb, 11); + avcodec_set_dimensions(v->s.avctx, w, h); skip_bits(gb, 5); //frame rate v->res_x8 = get_bits1(gb); if (get_bits1(gb)) { // something to do with DC VLC selection @@ -426,6 +427,7 @@ int vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitConte static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) { + int w, h; v->res_rtm_flag = 1; v->level = get_bits(gb, 3); if(v->level >= 5) @@ -446,18 +448,17 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) v->bitrtq_postproc = get_bits(gb, 5); //common v->postprocflag = get_bits1(gb); //common - v->s.avctx->coded_width = (get_bits(gb, 12) + 1) << 1; - v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1; - v->s.avctx->width = v->s.avctx->coded_width; - v->s.avctx->height = v->s.avctx->coded_height; + w = (get_bits(gb, 12) + 1) << 1; + h = (get_bits(gb, 12) + 1) << 1; + avcodec_set_dimensions(v->s.avctx, w, h); v->broadcast = get_bits1(gb); v->interlace = get_bits1(gb); v->tfcntrflag = get_bits1(gb); v->finterpflag = get_bits1(gb); skip_bits1(gb); // reserved - v->s.h_edge_pos = v->s.avctx->coded_width; - v->s.v_edge_pos = v->s.avctx->coded_height; + v->s.h_edge_pos = w; + v->s.v_edge_pos = h; av_log(v->s.avctx, AV_LOG_DEBUG, "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n" @@ -475,11 +476,12 @@ static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb) } v->s.max_b_frames = v->s.avctx->max_b_frames = 7; if(get_bits1(gb)) { //Display Info - decoding is not affected by it - int w, h, ar = 0; + int dw, dh, ar = 0; av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n"); - v->s.avctx->width = w = get_bits(gb, 14) + 1; - v->s.avctx->height = h = get_bits(gb, 14) + 1; - av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", w, h); + dw = get_bits(gb, 14) + 1; + dh = get_bits(gb, 14) + 1; + v->s.avctx->sample_aspect_ratio = av_div_q((AVRational){dw, dh}, (AVRational){w, h}); + av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", dw, dh); if(get_bits1(gb)) ar = get_bits(gb, 4); if(ar && ar < 14){ @@ -551,8 +553,9 @@ int vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext * } if(get_bits1(gb)){ - avctx->coded_width = (get_bits(gb, 12)+1)<<1; - avctx->coded_height = (get_bits(gb, 12)+1)<<1; + int w = (get_bits(gb, 12)+1)<<1; + int h = (get_bits(gb, 12)+1)<<1; + avcodec_set_dimensions(avctx, w, h); } if(v->extended_mv) v->extended_dmv = get_bits1(gb); |