ratecontrol.c 29.7 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
        rcc->entry = (RateControlEntry*)av_mallocz(i*sizeof(RateControlEntry));
        rcc->num_entries= i;
        
82
        /* init all to skipped p frames (with b frames we might have a not encoded frame at the end FIXME) */
M
Michael Niedermayer 已提交
83 84 85
        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/(1/av_q2d(s->avctx->time_base)); //FIXME missbehaves a little for variable fps
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= 1/av_q2d(s->avctx->time_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;
403
    const double fps= 1/av_q2d(s->avctx->time_base);
M
Michael Niedermayer 已提交
404 405
    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
    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;
504
    const float border_masking = s->avctx->border_masking;
505 506 507 508
    float bits_sum= 0.0;
    float cplx_sum= 0.0;
    float cplx_tab[s->mb_num];
    float bits_tab[s->mb_num];
509 510
    const int qmin= s->avctx->mb_lmin;
    const int qmax= s->avctx->mb_lmax;
M
cleanup  
Michael Niedermayer 已提交
511
    Picture * const pic= &s->current_picture;
512 513
    const int mb_width = s->mb_width;
    const int mb_height = s->mb_height;
514 515
    
    for(i=0; i<s->mb_num; i++){
M
Michael Niedermayer 已提交
516
        const int mb_xy= s->mb_index2xy[i];
517
        float temp_cplx= sqrt(pic->mc_mb_var[mb_xy]); //FIXME merge in pow()
M
Michael Niedermayer 已提交
518 519
        float spat_cplx= sqrt(pic->mb_var[mb_xy]);
        const int lumi= pic->mb_mean[mb_xy];
520
        float bits, cplx, factor;
521 522 523 524
        int mb_x = mb_xy % s->mb_stride;
        int mb_y = mb_xy / s->mb_stride;
        int mb_distance;
        float mb_factor = 0.0;
525
#if 0        
526 527
        if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune
        if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune
528 529 530 531
#endif   
        if(spat_cplx < 4) spat_cplx= 4; //FIXME finetune
        if(temp_cplx < 4) temp_cplx= 4; //FIXME finetune

M
Michael Niedermayer 已提交
532
        if((s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTRA)){//FIXME hq mode 
533 534 535 536 537 538 539
            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);
540 541 542 543 544

        if(lumi>127)
            factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking);
        else
            factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking);
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561

        if(mb_x < mb_width/5){
            mb_distance = mb_width/5 - mb_x;
            mb_factor = (float)mb_distance / (float)(mb_width/5);
        }else if(mb_x > 4*mb_width/5){
            mb_distance = mb_x - 4*mb_width/5;
            mb_factor = (float)mb_distance / (float)(mb_width/5);
        }
        if(mb_y < mb_height/5){
            mb_distance = mb_height/5 - mb_y;
            mb_factor = FFMAX(mb_factor, (float)mb_distance / (float)(mb_height/5));
        }else if(mb_y > 4*mb_height/5){
            mb_distance = mb_y - 4*mb_height/5;
            mb_factor = FFMAX(mb_factor, (float)mb_distance / (float)(mb_height/5));
        }

        factor*= 1.0 - border_masking*mb_factor;
562 563 564 565 566 567 568 569 570 571 572 573
        
        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){
574
        float factor= bits_sum/cplx_sum;
575 576
        for(i=0; i<s->mb_num; i++){
            float newq= q*cplx_tab[i]/bits_tab[i];
577
            newq*= factor;
578 579 580 581 582 583 584 585 586 587

            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;
            }
        }
588 589
        if(bits_sum < 0.001) bits_sum= 0.001;
        if(cplx_sum < 0.001) cplx_sum= 0.001;
590 591 592
    }
   
    for(i=0; i<s->mb_num; i++){
M
Michael Niedermayer 已提交
593
        const int mb_xy= s->mb_index2xy[i];
594 595 596 597 598 599 600
        float newq= q*cplx_tab[i]/bits_tab[i];
        int intq;

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

601
        intq= (int)(newq + 0.5);
602 603 604 605 606

        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]));
607
        s->lambda_table[mb_xy]= intq;
608 609
    }
}
610
//FIXME rd or at least approx for dquant
611 612

float ff_rate_estimate_qscale(MpegEncContext *s)
613 614
{
    float q;
615
    int qmin, qmax;
616 617 618 619
    float br_compensation;
    double diff;
    double short_term_q;
    double fps;
M
Michael Niedermayer 已提交
620
    int picture_number= s->picture_number;
621
    int64_t wanted_bits;
M
Michael Niedermayer 已提交
622
    RateControlContext *rcc= &s->rc_context;
M
cleanup  
Michael Niedermayer 已提交
623
    AVCodecContext *a= s->avctx;
M
Michael Niedermayer 已提交
624 625 626 627 628
    RateControlEntry local_rce, *rce;
    double bits;
    double rate_factor;
    int var;
    const int pict_type= s->pict_type;
M
cleanup  
Michael Niedermayer 已提交
629
    Picture * const pic= &s->current_picture;
630 631
    emms_c();

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

634
    fps= 1/av_q2d(s->avctx->time_base);
M
fixing  
Michael Niedermayer 已提交
635
//printf("input_pic_num:%d pic_num:%d frame_rate:%d\n", s->input_picture_number, s->picture_number, s->frame_rate);
636 637
        /* update predictors */
    if(picture_number>2){
M
Michael Niedermayer 已提交
638 639
        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);
640 641
    }

M
Michael Niedermayer 已提交
642 643 644 645 646 647 648 649 650
    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);
    }
651

M
Michael Niedermayer 已提交
652
    diff= s->total_bits - wanted_bits;
M
cleanup  
Michael Niedermayer 已提交
653
    br_compensation= (a->bit_rate_tolerance - diff)/a->bit_rate_tolerance;
M
Michael Niedermayer 已提交
654 655
    if(br_compensation<=0.0) br_compensation=0.001;

M
cleanup  
Michael Niedermayer 已提交
656
    var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum;
M
Michael Niedermayer 已提交
657
    
F
Fabrice Bellard 已提交
658
    short_term_q = 0; /* avoid warning */
M
Michael Niedermayer 已提交
659 660 661 662 663 664 665 666 667
    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 已提交
668 669
        rce->mc_mb_var_sum= pic->mc_mb_var_sum;
        rce->mb_var_sum   = pic->   mb_var_sum;
670
        rce->qscale   = FF_QP2LAMBDA * 2;
M
Michael Niedermayer 已提交
671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686
        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;
687
        }
M
Michael Niedermayer 已提交
688 689 690 691
        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] ++;
692

M
Michael Niedermayer 已提交
693
        bits= rce->i_tex_bits + rce->p_tex_bits;
M
Michael Niedermayer 已提交
694
        rate_factor= rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum * br_compensation;
695
    
M
Michael Niedermayer 已提交
696
        q= get_qscale(s, rce, rate_factor, picture_number);
697

698
        assert(q>0.0);
M
Michael Niedermayer 已提交
699
//printf("%f ", q);
700
        q= get_diff_limited_q(s, rce, q);
M
Michael Niedermayer 已提交
701 702 703 704
//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 已提交
705 706
            rcc->short_term_qsum*=a->qblur;
            rcc->short_term_qcount*=a->qblur;
M
Michael Niedermayer 已提交
707 708 709 710 711 712 713

            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 已提交
714 715
        assert(q>0.0);
        
M
Michael Niedermayer 已提交
716 717 718 719
        q= modify_qscale(s, rce, q, picture_number);

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

720
        assert(q>0.0);
721
    }
M
Michael Niedermayer 已提交
722 723

    if(s->avctx->debug&FF_DEBUG_RC){
724
        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 已提交
725
        av_get_pict_type_char(pict_type), qmin, q, qmax, picture_number, (int)wanted_bits/1000, (int)s->total_bits/1000,
M
Michael Niedermayer 已提交
726 727 728
        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 已提交
729 730 731 732

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

733 734 735 736 737 738
    if(s->adaptive_quant)
        adaptive_quantization(s, q);
    else
        q= (int)(q + 0.5);
    
    rcc->last_qscale= q;
M
cleanup  
Michael Niedermayer 已提交
739 740 741 742 743 744 745 746 747 748
    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
749
    return q;
750 751 752 753 754 755 756 757
}

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

static int init_pass2(MpegEncContext *s)
{
    RateControlContext *rcc= &s->rc_context;
M
cleanup  
Michael Niedermayer 已提交
758
    AVCodecContext *a= s->avctx;
759
    int i;
760
    double fps= 1/av_q2d(s->avctx->time_base);
761 762 763 764 765 766 767 768
    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;
769
    //int last_i_frame=-10000000;
M
cleanup  
Michael Niedermayer 已提交
770
    const int filter_size= (int)(a->qblur*4) | 1;  
M
Michael Niedermayer 已提交
771 772
    double expected_bits;
    double *qscale, *blured_qscale;
773 774 775 776 777

    /* find complexity & const_bits & decide the pict_types */
    for(i=0; i<rcc->num_entries; i++){
        RateControlEntry *rce= &rcc->entry[i];
        
M
Michael Niedermayer 已提交
778
        rce->new_pict_type= rce->pict_type;
M
Michael Niedermayer 已提交
779 780 781 782
        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] ++;
783 784 785 786 787 788 789

        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){
790
        av_log(s->avctx, AV_LOG_ERROR, "requested bitrate is to low\n");
791 792
        return -1;
    }
M
Michael Niedermayer 已提交
793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811
    
    /* 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]);
    }
812
//printf("qp_i:%f, qp_p:%f, qp_b:%f\n", avg_quantizer[I_TYPE],avg_quantizer[P_TYPE],avg_quantizer[B_TYPE]);
813 814 815 816 817

    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 已提交
818
        
819 820
    qscale= av_malloc(sizeof(double)*rcc->num_entries);
    blured_qscale= av_malloc(sizeof(double)*rcc->num_entries);
M
Michael Niedermayer 已提交
821

822
    for(step=256*256; step>0.0000001; step*=0.5){
M
Michael Niedermayer 已提交
823
        expected_bits=0;
824
        rate_factor+= step;
M
Michael Niedermayer 已提交
825 826 827
        
        rcc->buffer_index= s->avctx->rc_buffer_size/2;

828 829
        /* find qscale */
        for(i=0; i<rcc->num_entries; i++){
M
Michael Niedermayer 已提交
830 831 832 833 834 835
            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--){
836
            RateControlEntry *rce= &rcc->entry[i];
837 838
            
            qscale[i]= get_diff_limited_q(s, rce, qscale[i]);
M
Michael Niedermayer 已提交
839
        }
840

M
Michael Niedermayer 已提交
841 842 843 844 845 846 847 848 849 850
        /* 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 已提交
851
                double coeff= a->qblur==0 ? 1.0 : exp(-d*d/(a->qblur * a->qblur));
852
            
M
Michael Niedermayer 已提交
853 854 855 856
                if(index < 0 || index >= rcc->num_entries) continue;
                if(pict_type != rcc->entry[index].new_pict_type) continue;
                q+= qscale[index] * coeff;
                sum+= coeff;
857
            }
M
Michael Niedermayer 已提交
858
            blured_qscale[i]= q/sum;
859 860 861 862 863
        }
    
        /* find expected bits */
        for(i=0; i<rcc->num_entries; i++){
            RateControlEntry *rce= &rcc->entry[i];
M
Michael Niedermayer 已提交
864 865
            double bits;
            rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i);
866
            bits= qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits;
M
Michael Niedermayer 已提交
867
//printf("%d %f\n", rce->new_bits, blured_qscale[i]);
868
            bits += 8*ff_vbv_update(s, bits);
M
Michael Niedermayer 已提交
869

870
            rce->expected_bits= expected_bits;
M
Michael Niedermayer 已提交
871
            expected_bits += bits;
872 873
        }

M
Michael Niedermayer 已提交
874
//        printf("%f %d %f\n", expected_bits, (int)all_available_bits, rate_factor);
875 876
        if(expected_bits > all_available_bits) rate_factor-= step;
    }
877 878
    av_free(qscale);
    av_free(blured_qscale);
879

M
Michael Niedermayer 已提交
880
    if(abs(expected_bits/all_available_bits - 1.0) > 0.01 ){
881
        av_log(s->avctx, AV_LOG_ERROR, "Error: 2pass curve failed to converge\n");
M
Michael Niedermayer 已提交
882
        return -1;
883 884
    }

M
Michael Niedermayer 已提交
885
    return 0;
886
}