diff --git a/encoder/ratecontrol.c b/encoder/ratecontrol.c index a049f74..557b920 100644 --- a/encoder/ratecontrol.c +++ b/encoder/ratecontrol.c @@ -1467,10 +1467,15 @@ static float rate_estimate_qscale( x264_t *h ) if( rcc->b_2pass ) { //FIXME adjust abr_buffer based on distance to the end of the video - int64_t diff = total_bits - (int64_t)rce.expected_bits; + int64_t diff; + + if( h->fenc->i_frame < h->param.i_threads ) + diff = total_bits + (int64_t)h->fenc->i_frame * rcc->bitrate / rcc->fps - (int64_t)rce.expected_bits; + else + diff = total_bits + (int64_t)(h->param.i_threads - 1) * rcc->bitrate / rcc->fps - (int64_t)rce.expected_bits; q = rce.new_qscale; q /= x264_clip3f((double)(abr_buffer - diff) / abr_buffer, .5, 2); - if( h->fenc->i_frame > 30 ) + if( h->fenc->i_frame + 1 - h->param.i_threads >= rcc->fps && rcc->expected_bits_sum > 0) { /* Adjust quant based on the difference between * achieved and expected bitrate so far */ @@ -1542,7 +1547,7 @@ static float rate_estimate_qscale( x264_t *h ) wanted_bits = i_frame_done * rcc->bitrate / rcc->fps; if( wanted_bits > 0 ) { - abr_buffer *= X264_MAX( 1, sqrt(i_frame_done/25) ); + abr_buffer *= X264_MAX( 1, sqrt(i_frame_done / rcc->fps) ); overflow = x264_clip3f( 1.0 + (total_bits - wanted_bits) / abr_buffer, .5, 2 ); q *= overflow; }