force frame type for 2-pass encoding
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 28 Mar 2002 22:50:22 +0000 (22:50 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 28 Mar 2002 22:50:22 +0000 (22:50 +0000)
Originally committed as revision 365 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/mpegvideo.c
libavcodec/mpegvideo.h

index df6a7cfab7700d946252bba581242e87d77c98fd..6b60473466237728aef59f4fc77a7bb15793dc82 100644 (file)
@@ -120,6 +120,8 @@ typedef struct AVCodecContext {
     int qmin;         /* min qscale */
     int qmax;         /* max qscale */
     int max_qdiff;    /* max qscale difference between frames */
+    
+    int force_type;   /* 0= no force, otherwise I_TYPE, P_TYPE, ... */
 
     struct AVCodec *codec;
     void *priv_data;
index 1c8bcbdfa660f331e45e1b01939e466764c7ac9a..2a7aca21d2b81dd9480a1d21e1677ee21a40f33e 100644 (file)
@@ -514,9 +514,10 @@ int MPV_encode_picture(AVCodecContext *avctx,
 
     init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
 
+    s->force_type= avctx->force_type;
     if (!s->intra_only) {
         /* first picture of GOP is intra */
-        if (s->picture_in_gop_number % s->gop_size==0){
+        if (s->picture_in_gop_number % s->gop_size==0 || s->force_type==I_TYPE){
             s->picture_in_gop_number=0;
             s->pict_type = I_TYPE;
         }else
@@ -1313,7 +1314,7 @@ static void encode_picture(MpegEncContext *s, int picture_number)
         memset(s->mb_type      , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
     }
 
-    if(s->avg_mb_var < s->mc_mb_var && s->pict_type != B_TYPE){ //FIXME subtract MV bits
+    if(s->avg_mb_var < s->mc_mb_var && s->pict_type != B_TYPE && (!s->force_type)){ //FIXME subtract MV bits
         s->pict_type= I_TYPE;
         s->picture_in_gop_number=0;
         memset(s->mb_type   , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
@@ -1955,7 +1956,7 @@ static int rate_estimate_qscale(MpegEncContext *s)
     double fps;
     INT64 wanted_bits;
     emms_c();
-    
+
     fps= (double)s->frame_rate / FRAME_RATE_BASE;
     wanted_bits= s->bit_rate*(double)s->picture_number/fps;
 
index 03e9eaf55051ffd30462f0428e16ff7051741530..78c8aeb670b9883a4f742dc13d7b9b570e0fe675 100644 (file)
@@ -66,6 +66,7 @@ typedef struct MpegEncContext {
     int max_qdiff;    /* max qscale difference between frames */
     int encoding;     /* true if we are encoding (vs decoding) */
     int flags;        /* AVCodecContext.flags (HQ, MV4, ...) */
+    int force_type;   /* 0= no force, otherwise I_TYPE, P_TYPE, ... */
     /* the following fields are managed internally by the encoder */
 
     /* bit output */