changeset 251:75091bfc577b libavcodec

fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
author michaelni
date Fri, 22 Feb 2002 19:19:01 +0000
parents 3449316664b5
children ddb1a0e94cf4
files h263dec.c mpegvideo.c msmpeg4.c
diffstat 3 files changed, 16 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/h263dec.c	Fri Feb 22 03:35:41 2002 +0000
+++ b/h263dec.c	Fri Feb 22 19:19:01 2002 +0000
@@ -214,7 +214,7 @@
         }
     }
     
-    if (s->h263_msmpeg4)
+    if (s->h263_msmpeg4 && s->pict_type==I_TYPE)
         if(msmpeg4_decode_ext_header(s, buf_size) < 0) return -1;
 
     MPV_frame_end(s);
--- a/mpegvideo.c	Fri Feb 22 03:35:41 2002 +0000
+++ b/mpegvideo.c	Fri Feb 22 19:19:01 2002 +0000
@@ -1128,7 +1128,7 @@
         }
     }
     
-    if (s->h263_msmpeg4) 
+    if (s->h263_msmpeg4 && s->pict_type == I_TYPE)
         msmpeg4_encode_ext_header(s);
 
     //if (s->gob_number)
--- a/msmpeg4.c	Fri Feb 22 03:35:41 2002 +0000
+++ b/msmpeg4.c	Fri Feb 22 19:19:01 2002 +0000
@@ -21,6 +21,7 @@
 #include "common.h"
 #include "dsputil.h"
 #include "mpegvideo.h"
+#include "avcodec.h"
 
 /*
  * You can also call this codec : MPEG4 with a twist ! 
@@ -212,23 +213,14 @@
 
 void msmpeg4_encode_ext_header(MpegEncContext * s)
 {
-    if(s->pict_type == P_TYPE)
-    {
-	return; // P-Frames dont seem to have them and not even a 0 bit
-    }
-    else
-    {
         s->flipflop_rounding=1;
-        s->bitrate= 910;
+        s->bitrate= 910; // FIXME
 
-	put_bits(&s->pb, 1, 1); // ext header indicator
-
-	put_bits(&s->pb, 4, 7); // ?
+        put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29
 
 	put_bits(&s->pb, 11, s->bitrate);
 
 	put_bits(&s->pb, 1, s->flipflop_rounding);
-    }
 }
 
 /* predict coded block */
@@ -748,33 +740,23 @@
 
 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
 {
-    int firstBit=0;
-    
     /* the alt_bitstream reader could read over the end so we need to check it */
-    if(get_bits_count(&s->gb) < buf_size*8) firstBit= get_bits1(&s->gb);
-    
-    if(s->pict_type == P_TYPE)
+    if(get_bits_count(&s->gb) + 16 < buf_size*8)
     {
-        if(firstBit) return -1; // havnt seen ext headers in P-Frames yet ;)
+        int fps;
+
+        fps= get_bits(&s->gb, 5);
+        s->bitrate= get_bits(&s->gb, 11);
+        s->flipflop_rounding= get_bits1(&s->gb);
+
+//        printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bitrate, s->flipflop_rounding);
     }
     else
     {
-        int unk;
-	if(!firstBit) // no header found
-	{
-	    s->flipflop_rounding= 0;
-	    s->bitrate= 0;
-	    return 0;
-	}
-	
-	unk= get_bits(&s->gb, 4);
-	s->bitrate= get_bits(&s->gb, 11);
-	
-//	printf("%2d %4d ;; %1X\n", unk,s->bitrate, unk);
-    
-	s->flipflop_rounding= get_bits1(&s->gb);
+        s->flipflop_rounding= 0;
+        s->bitrate= 0;
     }
-    
+
     return 0;
 }