support downscaling frames for dynamic b frame decission
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 25 Dec 2005 18:34:02 +0000 (18:34 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 25 Dec 2005 18:34:02 +0000 (18:34 +0000)
Originally committed as revision 4776 to svn://svn.ffmpeg.org/ffmpeg/trunk

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

index e09351f94b4d067bae818d6d1ae399886168822f..0c810aa40f5396a1e0983182449a8ecf97a4f5c7 100644 (file)
@@ -1869,6 +1869,13 @@ typedef struct AVCodecContext {
      * - decoding: unused
      */
     int bidir_refine;
+
+    /**
+     *
+     * - encoding: set by user.
+     * - decoding: unused
+     */
+    int brd_scale;
 } AVCodecContext;
 
 /**
index 2b7718cca2fc711a6ad796774b5a011d7f952e3b..731a502c256c2b86f793b5e4dbc109eb50317a5a 100644 (file)
@@ -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; i<s->max_b_frames+1; i++){
             int is_p= i % (j+1) == j || i==s->max_b_frames;
index a0e97ca7ca6489d8d73f2382962f1fa4f09a822c..28fd5804aed2f7c263b8dd29c83fea81f3cb1560 100644 (file)
@@ -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},
 };