From 4d69fbc99ef807e278165c9ad09b6a38c2a20de4 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Thu, 28 Mar 2002 22:50:22 +0000 Subject: [PATCH] force frame type for 2-pass encoding Originally committed as revision 365 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/avcodec.h | 2 ++ libavcodec/mpegvideo.c | 7 ++++--- libavcodec/mpegvideo.h | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index df6a7cfab7..6b60473466 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -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; diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 1c8bcbdfa6..2a7aca21d2 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -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; diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 03e9eaf550..78c8aeb670 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -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 */