diff options
author | Matthieu Castet <castet.matthieu@free.fr> | 2005-11-13 20:06:31 +0000 |
---|---|---|
committer | Alex Beregszaszi <alex@rtfs.hu> | 2005-11-13 20:06:31 +0000 |
commit | 2da2ba037a129757f985232f54fe139cfe9e79b5 (patch) | |
tree | bc9afadb1202ec22a8bc19671336e944873b2a9d | |
parent | 7146d2c267766797083c794b70032642f8526fe3 (diff) | |
download | ffmpeg-2da2ba037a129757f985232f54fe139cfe9e79b5.tar.gz |
Correctly skip unknown matrices (patch by Matthieu Castet) and disable comment reading
Originally committed as revision 4704 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/vp3.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index dbf8c4d510..80ab5a239e 100644 --- a/libavcodec/vp3.c +++ b/libavcodec/vp3.c @@ -63,7 +63,7 @@ #define KEYFRAMES_ONLY 0 -#define DEBUG_VP3 0 +#define DEBUG_VP3 1 #define DEBUG_INIT 0 #define DEBUG_DEQUANTIZERS 0 #define DEBUG_BLOCK_CODING 0 @@ -2780,7 +2780,7 @@ static int theora_decode_comments(AVCodecContext *avctx, GetBitContext gb) static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb) { Vp3DecodeContext *s = avctx->priv_data; - int i, n; + int i, n, matrices; if (s->theora >= 0x030200) { n = get_bits(&gb, 3); @@ -2806,12 +2806,12 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb) s->coded_dc_scale_factor[i] = get_bits(&gb, n); if (s->theora >= 0x030200) - n = get_bits(&gb, 9) + 1; + matrices = get_bits(&gb, 9) + 1; else - n = 3; - if (n != 3) { - av_log(avctx,AV_LOG_ERROR, "unsupported nbms : %d\n", n); - return -1; + matrices = 3; + if (matrices != 3) { + av_log(avctx,AV_LOG_ERROR, "unsupported matrices: %d\n", matrices); +// return -1; } /* y coeffs */ for (i = 0; i < 64; i++) @@ -2825,7 +2825,12 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb) for (i = 0; i < 64; i++) s->coded_inter_dequant[i] = get_bits(&gb, 8); - /* Huffman tables */ + /* skip unknown matrices */ + n = matrices - 3; + while(n--) + for (i = 0; i < 64; i++) + skip_bits(&gb, 8); + for (i = 0; i <= 1; i++) { for (n = 0; n <= 2; n++) { int newqr; @@ -2839,17 +2844,20 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb) } else { int qi = 0; - skip_bits(&gb, av_log2(2)+1); + skip_bits(&gb, av_log2(matrices-1)+1); while (qi < 63) { qi += get_bits(&gb, av_log2(63-qi)+1) + 1; - skip_bits(&gb, av_log2(2)+1); + skip_bits(&gb, av_log2(matrices-1)+1); } - if (qi > 63) + if (qi > 63) { av_log(avctx, AV_LOG_ERROR, "invalid qi %d > 63\n", qi); + return -1; + } } } } + /* Huffman tables */ for (s->hti = 0; s->hti < 80; s->hti++) { s->entries = 0; s->huff_code_size = 1; @@ -2907,7 +2915,8 @@ static int theora_decode_init(AVCodecContext *avctx) theora_decode_header(avctx, gb); break; case 0x81: - theora_decode_comments(avctx, gb); +// FIXME: is this needed? it breaks sometimes +// theora_decode_comments(avctx, gb); break; case 0x82: theora_decode_tables(avctx, gb); |