diff h263.c @ 161:7ce36cf13055 libavcodec

- Added support to Inter4V+Q MBs to H.263 decoder. - Advanced Prediction Mode activated for H.263 decoder. - Bug fixed on H.263+ header parsing for UFEP. - Now we can decode VIVO v1 streams :)
author pulento
date Sat, 17 Nov 2001 21:14:54 +0000
parents 3c3449bce692
children de80712db90b
line wrap: on
line diff
--- a/h263.c	Sat Nov 17 15:43:04 2001 +0000
+++ b/h263.c	Sat Nov 17 21:14:54 2001 +0000
@@ -750,7 +750,7 @@
         init_vlc(&intra_MCBPC_vlc, 6, 8, 
                  intra_MCBPC_bits, 1, 1,
                  intra_MCBPC_code, 1, 1);
-        init_vlc(&inter_MCBPC_vlc, 9, 20, 
+        init_vlc(&inter_MCBPC_vlc, 9, 25, 
                  inter_MCBPC_bits, 1, 1,
                  inter_MCBPC_code, 1, 1);
         init_vlc(&cbpy_vlc, 6, 16,
@@ -825,6 +825,10 @@
         //fprintf(stderr, "\tCBPC: %d", cbpc);
         if (cbpc < 0)
             return -1;
+        if (cbpc > 20)
+            cbpc+=3;
+        else if (cbpc == 20)
+            fprintf(stderr, "Stuffing !");
         
         dquant = cbpc & 8;
         s->mb_intra = ((cbpc & 4) != 0);
@@ -1223,14 +1227,16 @@
         
     format = get_bits(&s->gb, 3);
 
-    if (format != 7) {
+    if (format != 7 && format != 6) {
         s->h263_plus = 0;
         /* H.263v1 */
         width = h263_format[format][0];
         height = h263_format[format][1];
         if (!width)
             return -1;
-
+        
+        s->width = width;
+        s->height = height;
         s->pict_type = I_TYPE + get_bits1(&s->gb);
 
         s->unrestricted_mv = get_bits1(&s->gb); 
@@ -1238,27 +1244,36 @@
 
         if (get_bits1(&s->gb) != 0)
             return -1;	/* SAC: off */
-        if (get_bits1(&s->gb) != 0)
-            return -1;	/* advanced prediction mode: off */
+        if (get_bits1(&s->gb) != 0) {
+            s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
+        }   
+        
         if (get_bits1(&s->gb) != 0)
             return -1;	/* not PB frame */
 
         s->qscale = get_bits(&s->gb, 5);
         skip_bits1(&s->gb);	/* Continuous Presence Multipoint mode: off */
     } else {
-        s->h263_plus = 1;
+        int ufep;
+        
         /* H.263v2 */
-        /* OPPTYPE */
-     
-        if (get_bits(&s->gb, 3) != 1) /* Update Full Extended PTYPE */
+        s->h263_plus = 1;
+        ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
+        
+        if (ufep == 1) {
+            /* OPPTYPE */       
+            format = get_bits(&s->gb, 3);
+            skip_bits(&s->gb,1); /* Custom PCF */
+            s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
+            skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
+            if (get_bits1(&s->gb) != 0) {
+                s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
+            }
+            skip_bits(&s->gb, 8);
+            skip_bits(&s->gb, 3); /* Reserved */
+        } else if (ufep != 0)
             return -1;
-        format = get_bits(&s->gb, 3);
-                
-        skip_bits(&s->gb,1); /* Custom PCF */
-        s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
-        skip_bits(&s->gb, 10);
-        skip_bits(&s->gb, 3); /* Reserved */
-        
+            
         /* MPPTYPE */
         s->pict_type = get_bits(&s->gb, 3) + 1;
         if (s->pict_type != I_TYPE &&
@@ -1267,26 +1282,28 @@
         skip_bits(&s->gb, 7);
         
         /* Get the picture dimensions */
-        if (format == 6) {
-            /* Custom Picture Format (CPFMT) */
-            skip_bits(&s->gb, 4); /* aspect ratio */
-            width = (get_bits(&s->gb, 9) + 1) * 4;
-            skip_bits1(&s->gb);
-            height = get_bits(&s->gb, 9) * 4;
+        if (ufep) {
+            if (format == 6) {
+                /* Custom Picture Format (CPFMT) */
+                skip_bits(&s->gb, 4); /* aspect ratio */
+                width = (get_bits(&s->gb, 9) + 1) * 4;
+                skip_bits1(&s->gb);
+                height = get_bits(&s->gb, 9) * 4;
 #ifdef DEBUG 
-            fprintf(stderr,"\nH.263+ Custom picture: %dx%d\n",width,height);
+                fprintf(stderr,"\nH.263+ Custom picture: %dx%d\n",width,height);
 #endif            
-        }
-        else {
-            width = h263_format[format][0];
-            height = h263_format[format][1];
-        }
-        
-        if ((width == 0) || (height == 0))
-            return -1;
-            
-        if (s->umvplus_dec) {
-            skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
+            }
+            else {
+                width = h263_format[format][0];
+                height = h263_format[format][1];
+            }
+            if ((width == 0) || (height == 0))
+                return -1;
+            s->width = width;
+            s->height = height;
+            if (s->umvplus_dec) {
+                skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
+            }
         }
             
         s->qscale = get_bits(&s->gb, 5);
@@ -1296,9 +1313,6 @@
         skip_bits(&s->gb, 8);
     }
     s->f_code = 1;
-    s->width = width;
-    s->height = height;
-    
     return 0;
 }