diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index e09351f94b..0c810aa40f 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1869,6 +1869,13 @@ typedef struct AVCodecContext { * - decoding: unused */ int bidir_refine; + + /** + * + * - encoding: set by user. + * - decoding: unused + */ + int brd_scale; } AVCodecContext; /** diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 2b7718cca2..731a502c25 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -2145,9 +2145,9 @@ static int estimate_best_b_count(MpegEncContext *s){ AVCodec *codec= avcodec_find_encoder(s->avctx->codec_id); AVCodecContext *c= avcodec_alloc_context(); AVFrame input[FF_MAX_B_FRAMES+2]; - const int scale= 0; + const int scale= s->avctx->brd_scale; int i, j, out_size; - int outbuf_size= (s->width * s->height) >> (2*scale); //FIXME + int outbuf_size= s->width * s->height; //FIXME uint8_t *outbuf= av_malloc(outbuf_size); ImgReSampleContext *resample; int64_t best_rd= INT64_MAX; @@ -2198,6 +2198,7 @@ static int estimate_best_b_count(MpegEncContext *s){ input[0].pict_type= I_TYPE; input[0].quality= 2 * FF_QP2LAMBDA; out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[0]); + rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT; for(i=0; imax_b_frames+1; i++){ int is_p= i % (j+1) == j || i==s->max_b_frames; diff --git a/libavcodec/utils.c b/libavcodec/utils.c index a0e97ca7ca..28fd5804ae 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -708,6 +708,7 @@ static AVOption options[]={ {"mb_lmax", NULL, OFFSET(mb_lmax), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E}, {"me_penalty_compensation", NULL, OFFSET(me_penalty_compensation), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E}, {"bidir_refine", NULL, OFFSET(bidir_refine), FF_OPT_TYPE_INT, DEFAULT, 0, 4, V|E}, +{"brd_scale", NULL, OFFSET(brd_scale), FF_OPT_TYPE_INT, DEFAULT, 0, 10, V|E}, {NULL}, };