summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthieu Castet <castet.matthieu@free.fr>2005-11-13 20:06:31 +0000
committerAlex Beregszaszi <alex@rtfs.hu>2005-11-13 20:06:31 +0000
commit2da2ba037a129757f985232f54fe139cfe9e79b5 (patch)
treebc9afadb1202ec22a8bc19671336e944873b2a9d
parent7146d2c267766797083c794b70032642f8526fe3 (diff)
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.c33
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);