1 /***************************************************-*- coding: iso-8859-1 -*-
2 * ratecontrol.c: h264 encoder library (Rate Control)
3 *****************************************************************************
4 * Copyright (C) 2003 Laurent Aimar
5 * $Id: ratecontrol.c,v 1.1 2004/06/03 19:27:08 fenrir Exp $
7 * Authors: Måns Rullgård <mru@mru.ath.cx>
8 * 2 pass code: Michael Niedermayer <michaelni@gmx.at>
9 * Loren Merritt <lorenm@u.washington.edu>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
24 *****************************************************************************/
26 #define _ISOC99_SOURCE
27 #undef NDEBUG // always check asserts, the speed effect is far too small to disable them
35 #include "common/common.h"
36 #include "common/cpu.h"
37 #include "common/macroblock.h"
38 #include "ratecontrol.h"
41 #define exp2f(x) ( (float) exp2( (x) ) )
44 #define exp2f(x) powf( 2, (x) )
47 #define exp2f(x) pow( 2, (x) )
49 #ifdef WIN32 // POSIX says that rename() removes the destination, but win32 doesn't.
50 #define rename(src,dst) (unlink(dst), rename(src,dst))
62 uint64_t expected_bits;
68 float blurred_complexity;
69 } ratecontrol_entry_t;
71 struct x264_ratecontrol_t
77 int nmb; /* number of macroblocks in a frame */
86 int frames; /* frames in current gop */
89 int mb; /* MBs processed in current frame */
90 int bits_gop; /* allocated bits current gop */
91 int bits_last_gop; /* bits consumed in gop */
92 int qp; /* qp for current frame */
93 int qpm; /* qp for next MB */
94 float qpa; /* average qp for last frame */
96 float qp_avg_p; /* average QP for P frames */
98 int fbits; /* bits allocated for current frame */
99 int ufbits; /* bits used for current frame */
100 int nzcoeffs; /* # of 0-quantized coefficients */
101 int ncoeffs; /* total # of coefficients */
105 FILE *p_stat_file_out;
106 char *psz_stat_file_tmpname;
108 int num_entries; /* number of ratecontrol_entry_ts */
109 ratecontrol_entry_t *entry; /* FIXME: copy needed data and free this once init is done */
111 double last_qscale_for[5]; /* last qscale for a specific pict type, used for max_diff & ipb factor stuff */
112 int last_non_b_pict_type;
113 double accum_p_qp; /* for determining I-frame quant */
115 double last_accum_p_norm;
116 double lmin[5]; /* min qscale by frame type */
118 double lstep; /* max change (multiply) in qscale per frame */
119 double i_cplx_sum[5]; /* estimated total texture bits in intra MBs at qscale=1 */
120 double p_cplx_sum[5];
121 double mv_bits_sum[5];
122 int frame_count[5]; /* number of frames of each type */
126 static int init_pass2(x264_t *);
127 static float rate_estimate_qscale( x264_t *h, int pict_type );
130 * qp = h.264's quantizer
131 * qscale = linearized quantizer = Lagrange multiplier
133 static inline double qp2qscale(double qp)
135 return 0.85 * pow(2.0, ( qp - 12.0 ) / 6.0);
137 static inline double qscale2qp(double qscale)
139 return 12.0 + 6.0 * log(qscale/0.85) / log(2.0);
142 /* Texture bitrate is not quite inversely proportional to qscale,
143 * probably due the the changing number of SKIP blocks.
144 * MV bits level off at about qp<=12, because the lambda used
145 * for motion estimation is constant there. */
146 static inline double qscale2bits(ratecontrol_entry_t *rce, double qscale)
150 return (rce->i_tex_bits + rce->p_tex_bits + .1) * pow( rce->qscale / qscale, 1.1 )
151 + rce->mv_bits * pow( X264_MAX(rce->qscale, 12) / X264_MAX(qscale, 12), 0.5 );
154 /* There is no analytical inverse to the above formula. */
156 static inline double bits2qscale(ratecontrol_entry_t *rce, double bits)
160 return (rce->i_tex_bits + rce->p_tex_bits + rce->mv_bits + .1) * rce->qscale / bits;
165 int x264_ratecontrol_new( x264_t *h )
167 x264_ratecontrol_t *rc;
171 /* Needed(?) for 2 pass */
172 x264_cpu_restore( h->param.cpu );
174 h->rc = rc = x264_malloc( sizeof( x264_ratecontrol_t ) );
175 memset(rc, 0, sizeof(*rc));
177 /* FIXME: use integers */
178 if(h->param.i_fps_num > 0 && h->param.i_fps_den > 0)
179 rc->fps = (float) h->param.i_fps_num / h->param.i_fps_den;
183 rc->gop_size = h->param.i_keyint_max;
184 rc->bitrate = h->param.rc.i_bitrate * 1000;
185 rc->nmb = h->mb.i_mb_count;
187 rc->qp_constant[SLICE_TYPE_P] = h->param.rc.i_qp_constant;
188 rc->qp_constant[SLICE_TYPE_I] = x264_clip3( (int)( qscale2qp( qp2qscale( h->param.rc.i_qp_constant ) / fabs( h->param.rc.f_ip_factor )) + 0.5 ), 0, 51 );
189 rc->qp_constant[SLICE_TYPE_B] = x264_clip3( (int)( qscale2qp( qp2qscale( h->param.rc.i_qp_constant ) * fabs( h->param.rc.f_pb_factor )) + 0.5 ), 0, 51 );
191 /* Init 1pass CBR algo */
192 if( h->param.rc.b_cbr ){
193 rc->buffer_size = h->param.rc.i_rc_buffer_size * 1000;
194 rc->buffer_fullness = h->param.rc.i_rc_init_buffer;
195 rc->rcbufrate = rc->bitrate / rc->fps;
197 if(rc->buffer_size < rc->rcbufrate){
198 x264_log(h, X264_LOG_WARNING, "rc buffer size %i too small\n",
203 if(rc->buffer_size <= 0)
204 rc->buffer_size = rc->bitrate / 2;
206 if(rc->buffer_fullness > rc->buffer_size || rc->buffer_fullness < 0){
207 x264_log(h, X264_LOG_WARNING, "invalid initial buffer fullness %i\n",
208 rc->buffer_fullness);
209 rc->buffer_fullness = 0;
212 bpp = rc->bitrate / (rc->fps * h->param.i_width * h->param.i_height);
221 rc->gop_qp = rc->init_qp;
223 rc->bits_last_gop = 0;
225 x264_log(h, X264_LOG_DEBUG, "%f fps, %i bps, bufsize %i\n",
226 rc->fps, rc->bitrate, rc->buffer_size);
230 rc->lstep = exp2f(h->param.rc.i_qp_step / 6.0);
231 rc->last_qscale = qp2qscale(26);
232 for( i = 0; i < 5; i++ )
234 rc->last_qscale_for[i] = qp2qscale(26);
235 rc->lmin[i] = qp2qscale( h->param.rc.i_qp_min );
236 rc->lmax[i] = qp2qscale( h->param.rc.i_qp_max );
238 #if 0 // FIXME: do we want to assign lmin/lmax based on ip_factor, or leave them all the same?
239 rc->lmin[SLICE_TYPE_I] /= fabs(h->param.f_ip_factor);
240 rc->lmax[SLICE_TYPE_I] /= fabs(h->param.f_ip_factor);
241 rc->lmin[SLICE_TYPE_B] *= fabs(h->param.f_pb_factor);
242 rc->lmax[SLICE_TYPE_B] *= fabs(h->param.f_pb_factor);
245 /* Load stat file and init 2pass algo */
246 if( h->param.rc.b_stat_read )
252 /* read 1st pass stats */
253 assert( h->param.rc.psz_stat_in );
254 stats_file = fopen( h->param.rc.psz_stat_in, "rb");
257 x264_log(h, X264_LOG_ERROR, "ratecontrol_init: can't open stats file\n");
260 // FIXME: error checking
261 fseek(stats_file, 0, SEEK_END);
262 stats_size = ftell(stats_file);
263 fseek(stats_file, 0, SEEK_SET);
264 stats_in = x264_malloc(stats_size+10);
265 fread(stats_in, 1, stats_size, stats_file);
268 /* find number of pics */
271 p = strchr(p+1, ';');
273 i += h->param.i_bframe;
274 rc->entry = (ratecontrol_entry_t*) x264_malloc(i*sizeof(ratecontrol_entry_t));
275 memset(rc->entry, 0, i*sizeof(ratecontrol_entry_t));
278 /* init all to skipped p frames */
279 for(i=0; i<rc->num_entries; i++){
280 ratecontrol_entry_t *rce = &rc->entry[i];
281 rce->pict_type = SLICE_TYPE_P;
282 rce->qscale = rce->new_qscale = qp2qscale(20);
283 rce->misc_bits = rc->nmb + 10;
289 for(i=0; i < rc->num_entries - h->param.i_bframe; i++){
290 ratecontrol_entry_t *rce;
297 next= strchr(p, ';');
299 (*next)=0; //sscanf is unbelievably slow on looong strings
302 e = sscanf(p, " in:%d ", &frame_number);
304 assert(frame_number >= 0);
305 assert(frame_number < rc->num_entries);
306 rce = &rc->entry[frame_number];
308 e += sscanf(p, " in:%*d out:%*d type:%c q:%f itex:%d ptex:%d mv:%d misc:%d imb:%d pmb:%d smb:%d",
309 &pict_type, &qp, &rce->i_tex_bits, &rce->p_tex_bits,
310 &rce->mv_bits, &rce->misc_bits, &rce->i_count, &rce->p_count, &rce->s_count);
313 case 'I': rce->idr = 1;
314 case 'i': rce->pict_type = SLICE_TYPE_I; break;
315 case 'P': rce->pict_type = SLICE_TYPE_P; break;
316 case 'B': rce->pict_type = SLICE_TYPE_B; break;
317 default: e = -1; break;
320 x264_log(h, X264_LOG_ERROR, "statistics are damaged at line %d, parser out=%d\n", i, e);
323 rce->qscale = qp2qscale(qp);
329 /* If using 2pass with constant quant, no need to run the bitrate allocation */
330 if(h->param.rc.b_cbr)
332 if(init_pass2(h) < 0) return -1;
336 /* Open output file */
337 /* If input and output files are the same, output to a temp file
338 * and move it to the real name only when it's complete */
339 if( h->param.rc.b_stat_write )
341 rc->psz_stat_file_tmpname = x264_malloc( strlen(h->param.rc.psz_stat_out) + 6 );
342 strcpy( rc->psz_stat_file_tmpname, h->param.rc.psz_stat_out );
343 strcat( rc->psz_stat_file_tmpname, ".temp" );
345 rc->p_stat_file_out = fopen( rc->psz_stat_file_tmpname, "wb" );
346 if( rc->p_stat_file_out == NULL )
348 x264_log(h, X264_LOG_ERROR, "ratecontrol_init: can't open stats file\n");
356 void x264_ratecontrol_delete( x264_t *h )
358 x264_ratecontrol_t *rc = h->rc;
360 if( rc->p_stat_file_out )
362 fclose( rc->p_stat_file_out );
363 if( h->i_frame >= rc->num_entries - h->param.i_bframe )
364 if( rename( rc->psz_stat_file_tmpname, h->param.rc.psz_stat_out ) != 0 )
366 x264_log( h, X264_LOG_ERROR, "failed to rename \"%s\" to \"%s\"\n",
367 rc->psz_stat_file_tmpname, h->param.rc.psz_stat_out );
369 x264_free( rc->psz_stat_file_tmpname );
372 x264_free(rc->entry);
376 void x264_ratecontrol_start( x264_t *h, int i_slice_type )
378 x264_ratecontrol_t *rc = h->rc;
379 int gframes, iframes, pframes, bframes;
380 int minbits, maxbits;
386 rc->slice_type = i_slice_type;
388 x264_cpu_restore( h->param.cpu );
390 if( !h->param.rc.b_cbr )
392 rc->qpm = rc->qpa = rc->qp =
393 rc->qp_constant[ i_slice_type ];
396 else if( h->param.rc.b_stat_read )
398 int frame = h->fenc->i_frame;
399 ratecontrol_entry_t *rce;
400 assert( frame >= 0 && frame < rc->num_entries );
401 rce = &h->rc->entry[frame];
403 rce->new_qscale = rate_estimate_qscale( h, i_slice_type );
404 rc->qpm = rc->qpa = rc->qp = rce->new_qp =
405 (int)(qscale2qp(rce->new_qscale) + 0.5);
409 switch(i_slice_type){
411 gbuf = rc->buffer_fullness + (rc->gop_size-1) * rc->rcbufrate;
412 rc->bits_gop = gbuf - rc->buffer_size / 2;
414 if(!rc->mb && rc->pframes){
415 int qp = rc->qp_avg_p / rc->pframes + 0.5;
416 #if 0 /* JM does this without explaining why */
417 int gdq = (float) rc->gop_size / 15 + 0.5;
421 if(qp > rc->qp_last_p - 2)
424 qp = x264_clip3(qp, rc->gop_qp - 4, rc->gop_qp + 4);
425 qp = x264_clip3(qp, h->param.rc.i_qp_min, h->param.rc.i_qp_max);
427 } else if(rc->frames > 4){
428 rc->gop_qp = rc->init_qp;
431 kp = h->param.rc.f_ip_factor * h->param.rc.f_pb_factor;
433 x264_log(h, X264_LOG_DEBUG,"gbuf=%i bits_gop=%i frames=%i gop_qp=%i\n",
434 gbuf, rc->bits_gop, rc->frames, rc->gop_qp);
436 rc->bits_last_gop = 0;
443 kp = h->param.rc.f_pb_factor;
451 x264_log(h, X264_LOG_WARNING, "ratecontrol: unknown slice type %i\n",
457 gframes = rc->gop_size - rc->frames;
458 iframes = gframes / rc->gop_size;
459 pframes = gframes / (h->param.i_bframe + 1) - iframes;
460 bframes = gframes - pframes - iframes;
462 gbits = rc->bits_gop - rc->bits_last_gop;
464 (h->param.rc.f_ip_factor * h->param.rc.f_pb_factor * iframes +
465 h->param.rc.f_pb_factor * pframes + bframes);
467 minbits = rc->buffer_fullness + rc->rcbufrate - rc->buffer_size;
470 maxbits = rc->buffer_fullness;
471 rc->fbits = x264_clip3(fbits, minbits, maxbits);
473 if(i_slice_type == SLICE_TYPE_I){
475 } else if(rc->ncoeffs && rc->ufbits){
478 nonzc = (rc->ncoeffs - rc->nzcoeffs);
481 else if(rc->fbits < INT_MAX / nonzc)
482 zn = rc->ncoeffs - rc->fbits * nonzc / rc->ufbits;
485 zn = x264_clip3(zn, 0, rc->ncoeffs);
486 dqp = h->param.rc.i_rc_sens * exp2f(rc->qpa / 6) *
487 (zn - rc->nzcoeffs) / rc->nzcoeffs;
488 dqp = x264_clip3(dqp, -h->param.rc.i_qp_step, h->param.rc.i_qp_step);
489 rc->qp = (int)(rc->qpa + dqp + .5);
492 if(rc->fbits > 0.9 * maxbits)
494 else if(rc->fbits > 0.8 * maxbits)
496 else if(rc->fbits < 1.1 * minbits)
498 else if(rc->fbits < 1.2 * minbits)
501 rc->qp = x264_clip3(rc->qp, h->param.rc.i_qp_min, h->param.rc.i_qp_max);
504 x264_log(h, X264_LOG_DEBUG, "fbits=%i, qp=%i, z=%i, min=%i, max=%i\n",
505 rc->fbits, rc->qpm, zn, minbits, maxbits);
507 rc->fbits -= rc->overhead;
515 void x264_ratecontrol_mb( x264_t *h, int bits )
517 x264_ratecontrol_t *rc = h->rc;
524 if( !h->param.rc.b_cbr || h->param.rc.b_stat_read )
527 x264_cpu_restore( h->param.cpu );
533 for(i = 0; i < 16 + 8; i++)
534 rc->nzcoeffs += 16 - h->mb.cache.non_zero_count[x264_scan8[i]];
535 rc->ncoeffs += 16 * (16 + 8);
537 if(rc->mb < rc->nmb / 16)
539 else if(rc->mb == rc->nmb)
542 rcoeffs = (rc->nmb - rc->mb) * 16 * 24;
543 rbits = rc->fbits - rc->ufbits;
547 /* zn = (rc->nmb - rc->mb) * 16 * 24; */
548 nonz = (rc->ncoeffs - rc->nzcoeffs);
551 else if(rc->ufbits && rbits < INT_MAX / nonz)
552 zn = rcoeffs - rbits * nonz / rc->ufbits;
555 zn = x264_clip3(zn, 0, rcoeffs);
556 enz = rc->nzcoeffs * (rc->nmb - rc->mb) / rc->mb;
557 dqp = (float) 2*h->param.rc.i_rc_sens * exp2f((float) rc->qps / rc->mb / 6) *
559 rc->qpm = x264_clip3(rc->qpm + dqp, rc->qp - 3, rc->qp + 3);
562 rc->qpm = x264_clip3(rc->qpm, h->param.rc.i_qp_min, h->param.rc.i_qp_max);
565 int x264_ratecontrol_qp( x264_t *h )
570 int x264_ratecontrol_slice_type( x264_t *h, int frame_num )
572 if( h->param.rc.b_stat_read )
574 if( frame_num >= h->rc->num_entries )
576 x264_log(h, X264_LOG_ERROR, "More input frames than in the 1st pass\n");
579 switch( h->rc->entry[frame_num].pict_type )
582 return h->rc->entry[frame_num].idr ? X264_TYPE_IDR : X264_TYPE_I;
594 return X264_TYPE_AUTO;
598 void x264_ratecontrol_end( x264_t *h, int bits )
600 x264_ratecontrol_t *rc = h->rc;
603 x264_cpu_restore( h->param.cpu );
605 h->stat.frame.i_mb_count_skip = h->stat.frame.i_mb_count[P_SKIP] + h->stat.frame.i_mb_count[B_SKIP];
606 h->stat.frame.i_mb_count_p = h->stat.frame.i_mb_count[P_L0] + h->stat.frame.i_mb_count[P_8x8];
607 for( i = B_DIRECT; i < B_8x8; i++ )
608 h->stat.frame.i_mb_count_p += h->stat.frame.i_mb_count[i];
610 if( h->param.rc.b_stat_write )
612 char c_type = rc->slice_type==SLICE_TYPE_I ? (h->fenc->i_poc==0 ? 'I' : 'i')
613 : rc->slice_type==SLICE_TYPE_P ? 'P' : 'B';
614 fprintf( rc->p_stat_file_out,
615 "in:%d out:%d type:%c q:%.3f itex:%d ptex:%d mv:%d misc:%d imb:%d pmb:%d smb:%d;\n",
616 h->fenc->i_frame, h->i_frame-1,
618 h->stat.frame.i_itex_bits, h->stat.frame.i_ptex_bits,
619 h->stat.frame.i_hdr_bits, h->stat.frame.i_misc_bits,
620 h->stat.frame.i_mb_count[I_4x4] + h->stat.frame.i_mb_count[I_16x16],
621 h->stat.frame.i_mb_count_p,
622 h->stat.frame.i_mb_count_skip);
625 if( !h->param.rc.b_cbr || h->param.rc.b_stat_read )
628 rc->buffer_fullness += rc->rcbufrate - bits;
629 if(rc->buffer_fullness < 0){
630 x264_log(h, X264_LOG_WARNING, "buffer underflow %i\n",
631 rc->buffer_fullness);
632 rc->buffer_fullness = 0;
635 rc->qpa = (float)rc->qps / rc->mb;
636 if(rc->slice_type == SLICE_TYPE_P){
637 rc->qp_avg_p += rc->qpa;
638 rc->qp_last_p = rc->qpa;
640 } else if(rc->slice_type == SLICE_TYPE_I){
641 float err = (float) rc->ufbits / rc->fbits;
648 rc->overhead = bits - rc->ufbits;
650 x264_log(h, X264_LOG_DEBUG, "bits=%i, qp=%.1f, z=%i, zr=%6.3f, buf=%i\n",
651 bits, rc->qpa, rc->nzcoeffs, (float) rc->nzcoeffs / rc->ncoeffs,
652 rc->buffer_fullness);
654 rc->bits_last_gop += bits;
659 /****************************************************************************
661 ***************************************************************************/
662 double x264_eval( char *s, double *const_value, const char **const_name,
663 double (**func1)(void *, double), const char **func1_name,
664 double (**func2)(void *, double, double), char **func2_name,
668 * modifies the bitrate curve from pass1 for one frame
670 static double get_qscale(x264_t *h, ratecontrol_entry_t *rce, double rate_factor)
672 x264_ratecontrol_t *rcc= h->rc;
673 const int pict_type = rce->pict_type;
676 double const_values[]={
677 rce->i_tex_bits * rce->qscale,
678 rce->p_tex_bits * rce->qscale,
679 (rce->i_tex_bits + rce->p_tex_bits) * rce->qscale,
680 rce->mv_bits * rce->qscale,
681 (double)rce->i_count / rcc->nmb,
682 (double)rce->p_count / rcc->nmb,
683 (double)rce->s_count / rcc->nmb,
684 rce->pict_type == SLICE_TYPE_I,
685 rce->pict_type == SLICE_TYPE_P,
686 rce->pict_type == SLICE_TYPE_B,
687 h->param.rc.f_qcompress,
688 rcc->i_cplx_sum[SLICE_TYPE_I] / rcc->frame_count[SLICE_TYPE_I],
689 rcc->i_cplx_sum[SLICE_TYPE_P] / rcc->frame_count[SLICE_TYPE_P],
690 rcc->p_cplx_sum[SLICE_TYPE_P] / rcc->frame_count[SLICE_TYPE_P],
691 rcc->p_cplx_sum[SLICE_TYPE_B] / rcc->frame_count[SLICE_TYPE_B],
692 (rcc->i_cplx_sum[pict_type] + rcc->p_cplx_sum[pict_type]) / rcc->frame_count[pict_type],
693 rce->blurred_complexity,
696 static const char *const_names[]={
716 static double (*func1[])(void *, double)={
717 // (void *)bits2qscale,
721 static const char *func1_names[]={
727 q = x264_eval((char*)h->param.rc.psz_rc_eq, const_values, const_names, func1, func1_names, NULL, NULL, rce);
730 // avoid NaN's in the rc_eq
731 if(q != q || rce->i_tex_bits + rce->p_tex_bits + rce->mv_bits == 0)
732 q = rcc->last_qscale;
734 rcc->last_qscale = q;
739 static double get_diff_limited_q(x264_t *h, ratecontrol_entry_t *rce, double q)
741 x264_ratecontrol_t *rcc = h->rc;
742 const int pict_type = rce->pict_type;
744 // force I/B quants as a function of P quants
745 const double last_p_q = rcc->last_qscale_for[SLICE_TYPE_P];
746 const double last_non_b_q= rcc->last_qscale_for[rcc->last_non_b_pict_type];
747 if( pict_type == SLICE_TYPE_I )
750 double pq = qp2qscale( rcc->accum_p_qp / rcc->accum_p_norm );
751 double ip_factor = fabs( h->param.rc.f_ip_factor );
752 /* don't apply ip_factor if the following frame is also I */
753 if( rcc->accum_p_norm <= 0 )
755 else if( h->param.rc.f_ip_factor < 0 )
757 else if( rcc->accum_p_norm >= 1 )
760 q = rcc->accum_p_norm * pq / ip_factor + (1 - rcc->accum_p_norm) * iq;
762 else if( pict_type == SLICE_TYPE_B )
764 if( h->param.rc.f_pb_factor > 0 )
766 q *= fabs( h->param.rc.f_pb_factor );
768 else if( pict_type == SLICE_TYPE_P
769 && rcc->last_non_b_pict_type == SLICE_TYPE_P
770 && rce->i_tex_bits + rce->p_tex_bits == 0 )
775 /* last qscale / qdiff stuff */
776 /* TODO take intro account whether the I-frame is a scene cut
777 * or just a seek point */
778 if(rcc->last_non_b_pict_type==pict_type
779 && (pict_type!=SLICE_TYPE_I || rcc->last_accum_p_norm < 1))
781 double last_q = rcc->last_qscale_for[pict_type];
782 double max_qscale = last_q * rcc->lstep;
783 double min_qscale = last_q / rcc->lstep;
785 if (q > max_qscale) q = max_qscale;
786 else if(q < min_qscale) q = min_qscale;
789 rcc->last_qscale_for[pict_type] = q;
790 if(pict_type!=SLICE_TYPE_B)
791 rcc->last_non_b_pict_type = pict_type;
792 if(pict_type==SLICE_TYPE_I)
794 rcc->last_accum_p_norm = rcc->accum_p_norm;
795 rcc->accum_p_norm = 0;
798 if(pict_type==SLICE_TYPE_P)
800 float mask = 1 - pow( (float)rce->i_count / rcc->nmb, 2 );
801 rcc->accum_p_qp = mask * (qscale2qp(q) + rcc->accum_p_qp);
802 rcc->accum_p_norm = mask * (1 + rcc->accum_p_norm);
807 // clip a qscale to between lmin and lmax
808 static double clip_qscale( x264_t *h, ratecontrol_entry_t *rce, double q )
810 double lmin = h->rc->lmin[rce->pict_type];
811 double lmax = h->rc->lmax[rce->pict_type];
816 double min2 = log(lmin);
817 double max2 = log(lmax);
818 q = (log(q) - min2)/(max2-min2) - 0.5;
819 q = 1.0/(1.0 + exp(-4*q));
820 q = q*(max2-min2) + min2;
825 // update qscale for 1 frame based on actual bits used so far
826 static float rate_estimate_qscale(x264_t *h, int pict_type)
829 float br_compensation;
831 int picture_number = h->fenc->i_frame;
832 x264_ratecontrol_t *rcc = h->rc;
833 ratecontrol_entry_t *rce;
834 double lmin = rcc->lmin[pict_type];
835 double lmax = rcc->lmax[pict_type];
836 int64_t total_bits = 8*(h->stat.i_slice_size[SLICE_TYPE_I]
837 + h->stat.i_slice_size[SLICE_TYPE_P]
838 + h->stat.i_slice_size[SLICE_TYPE_B]);
840 //printf("input_pic_num:%d pic_num:%d frame_rate:%d\n", s->input_picture_number, s->picture_number, s->frame_rate);
842 rce = &rcc->entry[picture_number];
844 assert(pict_type == rce->pict_type);
846 if(rce->pict_type == SLICE_TYPE_B)
848 return rcc->last_qscale * h->param.rc.f_pb_factor;
852 diff = (int64_t)total_bits - (int64_t)rce->expected_bits;
853 br_compensation = (rcc->buffer_size - diff) / rcc->buffer_size;
854 br_compensation = x264_clip3f(br_compensation, .5, 2);
856 q = rce->new_qscale / br_compensation;
857 q = x264_clip3f(q, lmin, lmax);
858 rcc->last_qscale = q;
863 static int init_pass2( x264_t *h )
865 x264_ratecontrol_t *rcc = h->rc;
866 uint64_t all_const_bits = 0;
867 uint64_t all_available_bits = (uint64_t)(h->param.rc.i_bitrate * 1000 * (double)rcc->num_entries / rcc->fps);
868 double rate_factor, step, step_mult;
869 double qblur = h->param.rc.f_qblur;
870 double cplxblur = h->param.rc.f_complexity_blur;
871 const int filter_size = (int)(qblur*4) | 1;
872 double expected_bits;
873 double *qscale, *blurred_qscale;
876 /* find total/average complexity & const_bits */
877 for(i=0; i<rcc->num_entries; i++){
878 ratecontrol_entry_t *rce = &rcc->entry[i];
879 all_const_bits += rce->misc_bits;
880 rcc->i_cplx_sum[rce->pict_type] += rce->i_tex_bits * rce->qscale;
881 rcc->p_cplx_sum[rce->pict_type] += rce->p_tex_bits * rce->qscale;
882 rcc->mv_bits_sum[rce->pict_type] += rce->mv_bits * rce->qscale;
883 rcc->frame_count[rce->pict_type] ++;
886 if( all_available_bits < all_const_bits)
888 x264_log(h, X264_LOG_ERROR, "requested bitrate is too low. estimated minimum is %d kbps\n",
889 (int)(all_const_bits * rcc->fps / (rcc->num_entries * 1000)));
893 for(i=0; i<rcc->num_entries; i++){
894 ratecontrol_entry_t *rce = &rcc->entry[i];
895 double weight_sum = 0;
899 /* weighted average of cplx of future frames */
900 for(j=1; j<cplxblur*2 && j<rcc->num_entries-i; j++){
901 ratecontrol_entry_t *rcj = &rcc->entry[i+j];
902 weight *= 1 - pow( (float)rcj->i_count / rcc->nmb, 2 );
905 weight_sum += weight;
906 cplx_sum += weight * qscale2bits(rcj, 1);
908 /* weighted average of cplx of past frames */
910 for(j=0; j<cplxblur*2 && j<=i; j++){
911 ratecontrol_entry_t *rcj = &rcc->entry[i-j];
912 weight_sum += weight;
913 cplx_sum += weight * qscale2bits(rcj, 1);
914 weight *= 1 - pow( (float)rcj->i_count / rcc->nmb, 2 );
918 rce->blurred_complexity = cplx_sum / weight_sum;
921 qscale = x264_malloc(sizeof(double)*rcc->num_entries);
923 blurred_qscale = x264_malloc(sizeof(double)*rcc->num_entries);
925 blurred_qscale = qscale;
928 for(i=0; i<rcc->num_entries; i++)
929 expected_bits += qscale2bits(&rcc->entry[i], get_qscale(h, &rcc->entry[i], 1.0));
930 step_mult = all_available_bits / expected_bits;
933 for(step = 1E4 * step_mult; step > 1E-7 * step_mult; step *= 0.5){
937 rcc->last_non_b_pict_type = -1;
938 rcc->last_accum_p_norm = 1;
941 for(i=0; i<rcc->num_entries; i++){
942 qscale[i] = get_qscale(h, &rcc->entry[i], rate_factor);
945 /* fixed I/B QP relative to P mode */
946 for(i=rcc->num_entries-1; i>=0; i--){
947 qscale[i] = get_diff_limited_q(h, &rcc->entry[i], qscale[i]);
948 assert(qscale[i] >= 0);
953 assert(filter_size%2==1);
954 for(i=0; i<rcc->num_entries; i++){
955 ratecontrol_entry_t *rce = &rcc->entry[i];
957 double q=0.0, sum=0.0;
959 for(j=0; j<filter_size; j++){
960 int index = i+j-filter_size/2;
962 double coeff = qblur==0 ? 1.0 : exp(-d*d/(qblur*qblur));
963 if(index < 0 || index >= rcc->num_entries) continue;
964 if(rce->pict_type != rcc->entry[index].pict_type) continue;
965 q += qscale[index] * coeff;
968 blurred_qscale[i] = q/sum;
972 /* find expected bits */
973 for(i=0; i<rcc->num_entries; i++){
974 ratecontrol_entry_t *rce = &rcc->entry[i];
976 rce->new_qscale = clip_qscale(h, rce, blurred_qscale[i]);
977 assert(rce->new_qscale >= 0);
978 bits = qscale2bits(rce, rce->new_qscale) + rce->misc_bits;
980 rce->expected_bits = expected_bits;
981 expected_bits += bits;
984 //printf("expected:%llu available:%llu factor:%lf avgQ:%lf\n", (uint64_t)expected_bits, all_available_bits, rate_factor);
985 if(expected_bits > all_available_bits) rate_factor -= step;
990 x264_free(blurred_qscale);
992 if(fabs(expected_bits/all_available_bits - 1.0) > 0.01)
995 for(i=0; i<rcc->num_entries; i++)
996 avgq += rcc->entry[i].new_qscale;
997 avgq = qscale2qp(avgq / rcc->num_entries);
999 x264_log(h, X264_LOG_ERROR, "Error: 2pass curve failed to converge\n");
1000 x264_log(h, X264_LOG_ERROR, "target: %.2f kbit/s, got: %.2f kbit/s, avg QP: %.4f\n",
1001 (float)h->param.rc.i_bitrate,
1002 expected_bits * rcc->fps / (rcc->num_entries * 1000.),
1004 if(expected_bits < all_available_bits && avgq < h->param.rc.i_qp_min + 2)
1005 x264_log(h, X264_LOG_ERROR, "try reducing target bitrate or reducing qp_min (currently %d)\n", h->param.rc.i_qp_min);
1006 else if(expected_bits > all_available_bits && avgq > h->param.rc.i_qp_max - 2)
1008 if(h->param.rc.i_qp_max < 51)
1009 x264_log(h, X264_LOG_ERROR, "try increasing target bitrate or increasing qp_max (currently %d)\n", h->param.rc.i_qp_max);
1011 x264_log(h, X264_LOG_ERROR, "try increasing target bitrate\n");
1014 x264_log(h, X264_LOG_ERROR, "internal error\n");