mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
force frame type for 2-pass encoding
Originally committed as revision 365 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
649c00c96d
commit
4d69fbc99e
@ -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,
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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 {
|
|||||||
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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user