00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00026 #include "avcodec.h"
00027 #include "dsputil.h"
00028 #include "mpegvideo.h"
00029
00030 #undef NDEBUG // allways check asserts, the speed effect is far too small to disable them
00031 #include <assert.h>
00032
00033 #ifndef M_E
00034 #define M_E 2.718281828
00035 #endif
00036
00037 static int init_pass2(MpegEncContext *s);
00038 static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num);
00039
00040 void ff_write_pass1_stats(MpegEncContext *s){
00041 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",
00042 s->current_picture_ptr->display_picture_number, s->current_picture_ptr->coded_picture_number, s->pict_type,
00043 s->current_picture.quality, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits,
00044 s->f_code, s->b_code, s->current_picture.mc_mb_var_sum, s->current_picture.mb_var_sum, s->i_count);
00045 }
00046
00047 int ff_rate_control_init(MpegEncContext *s)
00048 {
00049 RateControlContext *rcc= &s->rc_context;
00050 int i;
00051 emms_c();
00052
00053 for(i=0; i<5; i++){
00054 rcc->pred[i].coeff= FF_QP2LAMBDA * 7.0;
00055 rcc->pred[i].count= 1.0;
00056
00057 rcc->pred[i].decay= 0.4;
00058 rcc->i_cplx_sum [i]=
00059 rcc->p_cplx_sum [i]=
00060 rcc->mv_bits_sum[i]=
00061 rcc->qscale_sum [i]=
00062 rcc->frame_count[i]= 1;
00063 rcc->last_qscale_for[i]=FF_QP2LAMBDA * 5;
00064 }
00065 rcc->buffer_index= s->avctx->rc_initial_buffer_occupancy;
00066
00067 if(s->flags&CODEC_FLAG_PASS2){
00068 int i;
00069 char *p;
00070
00071
00072 p= s->avctx->stats_in;
00073 for(i=-1; p; i++){
00074 p= strchr(p+1, ';');
00075 }
00076 i+= s->max_b_frames;
00077 if(i<=0 || i>=INT_MAX / sizeof(RateControlEntry))
00078 return -1;
00079 rcc->entry = (RateControlEntry*)av_mallocz(i*sizeof(RateControlEntry));
00080 rcc->num_entries= i;
00081
00082
00083 for(i=0; i<rcc->num_entries; i++){
00084 RateControlEntry *rce= &rcc->entry[i];
00085 rce->pict_type= rce->new_pict_type=P_TYPE;
00086 rce->qscale= rce->new_qscale=FF_QP2LAMBDA * 2;
00087 rce->misc_bits= s->mb_num + 10;
00088 rce->mb_var_sum= s->mb_num*100;
00089 }
00090
00091
00092 p= s->avctx->stats_in;
00093 for(i=0; i<rcc->num_entries - s->max_b_frames; i++){
00094 RateControlEntry *rce;
00095 int picture_number;
00096 int e;
00097 char *next;
00098
00099 next= strchr(p, ';');
00100 if(next){
00101 (*next)=0;
00102 next++;
00103 }
00104 e= sscanf(p, " in:%d ", &picture_number);
00105
00106 assert(picture_number >= 0);
00107 assert(picture_number < rcc->num_entries);
00108 rce= &rcc->entry[picture_number];
00109
00110 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",
00111 &rce->pict_type, &rce->qscale, &rce->i_tex_bits, &rce->p_tex_bits, &rce->mv_bits, &rce->misc_bits,
00112 &rce->f_code, &rce->b_code, &rce->mc_mb_var_sum, &rce->mb_var_sum, &rce->i_count);
00113 if(e!=12){
00114 av_log(s->avctx, AV_LOG_ERROR, "statistics are damaged at line %d, parser out=%d\n", i, e);
00115 return -1;
00116 }
00117 p= next;
00118 }
00119
00120 if(init_pass2(s) < 0) return -1;
00121 }
00122
00123 if(!(s->flags&CODEC_FLAG_PASS2)){
00124
00125 rcc->short_term_qsum=0.001;
00126 rcc->short_term_qcount=0.001;
00127
00128 rcc->pass1_rc_eq_output_sum= 0.001;
00129 rcc->pass1_wanted_bits=0.001;
00130
00131
00132 if(s->avctx->rc_initial_cplx){
00133 for(i=0; i<60*30; i++){
00134 double bits= s->avctx->rc_initial_cplx * (i/10000.0 + 1.0)*s->mb_num;
00135 RateControlEntry rce;
00136 double q;
00137
00138 if (i%((s->gop_size+3)/4)==0) rce.pict_type= I_TYPE;
00139 else if(i%(s->max_b_frames+1)) rce.pict_type= B_TYPE;
00140 else rce.pict_type= P_TYPE;
00141
00142 rce.new_pict_type= rce.pict_type;
00143 rce.mc_mb_var_sum= bits*s->mb_num/100000;
00144 rce.mb_var_sum = s->mb_num;
00145 rce.qscale = FF_QP2LAMBDA * 2;
00146 rce.f_code = 2;
00147 rce.b_code = 1;
00148 rce.misc_bits= 1;
00149
00150 if(s->pict_type== I_TYPE){
00151 rce.i_count = s->mb_num;
00152 rce.i_tex_bits= bits;
00153 rce.p_tex_bits= 0;
00154 rce.mv_bits= 0;
00155 }else{
00156 rce.i_count = 0;
00157 rce.i_tex_bits= 0;
00158 rce.p_tex_bits= bits*0.9;
00159 rce.mv_bits= bits*0.1;
00160 }
00161 rcc->i_cplx_sum [rce.pict_type] += rce.i_tex_bits*rce.qscale;
00162 rcc->p_cplx_sum [rce.pict_type] += rce.p_tex_bits*rce.qscale;
00163 rcc->mv_bits_sum[rce.pict_type] += rce.mv_bits;
00164 rcc->frame_count[rce.pict_type] ++;
00165
00166 bits= rce.i_tex_bits + rce.p_tex_bits;
00167
00168 q= get_qscale(s, &rce, rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum, i);
00169 rcc->pass1_wanted_bits+= s->bit_rate/(1/av_q2d(s->avctx->time_base));
00170 }
00171 }
00172
00173 }
00174
00175 return 0;
00176 }
00177
00178 void ff_rate_control_uninit(MpegEncContext *s)
00179 {
00180 RateControlContext *rcc= &s->rc_context;
00181 emms_c();
00182
00183 av_freep(&rcc->entry);
00184 }
00185
00186 static inline double qp2bits(RateControlEntry *rce, double qp){
00187 if(qp<=0.0){
00188 av_log(NULL, AV_LOG_ERROR, "qp<=0.0\n");
00189 }
00190 return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ qp;
00191 }
00192
00193 static inline double bits2qp(RateControlEntry *rce, double bits){
00194 if(bits<0.9){
00195 av_log(NULL, AV_LOG_ERROR, "bits<0.9\n");
00196 }
00197 return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ bits;
00198 }
00199
00200 int ff_vbv_update(MpegEncContext *s, int frame_size){
00201 RateControlContext *rcc= &s->rc_context;
00202 const double fps= 1/av_q2d(s->avctx->time_base);
00203 const int buffer_size= s->avctx->rc_buffer_size;
00204 const double min_rate= s->avctx->rc_min_rate/fps;
00205 const double max_rate= s->avctx->rc_max_rate/fps;
00206
00207
00208 if(buffer_size){
00209 int left;
00210
00211 rcc->buffer_index-= frame_size;
00212 if(rcc->buffer_index < 0){
00213 av_log(s->avctx, AV_LOG_ERROR, "rc buffer underflow\n");
00214 rcc->buffer_index= 0;
00215 }
00216
00217 left= buffer_size - rcc->buffer_index - 1;
00218 rcc->buffer_index += clip(left, min_rate, max_rate);
00219
00220 if(rcc->buffer_index > buffer_size){
00221 int stuffing= ceil((rcc->buffer_index - buffer_size)/8);
00222
00223 if(stuffing < 4 && s->codec_id == CODEC_ID_MPEG4)
00224 stuffing=4;
00225 rcc->buffer_index -= 8*stuffing;
00226
00227 if(s->avctx->debug & FF_DEBUG_RC)
00228 av_log(s->avctx, AV_LOG_DEBUG, "stuffing %d bytes\n", stuffing);
00229
00230 return stuffing;
00231 }
00232 }
00233 return 0;
00234 }
00235
00239 static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num){
00240 RateControlContext *rcc= &s->rc_context;
00241 AVCodecContext *a= s->avctx;
00242 double q, bits;
00243 const int pict_type= rce->new_pict_type;
00244 const double mb_num= s->mb_num;
00245 int i;
00246
00247 double const_values[]={
00248 M_PI,
00249 M_E,
00250 rce->i_tex_bits*rce->qscale,
00251 rce->p_tex_bits*rce->qscale,
00252 (rce->i_tex_bits + rce->p_tex_bits)*(double)rce->qscale,
00253 rce->mv_bits/mb_num,
00254 rce->pict_type == B_TYPE ? (rce->f_code + rce->b_code)*0.5 : rce->f_code,
00255 rce->i_count/mb_num,
00256 rce->mc_mb_var_sum/mb_num,
00257 rce->mb_var_sum/mb_num,
00258 rce->pict_type == I_TYPE,
00259 rce->pict_type == P_TYPE,
00260 rce->pict_type == B_TYPE,
00261 rcc->qscale_sum[pict_type] / (double)rcc->frame_count[pict_type],
00262 a->qcompress,
00263
00264
00265
00266
00267 rcc->i_cplx_sum[I_TYPE] / (double)rcc->frame_count[I_TYPE],
00268 rcc->i_cplx_sum[P_TYPE] / (double)rcc->frame_count[P_TYPE],
00269 rcc->p_cplx_sum[P_TYPE] / (double)rcc->frame_count[P_TYPE],
00270 rcc->p_cplx_sum[B_TYPE] / (double)rcc->frame_count[B_TYPE],
00271 (rcc->i_cplx_sum[pict_type] + rcc->p_cplx_sum[pict_type]) / (double)rcc->frame_count[pict_type],
00272 0
00273 };
00274 static const char *const_names[]={
00275 "PI",
00276 "E",
00277 "iTex",
00278 "pTex",
00279 "tex",
00280 "mv",
00281 "fCode",
00282 "iCount",
00283 "mcVar",
00284 "var",
00285 "isI",
00286 "isP",
00287 "isB",
00288 "avgQP",
00289 "qComp",
00290
00291
00292
00293
00294 "avgIITex",
00295 "avgPITex",
00296 "avgPPTex",
00297 "avgBPTex",
00298 "avgTex",
00299 NULL
00300 };
00301 static double (*func1[])(void *, double)={
00302 (void *)bits2qp,
00303 (void *)qp2bits,
00304 NULL
00305 };
00306 static const char *func1_names[]={
00307 "bits2qp",
00308 "qp2bits",
00309 NULL
00310 };
00311
00312 bits= ff_eval(s->avctx->rc_eq, const_values, const_names, func1, func1_names, NULL, NULL, rce);
00313
00314 rcc->pass1_rc_eq_output_sum+= bits;
00315 bits*=rate_factor;
00316 if(bits<0.0) bits=0.0;
00317 bits+= 1.0;
00318
00319
00320 for(i=0; i<s->avctx->rc_override_count; i++){
00321 RcOverride *rco= s->avctx->rc_override;
00322 if(rco[i].start_frame > frame_num) continue;
00323 if(rco[i].end_frame < frame_num) continue;
00324
00325 if(rco[i].qscale)
00326 bits= qp2bits(rce, rco[i].qscale);
00327 else
00328 bits*= rco[i].quality_factor;
00329 }
00330
00331 q= bits2qp(rce, bits);
00332
00333
00334 if (pict_type==I_TYPE && s->avctx->i_quant_factor<0.0)
00335 q= -q*s->avctx->i_quant_factor + s->avctx->i_quant_offset;
00336 else if(pict_type==B_TYPE && s->avctx->b_quant_factor<0.0)
00337 q= -q*s->avctx->b_quant_factor + s->avctx->b_quant_offset;
00338
00339 return q;
00340 }
00341
00342 static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, double q){
00343 RateControlContext *rcc= &s->rc_context;
00344 AVCodecContext *a= s->avctx;
00345 const int pict_type= rce->new_pict_type;
00346 const double last_p_q = rcc->last_qscale_for[P_TYPE];
00347 const double last_non_b_q= rcc->last_qscale_for[rcc->last_non_b_pict_type];
00348
00349 if (pict_type==I_TYPE && (a->i_quant_factor>0.0 || rcc->last_non_b_pict_type==P_TYPE))
00350 q= last_p_q *ABS(a->i_quant_factor) + a->i_quant_offset;
00351 else if(pict_type==B_TYPE && a->b_quant_factor>0.0)
00352 q= last_non_b_q* a->b_quant_factor + a->b_quant_offset;
00353
00354
00355 if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){
00356 double last_q= rcc->last_qscale_for[pict_type];
00357 const int maxdiff= FF_QP2LAMBDA * a->max_qdiff;
00358
00359 if (q > last_q + maxdiff) q= last_q + maxdiff;
00360 else if(q < last_q - maxdiff) q= last_q - maxdiff;
00361 }
00362
00363 rcc->last_qscale_for[pict_type]= q;
00364
00365 if(pict_type!=B_TYPE)
00366 rcc->last_non_b_pict_type= pict_type;
00367
00368 return q;
00369 }
00370
00374 static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){
00375 int qmin= s->avctx->lmin;
00376 int qmax= s->avctx->lmax;
00377
00378 assert(qmin <= qmax);
00379
00380 if(pict_type==B_TYPE){
00381 qmin= (int)(qmin*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5);
00382 qmax= (int)(qmax*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5);
00383 }else if(pict_type==I_TYPE){
00384 qmin= (int)(qmin*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5);
00385 qmax= (int)(qmax*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5);
00386 }
00387
00388 qmin= clip(qmin, 1, FF_LAMBDA_MAX);
00389 qmax= clip(qmax, 1, FF_LAMBDA_MAX);
00390
00391 if(qmax<qmin) qmax= qmin;
00392
00393 *qmin_ret= qmin;
00394 *qmax_ret= qmax;
00395 }
00396
00397 static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q, int frame_num){
00398 RateControlContext *rcc= &s->rc_context;
00399 int qmin, qmax;
00400 double bits;
00401 const int pict_type= rce->new_pict_type;
00402 const double buffer_size= s->avctx->rc_buffer_size;
00403 const double fps= 1/av_q2d(s->avctx->time_base);
00404 const double min_rate= s->avctx->rc_min_rate / fps;
00405 const double max_rate= s->avctx->rc_max_rate / fps;
00406
00407 get_qminmax(&qmin, &qmax, s, pict_type);
00408
00409
00410 if(s->avctx->rc_qmod_freq && frame_num%s->avctx->rc_qmod_freq==0 && pict_type==P_TYPE)
00411 q*= s->avctx->rc_qmod_amp;
00412
00413 bits= qp2bits(rce, q);
00414
00415
00416 if(buffer_size){
00417 double expected_size= rcc->buffer_index;
00418 double q_limit;
00419
00420 if(min_rate){
00421 double d= 2*(buffer_size - expected_size)/buffer_size;
00422 if(d>1.0) d=1.0;
00423 else if(d<0.0001) d=0.0001;
00424 q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
00425
00426 q_limit= bits2qp(rce, FFMAX((min_rate - buffer_size + rcc->buffer_index)*3, 1));
00427 if(q > q_limit){
00428 if(s->avctx->debug&FF_DEBUG_RC){
00429 av_log(s->avctx, AV_LOG_DEBUG, "limiting QP %f -> %f\n", q, q_limit);
00430 }
00431 q= q_limit;
00432 }
00433 }
00434
00435 if(max_rate){
00436 double d= 2*expected_size/buffer_size;
00437 if(d>1.0) d=1.0;
00438 else if(d<0.0001) d=0.0001;
00439 q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
00440
00441 q_limit= bits2qp(rce, FFMAX(rcc->buffer_index/3, 1));
00442 if(q < q_limit){
00443 if(s->avctx->debug&FF_DEBUG_RC){
00444 av_log(s->avctx, AV_LOG_DEBUG, "limiting QP %f -> %f\n", q, q_limit);
00445 }
00446 q= q_limit;
00447 }
00448 }
00449 }
00450
00451 if(s->avctx->rc_qsquish==0.0 || qmin==qmax){
00452 if (q<qmin) q=qmin;
00453 else if(q>qmax) q=qmax;
00454 }else{
00455 double min2= log(qmin);
00456 double max2= log(qmax);
00457
00458 q= log(q);
00459 q= (q - min2)/(max2-min2) - 0.5;
00460 q*= -4.0;
00461 q= 1.0/(1.0 + exp(q));
00462 q= q*(max2-min2) + min2;
00463
00464 q= exp(q);
00465 }
00466
00467 return q;
00468 }
00469
00470
00471
00472
00473 static double predict_size(Predictor *p, double q, double var)
00474 {
00475 return p->coeff*var / (q*p->count);
00476 }
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486 static void update_predictor(Predictor *p, double q, double var, double size)
00487 {
00488 double new_coeff= size*q / (var + 1);
00489 if(var<10) return;
00490
00491 p->count*= p->decay;
00492 p->coeff*= p->decay;
00493 p->count++;
00494 p->coeff+= new_coeff;
00495 }
00496
00497 static void adaptive_quantization(MpegEncContext *s, double q){
00498 int i;
00499 const float lumi_masking= s->avctx->lumi_masking / (128.0*128.0);
00500 const float dark_masking= s->avctx->dark_masking / (128.0*128.0);
00501 const float temp_cplx_masking= s->avctx->temporal_cplx_masking;
00502 const float spatial_cplx_masking = s->avctx->spatial_cplx_masking;
00503 const float p_masking = s->avctx->p_masking;
00504 const float border_masking = s->avctx->border_masking;
00505 float bits_sum= 0.0;
00506 float cplx_sum= 0.0;
00507 float cplx_tab[s->mb_num];
00508 float bits_tab[s->mb_num];
00509 const int qmin= s->avctx->mb_lmin;
00510 const int qmax= s->avctx->mb_lmax;
00511 Picture * const pic= &s->current_picture;
00512 const int mb_width = s->mb_width;
00513 const int mb_height = s->mb_height;
00514
00515 for(i=0; i<s->mb_num; i++){
00516 const int mb_xy= s->mb_index2xy[i];
00517 float temp_cplx= sqrt(pic->mc_mb_var[mb_xy]);
00518 float spat_cplx= sqrt(pic->mb_var[mb_xy]);
00519 const int lumi= pic->mb_mean[mb_xy];
00520 float bits, cplx, factor;
00521 int mb_x = mb_xy % s->mb_stride;
00522 int mb_y = mb_xy / s->mb_stride;
00523 int mb_distance;
00524 float mb_factor = 0.0;
00525 #if 0
00526 if(spat_cplx < q/3) spat_cplx= q/3;
00527 if(temp_cplx < q/3) temp_cplx= q/3;
00528 #endif
00529 if(spat_cplx < 4) spat_cplx= 4;
00530 if(temp_cplx < 4) temp_cplx= 4;
00531
00532 if((s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTRA)){
00533 cplx= spat_cplx;
00534 factor= 1.0 + p_masking;
00535 }else{
00536 cplx= temp_cplx;
00537 factor= pow(temp_cplx, - temp_cplx_masking);
00538 }
00539 factor*=pow(spat_cplx, - spatial_cplx_masking);
00540
00541 if(lumi>127)
00542 factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking);
00543 else
00544 factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking);
00545
00546 if(mb_x < mb_width/5){
00547 mb_distance = mb_width/5 - mb_x;
00548 mb_factor = (float)mb_distance / (float)(mb_width/5);
00549 }else if(mb_x > 4*mb_width/5){
00550 mb_distance = mb_x - 4*mb_width/5;
00551 mb_factor = (float)mb_distance / (float)(mb_width/5);
00552 }
00553 if(mb_y < mb_height/5){
00554 mb_distance = mb_height/5 - mb_y;
00555 mb_factor = FFMAX(mb_factor, (float)mb_distance / (float)(mb_height/5));
00556 }else if(mb_y > 4*mb_height/5){
00557 mb_distance = mb_y - 4*mb_height/5;
00558 mb_factor = FFMAX(mb_factor, (float)mb_distance / (float)(mb_height/5));
00559 }
00560
00561 factor*= 1.0 - border_masking*mb_factor;
00562
00563 if(factor<0.00001) factor= 0.00001;
00564
00565 bits= cplx*factor;
00566 cplx_sum+= cplx;
00567 bits_sum+= bits;
00568 cplx_tab[i]= cplx;
00569 bits_tab[i]= bits;
00570 }
00571
00572
00573 if(s->flags&CODEC_FLAG_NORMALIZE_AQP){
00574 float factor= bits_sum/cplx_sum;
00575 for(i=0; i<s->mb_num; i++){
00576 float newq= q*cplx_tab[i]/bits_tab[i];
00577 newq*= factor;
00578
00579 if (newq > qmax){
00580 bits_sum -= bits_tab[i];
00581 cplx_sum -= cplx_tab[i]*q/qmax;
00582 }
00583 else if(newq < qmin){
00584 bits_sum -= bits_tab[i];
00585 cplx_sum -= cplx_tab[i]*q/qmin;
00586 }
00587 }
00588 if(bits_sum < 0.001) bits_sum= 0.001;
00589 if(cplx_sum < 0.001) cplx_sum= 0.001;
00590 }
00591
00592 for(i=0; i<s->mb_num; i++){
00593 const int mb_xy= s->mb_index2xy[i];
00594 float newq= q*cplx_tab[i]/bits_tab[i];
00595 int intq;
00596
00597 if(s->flags&CODEC_FLAG_NORMALIZE_AQP){
00598 newq*= bits_sum/cplx_sum;
00599 }
00600
00601 intq= (int)(newq + 0.5);
00602
00603 if (intq > qmax) intq= qmax;
00604 else if(intq < qmin) intq= qmin;
00605
00606
00607 s->lambda_table[mb_xy]= intq;
00608 }
00609 }
00610
00611
00612 float ff_rate_estimate_qscale(MpegEncContext *s)
00613 {
00614 float q;
00615 int qmin, qmax;
00616 float br_compensation;
00617 double diff;
00618 double short_term_q;
00619 double fps;
00620 int picture_number= s->picture_number;
00621 int64_t wanted_bits;
00622 RateControlContext *rcc= &s->rc_context;
00623 AVCodecContext *a= s->avctx;
00624 RateControlEntry local_rce, *rce;
00625 double bits;
00626 double rate_factor;
00627 int var;
00628 const int pict_type= s->pict_type;
00629 Picture * const pic= &s->current_picture;
00630 emms_c();
00631
00632 get_qminmax(&qmin, &qmax, s, pict_type);
00633
00634 fps= 1/av_q2d(s->avctx->time_base);
00635
00636
00637 if(picture_number>2){
00638 const int last_var= s->last_pict_type == I_TYPE ? rcc->last_mb_var_sum : rcc->last_mc_mb_var_sum;
00639 update_predictor(&rcc->pred[s->last_pict_type], rcc->last_qscale, sqrt(last_var), s->frame_bits);
00640 }
00641
00642 if(s->flags&CODEC_FLAG_PASS2){
00643 assert(picture_number>=0);
00644 assert(picture_number<rcc->num_entries);
00645 rce= &rcc->entry[picture_number];
00646 wanted_bits= rce->expected_bits;
00647 }else{
00648 rce= &local_rce;
00649 wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps);
00650 }
00651
00652 diff= s->total_bits - wanted_bits;
00653 br_compensation= (a->bit_rate_tolerance - diff)/a->bit_rate_tolerance;
00654 if(br_compensation<=0.0) br_compensation=0.001;
00655
00656 var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum;
00657
00658 short_term_q = 0;
00659 if(s->flags&CODEC_FLAG_PASS2){
00660 if(pict_type!=I_TYPE)
00661 assert(pict_type == rce->new_pict_type);
00662
00663 q= rce->new_qscale / br_compensation;
00664
00665 }else{
00666 rce->pict_type=
00667 rce->new_pict_type= pict_type;
00668 rce->mc_mb_var_sum= pic->mc_mb_var_sum;
00669 rce->mb_var_sum = pic-> mb_var_sum;
00670 rce->qscale = FF_QP2LAMBDA * 2;
00671 rce->f_code = s->f_code;
00672 rce->b_code = s->b_code;
00673 rce->misc_bits= 1;
00674
00675 bits= predict_size(&rcc->pred[pict_type], rce->qscale, sqrt(var));
00676 if(pict_type== I_TYPE){
00677 rce->i_count = s->mb_num;
00678 rce->i_tex_bits= bits;
00679 rce->p_tex_bits= 0;
00680 rce->mv_bits= 0;
00681 }else{
00682 rce->i_count = 0;
00683 rce->i_tex_bits= 0;
00684 rce->p_tex_bits= bits*0.9;
00685
00686 rce->mv_bits= bits*0.1;
00687 }
00688 rcc->i_cplx_sum [pict_type] += rce->i_tex_bits*rce->qscale;
00689 rcc->p_cplx_sum [pict_type] += rce->p_tex_bits*rce->qscale;
00690 rcc->mv_bits_sum[pict_type] += rce->mv_bits;
00691 rcc->frame_count[pict_type] ++;
00692
00693 bits= rce->i_tex_bits + rce->p_tex_bits;
00694 rate_factor= rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum * br_compensation;
00695
00696 q= get_qscale(s, rce, rate_factor, picture_number);
00697
00698 assert(q>0.0);
00699
00700 q= get_diff_limited_q(s, rce, q);
00701
00702 assert(q>0.0);
00703
00704 if(pict_type==P_TYPE || s->intra_only){
00705 rcc->short_term_qsum*=a->qblur;
00706 rcc->short_term_qcount*=a->qblur;
00707
00708 rcc->short_term_qsum+= q;
00709 rcc->short_term_qcount++;
00710
00711 q= short_term_q= rcc->short_term_qsum/rcc->short_term_qcount;
00712
00713 }
00714 assert(q>0.0);
00715
00716 q= modify_qscale(s, rce, q, picture_number);
00717
00718 rcc->pass1_wanted_bits+= s->bit_rate/fps;
00719
00720 assert(q>0.0);
00721 }
00722
00723 if(s->avctx->debug&FF_DEBUG_RC){
00724 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",
00725 av_get_pict_type_char(pict_type), qmin, q, qmax, picture_number, (int)wanted_bits/1000, (int)s->total_bits/1000,
00726 br_compensation, short_term_q, s->frame_bits, pic->mb_var_sum, pic->mc_mb_var_sum, s->bit_rate/1000, (int)fps
00727 );
00728 }
00729
00730 if (q<qmin) q=qmin;
00731 else if(q>qmax) q=qmax;
00732
00733 if(s->adaptive_quant)
00734 adaptive_quantization(s, q);
00735 else
00736 q= (int)(q + 0.5);
00737
00738 rcc->last_qscale= q;
00739 rcc->last_mc_mb_var_sum= pic->mc_mb_var_sum;
00740 rcc->last_mb_var_sum= pic->mb_var_sum;
00741 #if 0
00742 {
00743 static int mvsum=0, texsum=0;
00744 mvsum += s->mv_bits;
00745 texsum += s->i_tex_bits + s->p_tex_bits;
00746 printf("%d %d//\n\n", mvsum, texsum);
00747 }
00748 #endif
00749 return q;
00750 }
00751
00752
00753
00754
00755 static int init_pass2(MpegEncContext *s)
00756 {
00757 RateControlContext *rcc= &s->rc_context;
00758 AVCodecContext *a= s->avctx;
00759 int i;
00760 double fps= 1/av_q2d(s->avctx->time_base);
00761 double complexity[5]={0,0,0,0,0};
00762 double avg_quantizer[5];
00763 uint64_t const_bits[5]={0,0,0,0,0};
00764 uint64_t available_bits[5];
00765 uint64_t all_const_bits;
00766 uint64_t all_available_bits= (uint64_t)(s->bit_rate*(double)rcc->num_entries/fps);
00767 double rate_factor=0;
00768 double step;
00769
00770 const int filter_size= (int)(a->qblur*4) | 1;
00771 double expected_bits;
00772 double *qscale, *blured_qscale;
00773
00774
00775 for(i=0; i<rcc->num_entries; i++){
00776 RateControlEntry *rce= &rcc->entry[i];
00777
00778 rce->new_pict_type= rce->pict_type;
00779 rcc->i_cplx_sum [rce->pict_type] += rce->i_tex_bits*rce->qscale;
00780 rcc->p_cplx_sum [rce->pict_type] += rce->p_tex_bits*rce->qscale;
00781 rcc->mv_bits_sum[rce->pict_type] += rce->mv_bits;
00782 rcc->frame_count[rce->pict_type] ++;
00783
00784 complexity[rce->new_pict_type]+= (rce->i_tex_bits+ rce->p_tex_bits)*(double)rce->qscale;
00785 const_bits[rce->new_pict_type]+= rce->mv_bits + rce->misc_bits;
00786 }
00787 all_const_bits= const_bits[I_TYPE] + const_bits[P_TYPE] + const_bits[B_TYPE];
00788
00789 if(all_available_bits < all_const_bits){
00790 av_log(s->avctx, AV_LOG_ERROR, "requested bitrate is to low\n");
00791 return -1;
00792 }
00793
00794
00795 avg_quantizer[P_TYPE]=0;
00796 for(step=256*256; step>0.0000001; step*=0.5){
00797 double expected_bits=0;
00798 avg_quantizer[P_TYPE]+= step;
00799
00800 avg_quantizer[I_TYPE]= avg_quantizer[P_TYPE]*ABS(s->avctx->i_quant_factor) + s->avctx->i_quant_offset;
00801 avg_quantizer[B_TYPE]= avg_quantizer[P_TYPE]*ABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
00802
00803 expected_bits=
00804 + all_const_bits
00805 + complexity[I_TYPE]/avg_quantizer[I_TYPE]
00806 + complexity[P_TYPE]/avg_quantizer[P_TYPE]
00807 + complexity[B_TYPE]/avg_quantizer[B_TYPE];
00808
00809 if(expected_bits < all_available_bits) avg_quantizer[P_TYPE]-= step;
00810
00811 }
00812
00813
00814 for(i=0; i<5; i++){
00815 available_bits[i]= const_bits[i] + complexity[i]/avg_quantizer[i];
00816 }
00817
00818
00819 qscale= av_malloc(sizeof(double)*rcc->num_entries);
00820 blured_qscale= av_malloc(sizeof(double)*rcc->num_entries);
00821
00822 for(step=256*256; step>0.0000001; step*=0.5){
00823 expected_bits=0;
00824 rate_factor+= step;
00825
00826 rcc->buffer_index= s->avctx->rc_buffer_size/2;
00827
00828
00829 for(i=0; i<rcc->num_entries; i++){
00830 qscale[i]= get_qscale(s, &rcc->entry[i], rate_factor, i);
00831 }
00832 assert(filter_size%2==1);
00833
00834
00835 for(i=rcc->num_entries-1; i>=0; i--){
00836 RateControlEntry *rce= &rcc->entry[i];
00837
00838 qscale[i]= get_diff_limited_q(s, rce, qscale[i]);
00839 }
00840
00841
00842 for(i=0; i<rcc->num_entries; i++){
00843 RateControlEntry *rce= &rcc->entry[i];
00844 const int pict_type= rce->new_pict_type;
00845 int j;
00846 double q=0.0, sum=0.0;
00847
00848 for(j=0; j<filter_size; j++){
00849 int index= i+j-filter_size/2;
00850 double d= index-i;
00851 double coeff= a->qblur==0 ? 1.0 : exp(-d*d/(a->qblur * a->qblur));
00852
00853 if(index < 0 || index >= rcc->num_entries) continue;
00854 if(pict_type != rcc->entry[index].new_pict_type) continue;
00855 q+= qscale[index] * coeff;
00856 sum+= coeff;
00857 }
00858 blured_qscale[i]= q/sum;
00859 }
00860
00861
00862 for(i=0; i<rcc->num_entries; i++){
00863 RateControlEntry *rce= &rcc->entry[i];
00864 double bits;
00865 rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i);
00866 bits= qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits;
00867
00868 bits += 8*ff_vbv_update(s, bits);
00869
00870 rce->expected_bits= expected_bits;
00871 expected_bits += bits;
00872 }
00873
00874
00875 if(expected_bits > all_available_bits) rate_factor-= step;
00876 }
00877 av_free(qscale);
00878 av_free(blured_qscale);
00879
00880 if(abs(expected_bits/all_available_bits - 1.0) > 0.01 ){
00881 av_log(s->avctx, AV_LOG_ERROR, "Error: 2pass curve failed to converge\n");
00882 return -1;
00883 }
00884
00885 return 0;
00886 }