frontend/va: Support QVBR rate control mode

Reviewed-by: Boyuan Zhang <Boyuan.Zhang@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22530>
This commit is contained in:
Sil Vilerino
2023-04-15 15:43:34 -04:00
committed by Marge Bot
parent 035b84f308
commit 30a6363c8f
5 changed files with 32 additions and 3 deletions

View File

@@ -213,8 +213,17 @@ vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint en
PIPE_VIDEO_ENTRYPOINT_ENCODE); PIPE_VIDEO_ENTRYPOINT_ENCODE);
break; break;
case VAConfigAttribRateControl: case VAConfigAttribRateControl:
{
/* Legacy behavior reports these three modes for all drivers */
value = VA_RC_CQP | VA_RC_CBR | VA_RC_VBR; 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: case VAConfigAttribEncRateControlExt:
value = pscreen->get_video_param(pscreen, ProfileToPipe(profile), value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
PIPE_VIDEO_ENTRYPOINT_ENCODE, PIPE_VIDEO_ENTRYPOINT_ENCODE,
@@ -524,6 +533,8 @@ vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoin
config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE; config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE;
else if (attrib_list[i].value == VA_RC_CQP) else if (attrib_list[i].value == VA_RC_CQP)
config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_DISABLE; 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 { else {
FREE(config); FREE(config);
return VA_STATUS_ERROR_INVALID_VALUE; return VA_STATUS_ERROR_INVALID_VALUE;

View File

@@ -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].max_qp = rc->max_qp;
context->desc.h264enc.rate_ctrl[temporal_id].min_qp = rc->min_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; return VA_STATUS_SUCCESS;
} }

View File

@@ -240,6 +240,11 @@ vlVaHandleVAEncMiscParameterTypeRateControlHEVC(vlVaContext *context, VAEncMiscP
context->desc.h265enc.rc.max_qp = rc->max_qp; context->desc.h265enc.rc.max_qp = rc->max_qp;
context->desc.h265enc.rc.min_qp = rc->min_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; return VA_STATUS_SUCCESS;
} }

View File

@@ -131,7 +131,8 @@ enum pipe_video_cap
PIPE_VIDEO_CAP_ENC_SUPPORTS_ASYNC_OPERATION = 33, PIPE_VIDEO_CAP_ENC_SUPPORTS_ASYNC_OPERATION = 33,
PIPE_VIDEO_CAP_MIN_WIDTH = 34, 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*/ /* To be used with PIPE_VIDEO_CAP_VPP_ORIENTATION_MODES and for VPP state*/

View File

@@ -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_CONSTANT_SKIP = 0x01,
PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE_SKIP = 0x02, PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE_SKIP = 0x02,
PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT = 0x03, 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 enum pipe_slice_buffer_placement_type
@@ -417,6 +418,9 @@ struct pipe_h264_enc_rate_control
unsigned max_au_size; unsigned max_au_size;
unsigned max_qp; unsigned max_qp;
unsigned min_qp; unsigned min_qp;
/* Used with PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE */
unsigned vbr_quality_factor;
}; };
struct pipe_h264_enc_motion_estimation struct pipe_h264_enc_motion_estimation
@@ -617,6 +621,9 @@ struct pipe_h265_enc_rate_control
unsigned max_au_size; unsigned max_au_size;
unsigned max_qp; unsigned max_qp;
unsigned min_qp; unsigned min_qp;
/* Used with PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE */
unsigned vbr_quality_factor;
}; };
struct pipe_h265_enc_picture_desc struct pipe_h265_enc_picture_desc