changeset 336:c56b45669214 libavcodec

export delay info fixed low_delay & vo_type on mpeg4 header writer & parser
author michaelni
date Mon, 22 Apr 2002 19:04:28 +0000
parents e7e9d9901523
children 8899c3b35b57
files avcodec.h h263.c h263dec.c mpeg4data.h mpegvideo.c mpegvideo.h
diffstat 6 files changed, 49 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/avcodec.h	Mon Apr 22 17:33:43 2002 +0000
+++ b/avcodec.h	Mon Apr 22 19:04:28 2002 +0000
@@ -5,8 +5,8 @@
 
 #define LIBAVCODEC_VERSION_INT 0x000406
 #define LIBAVCODEC_VERSION     "0.4.6"
-#define LIBAVCODEC_BUILD       4601
-#define LIBAVCODEC_BUILD_STR   "4601"
+#define LIBAVCODEC_BUILD       4602
+#define LIBAVCODEC_BUILD_STR   "4602"
 
 enum CodecID {
     CODEC_ID_NONE, 
@@ -140,6 +140,9 @@
     int frame_number; /* audio or video frame number */
     int key_frame;    /* true if the previous compressed frame was 
                          a key frame (intra, or seekable) */
+    int delay;        /* number of frames the decoded output will be delayed relative to the encoded input */
+    
+    /* encoding parameters */
     int quality;      /* quality of the previous encoded frame 
                          (between 1 (good) and 31 (bad)) 
                          this is allso used to set the quality in vbr mode
--- a/h263.c	Mon Apr 22 17:33:43 2002 +0000
+++ b/h263.c	Mon Apr 22 19:04:28 2002 +0000
@@ -1008,7 +1008,9 @@
 {
     int vo_ver_id=1; //must be 2 if we want GMC or q-pel
     char buf[255];
-    
+
+    s->vo_type= s->has_b_frames ? CORE_VO_TYPE : SIMPLE_VO_TYPE;
+
     if(get_bit_count(&s->pb)!=0) mpeg4_stuffing(&s->pb);
     put_bits(&s->pb, 16, 0);
     put_bits(&s->pb, 16, 0x100);        /* video obj */
@@ -1016,7 +1018,7 @@
     put_bits(&s->pb, 16, 0x120);        /* video obj layer */
 
     put_bits(&s->pb, 1, 0);		/* random access vol */
-    put_bits(&s->pb, 8, 1);		/* video obj type indication= simple obj */
+    put_bits(&s->pb, 8, s->vo_type);	/* video obj type indication */
     put_bits(&s->pb, 1, 1);		/* is obj layer id= yes */
       put_bits(&s->pb, 4, vo_ver_id);	/* is obj layer ver id */
       put_bits(&s->pb, 3, 1);		/* is obj layer priority */
@@ -1024,7 +1026,16 @@
         put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
     else
         put_bits(&s->pb, 4, 1);		/* aspect ratio info= sqare pixel */
-    put_bits(&s->pb, 1, 0);		/* vol control parameters= no */
+
+    if(s->low_delay){
+        put_bits(&s->pb, 1, 1);		/* vol control parameters= yes */
+        put_bits(&s->pb, 2, 1);		/* chroma format 422 */
+        put_bits(&s->pb, 1, s->low_delay);
+        put_bits(&s->pb, 1, 0);		/* vbv parameters= no */
+    }else{
+        put_bits(&s->pb, 1, 0);		/* vol control parameters= no */
+    }
+
     put_bits(&s->pb, 2, RECT_SHAPE);	/* vol shape= rectangle */
     put_bits(&s->pb, 1, 1);		/* marker bit */
     
@@ -2579,7 +2590,7 @@
 
         /* vol header */
         skip_bits(&s->gb, 1); /* random access */
-        skip_bits(&s->gb, 8); /* vo_type */
+        s->vo_type= get_bits(&s->gb, 8);
         if (get_bits1(&s->gb) != 0) { /* is_ol_id */
             vo_ver_id = get_bits(&s->gb, 4); /* vo_ver_id */
             skip_bits(&s->gb, 3); /* vo_priority */
@@ -2594,9 +2605,19 @@
         }
 
         if(get_bits1(&s->gb)){ /* vol control parameter */
-            printf("vol control parameter not supported\n");
-            return -1;   
+            int chroma_format= get_bits(&s->gb, 2);
+            if(chroma_format!=1){
+                printf("illegal chroma format\n");
+            }
+            s->low_delay= get_bits1(&s->gb);
+            if(get_bits1(&s->gb)){ /* vbv parameters */
+                printf("vbv parameters not supported\n");
+                return -1;
+            }
+        }else{
+            s->low_delay=0;
         }
+
         s->shape = get_bits(&s->gb, 2); /* vol shape */
         if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
         if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
--- a/h263dec.c	Mon Apr 22 17:33:43 2002 +0000
+++ b/h263dec.c	Mon Apr 22 19:04:28 2002 +0000
@@ -45,7 +45,7 @@
     case CODEC_ID_MPEG4:
         s->time_increment_bits = 4; /* default value for broken headers */
         s->h263_pred = 1;
-        s->has_b_frames = 1;
+        s->has_b_frames = 1; //default, might be overriden in the vol header during header parsing
         break;
     case CODEC_ID_MSMPEG4V1:
         s->h263_msmpeg4 = 1;
@@ -129,6 +129,7 @@
         ret = msmpeg4_decode_picture_header(s);
     } else if (s->h263_pred) {
         ret = mpeg4_decode_picture_header(s);
+        s->has_b_frames= !s->low_delay;
     } else if (s->h263_intel) {
         ret = intel_h263_decode_picture_header(s);
     } else {
--- a/mpeg4data.h	Mon Apr 22 17:33:43 2002 +0000
+++ b/mpeg4data.h	Mon Apr 22 19:04:28 2002 +0000
@@ -4,6 +4,9 @@
 #define BIN_ONLY_SHAPE   2
 #define GRAY_SHAPE       3
 
+#define SIMPLE_VO_TYPE 1
+#define CORE_VO_TYPE   3
+
 // aspect_ratio_info
 #define EXTENDET_PAR 15
 
--- a/mpegvideo.c	Mon Apr 22 17:33:43 2002 +0000
+++ b/mpegvideo.c	Mon Apr 22 19:04:28 2002 +0000
@@ -409,6 +409,7 @@
     switch(avctx->codec->id) {
     case CODEC_ID_MPEG1VIDEO:
         s->out_format = FMT_MPEG1;
+        avctx->delay=0; //FIXME not sure, should check the spec
         break;
     case CODEC_ID_MJPEG:
         s->out_format = FMT_MJPEG;
@@ -422,6 +423,7 @@
         s->mjpeg_hsample[2] = 1; 
         if (mjpeg_init(s) < 0)
             return -1;
+        avctx->delay=0;
         break;
     case CODEC_ID_H263:
         if (h263_get_picture_format(s->width, s->height) == 7) {
@@ -429,6 +431,7 @@
             return -1;
         }
         s->out_format = FMT_H263;
+        avctx->delay=0;
         break;
     case CODEC_ID_H263P:
         s->out_format = FMT_H263;
@@ -440,16 +443,20 @@
         /* These are just to be sure */
         s->umvplus = 0;
         s->umvplus_dec = 0;
+        avctx->delay=0;
         break;
     case CODEC_ID_RV10:
         s->out_format = FMT_H263;
         s->h263_rv10 = 1;
+        avctx->delay=0;
         break;
     case CODEC_ID_MPEG4:
         s->out_format = FMT_H263;
         s->h263_pred = 1;
         s->unrestricted_mv = 1;
         s->has_b_frames= s->max_b_frames ? 1 : 0;
+        s->low_delay=0;
+        avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); 
         break;
     case CODEC_ID_MSMPEG4V1:
         s->out_format = FMT_H263;
@@ -457,6 +464,7 @@
         s->h263_pred = 1;
         s->unrestricted_mv = 1;
         s->msmpeg4_version= 1;
+        avctx->delay=0;
         break;
     case CODEC_ID_MSMPEG4V2:
         s->out_format = FMT_H263;
@@ -464,6 +472,7 @@
         s->h263_pred = 1;
         s->unrestricted_mv = 1;
         s->msmpeg4_version= 2;
+        avctx->delay=0;
         break;
     case CODEC_ID_MSMPEG4V3:
         s->out_format = FMT_H263;
@@ -471,6 +480,7 @@
         s->h263_pred = 1;
         s->unrestricted_mv = 1;
         s->msmpeg4_version= 3;
+        avctx->delay=0;
         break;
     default:
         return -1;
--- a/mpegvideo.h	Mon Apr 22 17:33:43 2002 +0000
+++ b/mpegvideo.h	Mon Apr 22 19:04:28 2002 +0000
@@ -296,6 +296,8 @@
     int data_partioning;
     int resync_marker;
     int resync_x_pos;
+    int low_delay;                   /* no reordering needed / has no b-frames */
+    int vo_type;
 
     /* divx specific, used to workaround (many) bugs in divx5 */
     int divx_version;