ratecontrol.c 29.6 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

/**
 * @file ratecontrol.c
 * Rate control for video encoders.
24
 */
M
Michael Niedermayer 已提交
25

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",
42 43
            s->current_picture_ptr->display_picture_number, s->current_picture_ptr->coded_picture_number, s->pict_type,
            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
        rcc->pred[i].count= 1.0;
56

M
Michael Niedermayer 已提交
57 58 59 60 61 62
        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
        rcc->entry = (RateControlEntry*)av_mallocz(i*sizeof(RateControlEntry));
        rcc->num_entries= i;
81

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
            rce->misc_bits= s->mb_num + 10;
            rce->mb_var_sum= s->mb_num*100;
89 90
        }

M
Michael Niedermayer 已提交
91 92 93
        /* 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",
111
                   &rce->pict_type, &rce->qscale, &rce->i_tex_bits, &rce->p_tex_bits, &rce->mv_bits, &rce->misc_bits,
M
Michael Niedermayer 已提交
112 113
                   &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
        if(init_pass2(s) < 0) return -1;
    }
122

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
        rcc->pass1_wanted_bits=0.001;
130

M
Michael Niedermayer 已提交
131 132 133 134 135 136
        /* 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;
137

M
Michael Niedermayer 已提交
138 139 140 141 142 143 144
                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
    }
    return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ bits;
}
199

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;
206

M
Michael Niedermayer 已提交
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
            if(stuffing < 4 && s->codec_id == CODEC_ID_MPEG4)
                stuffing=4;
            rcc->buffer_index -= 8*stuffing;
226

227 228 229 230
            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
    double q, bits;
    const int pict_type= rce->new_pict_type;
244
    const double mb_num= s->mb_num;
M
Michael Niedermayer 已提交
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
    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
        "bits2qp",
        "qp2bits",
        NULL
    };

    bits= ff_eval(s->avctx->rc_eq, const_values, const_names, func1, func1_names, NULL, NULL, rce);
313

M
Michael Niedermayer 已提交
314
    rcc->pass1_rc_eq_output_sum+= bits;
M
Michael Niedermayer 已提交
315 316 317
    bits*=rate_factor;
    if(bits<0.0) bits=0.0;
    bits+= 1.0; //avoid 1/0 issues
318

M
Michael Niedermayer 已提交
319 320 321 322 323
    /* 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;
324 325

        if(rco[i].qscale)
M
Michael Niedermayer 已提交
326 327 328 329 330 331
            bits= qp2bits(rce, rco[i].qscale); //FIXME move at end to really force it?
        else
            bits*= rco[i].quality_factor;
    }

    q= bits2qp(rce, bits);
332

M
Michael Niedermayer 已提交
333 334 335 336 337
    /* 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];
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

    rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring
364

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
    int qmin= s->avctx->lmin;
376
    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;
392

M
Michael Niedermayer 已提交
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;
406

M
Michael Niedermayer 已提交
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
        if     (q<qmin) q=qmin;
        else if(q>qmax) q=qmax;
    }else{
        double min2= log(qmin);
        double max2= log(qmax);
457

M
Michael Niedermayer 已提交
458 459 460 461 462
        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;
463

M
Michael Niedermayer 已提交
464 465
        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
#endif
529 530 531
        if(spat_cplx < 4) spat_cplx= 4; //FIXME finetune
        if(temp_cplx < 4) temp_cplx= 4; //FIXME finetune

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
        if(factor<0.00001) factor= 0.00001;
564

565 566 567 568 569 570 571 572 573
        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 611 612 613 614 615 616 617 618 619 620

void ff_get_2pass_fcode(MpegEncContext *s){
    RateControlContext *rcc= &s->rc_context;
    int picture_number= s->picture_number;
    RateControlEntry *rce;

    rce= &rcc->entry[picture_number];
    s->f_code= rce->f_code;
    s->b_code= rce->b_code;
}

621
//FIXME rd or at least approx for dquant
622

623
float ff_rate_estimate_qscale(MpegEncContext *s, int dry_run)
624 625
{
    float q;
626
    int qmin, qmax;
627 628 629 630
    float br_compensation;
    double diff;
    double short_term_q;
    double fps;
M
Michael Niedermayer 已提交
631
    int picture_number= s->picture_number;
632
    int64_t wanted_bits;
M
Michael Niedermayer 已提交
633
    RateControlContext *rcc= &s->rc_context;
M
cleanup  
Michael Niedermayer 已提交
634
    AVCodecContext *a= s->avctx;
M
Michael Niedermayer 已提交
635 636 637 638 639
    RateControlEntry local_rce, *rce;
    double bits;
    double rate_factor;
    int var;
    const int pict_type= s->pict_type;
M
cleanup  
Michael Niedermayer 已提交
640
    Picture * const pic= &s->current_picture;
641 642
    emms_c();

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

645
    fps= 1/av_q2d(s->avctx->time_base);
M
fixing  
Michael Niedermayer 已提交
646
//printf("input_pic_num:%d pic_num:%d frame_rate:%d\n", s->input_picture_number, s->picture_number, s->frame_rate);
647
        /* update predictors */
648
    if(picture_number>2 && !dry_run){
M
Michael Niedermayer 已提交
649 650
        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);
651 652
    }

M
Michael Niedermayer 已提交
653 654 655 656 657 658 659 660 661
    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);
    }
662

M
Michael Niedermayer 已提交
663
    diff= s->total_bits - wanted_bits;
M
cleanup  
Michael Niedermayer 已提交
664
    br_compensation= (a->bit_rate_tolerance - diff)/a->bit_rate_tolerance;
M
Michael Niedermayer 已提交
665 666
    if(br_compensation<=0.0) br_compensation=0.001;

M
cleanup  
Michael Niedermayer 已提交
667
    var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum;
668

F
Fabrice Bellard 已提交
669
    short_term_q = 0; /* avoid warning */
M
Michael Niedermayer 已提交
670 671 672 673 674 675 676
    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{
677
        rce->pict_type=
M
Michael Niedermayer 已提交
678
        rce->new_pict_type= pict_type;
M
cleanup  
Michael Niedermayer 已提交
679 680
        rce->mc_mb_var_sum= pic->mc_mb_var_sum;
        rce->mb_var_sum   = pic->   mb_var_sum;
681
        rce->qscale   = FF_QP2LAMBDA * 2;
M
Michael Niedermayer 已提交
682 683 684 685 686 687 688 689 690 691 692 693 694 695
        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;
696

M
Michael Niedermayer 已提交
697
            rce->mv_bits= bits*0.1;
698
        }
M
Michael Niedermayer 已提交
699 700 701 702
        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] ++;
703

M
Michael Niedermayer 已提交
704
        bits= rce->i_tex_bits + rce->p_tex_bits;
M
Michael Niedermayer 已提交
705
        rate_factor= rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum * br_compensation;
706

M
Michael Niedermayer 已提交
707
        q= get_qscale(s, rce, rate_factor, picture_number);
708

709
        assert(q>0.0);
M
Michael Niedermayer 已提交
710
//printf("%f ", q);
711
        q= get_diff_limited_q(s, rce, q);
M
Michael Niedermayer 已提交
712 713 714 715
//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 已提交
716 717
            rcc->short_term_qsum*=a->qblur;
            rcc->short_term_qcount*=a->qblur;
M
Michael Niedermayer 已提交
718 719 720 721 722 723 724

            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 已提交
725
        assert(q>0.0);
726

M
Michael Niedermayer 已提交
727 728 729 730
        q= modify_qscale(s, rce, q, picture_number);

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

731
        assert(q>0.0);
732
    }
M
Michael Niedermayer 已提交
733 734

    if(s->avctx->debug&FF_DEBUG_RC){
735
        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 已提交
736
        av_get_pict_type_char(pict_type), qmin, q, qmax, picture_number, (int)wanted_bits/1000, (int)s->total_bits/1000,
M
Michael Niedermayer 已提交
737 738 739
        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 已提交
740

741
    if     (q<qmin) q=qmin;
M
Michael Niedermayer 已提交
742 743
    else if(q>qmax) q=qmax;

744 745 746 747
    if(s->adaptive_quant)
        adaptive_quantization(s, q);
    else
        q= (int)(q + 0.5);
748

749 750 751 752 753
    if(!dry_run){
        rcc->last_qscale= q;
        rcc->last_mc_mb_var_sum= pic->mc_mb_var_sum;
        rcc->last_mb_var_sum= pic->mb_var_sum;
    }
M
cleanup  
Michael Niedermayer 已提交
754 755 756 757 758 759 760 761
#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
762
    return q;
763 764 765 766 767 768 769 770
}

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

static int init_pass2(MpegEncContext *s)
{
    RateControlContext *rcc= &s->rc_context;
M
cleanup  
Michael Niedermayer 已提交
771
    AVCodecContext *a= s->avctx;
772
    int i;
773
    double fps= 1/av_q2d(s->avctx->time_base);
774 775 776 777 778 779 780 781
    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;
782
    //int last_i_frame=-10000000;
783
    const int filter_size= (int)(a->qblur*4) | 1;
M
Michael Niedermayer 已提交
784 785
    double expected_bits;
    double *qscale, *blured_qscale;
786 787 788 789

    /* find complexity & const_bits & decide the pict_types */
    for(i=0; i<rcc->num_entries; i++){
        RateControlEntry *rce= &rcc->entry[i];
790

M
Michael Niedermayer 已提交
791
        rce->new_pict_type= rce->pict_type;
M
Michael Niedermayer 已提交
792 793 794 795
        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] ++;
796 797 798 799 800

        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];
801

802
    if(all_available_bits < all_const_bits){
803
        av_log(s->avctx, AV_LOG_ERROR, "requested bitrate is to low\n");
804 805
        return -1;
    }
806

M
Michael Niedermayer 已提交
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;
812

M
Michael Niedermayer 已提交
813 814
        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;
815 816 817

        expected_bits=
            + all_const_bits
M
Michael Niedermayer 已提交
818 819 820
            + complexity[I_TYPE]/avg_quantizer[I_TYPE]
            + complexity[P_TYPE]/avg_quantizer[P_TYPE]
            + complexity[B_TYPE]/avg_quantizer[B_TYPE];
821

M
Michael Niedermayer 已提交
822 823 824
        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]);
    }
825
//printf("qp_i:%f, qp_p:%f, qp_b:%f\n", avg_quantizer[I_TYPE],avg_quantizer[P_TYPE],avg_quantizer[B_TYPE]);
826 827 828 829 830

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

832 833
    qscale= av_malloc(sizeof(double)*rcc->num_entries);
    blured_qscale= av_malloc(sizeof(double)*rcc->num_entries);
M
Michael Niedermayer 已提交
834

835
    for(step=256*256; step>0.0000001; step*=0.5){
M
Michael Niedermayer 已提交
836
        expected_bits=0;
837
        rate_factor+= step;
838

M
Michael Niedermayer 已提交
839 840
        rcc->buffer_index= s->avctx->rc_buffer_size/2;

841 842
        /* find qscale */
        for(i=0; i<rcc->num_entries; i++){
M
Michael Niedermayer 已提交
843 844 845 846 847 848
            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--){
849
            RateControlEntry *rce= &rcc->entry[i];
850

851
            qscale[i]= get_diff_limited_q(s, rce, qscale[i]);
M
Michael Niedermayer 已提交
852
        }
853

M
Michael Niedermayer 已提交
854 855 856 857 858 859
        /* 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;
860

M
Michael Niedermayer 已提交
861 862 863
            for(j=0; j<filter_size; j++){
                int index= i+j-filter_size/2;
                double d= index-i;
M
cleanup  
Michael Niedermayer 已提交
864
                double coeff= a->qblur==0 ? 1.0 : exp(-d*d/(a->qblur * a->qblur));
865

M
Michael Niedermayer 已提交
866 867 868 869
                if(index < 0 || index >= rcc->num_entries) continue;
                if(pict_type != rcc->entry[index].new_pict_type) continue;
                q+= qscale[index] * coeff;
                sum+= coeff;
870
            }
M
Michael Niedermayer 已提交
871
            blured_qscale[i]= q/sum;
872
        }
873

874 875 876
        /* find expected bits */
        for(i=0; i<rcc->num_entries; i++){
            RateControlEntry *rce= &rcc->entry[i];
M
Michael Niedermayer 已提交
877 878
            double bits;
            rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i);
879
            bits= qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits;
M
Michael Niedermayer 已提交
880
//printf("%d %f\n", rce->new_bits, blured_qscale[i]);
881
            bits += 8*ff_vbv_update(s, bits);
M
Michael Niedermayer 已提交
882

883
            rce->expected_bits= expected_bits;
M
Michael Niedermayer 已提交
884
            expected_bits += bits;
885 886
        }

M
Michael Niedermayer 已提交
887
//        printf("%f %d %f\n", expected_bits, (int)all_available_bits, rate_factor);
888 889
        if(expected_bits > all_available_bits) rate_factor-= step;
    }
890 891
    av_free(qscale);
    av_free(blured_qscale);
892

M
Michael Niedermayer 已提交
893
    if(abs(expected_bits/all_available_bits - 1.0) > 0.01 ){
894
        av_log(s->avctx, AV_LOG_ERROR, "Error: 2pass curve failed to converge\n");
M
Michael Niedermayer 已提交
895
        return -1;
896 897
    }

M
Michael Niedermayer 已提交
898
    return 0;
899
}