diff h263dec.c @ 1278:483db104bb7b libavcodec

truncated h263 decoding support / H263-ES "demuxer"
author michaelni
date Thu, 22 May 2003 14:12:22 +0000
parents ad21a7b2349b
children 6e039762d5cb
line wrap: on
line diff
--- a/h263dec.c	Wed May 21 17:50:57 2003 +0000
+++ b/h263dec.c	Thu May 22 14:12:22 2003 +0000
@@ -341,6 +341,42 @@
     return END_NOT_FOUND;
 }
 
+static int h263_find_frame_end(MpegEncContext *s, uint8_t *buf, int buf_size){
+    ParseContext *pc= &s->parse_context;
+    int vop_found, i;
+    uint32_t state;
+    
+    vop_found= pc->frame_start_found;
+    state= pc->state;
+    
+    i=0;
+    if(!vop_found){
+        for(i=0; i<buf_size; i++){
+            state= (state<<8) | buf[i];
+            if(state>>(32-22) == 0x20){
+                i++;
+                vop_found=1;
+                break;
+            }
+        }
+    }
+
+    if(vop_found){    
+      for(; i<buf_size; i++){
+        state= (state<<8) | buf[i];
+        if(state>>(32-22) == 0x20){
+            pc->frame_start_found=0;
+            pc->state=-1; 
+            return i-3;
+        }
+      }
+    }
+    pc->frame_start_found= vop_found;
+    pc->state= state;
+    
+    return END_NOT_FOUND;
+}
+
 /**
  * draws an line from (ex, ey) -> (sx, sy).
  * @param w width of the image
@@ -440,6 +476,8 @@
         
         if(s->codec_id==CODEC_ID_MPEG4){
             next= mpeg4_find_frame_end(s, buf, buf_size);
+        }else if(s->codec_id==CODEC_ID_H263){
+            next= h263_find_frame_end(s, buf, buf_size);
         }else{
             fprintf(stderr, "this codec doesnt support truncated bitstreams\n");
             return -1;
@@ -753,6 +791,7 @@
 #ifdef PRINT_FRAME_TIME
 printf("%Ld\n", rdtsc()-time);
 #endif
+
     return get_consumed_bytes(s, buf_size);
 }
 
@@ -784,7 +823,7 @@
     NULL,
     ff_h263_decode_end,
     ff_h263_decode_frame,
-    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
+    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
 };
 
 AVCodec msmpeg4v1_decoder = {