Mercurial > libavcodec.hg
changeset 4935:b34f448e1a12 libavcodec
fix display of theora videos with visible size smaller than encoded size
author | aurel |
---|---|
date | Mon, 07 May 2007 15:43:01 +0000 |
parents | feba7e1adac5 |
children | 2e400c0e99f6 |
files | vp3.c |
diffstat | 1 files changed, 9 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/vp3.c Mon May 07 13:29:02 2007 +0000 +++ b/vp3.c Mon May 07 15:43:01 2007 +0000 @@ -2371,6 +2371,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb) { Vp3DecodeContext *s = avctx->priv_data; + int visible_width, visible_height; s->theora = get_bits_long(gb, 24); av_log(avctx, AV_LOG_INFO, "Theora bitstream version %X\n", s->theora); @@ -2399,15 +2400,10 @@ skip_bits(gb, 32); /* total number of blocks in a frame */ skip_bits(gb, 4); /* total number of blocks in a frame */ skip_bits(gb, 32); /* total number of macroblocks in a frame */ - - skip_bits(gb, 24); /* frame width */ - skip_bits(gb, 24); /* frame height */ } - else - { - skip_bits(gb, 24); /* frame width */ - skip_bits(gb, 24); /* frame height */ - } + + visible_width = get_bits_long(gb, 24); + visible_height = get_bits_long(gb, 24); if (s->theora >= 0x030200) { skip_bits(gb, 8); /* offset x */ @@ -2438,8 +2434,11 @@ // align_get_bits(gb); - avctx->width = s->width; - avctx->height = s->height; + if ( visible_width <= s->width && visible_width > s->width-16 + && visible_height <= s->height && visible_height > s->height-16) + avcodec_set_dimensions(avctx, visible_width, visible_height); + else + avcodec_set_dimensions(avctx, s->width, s->height); return 0; }