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

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].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;
}

View File

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

View File

@@ -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*/

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_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