ratecontrol.c 27.5 KB
Newer Older
1
/*
F
Fabrice Bellard 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 * Rate control for video encoders
 *
 * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
M
Michael Niedermayer 已提交
20 21 22 23 24 25

/**
 * @file ratecontrol.c
 * Rate control for video encoders.
 */ 

26
#include "avcodec.h"
F
Fabrice Bellard 已提交
27
#include "dsputil.h"
28 29
#include "mpegvideo.h"

M
Michael Niedermayer 已提交
30 31
#undef NDEBUG // allways check asserts, the speed effect is far too small to disable them
#include <assert.h>
32

M
Michael Niedermayer 已提交
33 34 35 36
#ifndef M_E
#define M_E 2.718281828
#endif

37
static int init_pass2(MpegEncContext *s);
M
Michael Niedermayer 已提交
38
static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num);
39 40

void ff_write_pass1_stats(MpegEncContext *s){
41
    sprintf(s->avctx->stats_out, "in:%d out:%d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d;\n",
42
            s->picture_number, s->input_picture_number - s->max_b_frames, s->pict_type, 
43
            s->frame_qscale, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits, 
M
cleanup  
Michael Niedermayer 已提交
44
            s->f_code, s->b_code, s->current_picture.mc_mb_var_sum, s->current_picture.mb_var_sum, s->i_count);
45 46 47 48 49
}

int ff_rate_control_init(MpegEncContext *s)
{
    RateControlContext *rcc= &s->rc_context;
M
Michael Niedermayer 已提交
50
    int i;
51 52
    emms_c();

M
Michael Niedermayer 已提交
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
    for(i=0; i<5; i++){
        rcc->pred[i].coeff= 7.0;
        rcc->pred[i].count= 1.0;
    
        rcc->pred[i].decay= 0.4;
        rcc->i_cplx_sum [i]=
        rcc->p_cplx_sum [i]=
        rcc->mv_bits_sum[i]=
        rcc->qscale_sum [i]=
        rcc->frame_count[i]= 1; // 1 is better cuz of 1/0 and such
        rcc->last_qscale_for[i]=5;
    }
    rcc->buffer_index= s->avctx->rc_buffer_size/2;

    if(s->flags&CODEC_FLAG_PASS2){
68
        int i;
M
Michael Niedermayer 已提交
69
        char *p;
70

M
Michael Niedermayer 已提交
71 72 73 74
        /* find number of pics */
        p= s->avctx->stats_in;
        for(i=-1; p; i++){
            p= strchr(p+1, ';');
75
        }
M
Michael Niedermayer 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
        i+= s->max_b_frames;
        rcc->entry = (RateControlEntry*)av_mallocz(i*sizeof(RateControlEntry));
        rcc->num_entries= i;
        
        /* init all to skiped p frames (with b frames we might have a not encoded frame at the end FIXME) */
        for(i=0; i<rcc->num_entries; i++){
            RateControlEntry *rce= &rcc->entry[i];
            rce->pict_type= rce->new_pict_type=P_TYPE;
            rce->qscale= rce->new_qscale=2;
            rce->misc_bits= s->mb_num + 10;
            rce->mb_var_sum= s->mb_num*100;
        }        
        
        /* read stats */
        p= s->avctx->stats_in;
        for(i=0; i<rcc->num_entries - s->max_b_frames; i++){
92 93 94
            RateControlEntry *rce;
            int picture_number;
            int e;
M
Michael Niedermayer 已提交
95 96 97 98 99 100 101 102 103 104 105
            char *next;

            next= strchr(p, ';');
            if(next){
                (*next)=0; //sscanf in unbelieavle slow on looong strings //FIXME copy / dont write
                next++;
            }
            e= sscanf(p, " in:%d ", &picture_number);

            assert(picture_number >= 0);
            assert(picture_number < rcc->num_entries);
106
            rce= &rcc->entry[picture_number];
M
Michael Niedermayer 已提交
107

108
            e+=sscanf(p, " in:%*d out:%*d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d",
M
Michael Niedermayer 已提交
109 110 111 112
                   &rce->pict_type, &rce->qscale, &rce->i_tex_bits, &rce->p_tex_bits, &rce->mv_bits, &rce->misc_bits, 
                   &rce->f_code, &rce->b_code, &rce->mc_mb_var_sum, &rce->mb_var_sum, &rce->i_count);
            if(e!=12){
                fprintf(stderr, "statistics are damaged at line %d, parser out=%d\n", i, e);
113 114
                return -1;
            }
M
Michael Niedermayer 已提交
115
            p= next;
116 117 118 119 120
        }
        
        if(init_pass2(s) < 0) return -1;
    }
     
M
Michael Niedermayer 已提交
121 122 123 124
    if(!(s->flags&CODEC_FLAG_PASS2)){

        rcc->short_term_qsum=0.001;
        rcc->short_term_qcount=0.001;
125
    
M
Michael Niedermayer 已提交
126
        rcc->pass1_rc_eq_output_sum= 0.001;
M
Michael Niedermayer 已提交
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
        rcc->pass1_wanted_bits=0.001;
        
        /* init stuff with the user specified complexity */
        if(s->avctx->rc_initial_cplx){
            for(i=0; i<60*30; i++){
                double bits= s->avctx->rc_initial_cplx * (i/10000.0 + 1.0)*s->mb_num;
                RateControlEntry rce;
                double q;
                
                if     (i%((s->gop_size+3)/4)==0) rce.pict_type= I_TYPE;
                else if(i%(s->max_b_frames+1))    rce.pict_type= B_TYPE;
                else                              rce.pict_type= P_TYPE;

                rce.new_pict_type= rce.pict_type;
                rce.mc_mb_var_sum= bits*s->mb_num/100000;
                rce.mb_var_sum   = s->mb_num;
                rce.qscale   = 2;
                rce.f_code   = 2;
                rce.b_code   = 1;
                rce.misc_bits= 1;

                if(s->pict_type== I_TYPE){
                    rce.i_count   = s->mb_num;
                    rce.i_tex_bits= bits;
                    rce.p_tex_bits= 0;
                    rce.mv_bits= 0;
                }else{
                    rce.i_count   = 0; //FIXME we do know this approx
                    rce.i_tex_bits= 0;
                    rce.p_tex_bits= bits*0.9;
                    rce.mv_bits= bits*0.1;
                }
                rcc->i_cplx_sum [rce.pict_type] += rce.i_tex_bits*rce.qscale;
                rcc->p_cplx_sum [rce.pict_type] += rce.p_tex_bits*rce.qscale;
                rcc->mv_bits_sum[rce.pict_type] += rce.mv_bits;
                rcc->frame_count[rce.pict_type] ++;
163

M
Michael Niedermayer 已提交
164
                bits= rce.i_tex_bits + rce.p_tex_bits;
165

M
Michael Niedermayer 已提交
166
                q= get_qscale(s, &rce, rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum, i);
167
                rcc->pass1_wanted_bits+= s->bit_rate/(s->avctx->frame_rate / (double)s->avctx->frame_rate_base);
M
Michael Niedermayer 已提交
168 169 170 171 172
            }
        }

    }
    
173 174 175 176 177 178 179 180
    return 0;
}

void ff_rate_control_uninit(MpegEncContext *s)
{
    RateControlContext *rcc= &s->rc_context;
    emms_c();

181
    av_freep(&rcc->entry);
182 183
}

M
Michael Niedermayer 已提交
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
static inline double qp2bits(RateControlEntry *rce, double qp){
    if(qp<=0.0){
        fprintf(stderr, "qp<=0.0\n");
    }
    return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ qp;
}

static inline double bits2qp(RateControlEntry *rce, double bits){
    if(bits<0.9){
        fprintf(stderr, "bits<0.9\n");
    }
    return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ bits;
}
    
static void update_rc_buffer(MpegEncContext *s, int frame_size){
    RateControlContext *rcc= &s->rc_context;
200
    const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
M
Michael Niedermayer 已提交
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
    const double buffer_size= s->avctx->rc_buffer_size;
    const double min_rate= s->avctx->rc_min_rate/fps;
    const double max_rate= s->avctx->rc_max_rate/fps;

    if(buffer_size){
        rcc->buffer_index-= frame_size;
        if(rcc->buffer_index < buffer_size/2 /*FIXME /2 */ || min_rate==0){
            rcc->buffer_index+= max_rate;
            if(rcc->buffer_index >= buffer_size)
                rcc->buffer_index= buffer_size-1;
        }else{
            rcc->buffer_index+= min_rate;
        }
        
        if(rcc->buffer_index < 0)
            fprintf(stderr, "rc buffer underflow\n");
        if(rcc->buffer_index >= s->avctx->rc_buffer_size)
            fprintf(stderr, "rc buffer overflow\n");
    }
}

/**
 * modifies the bitrate curve from pass1 for one frame
 */
static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num){
    RateControlContext *rcc= &s->rc_context;
    double q, bits;
    const int pict_type= rce->new_pict_type;
    const double mb_num= s->mb_num;  
    int i;

    double const_values[]={
        M_PI,
        M_E,
        rce->i_tex_bits*rce->qscale,
        rce->p_tex_bits*rce->qscale,
        (rce->i_tex_bits + rce->p_tex_bits)*(double)rce->qscale,
        rce->mv_bits/mb_num,
        rce->pict_type == B_TYPE ? (rce->f_code + rce->b_code)*0.5 : rce->f_code,
        rce->i_count/mb_num,
        rce->mc_mb_var_sum/mb_num,
        rce->mb_var_sum/mb_num,
        rce->pict_type == I_TYPE,
        rce->pict_type == P_TYPE,
        rce->pict_type == B_TYPE,
        rcc->qscale_sum[pict_type] / (double)rcc->frame_count[pict_type],
        s->qcompress,
/*        rcc->last_qscale_for[I_TYPE],
        rcc->last_qscale_for[P_TYPE],
        rcc->last_qscale_for[B_TYPE],
        rcc->next_non_b_qscale,*/
        rcc->i_cplx_sum[I_TYPE] / (double)rcc->frame_count[I_TYPE],
        rcc->i_cplx_sum[P_TYPE] / (double)rcc->frame_count[P_TYPE],
        rcc->p_cplx_sum[P_TYPE] / (double)rcc->frame_count[P_TYPE],
        rcc->p_cplx_sum[B_TYPE] / (double)rcc->frame_count[B_TYPE],
        (rcc->i_cplx_sum[pict_type] + rcc->p_cplx_sum[pict_type]) / (double)rcc->frame_count[pict_type],
        0
    };
259
    static const char *const_names[]={
M
Michael Niedermayer 已提交
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
        "PI",
        "E",
        "iTex",
        "pTex",
        "tex",
        "mv",
        "fCode",
        "iCount",
        "mcVar",
        "var",
        "isI",
        "isP",
        "isB",
        "avgQP",
        "qComp",
/*        "lastIQP",
        "lastPQP",
        "lastBQP",
        "nextNonBQP",*/
        "avgIITex",
        "avgPITex",
        "avgPPTex",
        "avgBPTex",
        "avgTex",
        NULL
    };
286
    static double (*func1[])(void *, double)={
F
Fabrice Bellard 已提交
287 288
        (void *)bits2qp,
        (void *)qp2bits,
M
Michael Niedermayer 已提交
289 290
        NULL
    };
291
    static const char *func1_names[]={
M
Michael Niedermayer 已提交
292 293 294 295 296 297 298
        "bits2qp",
        "qp2bits",
        NULL
    };

    bits= ff_eval(s->avctx->rc_eq, const_values, const_names, func1, func1_names, NULL, NULL, rce);
    
M
Michael Niedermayer 已提交
299
    rcc->pass1_rc_eq_output_sum+= bits;
M
Michael Niedermayer 已提交
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
    bits*=rate_factor;
    if(bits<0.0) bits=0.0;
    bits+= 1.0; //avoid 1/0 issues
    
    /* user override */
    for(i=0; i<s->avctx->rc_override_count; i++){
        RcOverride *rco= s->avctx->rc_override;
        if(rco[i].start_frame > frame_num) continue;
        if(rco[i].end_frame   < frame_num) continue;
    
        if(rco[i].qscale) 
            bits= qp2bits(rce, rco[i].qscale); //FIXME move at end to really force it?
        else
            bits*= rco[i].quality_factor;
    }

    q= bits2qp(rce, bits);
    
    /* I/B difference */
    if     (pict_type==I_TYPE && s->avctx->i_quant_factor<0.0)
        q= -q*s->avctx->i_quant_factor + s->avctx->i_quant_offset;
    else if(pict_type==B_TYPE && s->avctx->b_quant_factor<0.0)
        q= -q*s->avctx->b_quant_factor + s->avctx->b_quant_offset;
323 324 325 326 327 328 329 330 331 332
        
    return q;
}

static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, double q){
    RateControlContext *rcc= &s->rc_context;
    AVCodecContext *a= s->avctx;
    const int pict_type= rce->new_pict_type;
    const double last_p_q    = rcc->last_qscale_for[P_TYPE];
    const double last_non_b_q= rcc->last_qscale_for[rcc->last_non_b_pict_type];
M
Michael Niedermayer 已提交
333
    
334 335 336 337 338
    if     (pict_type==I_TYPE && (a->i_quant_factor>0.0 || rcc->last_non_b_pict_type==P_TYPE))
        q= last_p_q    *ABS(a->i_quant_factor) + a->i_quant_offset;
    else if(pict_type==B_TYPE && a->b_quant_factor>0.0)
        q= last_non_b_q*    a->b_quant_factor  + a->b_quant_offset;

M
Michael Niedermayer 已提交
339
    /* last qscale / qdiff stuff */
340 341
    if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){
        double last_q= rcc->last_qscale_for[pict_type];
M
Michael Niedermayer 已提交
342

343 344 345
        if     (q > last_q + a->max_qdiff) q= last_q + a->max_qdiff;
        else if(q < last_q - a->max_qdiff) q= last_q - a->max_qdiff;
    }
M
Michael Niedermayer 已提交
346 347 348

    rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring
    
349 350 351
    if(pict_type!=B_TYPE)
        rcc->last_non_b_pict_type= pict_type;

M
Michael Niedermayer 已提交
352 353 354 355 356 357 358
    return q;
}

/**
 * gets the qmin & qmax for pict_type
 */
static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){
M
Michael Niedermayer 已提交
359 360
    int qmin= s->avctx->qmin;                                                       
    int qmax= s->avctx->qmax;
361 362
    
    assert(qmin <= qmax);
M
Michael Niedermayer 已提交
363 364 365 366 367 368 369 370 371

    if(pict_type==B_TYPE){
        qmin= (int)(qmin*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5);
        qmax= (int)(qmax*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5);
    }else if(pict_type==I_TYPE){
        qmin= (int)(qmin*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5);
        qmax= (int)(qmax*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5);
    }

372 373 374
    qmin= clip(qmin, 1, 31);
    qmax= clip(qmax, 1, 31);

M
Michael Niedermayer 已提交
375
    if(qmin==1 && s->avctx->qmin>1) qmin=2; //avoid qmin=1 unless the user wants qmin=1
M
Michael Niedermayer 已提交
376 377 378

    if(qmin<3 && s->max_qcoeff<=128 && pict_type==I_TYPE) qmin=3; //reduce cliping problems

379
    if(qmax<qmin) qmax= qmin;
M
Michael Niedermayer 已提交
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
    
    *qmin_ret= qmin;
    *qmax_ret= qmax;
}

static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q, int frame_num){
    RateControlContext *rcc= &s->rc_context;
    int qmin, qmax;
    double bits;
    const int pict_type= rce->new_pict_type;
    const double buffer_size= s->avctx->rc_buffer_size;
    const double min_rate= s->avctx->rc_min_rate;
    const double max_rate= s->avctx->rc_max_rate;
    
    get_qminmax(&qmin, &qmax, s, pict_type);

    /* modulation */
    if(s->avctx->rc_qmod_freq && frame_num%s->avctx->rc_qmod_freq==0 && pict_type==P_TYPE)
        q*= s->avctx->rc_qmod_amp;

    bits= qp2bits(rce, q);
M
fixing  
Michael Niedermayer 已提交
401
//printf("q:%f\n", q);
M
Michael Niedermayer 已提交
402 403
    /* buffer overflow/underflow protection */
    if(buffer_size){
404
        double expected_size= rcc->buffer_index;
M
Michael Niedermayer 已提交
405 406

        if(min_rate){
407
            double d= 2*(buffer_size - expected_size)/buffer_size;
M
Michael Niedermayer 已提交
408
            if(d>1.0) d=1.0;
M
fixing  
Michael Niedermayer 已提交
409 410
            else if(d<0.0001) d=0.0001;
            q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
411

M
Michael Niedermayer 已提交
412
            q= FFMIN(q, bits2qp(rce, FFMAX((min_rate - buffer_size + rcc->buffer_index)*2, 1)));
M
Michael Niedermayer 已提交
413 414 415 416 417
        }

        if(max_rate){
            double d= 2*expected_size/buffer_size;
            if(d>1.0) d=1.0;
M
fixing  
Michael Niedermayer 已提交
418 419
            else if(d<0.0001) d=0.0001;
            q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
420

M
Michael Niedermayer 已提交
421
            q= FFMAX(q, bits2qp(rce, FFMAX(rcc->buffer_index/2, 1)));
M
Michael Niedermayer 已提交
422 423
        }
    }
M
fixing  
Michael Niedermayer 已提交
424
//printf("q:%f max:%f min:%f size:%f index:%d bits:%f agr:%f\n", q,max_rate, min_rate, buffer_size, rcc->buffer_index, bits, s->avctx->rc_buffer_aggressivity);
425
    if(s->avctx->rc_qsquish==0.0 || qmin==qmax){
M
Michael Niedermayer 已提交
426 427 428 429 430 431 432 433 434 435 436 437 438 439
        if     (q<qmin) q=qmin;
        else if(q>qmax) q=qmax;
    }else{
        double min2= log(qmin);
        double max2= log(qmax);
        
        q= log(q);
        q= (q - min2)/(max2-min2) - 0.5;
        q*= -4.0;
        q= 1.0/(1.0 + exp(q));
        q= q*(max2-min2) + min2;
        
        q= exp(q);
    }
440
    
M
Michael Niedermayer 已提交
441 442 443
    return q;
}

444 445 446
//----------------------------------
// 1 Pass Code

M
Michael Niedermayer 已提交
447
static double predict_size(Predictor *p, double q, double var)
448 449 450 451
{
     return p->coeff*var / (q*p->count);
}

452
/*
M
Michael Niedermayer 已提交
453 454 455 456 457
static double predict_qp(Predictor *p, double size, double var)
{
//printf("coeff:%f, count:%f, var:%f, size:%f//\n", p->coeff, p->count, var, size);
     return p->coeff*var / (size*p->count);
}
458
*/
M
Michael Niedermayer 已提交
459

460 461 462
static void update_predictor(Predictor *p, double q, double var, double size)
{
    double new_coeff= size*q / (var + 1);
M
Michael Niedermayer 已提交
463
    if(var<10) return;
464 465 466 467 468 469 470

    p->count*= p->decay;
    p->coeff*= p->decay;
    p->count++;
    p->coeff+= new_coeff;
}

471 472 473
static void adaptive_quantization(MpegEncContext *s, double q){
    int i;
    const float lumi_masking= s->avctx->lumi_masking / (128.0*128.0);
474
    const float dark_masking= s->avctx->dark_masking / (128.0*128.0);
475 476 477 478 479 480 481
    const float temp_cplx_masking= s->avctx->temporal_cplx_masking;
    const float spatial_cplx_masking = s->avctx->spatial_cplx_masking;
    const float p_masking = s->avctx->p_masking;
    float bits_sum= 0.0;
    float cplx_sum= 0.0;
    float cplx_tab[s->mb_num];
    float bits_tab[s->mb_num];
M
Michael Niedermayer 已提交
482 483
    const int qmin= s->avctx->mb_qmin;
    const int qmax= s->avctx->mb_qmax;
M
cleanup  
Michael Niedermayer 已提交
484
    Picture * const pic= &s->current_picture;
M
Michael Niedermayer 已提交
485
    int last_qscale=0;
486 487
    
    for(i=0; i<s->mb_num; i++){
M
Michael Niedermayer 已提交
488 489 490 491
        const int mb_xy= s->mb_index2xy[i];
        float temp_cplx= sqrt(pic->mc_mb_var[mb_xy]);
        float spat_cplx= sqrt(pic->mb_var[mb_xy]);
        const int lumi= pic->mb_mean[mb_xy];
492 493 494 495 496
        float bits, cplx, factor;
        
        if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune
        if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune
        
M
Michael Niedermayer 已提交
497
        if((s->mb_type[mb_xy]&MB_TYPE_INTRA)){//FIXME hq mode 
498 499 500 501 502 503 504
            cplx= spat_cplx;
            factor= 1.0 + p_masking;
        }else{
            cplx= temp_cplx;
            factor= pow(temp_cplx, - temp_cplx_masking);
        }
        factor*=pow(spat_cplx, - spatial_cplx_masking);
505 506 507 508 509

        if(lumi>127)
            factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking);
        else
            factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking);
510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
        
        if(factor<0.00001) factor= 0.00001;
        
        bits= cplx*factor;
        cplx_sum+= cplx;
        bits_sum+= bits;
        cplx_tab[i]= cplx;
        bits_tab[i]= bits;
    }

    /* handle qmin/qmax cliping */
    if(s->flags&CODEC_FLAG_NORMALIZE_AQP){
        for(i=0; i<s->mb_num; i++){
            float newq= q*cplx_tab[i]/bits_tab[i];
            newq*= bits_sum/cplx_sum;

            if     (newq > qmax){
                bits_sum -= bits_tab[i];
                cplx_sum -= cplx_tab[i]*q/qmax;
            }
            else if(newq < qmin){
                bits_sum -= bits_tab[i];
                cplx_sum -= cplx_tab[i]*q/qmin;
            }
        }
    }
   
    for(i=0; i<s->mb_num; i++){
M
Michael Niedermayer 已提交
538
        const int mb_xy= s->mb_index2xy[i];
539 540 541 542 543 544 545
        float newq= q*cplx_tab[i]/bits_tab[i];
        int intq;

        if(s->flags&CODEC_FLAG_NORMALIZE_AQP){
            newq*= bits_sum/cplx_sum;
        }

M
Michael Niedermayer 已提交
546 547
        if(i && ABS(last_qscale - newq)<0.75)
            intq= last_qscale;
548 549 550 551 552 553 554
        else
            intq= (int)(newq + 0.5);

        if     (intq > qmax) intq= qmax;
        else if(intq < qmin) intq= qmin;
//if(i%s->mb_width==0) printf("\n");
//printf("%2d%3d ", intq, ff_sqrt(s->mc_mb_var[i]));
M
Michael Niedermayer 已提交
555 556
        last_qscale=
        pic->qscale_table[mb_xy]= intq;
557 558 559 560
    }
}

float ff_rate_estimate_qscale(MpegEncContext *s)
561 562
{
    float q;
563
    int qmin, qmax;
564 565 566 567
    float br_compensation;
    double diff;
    double short_term_q;
    double fps;
M
Michael Niedermayer 已提交
568
    int picture_number= s->picture_number;
569
    int64_t wanted_bits;
M
Michael Niedermayer 已提交
570 571 572 573 574 575
    RateControlContext *rcc= &s->rc_context;
    RateControlEntry local_rce, *rce;
    double bits;
    double rate_factor;
    int var;
    const int pict_type= s->pict_type;
M
cleanup  
Michael Niedermayer 已提交
576
    Picture * const pic= &s->current_picture;
577 578
    emms_c();

M
Michael Niedermayer 已提交
579
    get_qminmax(&qmin, &qmax, s, pict_type);
580

581
    fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
M
fixing  
Michael Niedermayer 已提交
582
//printf("input_pic_num:%d pic_num:%d frame_rate:%d\n", s->input_picture_number, s->picture_number, s->frame_rate);
583 584
        /* update predictors */
    if(picture_number>2){
M
Michael Niedermayer 已提交
585 586
        const int last_var= s->last_pict_type == I_TYPE ? rcc->last_mb_var_sum : rcc->last_mc_mb_var_sum;
        update_predictor(&rcc->pred[s->last_pict_type], rcc->last_qscale, sqrt(last_var), s->frame_bits);
587 588
    }

M
Michael Niedermayer 已提交
589 590 591 592 593 594 595 596 597
    if(s->flags&CODEC_FLAG_PASS2){
        assert(picture_number>=0);
        assert(picture_number<rcc->num_entries);
        rce= &rcc->entry[picture_number];
        wanted_bits= rce->expected_bits;
    }else{
        rce= &local_rce;
        wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps);
    }
598

M
Michael Niedermayer 已提交
599 600 601 602
    diff= s->total_bits - wanted_bits;
    br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance;
    if(br_compensation<=0.0) br_compensation=0.001;

M
cleanup  
Michael Niedermayer 已提交
603
    var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum;
M
Michael Niedermayer 已提交
604 605 606 607 608 609 610 611 612 613
    
    if(s->flags&CODEC_FLAG_PASS2){
        if(pict_type!=I_TYPE)
            assert(pict_type == rce->new_pict_type);

        q= rce->new_qscale / br_compensation;
//printf("%f %f %f last:%d var:%d type:%d//\n", q, rce->new_qscale, br_compensation, s->frame_bits, var, pict_type);
    }else{
        rce->pict_type= 
        rce->new_pict_type= pict_type;
M
cleanup  
Michael Niedermayer 已提交
614 615
        rce->mc_mb_var_sum= pic->mc_mb_var_sum;
        rce->mb_var_sum   = pic->   mb_var_sum;
M
Michael Niedermayer 已提交
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
        rce->qscale   = 2;
        rce->f_code   = s->f_code;
        rce->b_code   = s->b_code;
        rce->misc_bits= 1;

        if(picture_number>0)
            update_rc_buffer(s, s->frame_bits);

        bits= predict_size(&rcc->pred[pict_type], rce->qscale, sqrt(var));
        if(pict_type== I_TYPE){
            rce->i_count   = s->mb_num;
            rce->i_tex_bits= bits;
            rce->p_tex_bits= 0;
            rce->mv_bits= 0;
        }else{
            rce->i_count   = 0; //FIXME we do know this approx
            rce->i_tex_bits= 0;
            rce->p_tex_bits= bits*0.9;
            
            rce->mv_bits= bits*0.1;
636
        }
M
Michael Niedermayer 已提交
637 638 639 640
        rcc->i_cplx_sum [pict_type] += rce->i_tex_bits*rce->qscale;
        rcc->p_cplx_sum [pict_type] += rce->p_tex_bits*rce->qscale;
        rcc->mv_bits_sum[pict_type] += rce->mv_bits;
        rcc->frame_count[pict_type] ++;
641

M
Michael Niedermayer 已提交
642
        bits= rce->i_tex_bits + rce->p_tex_bits;
M
Michael Niedermayer 已提交
643
        rate_factor= rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum * br_compensation;
644
    
M
Michael Niedermayer 已提交
645
        q= get_qscale(s, rce, rate_factor, picture_number);
646

647
        assert(q>0.0);
M
Michael Niedermayer 已提交
648
//printf("%f ", q);
649
        q= get_diff_limited_q(s, rce, q);
M
Michael Niedermayer 已提交
650 651 652 653 654 655 656 657 658 659 660 661 662
//printf("%f ", q);
        assert(q>0.0);

        if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass
            rcc->short_term_qsum*=s->qblur;
            rcc->short_term_qcount*=s->qblur;

            rcc->short_term_qsum+= q;
            rcc->short_term_qcount++;
//printf("%f ", q);
            q= short_term_q= rcc->short_term_qsum/rcc->short_term_qcount;
//printf("%f ", q);
        }
M
fixing  
Michael Niedermayer 已提交
663 664
        assert(q>0.0);
        
M
Michael Niedermayer 已提交
665 666 667 668
        q= modify_qscale(s, rce, q, picture_number);

        rcc->pass1_wanted_bits+= s->bit_rate/fps;

669
        assert(q>0.0);
670
    }
M
Michael Niedermayer 已提交
671 672 673

    if(s->avctx->debug&FF_DEBUG_RC){
        printf("%c qp:%d<%2.1f<%d %d want:%d total:%d comp:%f st_q:%2.2f size:%d var:%d/%d br:%d fps:%d\n",
M
cleanup  
Michael Niedermayer 已提交
674
        av_get_pict_type_char(pict_type), qmin, q, qmax, picture_number, (int)wanted_bits/1000, (int)s->total_bits/1000,
M
Michael Niedermayer 已提交
675 676 677
        br_compensation, short_term_q, s->frame_bits, pic->mb_var_sum, pic->mc_mb_var_sum, s->bit_rate/1000, (int)fps
        );
    }
M
Michael Niedermayer 已提交
678 679 680 681

    if     (q<qmin) q=qmin; 
    else if(q>qmax) q=qmax;

682 683 684 685 686 687
    if(s->adaptive_quant)
        adaptive_quantization(s, q);
    else
        q= (int)(q + 0.5);
    
    rcc->last_qscale= q;
M
cleanup  
Michael Niedermayer 已提交
688 689 690 691 692 693 694 695 696 697
    rcc->last_mc_mb_var_sum= pic->mc_mb_var_sum;
    rcc->last_mb_var_sum= pic->mb_var_sum;
#if 0
{
    static int mvsum=0, texsum=0;
    mvsum += s->mv_bits;
    texsum += s->i_tex_bits + s->p_tex_bits;
    printf("%d %d//\n\n", mvsum, texsum);
}
#endif
698
    return q;
699 700 701 702 703 704 705 706 707
}

//----------------------------------------------
// 2-Pass code

static int init_pass2(MpegEncContext *s)
{
    RateControlContext *rcc= &s->rc_context;
    int i;
708
    double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
709 710 711 712 713 714 715 716
    double complexity[5]={0,0,0,0,0};   // aproximate bits at quant=1
    double avg_quantizer[5];
    uint64_t const_bits[5]={0,0,0,0,0}; // quantizer idependant bits
    uint64_t available_bits[5];
    uint64_t all_const_bits;
    uint64_t all_available_bits= (uint64_t)(s->bit_rate*(double)rcc->num_entries/fps);
    double rate_factor=0;
    double step;
717
    //int last_i_frame=-10000000;
M
Michael Niedermayer 已提交
718 719 720
    const int filter_size= (int)(s->qblur*4) | 1;  
    double expected_bits;
    double *qscale, *blured_qscale;
721 722 723 724 725

    /* find complexity & const_bits & decide the pict_types */
    for(i=0; i<rcc->num_entries; i++){
        RateControlEntry *rce= &rcc->entry[i];
        
M
Michael Niedermayer 已提交
726
        rce->new_pict_type= rce->pict_type;
M
Michael Niedermayer 已提交
727 728 729 730
        rcc->i_cplx_sum [rce->pict_type] += rce->i_tex_bits*rce->qscale;
        rcc->p_cplx_sum [rce->pict_type] += rce->p_tex_bits*rce->qscale;
        rcc->mv_bits_sum[rce->pict_type] += rce->mv_bits;
        rcc->frame_count[rce->pict_type] ++;
731 732 733 734 735 736 737 738 739 740

        complexity[rce->new_pict_type]+= (rce->i_tex_bits+ rce->p_tex_bits)*(double)rce->qscale;
        const_bits[rce->new_pict_type]+= rce->mv_bits + rce->misc_bits;
    }
    all_const_bits= const_bits[I_TYPE] + const_bits[P_TYPE] + const_bits[B_TYPE];
    
    if(all_available_bits < all_const_bits){
        fprintf(stderr, "requested bitrate is to low\n");
        return -1;
    }
M
Michael Niedermayer 已提交
741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759
    
    /* find average quantizers */
    avg_quantizer[P_TYPE]=0;
    for(step=256*256; step>0.0000001; step*=0.5){
        double expected_bits=0;
        avg_quantizer[P_TYPE]+= step;
        
        avg_quantizer[I_TYPE]= avg_quantizer[P_TYPE]*ABS(s->avctx->i_quant_factor) + s->avctx->i_quant_offset;
        avg_quantizer[B_TYPE]= avg_quantizer[P_TYPE]*ABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
        
        expected_bits= 
            + all_const_bits 
            + complexity[I_TYPE]/avg_quantizer[I_TYPE]
            + complexity[P_TYPE]/avg_quantizer[P_TYPE]
            + complexity[B_TYPE]/avg_quantizer[B_TYPE];
            
        if(expected_bits < all_available_bits) avg_quantizer[P_TYPE]-= step;
//printf("%f %lld %f\n", expected_bits, all_available_bits, avg_quantizer[P_TYPE]);
    }
760
//printf("qp_i:%f, qp_p:%f, qp_b:%f\n", avg_quantizer[I_TYPE],avg_quantizer[P_TYPE],avg_quantizer[B_TYPE]);
761 762 763 764 765

    for(i=0; i<5; i++){
        available_bits[i]= const_bits[i] + complexity[i]/avg_quantizer[i];
    }
//printf("%lld %lld %lld %lld\n", available_bits[I_TYPE], available_bits[P_TYPE], available_bits[B_TYPE], all_available_bits);
M
Michael Niedermayer 已提交
766
        
767 768
    qscale= av_malloc(sizeof(double)*rcc->num_entries);
    blured_qscale= av_malloc(sizeof(double)*rcc->num_entries);
M
Michael Niedermayer 已提交
769

770
    for(step=256*256; step>0.0000001; step*=0.5){
M
Michael Niedermayer 已提交
771
        expected_bits=0;
772
        rate_factor+= step;
M
Michael Niedermayer 已提交
773 774 775
        
        rcc->buffer_index= s->avctx->rc_buffer_size/2;

776 777
        /* find qscale */
        for(i=0; i<rcc->num_entries; i++){
M
Michael Niedermayer 已提交
778 779 780 781 782 783
            qscale[i]= get_qscale(s, &rcc->entry[i], rate_factor, i);
        }
        assert(filter_size%2==1);

        /* fixed I/B QP relative to P mode */
        for(i=rcc->num_entries-1; i>=0; i--){
784
            RateControlEntry *rce= &rcc->entry[i];
785 786
            
            qscale[i]= get_diff_limited_q(s, rce, qscale[i]);
M
Michael Niedermayer 已提交
787
        }
788

M
Michael Niedermayer 已提交
789 790 791 792 793 794 795 796 797 798 799
        /* smooth curve */
        for(i=0; i<rcc->num_entries; i++){
            RateControlEntry *rce= &rcc->entry[i];
            const int pict_type= rce->new_pict_type;
            int j;
            double q=0.0, sum=0.0;
        
            for(j=0; j<filter_size; j++){
                int index= i+j-filter_size/2;
                double d= index-i;
                double coeff= s->qblur==0 ? 1.0 : exp(-d*d/(s->qblur * s->qblur));
800
            
M
Michael Niedermayer 已提交
801 802 803 804
                if(index < 0 || index >= rcc->num_entries) continue;
                if(pict_type != rcc->entry[index].new_pict_type) continue;
                q+= qscale[index] * coeff;
                sum+= coeff;
805
            }
M
Michael Niedermayer 已提交
806
            blured_qscale[i]= q/sum;
807 808 809 810 811
        }
    
        /* find expected bits */
        for(i=0; i<rcc->num_entries; i++){
            RateControlEntry *rce= &rcc->entry[i];
M
Michael Niedermayer 已提交
812 813
            double bits;
            rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i);
814
            bits= qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits;
M
Michael Niedermayer 已提交
815 816 817
//printf("%d %f\n", rce->new_bits, blured_qscale[i]);
            update_rc_buffer(s, bits);

818
            rce->expected_bits= expected_bits;
M
Michael Niedermayer 已提交
819
            expected_bits += bits;
820 821
        }

M
Michael Niedermayer 已提交
822
//        printf("%f %d %f\n", expected_bits, (int)all_available_bits, rate_factor);
823 824
        if(expected_bits > all_available_bits) rate_factor-= step;
    }
825 826
    av_free(qscale);
    av_free(blured_qscale);
827

M
Michael Niedermayer 已提交
828 829 830
    if(abs(expected_bits/all_available_bits - 1.0) > 0.01 ){
        fprintf(stderr, "Error: 2pass curve failed to converge\n");
        return -1;
831 832
    }

M
Michael Niedermayer 已提交
833
    return 0;
834
}