1 /*
2 * Rate control for video encoders
3 *
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 /**
24 * @file
25 * Rate control for video encoders.
26 */
27
30
36
38 {
40 "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d "
41 "fcode:%d bcode:%d mc-var:%"PRId64" var:%"PRId64" icount:%d skipcount:%d hbits:%d;\n",
42 s->current_picture_ptr->display_picture_number,
43 s->current_picture_ptr->coded_picture_number,
45 s->current_picture.f->quality,
54 s->i_count,
s->skip_count,
56 }
57
59 {
61 }
62
64 {
65 if (qp <= 0.0) {
67 }
69 }
70
72 {
75 }
77 }
78
80 {
86
89 q = last_p_q *
FFABS(
a->i_quant_factor) +
a->i_quant_offset;
91 a->b_quant_factor > 0.0)
92 q = last_non_b_q *
a->b_quant_factor +
a->b_quant_offset;
93 if (q < 1)
94 q = 1;
95
96 /* last qscale / qdiff stuff */
100
101 if (q > last_q + maxdiff)
102 q = last_q + maxdiff;
103 else if (q < last_q - maxdiff)
104 q = last_q - maxdiff;
105 }
106
107 rcc->
last_qscale_for[pict_type] = q;
// Note we cannot do that after blurring
108
111
112 return q;
113 }
114
115 /**
116 * Get the qmin & qmax for pict_type.
117 */
119 {
122
124
125 switch (pict_type) {
127 qmin = (
int)(qmin *
FFABS(
s->avctx->b_quant_factor) +
s->avctx->b_quant_offset + 0.5);
128 qmax = (
int)(qmax *
FFABS(
s->avctx->b_quant_factor) +
s->avctx->b_quant_offset + 0.5);
129 break;
131 qmin = (
int)(qmin *
FFABS(
s->avctx->i_quant_factor) +
s->avctx->i_quant_offset + 0.5);
132 qmax = (
int)(qmax *
FFABS(
s->avctx->i_quant_factor) +
s->avctx->i_quant_offset + 0.5);
133 break;
134 }
135
138
139 if (qmax < qmin)
140 qmax = qmin;
141
142 *qmin_ret = qmin;
143 *qmax_ret = qmax;
144 }
145
147 double q, int frame_num)
148 {
150 const double buffer_size =
s->avctx->rc_buffer_size;
151 const double fps =
get_fps(
s->avctx);
152 const double min_rate =
s->avctx->rc_min_rate / fps;
153 const double max_rate =
s->avctx->rc_max_rate / fps;
155 int qmin, qmax;
156
158
159 /* modulation */
160 if (
s->rc_qmod_freq &&
161 frame_num %
s->rc_qmod_freq == 0 &&
164
165 /* buffer overflow/underflow protection */
166 if (buffer_size) {
168 double q_limit;
169
170 if (min_rate) {
171 double d = 2 * (buffer_size - expected_size) / buffer_size;
176 q *= pow(
d, 1.0 /
s->rc_buffer_aggressivity);
177
180 s->avctx->rc_min_vbv_overflow_use, 1));
181
182 if (q > q_limit) {
185 "limiting QP %f -> %f\n", q, q_limit);
186 q = q_limit;
187 }
188 }
189
190 if (max_rate) {
191 double d = 2 * expected_size / buffer_size;
196 q /= pow(
d, 1.0 /
s->rc_buffer_aggressivity);
197
200 s->avctx->rc_max_available_vbv_use,
201 1));
202 if (q < q_limit) {
205 "limiting QP %f -> %f\n", q, q_limit);
206 q = q_limit;
207 }
208 }
209 }
210 ff_dlog(
s,
"q:%f max:%f min:%f size:%f index:%f agr:%f\n",
212 s->rc_buffer_aggressivity);
213 if (
s->rc_qsquish == 0.0 || qmin == qmax) {
214 if (q < qmin)
215 q = qmin;
216 else if (q > qmax)
217 q = qmax;
218 } else {
219 double min2 = log(qmin);
220 double max2 = log(qmax);
221
222 q = log(q);
223 q = (q - min2) / (max2 - min2) - 0.5;
224 q *= -4.0;
225 q = 1.0 / (1.0 +
exp(q));
226 q = q * (max2 - min2) + min2;
227
229 }
230
231 return q;
232 }
233
234 /**
235 * Modify the bitrate curve from pass1 for one frame.
236 */
238 double rate_factor, int frame_num)
239 {
243 const double mb_num =
s->mb_num;
246
268 0
269 };
270
274 return -1;
275 }
276
281 bits += 1.0;
// avoid 1/0 issues
282
283 /* user override */
284 for (
i = 0;
i <
s->avctx->rc_override_count;
i++) {
286 if (rco[
i].start_frame > frame_num)
287 continue;
288 if (rco[
i].end_frame < frame_num)
289 continue;
290
292 bits =
qp2bits(rce, rco[
i].qscale);
// FIXME move at end to really force it?
293 else
295 }
296
298
299 /* I/B difference */
301 q = -q *
s->avctx->i_quant_factor +
s->avctx->i_quant_offset;
303 q = -q *
s->avctx->b_quant_factor +
s->avctx->b_quant_offset;
304 if (q < 1)
305 q = 1;
306
307 return q;
308 }
309
311 {
316 double complexity[5] = { 0 }; // approximate bits at quant=1
317 uint64_t const_bits[5] = { 0 }; // quantizer independent bits
318 uint64_t all_const_bits;
319 uint64_t all_available_bits = (uint64_t)(
s->bit_rate *
321 double rate_factor = 0;
323 const int filter_size = (
int)(
a->qblur * 4) | 1;
324 double expected_bits = 0; // init to silence gcc warning
325 double *qscale, *blurred_qscale, qscale_sum;
326
327 /* find complexity & const_bits & decide the pict_types */
330
336
340 }
341
345
346 if (all_available_bits < all_const_bits) {
348 return -1;
349 }
350
353 if (!qscale || !blurred_qscale) {
357 }
358 toobig = 0;
359
361 expected_bits = 0;
363
365
366 /* find qscale */
369
372 }
374
375 /* fixed I/B QP relative to P mode */
378
380 }
381
384
386 }
387
388 /* smooth curve */
392 int j;
393 double q = 0.0, sum = 0.0;
394
395 for (j = 0; j < filter_size; j++) {
396 int index =
i + j - filter_size / 2;
398 double coeff =
a->qblur == 0 ? 1.0 :
exp(-
d *
d / (
a->qblur *
a->qblur));
399
401 continue;
403 continue;
406 }
407 blurred_qscale[
i] = q / sum;
408 }
409
410 /* find expected bits */
414
416
419
421 expected_bits +=
bits;
422 }
423
425 "expected_bits: %f all_available_bits: %d rate_factor: %f\n",
426 expected_bits, (int)all_available_bits, rate_factor);
427 if (expected_bits > all_available_bits) {
429 ++toobig;
430 }
431 }
434
435 /* check bitrate calculations and print info */
436 qscale_sum = 0.0;
438 ff_dlog(
s,
"[lavc rc] entry[%d].new_qscale = %.3f qp = %.3f\n",
443 s->avctx->qmin,
s->avctx->qmax);
444 }
447 "[lavc rc] requested bitrate: %"PRId64" bps expected bitrate: %"PRId64" bps\n",
449 (int64_t)(expected_bits / ((
double)all_available_bits /
s->bit_rate)));
451 "[lavc rc] estimated target average qp: %.3f\n",
453 if (toobig == 0) {
455 "[lavc rc] Using all of requested bitrate is not "
456 "necessary for this video with these parameters.\n");
457 } else if (toobig == 40) {
459 "[lavc rc] Error: bitrate too low for this video "
460 "with these parameters.\n");
461 return -1;
462 }
else if (
fabs(expected_bits / all_available_bits - 1.0) > 0.01) {
464 "[lavc rc] Error: 2pass curve failed to converge\n");
465 return -1;
466 }
467
468 return 0;
469 }
470
472 {
476 "PI",
477 "E",
478 "iTex",
479 "pTex",
480 "tex",
481 "mv",
482 "fCode",
483 "iCount",
484 "mcVar",
485 "var",
486 "isI",
487 "isP",
488 "isB",
489 "avgQP",
490 "qComp",
491 "avgIITex",
492 "avgPITex",
493 "avgPPTex",
494 "avgBPTex",
495 "avgTex",
497 };
502 };
504 "bits2qp",
505 "qp2bits",
507 };
508 emms_c();
509
510 if (!
s->avctx->rc_max_available_vbv_use &&
s->avctx->rc_buffer_size) {
511 if (
s->avctx->rc_max_rate) {
512 s->avctx->rc_max_available_vbv_use =
av_clipf(
s->avctx->rc_max_rate/(
s->avctx->rc_buffer_size*
get_fps(
s->avctx)), 1.0/3, 1.0);
513 } else
514 s->avctx->rc_max_available_vbv_use = 1.0;
515 }
516
518 s->rc_eq ?
s->rc_eq :
"tex^qComp",
521 if (res < 0) {
523 return res;
524 }
525
526 for (
i = 0;
i < 5;
i++) {
530
535 rcc->
frame_count[
i] = 1;
// 1 is better because of 1/0 and such
536
538 }
542
545 char *p;
546
547 /* find number of pics */
548 p =
s->avctx->stats_in;
550 p = strchr(p + 1, ';');
551 i +=
s->max_b_frames;
553 return -1;
558
559 /* init all to skipped P-frames
560 * (with B-frames we might have a not encoded frame at the end FIXME) */
563
568 }
569
570 /* read stats */
571 p =
s->avctx->stats_in;
574 int picture_number;
575 int e;
576 char *next;
577
578 next = strchr(p, ';');
579 if (next) {
580 (*next) = 0; // sscanf is unbelievably slow on looong strings // FIXME copy / do not write
581 next++;
582 }
583 e = sscanf(p, " in:%d ", &picture_number);
584
586 av_assert0(picture_number < rcc->num_entries);
587 rce = &rcc->
entry[picture_number];
588
589 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:%"SCNd64" var:%"SCNd64" icount:%d skipcount:%d hbits:%d",
595 if (e != 14) {
597 "statistics are damaged at line %d, parser out=%d\n",
599 return -1;
600 }
601
602 p = next;
603 }
604
607 return -1;
608 }
609 }
610
614
617
618 if (
s->avctx->qblur > 1.0) {
620 return -1;
621 }
622 /* init stuff with the user specified complexity */
623 if (
s->rc_initial_cplx) {
624 for (
i = 0;
i < 60 * 30;
i++) {
625 double bits =
s->rc_initial_cplx * (
i / 10000.0 + 1.0) *
s->mb_num;
627
628 if (
i % ((
s->gop_size + 3) / 4) == 0)
630 else if (
i % (
s->max_b_frames + 1))
632 else
634
638
643
649 } else {
650 rce.
i_count = 0;
// FIXME we do know this approx
654 }
659
661
662 // FIXME misbehaves a little for variable fps
664 }
665 }
666 }
667
668 return 0;
669 }
670
672 {
674 emms_c();
675
678 }
679
681 {
683 const double fps =
get_fps(
s->avctx);
684 const int buffer_size =
s->avctx->rc_buffer_size;
685 const double min_rate =
s->avctx->rc_min_rate / fps;
686 const double max_rate =
s->avctx->rc_max_rate / fps;
687
690
691 if (buffer_size) {
693
697 if (
frame_size > max_rate &&
s->qscale ==
s->avctx->qmax) {
698 av_log(
s->avctx,
AV_LOG_ERROR,
"max bitrate possibly too small or try trellis with large lmax or increase qmax\n");
699 }
701 }
702
705
708
710 stuffing = 4;
712
715
716 return stuffing;
717 }
718 }
719 return 0;
720 }
721
723 {
725 }
726
728 {
729 double new_coeff =
size * q / (var + 1);
730 if (var < 10)
731 return;
732
736 p->
coeff += new_coeff;
737 }
738
740 {
742 const float lumi_masking =
s->avctx->lumi_masking / (128.0 * 128.0);
743 const float dark_masking =
s->avctx->dark_masking / (128.0 * 128.0);
744 const float temp_cplx_masking =
s->avctx->temporal_cplx_masking;
745 const float spatial_cplx_masking =
s->avctx->spatial_cplx_masking;
746 const float p_masking =
s->avctx->p_masking;
747 const float border_masking =
s->border_masking;
748 float bits_sum = 0.0;
749 float cplx_sum = 0.0;
750 float *cplx_tab =
s->cplx_tab;
751 float *bits_tab =
s->bits_tab;
752 const int qmin =
s->avctx->mb_lmin;
753 const int qmax =
s->avctx->mb_lmax;
754 const int mb_width =
s->mb_width;
755 const int mb_height =
s->mb_height;
756
757 for (
i = 0;
i <
s->mb_num;
i++) {
758 const int mb_xy =
s->mb_index2xy[
i];
759 float temp_cplx = sqrt(
s->mc_mb_var[mb_xy]);
// FIXME merge in pow()
760 float spat_cplx = sqrt(
s->mb_var[mb_xy]);
761 const int lumi =
s->mb_mean[mb_xy];
763 int mb_x = mb_xy %
s->mb_stride;
764 int mb_y = mb_xy /
s->mb_stride;
765 int mb_distance;
766 float mb_factor = 0.0;
767 if (spat_cplx < 4)
768 spat_cplx = 4; // FIXME fine-tune
769 if (temp_cplx < 4)
770 temp_cplx = 4; // FIXME fine-tune
771
773 cplx = spat_cplx;
775 } else {
776 cplx = temp_cplx;
777 factor = pow(temp_cplx, -temp_cplx_masking);
778 }
779 factor *= pow(spat_cplx, -spatial_cplx_masking);
780
781 if (lumi > 127)
782 factor *= (1.0 - (lumi - 128) * (lumi - 128) * lumi_masking);
783 else
784 factor *= (1.0 - (lumi - 128) * (lumi - 128) * dark_masking);
785
786 if (mb_x < mb_width / 5) {
787 mb_distance = mb_width / 5 - mb_x;
788 mb_factor = (
float)mb_distance / (
float)(mb_width / 5);
789 } else if (mb_x > 4 * mb_width / 5) {
790 mb_distance = mb_x - 4 * mb_width / 5;
791 mb_factor = (
float)mb_distance / (
float)(mb_width / 5);
792 }
793 if (mb_y < mb_height / 5) {
794 mb_distance = mb_height / 5 - mb_y;
795 mb_factor =
FFMAX(mb_factor,
796 (float)mb_distance / (float)(mb_height / 5));
797 } else if (mb_y > 4 * mb_height / 5) {
798 mb_distance = mb_y - 4 * mb_height / 5;
799 mb_factor =
FFMAX(mb_factor,
800 (float)mb_distance / (float)(mb_height / 5));
801 }
802
803 factor *= 1.0 - border_masking * mb_factor;
804
807
809 cplx_sum += cplx;
813 }
814
815 /* handle qmin/qmax clipping */
817 float factor = bits_sum / cplx_sum;
818 for (
i = 0;
i <
s->mb_num;
i++) {
819 float newq = q * cplx_tab[
i] / bits_tab[
i];
821
822 if (newq > qmax) {
823 bits_sum -= bits_tab[
i];
824 cplx_sum -= cplx_tab[
i] * q / qmax;
825 } else if (newq < qmin) {
826 bits_sum -= bits_tab[
i];
827 cplx_sum -= cplx_tab[
i] * q / qmin;
828 }
829 }
830 if (bits_sum < 0.001)
831 bits_sum = 0.001;
832 if (cplx_sum < 0.001)
833 cplx_sum = 0.001;
834 }
835
836 for (
i = 0;
i <
s->mb_num;
i++) {
837 const int mb_xy =
s->mb_index2xy[
i];
838 float newq = q * cplx_tab[
i] / bits_tab[
i];
839 int intq;
840
842 newq *= bits_sum / cplx_sum;
843 }
844
845 intq = (
int)(newq + 0.5);
846
847 if (intq > qmax)
848 intq = qmax;
849 else if (intq < qmin)
850 intq = qmin;
851 s->lambda_table[mb_xy] = intq;
852 }
853 }
854
856 {
859
862 }
863
864 // FIXME rd or at least approx for dquant
865
867 {
868 float q;
869 int qmin, qmax;
870 float br_compensation;
872 double short_term_q;
873 double fps;
874 int picture_number =
s->picture_number;
875 int64_t wanted_bits;
880 double rate_factor;
881 int64_t var;
882 const int pict_type =
s->pict_type;
883 emms_c();
884
886
888 /* update predictors */
889 if (picture_number > 2 && !dry_run) {
890 const int64_t last_var =
896 sqrt(last_var),
897 s->frame_bits -
s->stuffing_bits);
898 }
899
904 return -1;
905 }
906 rce = &rcc->
entry[picture_number];
908 } else {
910 rce = &local_rce;
911
912 /* FIXME add a dts field to AVFrame and ensure it is set and use it
913 * here instead of reordering but the reordering is simpler for now
914 * until H.264 B-pyramid must be handled. */
916 dts_pic =
s->current_picture_ptr;
917 else
918 dts_pic =
s->last_picture_ptr;
919
921 wanted_bits = (uint64_t)(
s->bit_rate * (
double)picture_number / fps);
922 else
923 wanted_bits = (uint64_t)(
s->bit_rate * (
double)dts_pic->
f->
pts / fps);
924 }
925
926 diff =
s->total_bits - wanted_bits;
927 br_compensation = (
a->bit_rate_tolerance -
diff) /
a->bit_rate_tolerance;
928 if (br_compensation <= 0.0)
929 br_compensation = 0.001;
930
932
933 short_term_q = 0; /* avoid warning */
937
940 br_compensation,
s->frame_bits, var, pict_type);
941 } else {
950
957 } else {
958 rce->
i_count = 0;
// FIXME we do know this approx
962 }
967
970
971 q =
get_qscale(
s, rce, rate_factor, picture_number);
972 if (q < 0)
973 return -1;
974
978
979 // FIXME type dependent blur like in 2-pass
983
987 }
989
991
993
995 }
996
999 "%c qp:%d<%2.1f<%d %d want:%"PRId64" total:%"PRId64" comp:%f st_q:%2.2f "
1000 "size:%d var:%"PRId64"/%"PRId64" br:%"PRId64" fps:%d\n",
1002 qmin, q, qmax, picture_number,
1003 wanted_bits / 1000,
s->total_bits / 1000,
1004 br_compensation, short_term_q,
s->frame_bits,
1005 s->mb_var_sum,
s->mc_mb_var_sum,
1006 s->bit_rate / 1000, (
int)fps);
1007 }
1008
1009 if (q < qmin)
1010 q = qmin;
1011 else if (q > qmax)
1012 q = qmax;
1013
1014 if (
s->adaptive_quant)
1016 else
1018
1019 if (!dry_run) {
1023 }
1024 return q;
1025 }