Mercurial > libavcodec.hg
changeset 2678:44abbda868c5 libavcodec
fix theora header parsing
patch by Matthieu Castet <castet dot matthieu at free dot fr>
author | mru |
---|---|
date | Fri, 13 May 2005 21:06:44 +0000 |
parents | 7b7613020f2c |
children | edd8e513376c |
files | vp3.c |
diffstat | 1 files changed, 34 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/vp3.c Fri May 13 21:04:16 2005 +0000 +++ b/vp3.c Fri May 13 21:06:44 2005 +0000 @@ -2641,7 +2641,7 @@ skip_bits(&gb, 1); s->last_quality_index = s->quality_index; s->quality_index = get_bits(&gb, 6); - if (s->theora >= 0x030300) + if (s->theora >= 0x030200) skip_bits1(&gb); if (s->avctx->debug & FF_DEBUG_PICT_INFO) @@ -2810,9 +2810,9 @@ /* FIXME: endianess? */ s->theora = (major << 16) | (minor << 8) | micro; - /* 3.3.0 aka alpha3 has the same frame orientation as original vp3 */ + /* 3.2.0 aka alpha3 has the same frame orientation as original vp3 */ /* but previous versions have the image flipped relative to vp3 */ - if (s->theora < 0x030300) + if (s->theora < 0x030200) { s->flipped_image = 1; av_log(avctx, AV_LOG_DEBUG, "Old (<alpha3) Theora bitstream, flipped image\n"); @@ -2837,14 +2837,14 @@ skip_bits(&gb, 24); /* aspect numerator */ skip_bits(&gb, 24); /* aspect denumerator */ - if (s->theora < 0x030300) + if (s->theora < 0x030200) skip_bits(&gb, 5); /* keyframe frequency force */ skip_bits(&gb, 8); /* colorspace */ skip_bits(&gb, 24); /* bitrate */ skip_bits(&gb, 6); /* last(?) quality index */ - if (s->theora >= 0x030300) + if (s->theora >= 0x030200) { skip_bits(&gb, 5); /* keyframe frequency force */ skip_bits(&gb, 5); /* spare bits */ @@ -2855,8 +2855,6 @@ avctx->width = s->width; avctx->height = s->height; - vp3_decode_init(avctx); - return 0; } @@ -2885,16 +2883,39 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb) { Vp3DecodeContext *s = avctx->priv_data; - int i; + int i, n; + + if (s->theora >= 0x030200) { + n = get_bits(&gb, 3); + /* loop filter table */ + for (i = 0; i < 64; i++) + skip_bits(&gb, n); + } + if (s->theora >= 0x030200) + n = get_bits(&gb, 4) + 1; + else + n = 16; /* quality threshold table */ for (i = 0; i < 64; i++) - s->coded_ac_scale_factor[i] = get_bits(&gb, 16); - + s->coded_ac_scale_factor[i] = get_bits(&gb, n); + + if (s->theora >= 0x030200) + n = get_bits(&gb, 4) + 1; + else + n = 16; /* dc scale factor table */ for (i = 0; i < 64; i++) - s->coded_dc_scale_factor[i] = get_bits(&gb, 16); - + s->coded_dc_scale_factor[i] = get_bits(&gb, n); + + if (s->theora >= 0x030200) + n = get_bits(&gb, 9) + 1; + else + n = 3; + if (n != 3) { + av_log(NULL,AV_LOG_ERROR, "unsupported nbms : %d\n", n); + return -1; + } /* y coeffs */ for (i = 0; i < 64; i++) s->coded_intra_y_dequant[i] = get_bits(&gb, 8); @@ -2946,7 +2967,6 @@ { case 0x80: theora_decode_header(avctx, gb); - vp3_decode_init(avctx); break; case 0x81: theora_decode_comments(avctx, gb); @@ -2957,6 +2977,7 @@ } } + vp3_decode_init(avctx); return 0; }