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;
 }