34 #undef NDEBUG // Always check asserts, the speed effect is far too small to disable them. 
   38 #define M_E 2.718281828 
   43                          double rate_factor, 
int frame_num);
 
   48              "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d " 
   49              "fcode:%d bcode:%d mc-var:%d var:%d icount:%d skipcount:%d hbits:%d;\n",
 
  120     static double (* 
const func1[])(
void *, double) = {
 
  141                         const_names, func1_names, 
func1,
 
  142                         NULL, NULL, 0, s->
avctx);
 
  148     for (i = 0; i < 5; i++) {
 
  172             p = strchr(p + 1, 
';');
 
  198             next = strchr(p, 
';');
 
  203             e = sscanf(p, 
" in:%d ", &picture_number);
 
  205             assert(picture_number >= 0);
 
  206             assert(picture_number < rcc->num_entries);
 
  207             rce = &rcc->
entry[picture_number];
 
  209             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",
 
  217                        "statistics are damaged at line %d, parser out=%d\n",
 
  234                    "Xvid ratecontrol requires libavcodec compiled with Xvid support.\n");
 
  253             for (i = 0; i < 60 * 30; i++) {
 
  257                 if (i % ((s->
gop_size + 3) / 4) == 0)
 
  323             buffer_size, rcc->
buffer_index, frame_size, min_rate, max_rate);
 
  338             int stuffing = ceil((rcc->
buffer_index - buffer_size) / 8);
 
  357                          double rate_factor, 
int frame_num)
 
  362     const double mb_num     = s->
mb_num;
 
  386         rcc->next_non_b_qscale,
 
  411         if (rco[i].start_frame > frame_num)
 
  413         if (rco[i].end_frame < frame_num)
 
  417             bits = 
qp2bits(rce, rco[i].qscale);  
 
  457         if (q > last_q + maxdiff)
 
  458             q = last_q + maxdiff;
 
  459         else if (q < last_q - maxdiff)
 
  460             q = last_q - maxdiff;
 
  479     assert(qmin <= qmax);
 
  503                             double q, 
int frame_num)
 
  527             double d = 2 * (buffer_size - expected_size) / buffer_size;
 
  541                            "limiting QP %f -> %f\n", q, q_limit);
 
  547             double d = 2 * expected_size / buffer_size;
 
  561                            "limiting QP %f -> %f\n", q, q_limit);
 
  566     av_dlog(s, 
"q:%f max:%f min:%f size:%f index:%f agr:%f\n",
 
  575         double min2 = log(qmin);
 
  576         double max2 = log(qmax);
 
  579         q  = (q - min2) / (max2 - min2) - 0.5;
 
  581         q  = 1.0 / (1.0 + exp(q));
 
  582         q  = q * (max2 - min2) + min2;
 
  600     double new_coeff = size * q / (var + 1);
 
  607     p->
coeff += new_coeff;
 
  619     float bits_sum                   = 0.0;
 
  620     float cplx_sum                   = 0.0;
 
  629     for (i = 0; i < s->
mb_num; i++) {
 
  631         float temp_cplx = sqrt(pic->
mc_mb_var[mb_xy]); 
 
  632         float spat_cplx = sqrt(pic->
mb_var[mb_xy]);
 
  633         const int lumi  = pic->
mb_mean[mb_xy];
 
  638         float mb_factor = 0.0;
 
  646             factor = 1.0 + p_masking;
 
  649             factor = pow(temp_cplx, -temp_cplx_masking);
 
  651         factor *= pow(spat_cplx, -spatial_cplx_masking);
 
  654             factor *= (1.0 - (lumi - 128) * (lumi - 128) * lumi_masking);
 
  656             factor *= (1.0 - (lumi - 128) * (lumi - 128) * dark_masking);
 
  658         if (mb_x < mb_width / 5) {
 
  659             mb_distance = mb_width / 5 - mb_x;
 
  660             mb_factor   = (float)mb_distance / (
float)(mb_width / 5);
 
  661         } 
else if (mb_x > 4 * mb_width / 5) {
 
  662             mb_distance = mb_x - 4 * mb_width / 5;
 
  663             mb_factor   = (float)mb_distance / (
float)(mb_width / 5);
 
  665         if (mb_y < mb_height / 5) {
 
  666             mb_distance = mb_height / 5 - mb_y;
 
  667             mb_factor   = 
FFMAX(mb_factor,
 
  668                                 (
float)mb_distance / (
float)(mb_height / 5));
 
  669         } 
else if (mb_y > 4 * mb_height / 5) {
 
  670             mb_distance = mb_y - 4 * mb_height / 5;
 
  671             mb_factor   = 
FFMAX(mb_factor,
 
  672                                 (
float)mb_distance / (
float)(mb_height / 5));
 
  675         factor *= 1.0 - border_masking * mb_factor;
 
  677         if (factor < 0.00001)
 
  689         float factor = bits_sum / cplx_sum;
 
  690         for (i = 0; i < s->
mb_num; i++) {
 
  691             float newq = q * cplx_tab[i] / bits_tab[i];
 
  695                 bits_sum -= bits_tab[i];
 
  696                 cplx_sum -= cplx_tab[i] * q / qmax;
 
  697             } 
else if (newq < qmin) {
 
  698                 bits_sum -= bits_tab[i];
 
  699                 cplx_sum -= cplx_tab[i] * q / qmin;
 
  702         if (bits_sum < 0.001)
 
  704         if (cplx_sum < 0.001)
 
  708     for (i = 0; i < s->
mb_num; i++) {
 
  710         float newq      = q * cplx_tab[i] / bits_tab[i];
 
  714             newq *= bits_sum / cplx_sum;
 
  717         intq = (int)(newq + 0.5);
 
  721         else if (intq < qmin)
 
  742     float br_compensation;
 
  768     if (picture_number > 2 && !dry_run) {
 
  779         assert(picture_number >= 0);
 
  784         rce         = &rcc->
entry[picture_number];
 
  799             wanted_bits = (uint64_t)(s->
bit_rate * (
double)picture_number / fps);
 
  801             wanted_bits = (uint64_t)(s->
bit_rate * (
double)dts_pic->
f.
pts / fps);
 
  806     if (br_compensation <= 0.0)
 
  807         br_compensation = 0.001;
 
  818                 br_compensation, s->
frame_bits, var, pict_type);
 
  850         q = 
get_qscale(s, rce, rate_factor, picture_number);
 
  878                "%c qp:%d<%2.1f<%d %d want:%d total:%d comp:%f st_q:%2.2f " 
  879                "size:%d var:%d/%d br:%d fps:%d\n",
 
  881                qmin, q, qmax, picture_number,
 
  882                (
int)wanted_bits / 1000, (
int)s->
total_bits / 1000,
 
  915     double complexity[5]   = { 0 }; 
 
  916     uint64_t const_bits[5] = { 0 }; 
 
  917     uint64_t all_const_bits;
 
  918     uint64_t all_available_bits = (uint64_t)(s->
bit_rate *
 
  920     double rate_factor          = 0;
 
  922     const int filter_size = (int)(a->
qblur * 4) | 1;
 
  923     double expected_bits = 0; 
 
  924     double *qscale, *blurred_qscale, qscale_sum;
 
  945     if (all_available_bits < all_const_bits) {
 
  954     for (step = 256 * 256; step > 0.0000001; step *= 0.5) {
 
  967         assert(filter_size % 2 == 1);
 
  987             double q = 0.0, sum = 0.0;
 
  989             for (j = 0; j < filter_size; j++) {
 
  990                 int index    = i + j - filter_size / 2;
 
  991                 double d     = index - i;
 
 1001             blurred_qscale[i] = q / sum;
 
 1015             expected_bits     += 
bits;
 
 1019                 "expected_bits: %f all_available_bits: %d rate_factor: %f\n",
 
 1020                 expected_bits, (
int)all_available_bits, rate_factor);
 
 1021         if (expected_bits > all_available_bits) {
 
 1022             rate_factor -= step;
 
 1032         av_dlog(s, 
"[lavc rc] entry[%d].new_qscale = %.3f  qp = %.3f\n",
 
 1039     assert(toobig <= 40);
 
 1041            "[lavc rc] requested bitrate: %d bps  expected bitrate: %d bps\n",
 
 1043            (
int)(expected_bits / ((
double)all_available_bits / s->
bit_rate)));
 
 1045            "[lavc rc] estimated target average qp: %.3f\n",
 
 1049                "[lavc rc] Using all of requested bitrate is not " 
 1050                "necessary for this video with these parameters.\n");
 
 1051     } 
else if (toobig == 40) {
 
 1053                "[lavc rc] Error: bitrate too low for this video " 
 1054                "with these parameters.\n");
 
 1056     } 
else if (fabs(expected_bits / all_available_bits - 1.0) > 0.01) {
 
 1058                "[lavc rc] Error: 2pass curve failed to converge\n");