35 #undef NDEBUG // Always check asserts, the speed effect is far too small to disable them. 
   39 #define M_E 2.718281828 
   46     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",
 
  101     static double (* 
const func1[])(
void *, double)={
 
  106     static const char * 
const func1_names[]={
 
  174             next= strchr(p, 
';');
 
  179             e= sscanf(p, 
" in:%d ", &picture_number);
 
  181             assert(picture_number >= 0);
 
  182             assert(picture_number < rcc->num_entries);
 
  183             rce= &rcc->
entry[picture_number];
 
  185             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",
 
  223             for(i=0; i<60*30; i++){
 
  287             buffer_size, rcc->
buffer_index, frame_size, min_rate, max_rate);
 
  301             int stuffing= ceil((rcc->
buffer_index - buffer_size)/8);
 
  324     const double mb_num= s->
mb_num;
 
  363     if(bits<0.0) bits=0.0;
 
  370         if(rco[i].
end_frame   < frame_num) 
continue;
 
  373             bits= 
qp2bits(rce, rco[i].qscale); 
 
  408         if     (q > last_q + maxdiff) q= last_q + maxdiff;
 
  409         else if(q < last_q - maxdiff) q= last_q - maxdiff;
 
  427     assert(qmin <= qmax);
 
  440     if(qmax<qmin) qmax= qmin;
 
  467             double d= 2*(buffer_size - expected_size)/buffer_size;
 
  469             else if(d<0.0001) d=0.0001;
 
  482             double d= 2*expected_size/buffer_size;
 
  484             else if(d<0.0001) d=0.0001;
 
  496     av_dlog(s, 
"q:%f max:%f min:%f size:%f index:%f agr:%f\n",
 
  501         else if(q>qmax) q=qmax;
 
  503         double min2= log(qmin);
 
  504         double max2= log(qmax);
 
  507         q= (q - min2)/(max2-min2) - 0.5;
 
  509         q= 1.0/(1.0 + exp(q));
 
  510         q= q*(max2-min2) + min2;
 
  528     double new_coeff= size*q / (var + 1);
 
  534     p->
coeff+= new_coeff;
 
  555     for(i=0; i<s->
mb_num; i++){
 
  557         float temp_cplx= sqrt(pic->
mc_mb_var[mb_xy]); 
 
  558         float spat_cplx= sqrt(pic->
mb_var[mb_xy]);
 
  559         const int lumi= pic->
mb_mean[mb_xy];
 
  564         float mb_factor = 0.0;
 
  565         if(spat_cplx < 4) spat_cplx= 4; 
 
  566         if(temp_cplx < 4) temp_cplx= 4; 
 
  570             factor= 1.0 + p_masking;
 
  573             factor= pow(temp_cplx, - temp_cplx_masking);
 
  575         factor*=pow(spat_cplx, - spatial_cplx_masking);
 
  578             factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking);
 
  580             factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking);
 
  582         if(mb_x < mb_width/5){
 
  583             mb_distance = mb_width/5 - mb_x;
 
  584             mb_factor = (float)mb_distance / (
float)(mb_width/5);
 
  585         }
else if(mb_x > 4*mb_width/5){
 
  586             mb_distance = mb_x - 4*mb_width/5;
 
  587             mb_factor = (float)mb_distance / (
float)(mb_width/5);
 
  589         if(mb_y < mb_height/5){
 
  590             mb_distance = mb_height/5 - mb_y;
 
  591             mb_factor = 
FFMAX(mb_factor, (
float)mb_distance / (
float)(mb_height/5));
 
  592         }
else if(mb_y > 4*mb_height/5){
 
  593             mb_distance = mb_y - 4*mb_height/5;
 
  594             mb_factor = 
FFMAX(mb_factor, (
float)mb_distance / (
float)(mb_height/5));
 
  597         factor*= 1.0 - border_masking*mb_factor;
 
  599         if(factor<0.00001) factor= 0.00001;
 
  610         float factor= bits_sum/cplx_sum;
 
  611         for(i=0; i<s->
mb_num; i++){
 
  612             float newq= q*cplx_tab[i]/bits_tab[i];
 
  616                 bits_sum -= bits_tab[i];
 
  617                 cplx_sum -= cplx_tab[i]*q/qmax;
 
  619             else if(newq < qmin){
 
  620                 bits_sum -= bits_tab[i];
 
  621                 cplx_sum -= cplx_tab[i]*q/qmin;
 
  624         if(bits_sum < 0.001) bits_sum= 0.001;
 
  625         if(cplx_sum < 0.001) cplx_sum= 0.001;
 
  628     for(i=0; i<s->
mb_num; i++){
 
  630         float newq= q*cplx_tab[i]/bits_tab[i];
 
  634             newq*= bits_sum/cplx_sum;
 
  637         intq= (int)(newq + 0.5);
 
  639         if     (intq > qmax) intq= qmax;
 
  640         else if(intq < qmin) intq= qmin;
 
  650     rce= &rcc->
entry[picture_number];
 
  661     float br_compensation;
 
  686     if(picture_number>2 && !dry_run){
 
  693         assert(picture_number>=0);
 
  698         rce= &rcc->
entry[picture_number];
 
  712             wanted_bits= (uint64_t)(s->
bit_rate*(
double)picture_number/fps);
 
  714             wanted_bits = (uint64_t)(s->
bit_rate*(
double)dts_pic->
f.
pts / fps);
 
  719     if(br_compensation<=0.0) br_compensation=0.001;
 
  730                 br_compensation, s->
frame_bits, var, pict_type);
 
  762         q= 
get_qscale(s, rce, rate_factor, picture_number);
 
  788         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",
 
  795     else if(q>qmax) q=qmax;
 
  819     double complexity[5]={0,0,0,0,0};   
 
  820     uint64_t const_bits[5]={0,0,0,0,0}; 
 
  821     uint64_t all_const_bits;
 
  823     double rate_factor=0;
 
  826     const int filter_size= (int)(a->
qblur*4) | 1;
 
  827     double expected_bits;
 
  828     double *qscale, *blurred_qscale, qscale_sum;
 
  845     if(all_available_bits < all_const_bits){
 
  854     for(step=256*256; step>0.0000001; step*=0.5){
 
  866         assert(filter_size%2==1);
 
  886             double q=0.0, sum=0.0;
 
  888             for(j=0; j<filter_size; j++){
 
  889                 int index= i+j-filter_size/2;
 
  893                 if(index < 0 || index >= rcc->
num_entries) 
continue;
 
  898             blurred_qscale[i]= q/sum;
 
  910             expected_bits += 
bits;
 
  914                 "expected_bits: %f all_available_bits: %d rate_factor: %f\n",
 
  915                 expected_bits, (
int)all_available_bits, rate_factor);
 
  916         if(expected_bits > all_available_bits) {
 
  927         av_dlog(s, 
"[lavc rc] entry[%d].new_qscale = %.3f  qp = %.3f\n",
 
  933     assert(toobig <= 40);
 
  935         "[lavc rc] requested bitrate: %d bps  expected bitrate: %d bps\n",
 
  937         (
int)(expected_bits / ((
double)all_available_bits/s->
bit_rate)));
 
  939         "[lavc rc] estimated target average qp: %.3f\n",
 
  943             "[lavc rc] Using all of requested bitrate is not " 
  944             "necessary for this video with these parameters.\n");
 
  945     } 
else if (toobig == 40) {
 
  947             "[lavc rc] Error: bitrate too low for this video " 
  948             "with these parameters.\n");
 
  950     } 
else if (fabs(expected_bits/all_available_bits - 1.0) > 0.01) {
 
  952             "[lavc rc] Error: 2pass curve failed to converge\n");