33 #undef NDEBUG // Always check asserts, the speed effect is far too small to disable them.
37 #define M_E 2.718281828
42 double rate_factor,
int frame_num);
47 "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d "
48 "fcode:%d bcode:%d mc-var:%d var:%d icount:%d skipcount:%d hbits:%d;\n",
119 static double (*
const func1[])(
void *, double) = {
124 static const char *
const func1_names[] = {
140 const_names, func1_names, func1,
147 for (i = 0; i < 5; i++) {
171 p = strchr(p + 1,
';');
197 next = strchr(p,
';');
202 e = sscanf(p,
" in:%d ", &picture_number);
204 assert(picture_number >= 0);
205 assert(picture_number < rcc->num_entries);
206 rce = &rcc->
entry[picture_number];
208 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",
216 "statistics are damaged at line %d, parser out=%d\n",
233 "Xvid ratecontrol requires libavcodec compiled with Xvid support.\n");
252 for (i = 0; i < 60 * 30; i++) {
256 if (i % ((s->
gop_size + 3) / 4) == 0)
322 buffer_size, rcc->
buffer_index, frame_size, min_rate, max_rate);
337 int stuffing = ceil((rcc->
buffer_index - buffer_size) / 8);
356 double rate_factor,
int frame_num)
361 const double mb_num = s->
mb_num;
385 rcc->next_non_b_qscale,
410 if (rco[i].start_frame > frame_num)
412 if (rco[i].end_frame < frame_num)
416 bits =
qp2bits(rce, rco[i].qscale);
456 if (q > last_q + maxdiff)
457 q = last_q + maxdiff;
458 else if (q < last_q - maxdiff)
459 q = last_q - maxdiff;
478 assert(qmin <= qmax);
502 double q,
int frame_num)
526 double d = 2 * (buffer_size - expected_size) / buffer_size;
540 "limiting QP %f -> %f\n", q, q_limit);
546 double d = 2 * expected_size / buffer_size;
560 "limiting QP %f -> %f\n", q, q_limit);
565 av_dlog(s,
"q:%f max:%f min:%f size:%f index:%f agr:%f\n",
574 double min2 = log(qmin);
575 double max2 = log(qmax);
578 q = (q - min2) / (max2 - min2) - 0.5;
580 q = 1.0 / (1.0 + exp(q));
581 q = q * (max2 - min2) + min2;
599 double new_coeff = size * q / (var + 1);
606 p->
coeff += new_coeff;
618 float bits_sum = 0.0;
619 float cplx_sum = 0.0;
628 for (i = 0; i < s->
mb_num; i++) {
630 float temp_cplx = sqrt(pic->
mc_mb_var[mb_xy]);
631 float spat_cplx = sqrt(pic->
mb_var[mb_xy]);
632 const int lumi = pic->
mb_mean[mb_xy];
637 float mb_factor = 0.0;
645 factor = 1.0 + p_masking;
648 factor = pow(temp_cplx, -temp_cplx_masking);
650 factor *= pow(spat_cplx, -spatial_cplx_masking);
653 factor *= (1.0 - (lumi - 128) * (lumi - 128) * lumi_masking);
655 factor *= (1.0 - (lumi - 128) * (lumi - 128) * dark_masking);
657 if (mb_x < mb_width / 5) {
658 mb_distance = mb_width / 5 - mb_x;
659 mb_factor = (float)mb_distance / (
float)(mb_width / 5);
660 }
else if (mb_x > 4 * mb_width / 5) {
661 mb_distance = mb_x - 4 * mb_width / 5;
662 mb_factor = (float)mb_distance / (
float)(mb_width / 5);
664 if (mb_y < mb_height / 5) {
665 mb_distance = mb_height / 5 - mb_y;
666 mb_factor =
FFMAX(mb_factor,
667 (
float)mb_distance / (
float)(mb_height / 5));
668 }
else if (mb_y > 4 * mb_height / 5) {
669 mb_distance = mb_y - 4 * mb_height / 5;
670 mb_factor =
FFMAX(mb_factor,
671 (
float)mb_distance / (
float)(mb_height / 5));
674 factor *= 1.0 - border_masking * mb_factor;
676 if (factor < 0.00001)
688 float factor = bits_sum / cplx_sum;
689 for (i = 0; i < s->
mb_num; i++) {
690 float newq = q * cplx_tab[i] / bits_tab[i];
694 bits_sum -= bits_tab[i];
695 cplx_sum -= cplx_tab[i] * q / qmax;
696 }
else if (newq < qmin) {
697 bits_sum -= bits_tab[i];
698 cplx_sum -= cplx_tab[i] * q / qmin;
701 if (bits_sum < 0.001)
703 if (cplx_sum < 0.001)
707 for (i = 0; i < s->
mb_num; i++) {
709 float newq = q * cplx_tab[i] / bits_tab[i];
713 newq *= bits_sum / cplx_sum;
716 intq = (int)(newq + 0.5);
720 else if (intq < qmin)
741 float br_compensation;
767 if (picture_number > 2 && !dry_run) {
778 assert(picture_number >= 0);
783 rce = &rcc->
entry[picture_number];
798 wanted_bits = (uint64_t)(s->
bit_rate * (
double)picture_number / fps);
800 wanted_bits = (uint64_t)(s->
bit_rate * (
double)dts_pic->
f.
pts / fps);
805 if (br_compensation <= 0.0)
806 br_compensation = 0.001;
817 br_compensation, s->
frame_bits, var, pict_type);
849 q =
get_qscale(s, rce, rate_factor, picture_number);
877 "%c qp:%d<%2.1f<%d %d want:%d total:%d comp:%f st_q:%2.2f "
878 "size:%d var:%d/%d br:%d fps:%d\n",
880 qmin, q, qmax, picture_number,
881 (
int)wanted_bits / 1000, (
int)s->
total_bits / 1000,
914 double complexity[5] = { 0 };
915 uint64_t const_bits[5] = { 0 };
916 uint64_t all_const_bits;
917 uint64_t all_available_bits = (uint64_t)(s->
bit_rate *
919 double rate_factor = 0;
921 const int filter_size = (int)(a->
qblur * 4) | 1;
922 double expected_bits;
923 double *qscale, *blurred_qscale, qscale_sum;
944 if (all_available_bits < all_const_bits) {
953 for (step = 256 * 256; step > 0.0000001; step *= 0.5) {
966 assert(filter_size % 2 == 1);
986 double q = 0.0, sum = 0.0;
988 for (j = 0; j < filter_size; j++) {
989 int index = i + j - filter_size / 2;
990 double d = index - i;
1000 blurred_qscale[i] = q / sum;
1014 expected_bits +=
bits;
1018 "expected_bits: %f all_available_bits: %d rate_factor: %f\n",
1019 expected_bits, (
int)all_available_bits, rate_factor);
1020 if (expected_bits > all_available_bits) {
1021 rate_factor -= step;
1031 av_dlog(s,
"[lavc rc] entry[%d].new_qscale = %.3f qp = %.3f\n",
1038 assert(toobig <= 40);
1040 "[lavc rc] requested bitrate: %d bps expected bitrate: %d bps\n",
1042 (
int)(expected_bits / ((
double)all_available_bits / s->
bit_rate)));
1044 "[lavc rc] estimated target average qp: %.3f\n",
1048 "[lavc rc] Using all of requested bitrate is not "
1049 "necessary for this video with these parameters.\n");
1050 }
else if (toobig == 40) {
1052 "[lavc rc] Error: bitrate too low for this video "
1053 "with these parameters.\n");
1055 }
else if (fabs(expected_bits / all_available_bits - 1.0) > 0.01) {
1057 "[lavc rc] Error: 2pass curve failed to converge\n");