ratecontrol.c 28.6 KB
Newer Older
1
/*
F
Fabrice Bellard 已提交
2 3
 * Rate control for video encoders
 *
M
Michael Niedermayer 已提交
4
 * Copyright (c) 2002-2003 Michael Niedermayer <michaelni@gmx.at>
F
Fabrice Bellard 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 *
 * 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:%d itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d;\n",
M
Michael Niedermayer 已提交
42
            s->current_picture_ptr->display_picture_number, s->current_picture_ptr->coded_picture_number, s->pict_type, 
43
            s->current_picture.quality, 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
    for(i=0; i<5; i++){
54
        rcc->pred[i].coeff= FF_QP2LAMBDA * 7.0;
M
Michael Niedermayer 已提交
55 56 57 58 59 60 61 62
        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
63
        rcc->last_qscale_for[i]=FF_QP2LAMBDA * 5;
M
Michael Niedermayer 已提交
64
    }
M
Michael Niedermayer 已提交
65
    rcc->buffer_index= s->avctx->rc_initial_buffer_occupancy;
M
Michael Niedermayer 已提交
66 67

    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
        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;
84
            rce->qscale= rce->new_qscale=FF_QP2LAMBDA * 2;
M
Michael Niedermayer 已提交
85 86 87 88 89 90 91
            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
                   &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){
112
                av_log(s->avctx, AV_LOG_ERROR, "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
        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;
143
                rce.qscale   = FF_QP2LAMBDA * 2;
M
Michael Niedermayer 已提交
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
                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
static inline double qp2bits(RateControlEntry *rce, double qp){
    if(qp<=0.0){
186
        av_log(NULL, AV_LOG_ERROR, "qp<=0.0\n");
M
Michael Niedermayer 已提交
187 188 189 190 191 192
    }
    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){
193
        av_log(NULL, AV_LOG_ERROR, "bits<0.9\n");
M
Michael Niedermayer 已提交
194 195 196 197
    }
    return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ bits;
}
    
198
int ff_vbv_update(MpegEncContext *s, int frame_size){
M
Michael Niedermayer 已提交
199
    RateControlContext *rcc= &s->rc_context;
200
    const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
M
Michael Niedermayer 已提交
201
    const int buffer_size= s->avctx->rc_buffer_size;
M
Michael Niedermayer 已提交
202 203
    const double min_rate= s->avctx->rc_min_rate/fps;
    const double max_rate= s->avctx->rc_max_rate/fps;
M
Michael Niedermayer 已提交
204 205
    
//printf("%d %f %d %f %f\n", buffer_size, rcc->buffer_index, frame_size, min_rate, max_rate);
M
Michael Niedermayer 已提交
206
    if(buffer_size){
M
Michael Niedermayer 已提交
207 208
        int left;

M
Michael Niedermayer 已提交
209
        rcc->buffer_index-= frame_size;
M
Michael Niedermayer 已提交
210
        if(rcc->buffer_index < 0){
211
            av_log(s->avctx, AV_LOG_ERROR, "rc buffer underflow\n");
M
Michael Niedermayer 已提交
212 213 214 215 216 217
            rcc->buffer_index= 0;
        }

        left= buffer_size - rcc->buffer_index - 1;
        rcc->buffer_index += clip(left, min_rate, max_rate);

M
Michael Niedermayer 已提交
218 219
        if(rcc->buffer_index > buffer_size){
            int stuffing= ceil((rcc->buffer_index - buffer_size)/8);
220 221 222 223 224 225 226 227 228
            
            if(stuffing < 4 && s->codec_id == CODEC_ID_MPEG4)
                stuffing=4;
            rcc->buffer_index -= 8*stuffing;
            
            if(s->avctx->debug & FF_DEBUG_RC)
                av_log(s->avctx, AV_LOG_DEBUG, "stuffing %d bytes\n", stuffing);

            return stuffing;
M
Michael Niedermayer 已提交
229
        }
M
Michael Niedermayer 已提交
230
    }
231
    return 0;
M
Michael Niedermayer 已提交
232 233 234 235 236 237 238
}

/**
 * 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;
M
cleanup  
Michael Niedermayer 已提交
239
    AVCodecContext *a= s->avctx;
M
Michael Niedermayer 已提交
240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
    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],
M
cleanup  
Michael Niedermayer 已提交
260
        a->qcompress,
M
Michael Niedermayer 已提交
261 262 263 264 265 266 267 268 269 270 271
/*        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
    };
272
    static const char *const_names[]={
M
Michael Niedermayer 已提交
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
        "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
    };
299
    static double (*func1[])(void *, double)={
F
Fabrice Bellard 已提交
300 301
        (void *)bits2qp,
        (void *)qp2bits,
M
Michael Niedermayer 已提交
302 303
        NULL
    };
304
    static const char *func1_names[]={
M
Michael Niedermayer 已提交
305 306 307 308 309 310 311
        "bits2qp",
        "qp2bits",
        NULL
    };

    bits= ff_eval(s->avctx->rc_eq, const_values, const_names, func1, func1_names, NULL, NULL, rce);
    
M
Michael Niedermayer 已提交
312
    rcc->pass1_rc_eq_output_sum+= bits;
M
Michael Niedermayer 已提交
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
    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;
336 337 338 339 340 341 342 343 344 345
        
    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 已提交
346
    
347 348 349 350 351
    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 已提交
352
    /* last qscale / qdiff stuff */
353 354
    if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){
        double last_q= rcc->last_qscale_for[pict_type];
355
        const int maxdiff= FF_QP2LAMBDA * a->max_qdiff;
M
Michael Niedermayer 已提交
356

357 358
        if     (q > last_q + maxdiff) q= last_q + maxdiff;
        else if(q < last_q - maxdiff) q= last_q - maxdiff;
359
    }
M
Michael Niedermayer 已提交
360 361 362

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

M
Michael Niedermayer 已提交
366 367 368 369 370 371 372
    return q;
}

/**
 * gets the qmin & qmax for pict_type
 */
static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){
373 374
    int qmin= s->avctx->lmin;                                                       
    int qmax= s->avctx->lmax;
375 376
    
    assert(qmin <= qmax);
M
Michael Niedermayer 已提交
377 378 379 380 381 382 383 384 385

    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);
    }

386 387
    qmin= clip(qmin, 1, FF_LAMBDA_MAX);
    qmax= clip(qmax, 1, FF_LAMBDA_MAX);
M
Michael Niedermayer 已提交
388

389
    if(qmax<qmin) qmax= qmin;
M
Michael Niedermayer 已提交
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;
M
Michael Niedermayer 已提交
401 402 403
    const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
    const double min_rate= s->avctx->rc_min_rate / fps;
    const double max_rate= s->avctx->rc_max_rate / fps;
M
Michael Niedermayer 已提交
404 405 406 407 408 409 410 411
    
    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 已提交
412
//printf("q:%f\n", q);
M
Michael Niedermayer 已提交
413 414
    /* buffer overflow/underflow protection */
    if(buffer_size){
415
        double expected_size= rcc->buffer_index;
M
Michael Niedermayer 已提交
416
        double q_limit;
M
Michael Niedermayer 已提交
417 418

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

M
Michael Niedermayer 已提交
424 425 426 427 428 429 430
            q_limit= bits2qp(rce, FFMAX((min_rate - buffer_size + rcc->buffer_index)*3, 1));
            if(q > q_limit){
                if(s->avctx->debug&FF_DEBUG_RC){
                    av_log(s->avctx, AV_LOG_DEBUG, "limiting QP %f -> %f\n", q, q_limit);
                }
                q= q_limit;
            }
M
Michael Niedermayer 已提交
431 432 433 434 435
        }

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

M
Michael Niedermayer 已提交
439 440 441 442 443 444 445
            q_limit= bits2qp(rce, FFMAX(rcc->buffer_index/3, 1));
            if(q < q_limit){
                if(s->avctx->debug&FF_DEBUG_RC){
                    av_log(s->avctx, AV_LOG_DEBUG, "limiting QP %f -> %f\n", q, q_limit);
                }
                q= q_limit;
            }
M
Michael Niedermayer 已提交
446 447
        }
    }
M
fixing  
Michael Niedermayer 已提交
448
//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);
449
    if(s->avctx->rc_qsquish==0.0 || qmin==qmax){
M
Michael Niedermayer 已提交
450 451 452 453 454 455 456 457 458 459 460 461 462 463
        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);
    }
464
    
M
Michael Niedermayer 已提交
465 466 467
    return q;
}

468 469 470
//----------------------------------
// 1 Pass Code

M
Michael Niedermayer 已提交
471
static double predict_size(Predictor *p, double q, double var)
472 473 474 475
{
     return p->coeff*var / (q*p->count);
}

476
/*
M
Michael Niedermayer 已提交
477 478 479 480 481
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);
}
482
*/
M
Michael Niedermayer 已提交
483

484 485 486
static void update_predictor(Predictor *p, double q, double var, double size)
{
    double new_coeff= size*q / (var + 1);
M
Michael Niedermayer 已提交
487
    if(var<10) return;
488 489 490 491 492 493 494

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

495 496 497
static void adaptive_quantization(MpegEncContext *s, double q){
    int i;
    const float lumi_masking= s->avctx->lumi_masking / (128.0*128.0);
498
    const float dark_masking= s->avctx->dark_masking / (128.0*128.0);
499 500 501 502 503 504 505
    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];
506 507
    const int qmin= s->avctx->lmin;
    const int qmax= s->avctx->lmax;
M
cleanup  
Michael Niedermayer 已提交
508
    Picture * const pic= &s->current_picture;
509 510
    
    for(i=0; i<s->mb_num; i++){
M
Michael Niedermayer 已提交
511
        const int mb_xy= s->mb_index2xy[i];
512
        float temp_cplx= sqrt(pic->mc_mb_var[mb_xy]); //FIXME merge in pow()
M
Michael Niedermayer 已提交
513 514
        float spat_cplx= sqrt(pic->mb_var[mb_xy]);
        const int lumi= pic->mb_mean[mb_xy];
515
        float bits, cplx, factor;
516
#if 0        
517 518
        if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune
        if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune
519 520 521 522
#endif   
        if(spat_cplx < 4) spat_cplx= 4; //FIXME finetune
        if(temp_cplx < 4) temp_cplx= 4; //FIXME finetune

M
Michael Niedermayer 已提交
523
        if((s->mb_type[mb_xy]&MB_TYPE_INTRA)){//FIXME hq mode 
524 525 526 527 528 529 530
            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);
531 532 533 534 535

        if(lumi>127)
            factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking);
        else
            factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking);
536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563
        
        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 已提交
564
        const int mb_xy= s->mb_index2xy[i];
565 566 567 568 569 570 571
        float newq= q*cplx_tab[i]/bits_tab[i];
        int intq;

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

572
        intq= (int)(newq + 0.5);
573 574 575 576 577

        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]));
578
        s->lambda_table[mb_xy]= intq;
579 580
    }
}
581
//FIXME rd or at least approx for dquant
582 583

float ff_rate_estimate_qscale(MpegEncContext *s)
584 585
{
    float q;
586
    int qmin, qmax;
587 588 589 590
    float br_compensation;
    double diff;
    double short_term_q;
    double fps;
M
Michael Niedermayer 已提交
591
    int picture_number= s->picture_number;
592
    int64_t wanted_bits;
M
Michael Niedermayer 已提交
593
    RateControlContext *rcc= &s->rc_context;
M
cleanup  
Michael Niedermayer 已提交
594
    AVCodecContext *a= s->avctx;
M
Michael Niedermayer 已提交
595 596 597 598 599
    RateControlEntry local_rce, *rce;
    double bits;
    double rate_factor;
    int var;
    const int pict_type= s->pict_type;
M
cleanup  
Michael Niedermayer 已提交
600
    Picture * const pic= &s->current_picture;
601 602
    emms_c();

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

605
    fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
M
fixing  
Michael Niedermayer 已提交
606
//printf("input_pic_num:%d pic_num:%d frame_rate:%d\n", s->input_picture_number, s->picture_number, s->frame_rate);
607 608
        /* update predictors */
    if(picture_number>2){
M
Michael Niedermayer 已提交
609 610
        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);
611 612
    }

M
Michael Niedermayer 已提交
613 614 615 616 617 618 619 620 621
    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);
    }
622

M
Michael Niedermayer 已提交
623
    diff= s->total_bits - wanted_bits;
M
cleanup  
Michael Niedermayer 已提交
624
    br_compensation= (a->bit_rate_tolerance - diff)/a->bit_rate_tolerance;
M
Michael Niedermayer 已提交
625 626
    if(br_compensation<=0.0) br_compensation=0.001;

M
cleanup  
Michael Niedermayer 已提交
627
    var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum;
M
Michael Niedermayer 已提交
628
    
F
Fabrice Bellard 已提交
629
    short_term_q = 0; /* avoid warning */
M
Michael Niedermayer 已提交
630 631 632 633 634 635 636 637 638
    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 已提交
639 640
        rce->mc_mb_var_sum= pic->mc_mb_var_sum;
        rce->mb_var_sum   = pic->   mb_var_sum;
641
        rce->qscale   = FF_QP2LAMBDA * 2;
M
Michael Niedermayer 已提交
642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
        rce->f_code   = s->f_code;
        rce->b_code   = s->b_code;
        rce->misc_bits= 1;

        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;
658
        }
M
Michael Niedermayer 已提交
659 660 661 662
        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] ++;
663

M
Michael Niedermayer 已提交
664
        bits= rce->i_tex_bits + rce->p_tex_bits;
M
Michael Niedermayer 已提交
665
        rate_factor= rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum * br_compensation;
666
    
M
Michael Niedermayer 已提交
667
        q= get_qscale(s, rce, rate_factor, picture_number);
668

669
        assert(q>0.0);
M
Michael Niedermayer 已提交
670
//printf("%f ", q);
671
        q= get_diff_limited_q(s, rce, q);
M
Michael Niedermayer 已提交
672 673 674 675
//printf("%f ", q);
        assert(q>0.0);

        if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass
M
cleanup  
Michael Niedermayer 已提交
676 677
            rcc->short_term_qsum*=a->qblur;
            rcc->short_term_qcount*=a->qblur;
M
Michael Niedermayer 已提交
678 679 680 681 682 683 684

            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 已提交
685 686
        assert(q>0.0);
        
M
Michael Niedermayer 已提交
687 688 689 690
        q= modify_qscale(s, rce, q, picture_number);

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

691
        assert(q>0.0);
692
    }
M
Michael Niedermayer 已提交
693 694

    if(s->avctx->debug&FF_DEBUG_RC){
695
        av_log(s->avctx, AV_LOG_DEBUG, "%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 已提交
696
        av_get_pict_type_char(pict_type), qmin, q, qmax, picture_number, (int)wanted_bits/1000, (int)s->total_bits/1000,
M
Michael Niedermayer 已提交
697 698 699
        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 已提交
700 701 702 703

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

704 705 706 707 708 709
    if(s->adaptive_quant)
        adaptive_quantization(s, q);
    else
        q= (int)(q + 0.5);
    
    rcc->last_qscale= q;
M
cleanup  
Michael Niedermayer 已提交
710 711 712 713 714 715 716 717 718 719
    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
720
    return q;
721 722 723 724 725 726 727 728
}

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

static int init_pass2(MpegEncContext *s)
{
    RateControlContext *rcc= &s->rc_context;
M
cleanup  
Michael Niedermayer 已提交
729
    AVCodecContext *a= s->avctx;
730
    int i;
731
    double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
732 733 734 735 736 737 738 739
    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;
740
    //int last_i_frame=-10000000;
M
cleanup  
Michael Niedermayer 已提交
741
    const int filter_size= (int)(a->qblur*4) | 1;  
M
Michael Niedermayer 已提交
742 743
    double expected_bits;
    double *qscale, *blured_qscale;
744 745 746 747 748

    /* find complexity & const_bits & decide the pict_types */
    for(i=0; i<rcc->num_entries; i++){
        RateControlEntry *rce= &rcc->entry[i];
        
M
Michael Niedermayer 已提交
749
        rce->new_pict_type= rce->pict_type;
M
Michael Niedermayer 已提交
750 751 752 753
        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] ++;
754 755 756 757 758 759 760

        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){
761
        av_log(s->avctx, AV_LOG_ERROR, "requested bitrate is to low\n");
762 763
        return -1;
    }
M
Michael Niedermayer 已提交
764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782
    
    /* 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]);
    }
783
//printf("qp_i:%f, qp_p:%f, qp_b:%f\n", avg_quantizer[I_TYPE],avg_quantizer[P_TYPE],avg_quantizer[B_TYPE]);
784 785 786 787 788

    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 已提交
789
        
790 791
    qscale= av_malloc(sizeof(double)*rcc->num_entries);
    blured_qscale= av_malloc(sizeof(double)*rcc->num_entries);
M
Michael Niedermayer 已提交
792

793
    for(step=256*256; step>0.0000001; step*=0.5){
M
Michael Niedermayer 已提交
794
        expected_bits=0;
795
        rate_factor+= step;
M
Michael Niedermayer 已提交
796 797 798
        
        rcc->buffer_index= s->avctx->rc_buffer_size/2;

799 800
        /* find qscale */
        for(i=0; i<rcc->num_entries; i++){
M
Michael Niedermayer 已提交
801 802 803 804 805 806
            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--){
807
            RateControlEntry *rce= &rcc->entry[i];
808 809
            
            qscale[i]= get_diff_limited_q(s, rce, qscale[i]);
M
Michael Niedermayer 已提交
810
        }
811

M
Michael Niedermayer 已提交
812 813 814 815 816 817 818 819 820 821
        /* 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;
M
cleanup  
Michael Niedermayer 已提交
822
                double coeff= a->qblur==0 ? 1.0 : exp(-d*d/(a->qblur * a->qblur));
823
            
M
Michael Niedermayer 已提交
824 825 826 827
                if(index < 0 || index >= rcc->num_entries) continue;
                if(pict_type != rcc->entry[index].new_pict_type) continue;
                q+= qscale[index] * coeff;
                sum+= coeff;
828
            }
M
Michael Niedermayer 已提交
829
            blured_qscale[i]= q/sum;
830 831 832 833 834
        }
    
        /* find expected bits */
        for(i=0; i<rcc->num_entries; i++){
            RateControlEntry *rce= &rcc->entry[i];
M
Michael Niedermayer 已提交
835 836
            double bits;
            rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i);
837
            bits= qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits;
M
Michael Niedermayer 已提交
838
//printf("%d %f\n", rce->new_bits, blured_qscale[i]);
839
            bits += 8*ff_vbv_update(s, bits);
M
Michael Niedermayer 已提交
840

841
            rce->expected_bits= expected_bits;
M
Michael Niedermayer 已提交
842
            expected_bits += bits;
843 844
        }

M
Michael Niedermayer 已提交
845
//        printf("%f %d %f\n", expected_bits, (int)all_available_bits, rate_factor);
846 847
        if(expected_bits > all_available_bits) rate_factor-= step;
    }
848 849
    av_free(qscale);
    av_free(blured_qscale);
850

M
Michael Niedermayer 已提交
851
    if(abs(expected_bits/all_available_bits - 1.0) > 0.01 ){
852
        av_log(s->avctx, AV_LOG_ERROR, "Error: 2pass curve failed to converge\n");
M
Michael Niedermayer 已提交
853
        return -1;
854 855
    }

M
Michael Niedermayer 已提交
856
    return 0;
857
}