frontends/va: set vbv buffer size same as target bitrate in cbr mode
authorSajeesh Sidharthan <sajeesh.sidharthan@amd.com>
Fri, 11 Nov 2022 15:17:56 +0000 (07:17 -0800)
committerMarge Bot <emma+marge@anholt.net>
Wed, 16 Nov 2022 20:01:05 +0000 (20:01 +0000)
video buffering verifier (vbv) buffer size must be set same as
target bitrate to achieve constant bitrate.

Signed-off-by: Sajeesh Sidharthan <sajeesh.sidharthan@amd.com>
Reviewed-by: Boyuan Zhang <Boyuan.Zhang@amd.com>
Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Reviewed-by: Veerabadhran Gopalakrishnan <Veerabadhran.Gopalakrishnan@amd.com>
Reviewed-by: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19695>

src/gallium/frontends/va/picture_h264_enc.c

index 8c8256e..1f0e808 100644 (file)
@@ -252,12 +252,17 @@ vlVaHandleVAEncMiscParameterTypeRateControlH264(vlVaContext *context, VAEncMiscP
    context->desc.h264enc.rate_ctrl[temporal_id].fill_data_enable = !(rc->rc_flags.bits.disable_bit_stuffing);
    context->desc.h264enc.rate_ctrl[temporal_id].skip_frame_enable = !(rc->rc_flags.bits.disable_frame_skip);
    context->desc.h264enc.rate_ctrl[temporal_id].peak_bitrate = rc->bits_per_second;
-   if (context->desc.h264enc.rate_ctrl[temporal_id].target_bitrate < 2000000)
-       context->desc.h264enc.rate_ctrl[temporal_id].vbv_buffer_size =
+
+   if ((context->desc.h264enc.rate_ctrl[0].rate_ctrl_method == PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT) ||
+       (context->desc.h264enc.rate_ctrl[0].rate_ctrl_method == PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT_SKIP))
+      context->desc.h264enc.rate_ctrl[temporal_id].vbv_buffer_size =
+         context->desc.h264enc.rate_ctrl[temporal_id].target_bitrate;
+   else if (context->desc.h264enc.rate_ctrl[temporal_id].target_bitrate < 2000000)
+      context->desc.h264enc.rate_ctrl[temporal_id].vbv_buffer_size =
          MIN2((context->desc.h264enc.rate_ctrl[0].target_bitrate * 2.75), 2000000);
    else
       context->desc.h264enc.rate_ctrl[temporal_id].vbv_buffer_size =
-         context->desc.h264enc.rate_ctrl[0].target_bitrate;
+         context->desc.h264enc.rate_ctrl[temporal_id].target_bitrate;
 
    context->desc.h264enc.rate_ctrl[temporal_id].max_qp = rc->max_qp;
    context->desc.h264enc.rate_ctrl[temporal_id].min_qp = rc->min_qp;