changeset 647:22b22723805e libavcodec

support decoding of the last mpeg "packet" even if no startcode is immedeatly afterwards (fixes bugs with mpeg in avi) new behavior is only activated if CODEC_FLAG_NOT_TRUNCATED is set
author michaelni
date Fri, 06 Sep 2002 22:30:16 +0000
parents f87dc45d921d
children dddcff6841f2
files avcodec.h mpeg12.c
diffstat 2 files changed, 15 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/avcodec.h	Thu Sep 05 13:23:11 2002 +0000
+++ b/avcodec.h	Fri Sep 06 22:30:16 2002 +0000
@@ -119,6 +119,7 @@
 #define CODEC_FLAG_GRAY  0x2000  /* only decode/encode grayscale */
 #define CODEC_FLAG_EMU_EDGE 0x4000/* dont draw edges */
 #define CODEC_FLAG_DR1    0x8000 /* dr1 */
+#define CODEC_FLAG_NOT_TRUNCATED  0x00010000 /* input bitstream is not truncated, except before a startcode */
 /* codec capabilities */
 
 /* decoder can use draw_horiz_band callback */
--- a/mpeg12.c	Thu Sep 05 13:23:11 2002 +0000
+++ b/mpeg12.c	Fri Sep 06 22:30:16 2002 +0000
@@ -584,7 +584,7 @@
 static VLC mb_btype_vlc;
 static VLC mb_pat_vlc;
 
-void mpeg1_init_vlc(MpegEncContext *s)
+static void init_vlcs(MpegEncContext *s)
 {
     static int done = 0;
 
@@ -1260,6 +1260,7 @@
     
     s->mpeg_enc_ctx.flags= avctx->flags;
     common_init(&s->mpeg_enc_ctx);
+    init_vlcs(&s->mpeg_enc_ctx);
 
     s->header_state = 0xff;
     s->mpeg_enc_ctx_allocated = 0;
@@ -1468,7 +1469,7 @@
 
     start_code = (start_code - 1) & 0xff;
     if (start_code >= s->mb_height){
-        fprintf(stderr, "slice below image\n");
+        fprintf(stderr, "slice below image (%d >= %d)\n", start_code, s->mb_height);
         return -1;
     }
     s->last_dc[0] = 1 << (7 + s->intra_dc_precision);
@@ -1590,7 +1591,6 @@
         
         if (MPV_common_init(s) < 0)
             return -1;
-        mpeg1_init_vlc(s);
         s1->mpeg_enc_ctx_allocated = 1;
     }
 
@@ -1711,7 +1711,17 @@
         } else {
             memcpy(s->buf_ptr, buf_start, len);
             s->buf_ptr += len;
-            
+            if(   (s2->flags&CODEC_FLAG_NOT_TRUNCATED) && (!start_code_found) 
+               && s->buf_ptr+4<s->buffer+s->buffer_size){
+                start_code_found= 1;
+                code= 0x1FF;
+                s->header_state=0xFF;
+                s->buf_ptr[0]=0;
+                s->buf_ptr[1]=0;
+                s->buf_ptr[2]=1;
+                s->buf_ptr[3]=0xFF;
+                s->buf_ptr+=4;
+            }
             if (start_code_found) {
                 /* prepare data for next start code */
                 input_size = s->buf_ptr - s->buffer;