[x264-devel] commit: Correct misprediction of bitrate in threaded mode ( Gabriel Bouvigne )
BugMaster
BugMaster at narod.ru
Thu Sep 18 19:52:11 CEST 2008
On Thu, 18 Sep 2008 10:41:18 +0200, Gabriel Bouvigne wrote:
> diff --git a/encoder/ratecontrol.c b/encoder/ratecontrol.c
> old mode 100644
> new mode 100755
> index 103e73b..cb1dd69
> --- a/encoder/ratecontrol.c
> +++ b/encoder/ratecontrol.c
> @@ -42,7 +42,7 @@ typedef struct
> int mv_bits;
> int tex_bits;
> int misc_bits;
> - uint64_t expected_bits;
> + uint64_t expected_bits; /*total expected bits up to the
> current frame (current one excluded)*/
> double expected_vbv;
> float new_qscale;
> int new_qp;
> @@ -93,7 +93,7 @@ struct x264_ratecontrol_t
> int last_satd;
> double last_rceq;
> double cplxr_sum; /* sum of bits*qscale/rceq */
> - double expected_bits_sum; /* sum of qscale2bits after rceq, ratefactor, and overflow */
> + double expected_bits_sum; /* sum of qscale2bits after rceq,
> ratefactor, and overflow, only includes finished frames */
> double wanted_bits_window; /* target bitrate * window */
> double cbr_decay;
> double short_term_cplxsum;
> @@ -1348,21 +1348,6 @@ static float rate_estimate_qscale( x264_t *h )
> + h->stat.i_slice_size[SLICE_TYPE_P]
> + h->stat.i_slice_size[SLICE_TYPE_B]);
>
- if( h->>param.i_threads > 1 )
> - {
- int j = h->>rc - h->thread[0]->rc;
> - int i;
> - for( i=1; i<h->param.i_threads; i++ )
> - {
> - x264_t *t = h->thread[ (j+i)%h->param.i_threads ];
> - double bits = t->rc->frame_size_planned;
> - if( !t->b_thread_active )
> - continue;
> - bits = X264_MAX(bits,
> x264_ratecontrol_get_estimated_size(t));
> - total_bits += (int64_t)bits;
> - }
> - }
> -
> if( rcc->b_2pass )
> {
> rce = *rcc->rce;
> @@ -1415,10 +1400,39 @@ 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;
> + int64_t predicted_bits = total_bits;
> +
> + if( rcc->b_vbv )
> + {
> + if( h->param.i_threads > 1 )
> + {
> + int j = h->rc - h->thread[0]->rc;
> + int i;
> + for( i=1; i<h->param.i_threads; i++ )
> + {
> + x264_t *t = h->thread[ (j+i)%h->param.i_threads ];
> + double bits = t->rc->frame_size_planned;
> + if( !t->b_thread_active )
> + continue;
> + bits = X264_MAX(bits,
> x264_ratecontrol_get_estimated_size(t));
> + predicted_bits += (int64_t)bits;
> + }
> + }
> + }
> + else
> + {
> + if( h->fenc->i_frame < h->param.i_threads )
> + predicted_bits += (int64_t)h->fenc->i_frame * rcc->bitrate / rcc->fps;
> + else
> + predicted_bits += (int64_t)(h->param.i_threads - 1) * rcc->bitrate / rcc->fps;
> + }
> +
> + diff = predicted_bits - (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 */
Yes. I think this would be the best solution.
More information about the x264-devel
mailing list