Commit 0912f73f authored by michaelni's avatar michaelni

force frame type for 2-pass encoding

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@365 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent e1fe0143
...@@ -120,6 +120,8 @@ typedef struct AVCodecContext { ...@@ -120,6 +120,8 @@ typedef struct AVCodecContext {
int qmin; /* min qscale */ int qmin; /* min qscale */
int qmax; /* max qscale */ int qmax; /* max qscale */
int max_qdiff; /* max qscale difference between frames */ int max_qdiff; /* max qscale difference between frames */
int force_type; /* 0= no force, otherwise I_TYPE, P_TYPE, ... */
struct AVCodec *codec; struct AVCodec *codec;
void *priv_data; void *priv_data;
......
...@@ -514,9 +514,10 @@ int MPV_encode_picture(AVCodecContext *avctx, ...@@ -514,9 +514,10 @@ int MPV_encode_picture(AVCodecContext *avctx,
init_put_bits(&s->pb, buf, buf_size, NULL, NULL); init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
s->force_type= avctx->force_type;
if (!s->intra_only) { if (!s->intra_only) {
/* first picture of GOP is intra */ /* 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->picture_in_gop_number=0;
s->pict_type = I_TYPE; s->pict_type = I_TYPE;
}else }else
...@@ -1313,7 +1314,7 @@ static void encode_picture(MpegEncContext *s, int picture_number) ...@@ -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); 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->pict_type= I_TYPE;
s->picture_in_gop_number=0; s->picture_in_gop_number=0;
memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height); 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) ...@@ -1955,7 +1956,7 @@ static int rate_estimate_qscale(MpegEncContext *s)
double fps; double fps;
INT64 wanted_bits; INT64 wanted_bits;
emms_c(); emms_c();
fps= (double)s->frame_rate / FRAME_RATE_BASE; fps= (double)s->frame_rate / FRAME_RATE_BASE;
wanted_bits= s->bit_rate*(double)s->picture_number/fps; wanted_bits= s->bit_rate*(double)s->picture_number/fps;
......
...@@ -66,6 +66,7 @@ typedef struct MpegEncContext { ...@@ -66,6 +66,7 @@ typedef struct MpegEncContext {
int max_qdiff; /* max qscale difference between frames */ int max_qdiff; /* max qscale difference between frames */
int encoding; /* true if we are encoding (vs decoding) */ int encoding; /* true if we are encoding (vs decoding) */
int flags; /* AVCodecContext.flags (HQ, MV4, ...) */ 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 */ /* the following fields are managed internally by the encoder */
/* bit output */ /* bit output */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment