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