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
32
37
39 {
41 "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d "
42 "fcode:%d bcode:%d mc-var:%"PRId64" var:%"PRId64" icount:%d hbits:%d;\n",
43 s->cur_pic.ptr->display_picture_number,
44 s->cur_pic.ptr->coded_picture_number,
46 s->cur_pic.ptr->f->quality,
57 }
58
60 {
63
65 #if FF_API_TICKS_PER_FRAME
67 #else
69 #endif
71 }
72
74 {
76 }
77
79 {
80 if (qp <= 0.0) {
82 }
84 }
85
87 {
89 }
90
92 {
95 }
97 }
98
100 {
102 }
103
105 {
111
114 q = last_p_q *
FFABS(
a->i_quant_factor) +
a->i_quant_offset;
116 a->b_quant_factor > 0.0)
117 q = last_non_b_q *
a->b_quant_factor +
a->b_quant_offset;
118 if (q < 1)
119 q = 1;
120
121 /* last qscale / qdiff stuff */
125
126 if (q > last_q + maxdiff)
127 q = last_q + maxdiff;
128 else if (q < last_q - maxdiff)
129 q = last_q - maxdiff;
130 }
131
132 rcc->
last_qscale_for[pict_type] = q;
// Note we cannot do that after blurring
133
136
137 return q;
138 }
139
140 /**
141 * Get the qmin & qmax for pict_type.
142 */
144 {
147
149
150 switch (pict_type) {
152 qmin = (int)(qmin *
FFABS(
s->avctx->b_quant_factor) +
s->avctx->b_quant_offset + 0.5);
153 qmax = (int)(qmax *
FFABS(
s->avctx->b_quant_factor) +
s->avctx->b_quant_offset + 0.5);
154 break;
156 qmin = (int)(qmin *
FFABS(
s->avctx->i_quant_factor) +
s->avctx->i_quant_offset + 0.5);
157 qmax = (int)(qmax *
FFABS(
s->avctx->i_quant_factor) +
s->avctx->i_quant_offset + 0.5);
158 break;
159 }
160
163
164 if (qmax < qmin)
165 qmax = qmin;
166
167 *qmin_ret = qmin;
168 *qmax_ret = qmax;
169 }
170
172 double q, int frame_num)
173 {
175 const double buffer_size =
s->avctx->rc_buffer_size;
176 const double fps =
get_fps(
s->avctx);
177 const double min_rate =
s->avctx->rc_min_rate / fps;
178 const double max_rate =
s->avctx->rc_max_rate / fps;
180 int qmin, qmax;
181
183
184 /* modulation */
185 if (
s->rc_qmod_freq &&
186 frame_num %
s->rc_qmod_freq == 0 &&
189
190 /* buffer overflow/underflow protection */
191 if (buffer_size) {
193 double q_limit;
194
195 if (min_rate) {
196 double d = 2 * (buffer_size - expected_size) / buffer_size;
197 if (d > 1.0)
198 d = 1.0;
199 else if (d < 0.0001)
200 d = 0.0001;
201 q *= pow(d, 1.0 /
s->rc_buffer_aggressivity);
202
205 s->avctx->rc_min_vbv_overflow_use, 1));
206
207 if (q > q_limit) {
210 "limiting QP %f -> %f\n", q, q_limit);
211 q = q_limit;
212 }
213 }
214
215 if (max_rate) {
216 double d = 2 * expected_size / buffer_size;
217 if (d > 1.0)
218 d = 1.0;
219 else if (d < 0.0001)
220 d = 0.0001;
221 q /= pow(d, 1.0 /
s->rc_buffer_aggressivity);
222
225 s->avctx->rc_max_available_vbv_use,
226 1));
227 if (q < q_limit) {
230 "limiting QP %f -> %f\n", q, q_limit);
231 q = q_limit;
232 }
233 }
234 }
235 ff_dlog(
s,
"q:%f max:%f min:%f size:%f index:%f agr:%f\n",
237 s->rc_buffer_aggressivity);
238 if (
s->rc_qsquish == 0.0 || qmin == qmax) {
239 if (q < qmin)
240 q = qmin;
241 else if (q > qmax)
242 q = qmax;
243 } else {
244 double min2 =
log(qmin);
245 double max2 =
log(qmax);
246
248 q = (q - min2) / (max2 - min2) - 0.5;
249 q *= -4.0;
250 q = 1.0 / (1.0 +
exp(q));
251 q = q * (max2 - min2) + min2;
252
254 }
255
256 return q;
257 }
258
259 /**
260 * Modify the bitrate curve from pass1 for one frame.
261 */
263 double rate_factor, int frame_num)
264 {
268 const double mb_num =
s->mb_num;
271
293 0
294 };
295
299 return -1;
300 }
301
306 bits += 1.0;
// avoid 1/0 issues
307
308 /* user override */
309 for (
i = 0;
i <
s->avctx->rc_override_count;
i++) {
311 if (rco[
i].start_frame > frame_num)
312 continue;
313 if (rco[
i].end_frame < frame_num)
314 continue;
315
317 bits =
qp2bits(rce, rco[
i].qscale);
// FIXME move at end to really force it?
318 else
320 }
321
323
324 /* I/B difference */
326 q = -q *
s->avctx->i_quant_factor +
s->avctx->i_quant_offset;
328 q = -q *
s->avctx->b_quant_factor +
s->avctx->b_quant_offset;
329 if (q < 1)
330 q = 1;
331
332 return q;
333 }
334
336 {
341 double complexity[5] = { 0 }; // approximate bits at quant=1
342 uint64_t const_bits[5] = { 0 }; // quantizer independent bits
343 uint64_t all_const_bits;
346 fps);
347 double rate_factor = 0;
349 const int filter_size = (int)(
a->qblur * 4) | 1;
350 double expected_bits = 0; // init to silence gcc warning
351 double *qscale, *blurred_qscale, qscale_sum;
352
353 /* find complexity & const_bits & decide the pict_types */
356
362
366 }
367
371
372 if (all_available_bits < all_const_bits) {
374 return -1;
375 }
376
379 if (!qscale || !blurred_qscale) {
383 }
384 toobig = 0;
385
387 expected_bits = 0;
389
391
392 /* find qscale */
395
398 }
400
401 /* fixed I/B QP relative to P mode */
404
406 }
407
410
412 }
413
414 /* smooth curve */
418 int j;
419 double q = 0.0, sum = 0.0;
420
421 for (j = 0; j < filter_size; j++) {
422 int index =
i + j - filter_size / 2;
424 double coeff =
a->qblur == 0 ? 1.0 :
exp(-d * d / (
a->qblur *
a->qblur));
425
427 continue;
429 continue;
432 }
433 blurred_qscale[
i] = q / sum;
434 }
435
436 /* find expected bits */
440
442
445
447 expected_bits +=
bits;
448 }
449
451 "expected_bits: %f all_available_bits: %d rate_factor: %f\n",
452 expected_bits, (int)all_available_bits, rate_factor);
453 if (expected_bits > all_available_bits) {
455 ++toobig;
456 }
457 }
460
461 /* check bitrate calculations and print info */
462 qscale_sum = 0.0;
464 ff_dlog(
s,
"[lavc rc] entry[%d].new_qscale = %.3f qp = %.3f\n",
469 s->avctx->qmin,
s->avctx->qmax);
470 }
473 "[lavc rc] requested bitrate: %"PRId64" bps expected bitrate: %"PRId64" bps\n",
475 (
int64_t)(expected_bits / ((
double)all_available_bits /
s->bit_rate)));
477 "[lavc rc] estimated target average qp: %.3f\n",
479 if (toobig == 0) {
481 "[lavc rc] Using all of requested bitrate is not "
482 "necessary for this video with these parameters.\n");
483 } else if (toobig == 40) {
485 "[lavc rc] Error: bitrate too low for this video "
486 "with these parameters.\n");
487 return -1;
488 }
else if (
fabs(expected_bits / all_available_bits - 1.0) > 0.01) {
490 "[lavc rc] Error: 2pass curve failed to converge\n");
491 return -1;
492 }
493
494 return 0;
495 }
496
498 {
502 "PI",
503 "E",
504 "iTex",
505 "pTex",
506 "tex",
507 "mv",
508 "fCode",
509 "iCount",
510 "mcVar",
511 "var",
512 "isI",
513 "isP",
514 "isB",
515 "avgQP",
516 "qComp",
517 "avgIITex",
518 "avgPITex",
519 "avgPPTex",
520 "avgBPTex",
521 "avgTex",
523 };
528 };
530 "bits2qp",
531 "qp2bits",
533 };
535
536 if (!
s->avctx->rc_max_available_vbv_use &&
s->avctx->rc_buffer_size) {
537 if (
s->avctx->rc_max_rate) {
538 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);
539 } else
540 s->avctx->rc_max_available_vbv_use = 1.0;
541 }
542
544 s->rc_eq ?
s->rc_eq :
"tex^qComp",
547 if (res < 0) {
549 return res;
550 }
551
552 for (
i = 0;
i < 5;
i++) {
556
561 rcc->
frame_count[
i] = 1;
// 1 is better because of 1/0 and such
562
564 }
568
571 char *p;
572
573 /* find number of pics */
574 p =
s->avctx->stats_in;
576 p = strchr(p + 1, ';');
577 i +=
s->max_b_frames;
579 return -1;
584
585 /* init all to skipped P-frames
586 * (with B-frames we might have a not encoded frame at the end FIXME) */
589
594 }
595
596 /* read stats */
597 p =
s->avctx->stats_in;
600 int picture_number;
601 int e;
602 char *next;
603
604 next = strchr(p, ';');
605 if (next) {
606 (*next) = 0; // sscanf is unbelievably slow on looong strings // FIXME copy / do not write
607 next++;
608 }
609 e = sscanf(p, " in:%d ", &picture_number);
610
612 av_assert0(picture_number < rcc->num_entries);
613 rce = &rcc->
entry[picture_number];
614
615 e += sscanf(p, " in:%*d out:%*d type:%d q:%f itex:%d ptex:%d "
616 "mv:%d misc:%d "
617 "fcode:%d bcode:%d "
618 "mc-var:%"SCNd64" var:%"SCNd64" "
619 "icount:%d hbits:%d",
625 if (e != 13) {
627 "statistics are damaged at line %d, parser out=%d\n",
629 return -1;
630 }
631
632 p = next;
633 }
634
636 if (res < 0)
637 return res;
638 }
639
643
646
647 if (
s->avctx->qblur > 1.0) {
649 return -1;
650 }
651 /* init stuff with the user specified complexity */
652 if (
s->rc_initial_cplx) {
653 for (
i = 0;
i < 60 * 30;
i++) {
654 double bits =
s->rc_initial_cplx * (
i / 10000.0 + 1.0) *
s->mb_num;
656
657 if (
i % ((
s->gop_size + 3) / 4) == 0)
659 else if (
i % (
s->max_b_frames + 1))
661 else
663
667
672
678 } else {
679 rce.
i_count = 0;
// FIXME we do know this approx
683 }
688
690
691 // FIXME misbehaves a little for variable fps
693 }
694 }
695 }
696
697 return 0;
698 }
699
701 {
703
707 }
708
710 {
712 const double fps =
get_fps(
s->avctx);
713 const int buffer_size =
s->avctx->rc_buffer_size;
714 const double min_rate =
s->avctx->rc_min_rate / fps;
715 const double max_rate =
s->avctx->rc_max_rate / fps;
716
719
720 if (buffer_size) {
722
726 if (
frame_size > max_rate &&
s->qscale ==
s->avctx->qmax) {
727 av_log(
s->avctx,
AV_LOG_ERROR,
"max bitrate possibly too small or try trellis with large lmax or increase qmax\n");
728 }
730 }
731
734
737
739 stuffing = 4;
741
744
745 return stuffing;
746 }
747 }
748 return 0;
749 }
750
752 {
754 }
755
757 {
758 double new_coeff =
size * q / (var + 1);
759 if (var < 10)
760 return;
761
765 p->
coeff += new_coeff;
766 }
767
769 {
771 const float lumi_masking =
s->avctx->lumi_masking / (128.0 * 128.0);
772 const float dark_masking =
s->avctx->dark_masking / (128.0 * 128.0);
773 const float temp_cplx_masking =
s->avctx->temporal_cplx_masking;
774 const float spatial_cplx_masking =
s->avctx->spatial_cplx_masking;
775 const float p_masking =
s->avctx->p_masking;
776 const float border_masking =
s->border_masking;
777 float bits_sum = 0.0;
778 float cplx_sum = 0.0;
779 float *cplx_tab =
s->cplx_tab;
780 float *bits_tab =
s->bits_tab;
781 const int qmin =
s->avctx->mb_lmin;
782 const int qmax =
s->avctx->mb_lmax;
783 const int mb_width =
s->mb_width;
784 const int mb_height =
s->mb_height;
785
786 for (
i = 0;
i <
s->mb_num;
i++) {
787 const int mb_xy =
s->mb_index2xy[
i];
788 float temp_cplx = sqrt(
s->mc_mb_var[mb_xy]);
// FIXME merge in pow()
789 float spat_cplx = sqrt(
s->mb_var[mb_xy]);
790 const int lumi =
s->mb_mean[mb_xy];
792 int mb_x = mb_xy %
s->mb_stride;
793 int mb_y = mb_xy /
s->mb_stride;
794 int mb_distance;
795 float mb_factor = 0.0;
796 if (spat_cplx < 4)
797 spat_cplx = 4; // FIXME fine-tune
798 if (temp_cplx < 4)
799 temp_cplx = 4; // FIXME fine-tune
800
802 cplx = spat_cplx;
804 } else {
805 cplx = temp_cplx;
806 factor = pow(temp_cplx, -temp_cplx_masking);
807 }
808 factor *= pow(spat_cplx, -spatial_cplx_masking);
809
810 if (lumi > 127)
811 factor *= (1.0 - (lumi - 128) * (lumi - 128) * lumi_masking);
812 else
813 factor *= (1.0 - (lumi - 128) * (lumi - 128) * dark_masking);
814
815 if (mb_x < mb_width / 5) {
816 mb_distance = mb_width / 5 - mb_x;
817 mb_factor = (
float)mb_distance / (
float)(mb_width / 5);
818 } else if (mb_x > 4 * mb_width / 5) {
819 mb_distance = mb_x - 4 * mb_width / 5;
820 mb_factor = (
float)mb_distance / (
float)(mb_width / 5);
821 }
822 if (mb_y < mb_height / 5) {
823 mb_distance = mb_height / 5 - mb_y;
824 mb_factor =
FFMAX(mb_factor,
825 (float)mb_distance / (float)(mb_height / 5));
826 } else if (mb_y > 4 * mb_height / 5) {
827 mb_distance = mb_y - 4 * mb_height / 5;
828 mb_factor =
FFMAX(mb_factor,
829 (float)mb_distance / (float)(mb_height / 5));
830 }
831
832 factor *= 1.0 - border_masking * mb_factor;
833
836
838 cplx_sum += cplx;
842 }
843
844 /* handle qmin/qmax clipping */
846 float factor = bits_sum / cplx_sum;
847 for (
i = 0;
i <
s->mb_num;
i++) {
848 float newq = q * cplx_tab[
i] / bits_tab[
i];
850
851 if (newq > qmax) {
852 bits_sum -= bits_tab[
i];
853 cplx_sum -= cplx_tab[
i] * q / qmax;
854 } else if (newq < qmin) {
855 bits_sum -= bits_tab[
i];
856 cplx_sum -= cplx_tab[
i] * q / qmin;
857 }
858 }
859 if (bits_sum < 0.001)
860 bits_sum = 0.001;
861 if (cplx_sum < 0.001)
862 cplx_sum = 0.001;
863 }
864
865 for (
i = 0;
i <
s->mb_num;
i++) {
866 const int mb_xy =
s->mb_index2xy[
i];
867 float newq = q * cplx_tab[
i] / bits_tab[
i];
868 int intq;
869
871 newq *= bits_sum / cplx_sum;
872 }
873
874 intq = (int)(newq + 0.5);
875
876 if (intq > qmax)
877 intq = qmax;
878 else if (intq < qmin)
879 intq = qmin;
880 s->lambda_table[mb_xy] = intq;
881 }
882 }
883
885 {
888
891 }
892
893 // FIXME rd or at least approx for dquant
894
896 {
897 float q;
898 int qmin, qmax;
899 float br_compensation;
901 double short_term_q;
902 double fps;
903 int picture_number =
s->picture_number;
909 double rate_factor;
911 const int pict_type =
s->pict_type;
913
915
917 /* update predictors */
918 if (picture_number > 2 && !dry_run) {
925 sqrt(last_var),
926 s->frame_bits -
s->stuffing_bits);
927 }
928
933 return -1;
934 }
935 rce = &rcc->
entry[picture_number];
937 } else {
939 double wanted_bits_double;
940 rce = &local_rce;
941
942 /* FIXME add a dts field to AVFrame and ensure it is set and use it
943 * here instead of reordering but the reordering is simpler for now
944 * until H.264 B-pyramid must be handled. */
946 dts_pic =
s->cur_pic.ptr;
947 else
948 dts_pic =
s->last_pic.ptr;
949
951 wanted_bits_double =
s->bit_rate * (
double)picture_number / fps;
952 else
953 wanted_bits_double =
s->bit_rate * (
double)dts_pic->
f->
pts / fps;
954 if (wanted_bits_double > INT64_MAX) {
956 wanted_bits = INT64_MAX;
957 } else
958 wanted_bits = (
int64_t)wanted_bits_double;
959 }
960
961 diff =
s->total_bits - wanted_bits;
962 br_compensation = (
a->bit_rate_tolerance -
diff) /
a->bit_rate_tolerance;
963 if (br_compensation <= 0.0)
964 br_compensation = 0.001;
965
967
968 short_term_q = 0; /* avoid warning */
972
975 br_compensation,
s->frame_bits, var, pict_type);
976 } else {
985
992 } else {
993 rce->
i_count = 0;
// FIXME we do know this approx
997 }
1002
1005
1006 q =
get_qscale(
s, rce, rate_factor, picture_number);
1007 if (q < 0)
1008 return -1;
1009
1013
1014 // FIXME type dependent blur like in 2-pass
1018
1022 }
1024
1026
1028
1030 }
1031
1034 "%c qp:%d<%2.1f<%d %d want:%"PRId64" total:%"PRId64" comp:%f st_q:%2.2f "
1035 "size:%d var:%"PRId64"/%"PRId64" br:%"PRId64" fps:%d\n",
1037 qmin, q, qmax, picture_number,
1038 wanted_bits / 1000,
s->total_bits / 1000,
1039 br_compensation, short_term_q,
s->frame_bits,
1040 s->mb_var_sum,
s->mc_mb_var_sum,
1041 s->bit_rate / 1000, (
int)fps);
1042 }
1043
1044 if (q < qmin)
1045 q = qmin;
1046 else if (q > qmax)
1047 q = qmax;
1048
1049 if (
s->adaptive_quant)
1051 else
1052 q = (int)(q + 0.5);
1053
1054 if (!dry_run) {
1058 }
1059 return q;
1060 }