changeset 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 1bf8c111691d
children de80712db90b
files h263.c h263data.h h263dec.c
diffstat 3 files changed, 61 insertions(+), 41 deletions(-) [+]
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;
 }
 
--- a/h263data.h	Sat Nov 17 15:43:04 2001 +0000
+++ b/h263data.h	Sat Nov 17 21:14:54 2001 +0000
@@ -4,20 +4,24 @@
 static const UINT8 intra_MCBPC_bits[8] = { 1, 3, 3, 3, 4, 6, 6, 6 };
 
 /* inter MCBPC, mb_type = (inter), (intra), (interq), (intraq), (inter4v) */
-/* Changed the tables for interq, following the standard ** Juanjo ** */
-static const UINT8 inter_MCBPC_code[20] = { 
+/* Changed the tables for interq and inter4v+q, following the standard ** Juanjo ** */
+static const UINT8 inter_MCBPC_code[25] = { 
     1, 3, 2, 5, 
     3, 4, 3, 3, 
     3, 7, 6, 5,
     4, 4, 3, 2,
     2, 5, 4, 5,
+    1, /* Stuffing */
+    2, 12, 14, 15,
 };
-static const UINT8 inter_MCBPC_bits[20] = { 
+static const UINT8 inter_MCBPC_bits[25] = { 
     1, 4, 4, 6, 
     5, 8, 8, 7,
     3, 7, 7, 9,
     6, 9, 9, 9,
     3, 7, 7, 8,
+    9, /* Stuffing */
+    11, 13, 13, 13,
 };
 
 /* This is the old table 
--- a/h263dec.c	Sat Nov 17 15:43:04 2001 +0000
+++ b/h263dec.c	Sat Nov 17 21:14:54 2001 +0000
@@ -163,8 +163,10 @@
                 if (msmpeg4_decode_mb(s, s->block) < 0)
                     return -1;
             } else {
-                if (h263_decode_mb(s, s->block) < 0)
+                if (h263_decode_mb(s, s->block) < 0) {
+                    fprintf(stderr,"\nError at MB: %d\n", (s->mb_y * s->mb_width) + s->mb_x);
                     return -1;
+                }
             }
             MPV_decode_mb(s, s->block);
         }