From 30a6363c8f6ff2cde85831cac11bdf78cb1e15e0 Mon Sep 17 00:00:00 2001 From: Sil Vilerino Date: Sat, 15 Apr 2023 15:43:34 -0400 Subject: [PATCH] frontend/va: Support QVBR rate control mode Reviewed-by: Boyuan Zhang Part-of: --- src/gallium/frontends/va/config.c | 13 ++++++++++++- src/gallium/frontends/va/picture_h264_enc.c | 5 +++++ src/gallium/frontends/va/picture_hevc_enc.c | 5 +++++ src/gallium/include/pipe/p_video_enums.h | 3 ++- src/gallium/include/pipe/p_video_state.h | 9 ++++++++- 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/gallium/frontends/va/config.c b/src/gallium/frontends/va/config.c index d7b31edfcad..1b3a48756cf 100644 --- a/src/gallium/frontends/va/config.c +++ b/src/gallium/frontends/va/config.c @@ -213,8 +213,17 @@ vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint en PIPE_VIDEO_ENTRYPOINT_ENCODE); break; case VAConfigAttribRateControl: + { + /* Legacy behavior reports these three modes for all drivers */ value = VA_RC_CQP | VA_RC_CBR | VA_RC_VBR; - break; + + /* Check for optional mode QVBR */ + int supports_qvbr = pscreen->get_video_param(pscreen, ProfileToPipe(profile), + PIPE_VIDEO_ENTRYPOINT_ENCODE, + PIPE_VIDEO_CAP_ENC_RATE_CONTROL_QVBR); + if (supports_qvbr > 0) + value |= VA_RC_QVBR; + } break; case VAConfigAttribEncRateControlExt: value = pscreen->get_video_param(pscreen, ProfileToPipe(profile), PIPE_VIDEO_ENTRYPOINT_ENCODE, @@ -524,6 +533,8 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE; else if (attrib_list[i].value == VA_RC_CQP) config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_DISABLE; + else if (attrib_list[i].value == VA_RC_QVBR) + config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE; else { FREE(config); return VA_STATUS_ERROR_INVALID_VALUE; diff --git a/src/gallium/frontends/va/picture_h264_enc.c b/src/gallium/frontends/va/picture_h264_enc.c index 0cdb6a64edf..0ba2bafac42 100644 --- a/src/gallium/frontends/va/picture_h264_enc.c +++ b/src/gallium/frontends/va/picture_h264_enc.c @@ -269,6 +269,11 @@ vlVaHandleVAEncMiscParameterTypeRateControlH264(vlVaContext *context, VAEncMiscP context->desc.h264enc.rate_ctrl[temporal_id].max_qp = rc->max_qp; context->desc.h264enc.rate_ctrl[temporal_id].min_qp = rc->min_qp; + if (context->desc.h264enc.rate_ctrl[0].rate_ctrl_method == + PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE) + context->desc.h264enc.rate_ctrl[temporal_id].vbr_quality_factor = + rc->quality_factor; + 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 4a9aa595aa4..14013a6c738 100644 --- a/src/gallium/frontends/va/picture_hevc_enc.c +++ b/src/gallium/frontends/va/picture_hevc_enc.c @@ -240,6 +240,11 @@ vlVaHandleVAEncMiscParameterTypeRateControlHEVC(vlVaContext *context, VAEncMiscP context->desc.h265enc.rc.max_qp = rc->max_qp; context->desc.h265enc.rc.min_qp = rc->min_qp; + if (context->desc.h265enc.rc.rate_ctrl_method == + PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE) + context->desc.h265enc.rc.vbr_quality_factor = + rc->quality_factor; + return VA_STATUS_SUCCESS; } diff --git a/src/gallium/include/pipe/p_video_enums.h b/src/gallium/include/pipe/p_video_enums.h index a55a79bf299..c547f92580e 100644 --- a/src/gallium/include/pipe/p_video_enums.h +++ b/src/gallium/include/pipe/p_video_enums.h @@ -131,7 +131,8 @@ enum pipe_video_cap PIPE_VIDEO_CAP_ENC_SUPPORTS_ASYNC_OPERATION = 33, PIPE_VIDEO_CAP_MIN_WIDTH = 34, - PIPE_VIDEO_CAP_MIN_HEIGHT = 35 + PIPE_VIDEO_CAP_MIN_HEIGHT = 35, + PIPE_VIDEO_CAP_ENC_RATE_CONTROL_QVBR = 36 }; /* To be used with PIPE_VIDEO_CAP_VPP_ORIENTATION_MODES and for VPP state*/ diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h index d2038444a51..f06e88d66e0 100644 --- a/src/gallium/include/pipe/p_video_state.h +++ b/src/gallium/include/pipe/p_video_state.h @@ -143,7 +143,8 @@ enum pipe_h2645_enc_rate_control_method PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT_SKIP = 0x01, PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE_SKIP = 0x02, PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT = 0x03, - PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE = 0x04 + PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE = 0x04, + PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE = 0x05 }; enum pipe_slice_buffer_placement_type @@ -417,6 +418,9 @@ struct pipe_h264_enc_rate_control unsigned max_au_size; unsigned max_qp; unsigned min_qp; + + /* Used with PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE */ + unsigned vbr_quality_factor; }; struct pipe_h264_enc_motion_estimation @@ -617,6 +621,9 @@ struct pipe_h265_enc_rate_control unsigned max_au_size; unsigned max_qp; unsigned min_qp; + + /* Used with PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE */ + unsigned vbr_quality_factor; }; struct pipe_h265_enc_picture_desc