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