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 <sivileri@microsoft.com>
Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31148>
This commit is contained in:
David Rosca 2024-09-20 13:57:46 +02:00 committed by Marge Bot
parent c56fc312a8
commit 5b157d4ad0
3 changed files with 50 additions and 20 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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;