ratecontrol.c 28.8 KB
Newer Older
1
/*
F
Fabrice Bellard 已提交
2 3
 * Rate control for video encoders
 *
4
 * Copyright (c) 2002-2004 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){
M
Michael Niedermayer 已提交
41
    snprintf(s->avctx->stats_out, 256, "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
        i+= s->max_b_frames;
77 78
        if(i<=0 || i>=INT_MAX / sizeof(RateControlEntry))
            return -1;
M
Michael Niedermayer 已提交
79 80 81 82 83 84 85
        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;
86
            rce->qscale= rce->new_qscale=FF_QP2LAMBDA * 2;
M
Michael Niedermayer 已提交
87 88 89 90 91 92 93
            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++){
94 95 96
            RateControlEntry *rce;
            int picture_number;
            int e;
M
Michael Niedermayer 已提交
97 98 99 100 101 102 103 104 105 106 107
            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);
108
            rce= &rcc->entry[picture_number];
M
Michael Niedermayer 已提交
109

110
            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 已提交
111 112 113
                   &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){
114
                av_log(s->avctx, AV_LOG_ERROR, "statistics are damaged at line %d, parser out=%d\n", i, e);
115 116
                return -1;
            }
M
Michael Niedermayer 已提交
117
            p= next;
118 119 120 121 122
        }
        
        if(init_pass2(s) < 0) return -1;
    }
     
M
Michael Niedermayer 已提交
123 124 125 126
    if(!(s->flags&CODEC_FLAG_PASS2)){

        rcc->short_term_qsum=0.001;
        rcc->short_term_qcount=0.001;
127
    
M
Michael Niedermayer 已提交
128
        rcc->pass1_rc_eq_output_sum= 0.001;
M
Michael Niedermayer 已提交
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
        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;
145
                rce.qscale   = FF_QP2LAMBDA * 2;
M
Michael Niedermayer 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
                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] ++;
165

M
Michael Niedermayer 已提交
166
                bits= rce.i_tex_bits + rce.p_tex_bits;
167

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

    }
    
175 176 177 178 179 180 181 182
    return 0;
}

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

183
    av_freep(&rcc->entry);
184 185
}

M
Michael Niedermayer 已提交
186 187
static inline double qp2bits(RateControlEntry *rce, double qp){
    if(qp<=0.0){
188
        av_log(NULL, AV_LOG_ERROR, "qp<=0.0\n");
M
Michael Niedermayer 已提交
189 190 191 192 193 194
    }
    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){
195
        av_log(NULL, AV_LOG_ERROR, "bits<0.9\n");
M
Michael Niedermayer 已提交
196 197 198 199
    }
    return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ bits;
}
    
200
int ff_vbv_update(MpegEncContext *s, int frame_size){
M
Michael Niedermayer 已提交
201
    RateControlContext *rcc= &s->rc_context;
202
    const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
M
Michael Niedermayer 已提交
203
    const int buffer_size= s->avctx->rc_buffer_size;
M
Michael Niedermayer 已提交
204 205
    const double min_rate= s->avctx->rc_min_rate/fps;
    const double max_rate= s->avctx->rc_max_rate/fps;
M
Michael Niedermayer 已提交
206 207
    
//printf("%d %f %d %f %f\n", buffer_size, rcc->buffer_index, frame_size, min_rate, max_rate);
M
Michael Niedermayer 已提交
208
    if(buffer_size){
M
Michael Niedermayer 已提交
209 210
        int left;

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

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

M
Michael Niedermayer 已提交
220 221
        if(rcc->buffer_index > buffer_size){
            int stuffing= ceil((rcc->buffer_index - buffer_size)/8);
222 223 224 225 226 227 228 229 230
            
            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 已提交
231
        }
M
Michael Niedermayer 已提交
232
    }
233
    return 0;
M
Michael Niedermayer 已提交
234 235 236 237 238 239 240
}

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

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

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

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

M
Michael Niedermayer 已提交
368 369 370 371 372 373 374
    return q;
}

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

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

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

391
    if(qmax<qmin) qmax= qmin;
M
Michael Niedermayer 已提交
392 393 394 395 396 397 398 399 400 401 402
    
    *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 已提交
403 404 405
    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 已提交
406 407 408 409 410 411 412 413
    
    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 已提交
414
//printf("q:%f\n", q);
M
Michael Niedermayer 已提交
415 416
    /* buffer overflow/underflow protection */
    if(buffer_size){
417
        double expected_size= rcc->buffer_index;
M
Michael Niedermayer 已提交
418
        double q_limit;
M
Michael Niedermayer 已提交
419 420

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

M
Michael Niedermayer 已提交
426 427 428 429 430 431 432
            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 已提交
433 434 435 436 437
        }

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

M
Michael Niedermayer 已提交
441 442 443 444 445 446 447
            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 已提交
448 449
        }
    }
M
fixing  
Michael Niedermayer 已提交
450
//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);
451
    if(s->avctx->rc_qsquish==0.0 || qmin==qmax){
M
Michael Niedermayer 已提交
452 453 454 455 456 457 458 459 460 461 462 463 464 465
        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);
    }
466
    
M
Michael Niedermayer 已提交
467 468 469
    return q;
}

470 471 472
//----------------------------------
// 1 Pass Code

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

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

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

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

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

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

        if(lumi>127)
            factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking);
        else
            factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking);
538 539 540 541 542 543 544 545 546 547 548 549
        
        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){
550
        float factor= bits_sum/cplx_sum;
551 552
        for(i=0; i<s->mb_num; i++){
            float newq= q*cplx_tab[i]/bits_tab[i];
553
            newq*= factor;
554 555 556 557 558 559 560 561 562 563

            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;
            }
        }
564 565
        if(bits_sum < 0.001) bits_sum= 0.001;
        if(cplx_sum < 0.001) cplx_sum= 0.001;
566 567 568
    }
   
    for(i=0; i<s->mb_num; i++){
M
Michael Niedermayer 已提交
569
        const int mb_xy= s->mb_index2xy[i];
570 571 572 573 574 575 576
        float newq= q*cplx_tab[i]/bits_tab[i];
        int intq;

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

577
        intq= (int)(newq + 0.5);
578 579 580 581 582

        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]));
583
        s->lambda_table[mb_xy]= intq;
584 585
    }
}
586
//FIXME rd or at least approx for dquant
587 588

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

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

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

M
Michael Niedermayer 已提交
618 619 620 621 622 623 624 625 626
    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);
    }
627

M
Michael Niedermayer 已提交
628
    diff= s->total_bits - wanted_bits;
M
cleanup  
Michael Niedermayer 已提交
629
    br_compensation= (a->bit_rate_tolerance - diff)/a->bit_rate_tolerance;
M
Michael Niedermayer 已提交
630 631
    if(br_compensation<=0.0) br_compensation=0.001;

M
cleanup  
Michael Niedermayer 已提交
632
    var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum;
M
Michael Niedermayer 已提交
633
    
F
Fabrice Bellard 已提交
634
    short_term_q = 0; /* avoid warning */
M
Michael Niedermayer 已提交
635 636 637 638 639 640 641 642 643
    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 已提交
644 645
        rce->mc_mb_var_sum= pic->mc_mb_var_sum;
        rce->mb_var_sum   = pic->   mb_var_sum;
646
        rce->qscale   = FF_QP2LAMBDA * 2;
M
Michael Niedermayer 已提交
647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662
        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;
663
        }
M
Michael Niedermayer 已提交
664 665 666 667
        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] ++;
668

M
Michael Niedermayer 已提交
669
        bits= rce->i_tex_bits + rce->p_tex_bits;
M
Michael Niedermayer 已提交
670
        rate_factor= rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum * br_compensation;
671
    
M
Michael Niedermayer 已提交
672
        q= get_qscale(s, rce, rate_factor, picture_number);
673

674
        assert(q>0.0);
M
Michael Niedermayer 已提交
675
//printf("%f ", q);
676
        q= get_diff_limited_q(s, rce, q);
M
Michael Niedermayer 已提交
677 678 679 680
//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 已提交
681 682
            rcc->short_term_qsum*=a->qblur;
            rcc->short_term_qcount*=a->qblur;
M
Michael Niedermayer 已提交
683 684 685 686 687 688 689

            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 已提交
690 691
        assert(q>0.0);
        
M
Michael Niedermayer 已提交
692 693 694 695
        q= modify_qscale(s, rce, q, picture_number);

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

696
        assert(q>0.0);
697
    }
M
Michael Niedermayer 已提交
698 699

    if(s->avctx->debug&FF_DEBUG_RC){
700
        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 已提交
701
        av_get_pict_type_char(pict_type), qmin, q, qmax, picture_number, (int)wanted_bits/1000, (int)s->total_bits/1000,
M
Michael Niedermayer 已提交
702 703 704
        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 已提交
705 706 707 708

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

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

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

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

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

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

    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 已提交
794
        
795 796
    qscale= av_malloc(sizeof(double)*rcc->num_entries);
    blured_qscale= av_malloc(sizeof(double)*rcc->num_entries);
M
Michael Niedermayer 已提交
797

798
    for(step=256*256; step>0.0000001; step*=0.5){
M
Michael Niedermayer 已提交
799
        expected_bits=0;
800
        rate_factor+= step;
M
Michael Niedermayer 已提交
801 802 803
        
        rcc->buffer_index= s->avctx->rc_buffer_size/2;

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

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

846
            rce->expected_bits= expected_bits;
M
Michael Niedermayer 已提交
847
            expected_bits += bits;
848 849
        }

M
Michael Niedermayer 已提交
850
//        printf("%f %d %f\n", expected_bits, (int)all_available_bits, rate_factor);
851 852
        if(expected_bits > all_available_bits) rate_factor-= step;
    }
853 854
    av_free(qscale);
    av_free(blured_qscale);
855

M
Michael Niedermayer 已提交
856
    if(abs(expected_bits/all_available_bits - 1.0) > 0.01 ){
857
        av_log(s->avctx, AV_LOG_ERROR, "Error: 2pass curve failed to converge\n");
M
Michael Niedermayer 已提交
858
        return -1;
859 860
    }

M
Michael Niedermayer 已提交
861
    return 0;
862
}