[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