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");