From 5b157d4ad0dfc15d163cec3fa43888736a9190b2 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Fri, 20 Sep 2024 13:57:46 +0200 Subject: [PATCH] frontends/va: Calculate VBV params for other layers relative to base layer VAAPI only gives these parameters for base layer, but we need them for other layers too. Reviewed-By: Sil Vilerino Reviewed-by: Ruijing Dong Part-of: --- src/gallium/frontends/va/picture_av1_enc.c | 24 +++++++++++++++------ src/gallium/frontends/va/picture_h264_enc.c | 22 +++++++++++++------ src/gallium/frontends/va/picture_hevc_enc.c | 24 +++++++++++++++------ 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/src/gallium/frontends/va/picture_av1_enc.c b/src/gallium/frontends/va/picture_av1_enc.c index a963f0e5b8b..e2b10edd924 100644 --- a/src/gallium/frontends/va/picture_av1_enc.c +++ b/src/gallium/frontends/va/picture_av1_enc.c @@ -409,13 +409,23 @@ vlVaHandleVAEncMiscParameterTypeHRDAV1(vlVaContext *context, VAEncMiscParameterB { VAEncMiscParameterHRD *ms = (VAEncMiscParameterHRD *)misc->data; - if (ms->buffer_size) { - context->desc.av1enc.rc[0].vbv_buffer_size = ms->buffer_size; - context->desc.av1enc.rc[0].vbv_buf_lv = (ms->initial_buffer_fullness << 6 ) / ms->buffer_size; - context->desc.av1enc.rc[0].vbv_buf_initial_size = ms->initial_buffer_fullness; - /* Distinguishes from the default params set for these values in other - * functions and app specific params passed down via HRD buffer */ - context->desc.av1enc.rc[0].app_requested_hrd_buffer = true; + if (ms->buffer_size == 0) + return VA_STATUS_ERROR_INVALID_PARAMETER; + + /* Distinguishes from the default params set for these values in other + functions and app specific params passed down via HRD buffer */ + context->desc.av1enc.rc[0].app_requested_hrd_buffer = true; + context->desc.av1enc.rc[0].vbv_buffer_size = ms->buffer_size; + context->desc.av1enc.rc[0].vbv_buf_lv = (ms->initial_buffer_fullness << 6) / ms->buffer_size; + context->desc.av1enc.rc[0].vbv_buf_initial_size = ms->initial_buffer_fullness; + + for (unsigned i = 1; i < context->desc.av1enc.seq.num_temporal_layers; i++) { + context->desc.av1enc.rc[i].vbv_buffer_size = + (float)ms->buffer_size / context->desc.av1enc.rc[0].peak_bitrate * + context->desc.av1enc.rc[i].peak_bitrate; + context->desc.av1enc.rc[i].vbv_buf_lv = context->desc.av1enc.rc[0].vbv_buf_lv; + context->desc.av1enc.rc[i].vbv_buf_initial_size = + (context->desc.av1enc.rc[i].vbv_buffer_size * context->desc.av1enc.rc[i].vbv_buf_lv) >> 6; } return VA_STATUS_SUCCESS; diff --git a/src/gallium/frontends/va/picture_h264_enc.c b/src/gallium/frontends/va/picture_h264_enc.c index 0fd4ce24740..6464c2ce0d6 100644 --- a/src/gallium/frontends/va/picture_h264_enc.c +++ b/src/gallium/frontends/va/picture_h264_enc.c @@ -840,13 +840,23 @@ vlVaHandleVAEncMiscParameterTypeHRDH264(vlVaContext *context, VAEncMiscParameter { VAEncMiscParameterHRD *ms = (VAEncMiscParameterHRD *)misc->data; - if (ms->buffer_size) { - context->desc.h264enc.rate_ctrl[0].vbv_buffer_size = ms->buffer_size; - context->desc.h264enc.rate_ctrl[0].vbv_buf_lv = (ms->initial_buffer_fullness << 6 ) / ms->buffer_size; - context->desc.h264enc.rate_ctrl[0].vbv_buf_initial_size = ms->initial_buffer_fullness; - /* Distinguishes from the default params set for these values in other + if (ms->buffer_size == 0) + return VA_STATUS_ERROR_INVALID_PARAMETER; + + /* Distinguishes from the default params set for these values in other functions and app specific params passed down via HRD buffer */ - context->desc.h264enc.rate_ctrl[0].app_requested_hrd_buffer = true; + context->desc.h264enc.rate_ctrl[0].app_requested_hrd_buffer = true; + context->desc.h264enc.rate_ctrl[0].vbv_buffer_size = ms->buffer_size; + context->desc.h264enc.rate_ctrl[0].vbv_buf_lv = (ms->initial_buffer_fullness << 6) / ms->buffer_size; + context->desc.h264enc.rate_ctrl[0].vbv_buf_initial_size = ms->initial_buffer_fullness; + + for (unsigned i = 1; i < context->desc.h264enc.seq.num_temporal_layers; i++) { + context->desc.h264enc.rate_ctrl[i].vbv_buffer_size = + (float)ms->buffer_size / context->desc.h264enc.rate_ctrl[0].peak_bitrate * + context->desc.h264enc.rate_ctrl[i].peak_bitrate; + context->desc.h264enc.rate_ctrl[i].vbv_buf_lv = context->desc.h264enc.rate_ctrl[0].vbv_buf_lv; + context->desc.h264enc.rate_ctrl[i].vbv_buf_initial_size = + (context->desc.h264enc.rate_ctrl[i].vbv_buffer_size * context->desc.h264enc.rate_ctrl[i].vbv_buf_lv) >> 6; } return VA_STATUS_SUCCESS; diff --git a/src/gallium/frontends/va/picture_hevc_enc.c b/src/gallium/frontends/va/picture_hevc_enc.c index b933c5c5fc1..61a9d83ed7c 100644 --- a/src/gallium/frontends/va/picture_hevc_enc.c +++ b/src/gallium/frontends/va/picture_hevc_enc.c @@ -1089,13 +1089,23 @@ vlVaHandleVAEncMiscParameterTypeHRDHEVC(vlVaContext *context, VAEncMiscParameter { VAEncMiscParameterHRD *ms = (VAEncMiscParameterHRD *)misc->data; - if (ms->buffer_size) { - context->desc.h265enc.rc[0].vbv_buffer_size = ms->buffer_size; - context->desc.h265enc.rc[0].vbv_buf_lv = (ms->initial_buffer_fullness << 6 ) / ms->buffer_size; - context->desc.h265enc.rc[0].vbv_buf_initial_size = ms->initial_buffer_fullness; - /* Distinguishes from the default params set for these values in other - functions and app specific params passed down via HRD buffer */ - context->desc.h265enc.rc[0].app_requested_hrd_buffer = true; + if (ms->buffer_size == 0) + return VA_STATUS_ERROR_INVALID_PARAMETER; + + /* Distinguishes from the default params set for these values in other + functions and app specific params passed down via HRD buffer */ + context->desc.h265enc.rc[0].app_requested_hrd_buffer = true; + context->desc.h265enc.rc[0].vbv_buffer_size = ms->buffer_size; + context->desc.h265enc.rc[0].vbv_buf_lv = (ms->initial_buffer_fullness << 6) / ms->buffer_size; + context->desc.h265enc.rc[0].vbv_buf_initial_size = ms->initial_buffer_fullness; + + for (unsigned i = 1; i < context->desc.h265enc.seq.num_temporal_layers; i++) { + context->desc.h265enc.rc[i].vbv_buffer_size = + (float)ms->buffer_size / context->desc.h265enc.rc[0].peak_bitrate * + context->desc.h265enc.rc[i].peak_bitrate; + context->desc.h265enc.rc[i].vbv_buf_lv = context->desc.h265enc.rc[0].vbv_buf_lv; + context->desc.h265enc.rc[i].vbv_buf_initial_size = + (context->desc.h265enc.rc[i].vbv_buffer_size * context->desc.h265enc.rc[i].vbv_buf_lv) >> 6; } return VA_STATUS_SUCCESS;