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",
115 static double (*
const func1[])(
void *, double) = {
120 static const char *
const func1_names[] = {
129 const_names, func1_names, func1,
136 for (i = 0; i < 5; i++) {
158 p = strchr(p + 1,
';');
184 next = strchr(p,
';');
189 e = sscanf(p,
" in:%d ", &picture_number);
191 assert(picture_number >= 0);
192 assert(picture_number < rcc->num_entries);
193 rce = &rcc->
entry[picture_number];
195 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",
203 "statistics are damaged at line %d, parser out=%d\n",
220 "Xvid ratecontrol requires libavcodec compiled with Xvid support.\n");
239 for (i = 0; i < 60 * 30; i++) {
243 if (i % ((s->
gop_size + 3) / 4) == 0)
309 buffer_size, rcc->
buffer_index, frame_size, min_rate, max_rate);
324 int stuffing = ceil((rcc->
buffer_index - buffer_size) / 8);
343 double rate_factor,
int frame_num)
348 const double mb_num = s->
mb_num;
372 rcc->next_non_b_qscale,
397 if (rco[i].start_frame > frame_num)
399 if (rco[i].end_frame < frame_num)
403 bits =
qp2bits(rce, rco[i].qscale);
443 if (q > last_q + maxdiff)
444 q = last_q + maxdiff;
445 else if (q < last_q - maxdiff)
446 q = last_q - maxdiff;
465 assert(qmin <= qmax);
489 double q,
int frame_num)
513 double d = 2 * (buffer_size - expected_size) / buffer_size;
527 "limiting QP %f -> %f\n", q, q_limit);
533 double d = 2 * expected_size / buffer_size;
547 "limiting QP %f -> %f\n", q, q_limit);
552 av_dlog(s,
"q:%f max:%f min:%f size:%f index:%f agr:%f\n",
561 double min2 = log(qmin);
562 double max2 = log(qmax);
565 q = (q - min2) / (max2 - min2) - 0.5;
567 q = 1.0 / (1.0 + exp(q));
568 q = q * (max2 - min2) + min2;
586 double new_coeff = size * q / (var + 1);
593 p->
coeff += new_coeff;
605 float bits_sum = 0.0;
606 float cplx_sum = 0.0;
615 for (i = 0; i < s->
mb_num; i++) {
617 float temp_cplx = sqrt(pic->
mc_mb_var[mb_xy]);
618 float spat_cplx = sqrt(pic->
mb_var[mb_xy]);
619 const int lumi = pic->
mb_mean[mb_xy];
620 float bits, cplx, factor;
624 float mb_factor = 0.0;
632 factor = 1.0 + p_masking;
635 factor = pow(temp_cplx, -temp_cplx_masking);
637 factor *= pow(spat_cplx, -spatial_cplx_masking);
640 factor *= (1.0 - (lumi - 128) * (lumi - 128) * lumi_masking);
642 factor *= (1.0 - (lumi - 128) * (lumi - 128) * dark_masking);
644 if (mb_x < mb_width / 5) {
645 mb_distance = mb_width / 5 - mb_x;
646 mb_factor = (float)mb_distance / (
float)(mb_width / 5);
647 }
else if (mb_x > 4 * mb_width / 5) {
648 mb_distance = mb_x - 4 * mb_width / 5;
649 mb_factor = (float)mb_distance / (
float)(mb_width / 5);
651 if (mb_y < mb_height / 5) {
652 mb_distance = mb_height / 5 - mb_y;
653 mb_factor =
FFMAX(mb_factor,
654 (
float)mb_distance / (
float)(mb_height / 5));
655 }
else if (mb_y > 4 * mb_height / 5) {
656 mb_distance = mb_y - 4 * mb_height / 5;
657 mb_factor =
FFMAX(mb_factor,
658 (
float)mb_distance / (
float)(mb_height / 5));
661 factor *= 1.0 - border_masking * mb_factor;
663 if (factor < 0.00001)
666 bits = cplx * factor;
675 float factor = bits_sum / cplx_sum;
676 for (i = 0; i < s->
mb_num; i++) {
677 float newq = q * cplx_tab[i] / bits_tab[i];
681 bits_sum -= bits_tab[i];
682 cplx_sum -= cplx_tab[i] * q / qmax;
683 }
else if (newq < qmin) {
684 bits_sum -= bits_tab[i];
685 cplx_sum -= cplx_tab[i] * q / qmin;
688 if (bits_sum < 0.001)
690 if (cplx_sum < 0.001)
694 for (i = 0; i < s->
mb_num; i++) {
696 float newq = q * cplx_tab[i] / bits_tab[i];
700 newq *= bits_sum / cplx_sum;
703 intq = (int)(newq + 0.5);
707 else if (intq < qmin)
728 float br_compensation;
754 if (picture_number > 2 && !dry_run) {
763 assert(picture_number >= 0);
764 assert(picture_number < rcc->num_entries);
765 rce = &rcc->
entry[picture_number];
780 wanted_bits = (uint64_t)(s->
bit_rate * (
double)picture_number / fps);
782 wanted_bits = (uint64_t)(s->
bit_rate * (
double)dts_pic->
f.
pts / fps);
787 if (br_compensation <= 0.0)
788 br_compensation = 0.001;
799 br_compensation, s->
frame_bits, var, pict_type);
831 q =
get_qscale(s, rce, rate_factor, picture_number);
859 "%c qp:%d<%2.1f<%d %d want:%d total:%d comp:%f st_q:%2.2f "
860 "size:%d var:%d/%d br:%d fps:%d\n",
862 qmin, q, qmax, picture_number,
863 (
int)wanted_bits / 1000, (
int)s->
total_bits / 1000,
896 double complexity[5] = { 0 };
897 uint64_t const_bits[5] = { 0 };
898 uint64_t all_const_bits;
899 uint64_t all_available_bits = (uint64_t)(s->
bit_rate *
901 double rate_factor = 0;
903 const int filter_size = (int)(a->
qblur * 4) | 1;
904 double expected_bits;
905 double *qscale, *blurred_qscale, qscale_sum;
926 if (all_available_bits < all_const_bits) {
935 for (step = 256 * 256; step > 0.0000001; step *= 0.5) {
948 assert(filter_size % 2 == 1);
962 double q = 0.0, sum = 0.0;
964 for (j = 0; j < filter_size; j++) {
965 int index = i + j - filter_size / 2;
966 double d = index - i;
967 double coeff = a->
qblur == 0 ? 1.0 : exp(-d * d / (a->
qblur * a->
qblur));
973 q += qscale[
index] * coeff;
976 blurred_qscale[i] = q / sum;
990 expected_bits +=
bits;
994 "expected_bits: %f all_available_bits: %d rate_factor: %f\n",
995 expected_bits, (
int)all_available_bits, rate_factor);
996 if (expected_bits > all_available_bits) {
1007 av_dlog(s,
"[lavc rc] entry[%d].new_qscale = %.3f qp = %.3f\n",
1014 assert(toobig <= 40);
1016 "[lavc rc] requested bitrate: %d bps expected bitrate: %d bps\n",
1018 (
int)(expected_bits / ((
double)all_available_bits / s->
bit_rate)));
1020 "[lavc rc] estimated target average qp: %.3f\n",
1024 "[lavc rc] Using all of requested bitrate is not "
1025 "necessary for this video with these parameters.\n");
1026 }
else if (toobig == 40) {
1028 "[lavc rc] Error: bitrate too low for this video "
1029 "with these parameters.\n");
1031 }
else if (fabs(expected_bits / all_available_bits - 1.0) > 0.01) {
1033 "[lavc rc] Error: 2pass curve failed to converge\n");