frontends/va: Set default encoding parameters at context creation

Instead of doing it when handling sequence parameter buffer, which could
overwrite previously set values.

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/30992>
This commit is contained in:
David Rosca 2024-08-27 11:37:17 +02:00 committed by Marge Bot
parent 77d5e8ab19
commit 4e38b56d80
6 changed files with 31 additions and 122 deletions

View file

@ -378,17 +378,45 @@ vlVaCreateContext(VADriverContextP ctx, VAConfigID config_id, int picture_width,
if (config->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) {
switch (u_reduce_video_profile(context->templat.profile)) {
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
context->desc.h264enc.rate_ctrl[0].rate_ctrl_method = config->rc;
for (unsigned i = 0; i < ARRAY_SIZE(context->desc.h264enc.rate_ctrl); i++) {
context->desc.h264enc.rate_ctrl[i].rate_ctrl_method = config->rc;
context->desc.h264enc.rate_ctrl[i].vbv_buffer_size = 20000000;
context->desc.h264enc.rate_ctrl[i].vbv_buf_lv = 64;
context->desc.h264enc.rate_ctrl[i].fill_data_enable = 1;
context->desc.h264enc.rate_ctrl[i].enforce_hrd = 1;
context->desc.h264enc.rate_ctrl[i].max_qp = 51;
context->desc.h264enc.rate_ctrl[i].frame_rate_num = 30;
context->desc.h264enc.rate_ctrl[i].frame_rate_den = 1;
}
context->desc.h264enc.frame_idx = util_hash_table_create_ptr_keys();
util_dynarray_init(&context->desc.h264enc.raw_headers, NULL);
break;
case PIPE_VIDEO_FORMAT_HEVC:
context->desc.h265enc.rc[0].rate_ctrl_method = config->rc;
for (unsigned i = 0; i < ARRAY_SIZE(context->desc.h265enc.rc); i++) {
context->desc.h265enc.rc[i].rate_ctrl_method = config->rc;
context->desc.h265enc.rc[i].vbv_buffer_size = 20000000;
context->desc.h265enc.rc[i].vbv_buf_lv = 64;
context->desc.h265enc.rc[i].fill_data_enable = 1;
context->desc.h265enc.rc[i].enforce_hrd = 1;
context->desc.h265enc.rc[i].max_qp = 51;
context->desc.h265enc.rc[i].frame_rate_num = 30;
context->desc.h265enc.rc[i].frame_rate_den = 1;
}
context->desc.h265enc.frame_idx = util_hash_table_create_ptr_keys();
util_dynarray_init(&context->desc.h265enc.raw_headers, NULL);
break;
case PIPE_VIDEO_FORMAT_AV1:
context->desc.av1enc.rc[0].rate_ctrl_method = config->rc;
for (unsigned i = 0; i < ARRAY_SIZE(context->desc.av1enc.rc); i++) {
context->desc.av1enc.rc[i].rate_ctrl_method = config->rc;
context->desc.av1enc.rc[i].vbv_buffer_size = 20000000;
context->desc.av1enc.rc[i].vbv_buf_lv = 64;
context->desc.av1enc.rc[i].fill_data_enable = 1;
context->desc.av1enc.rc[i].enforce_hrd = 1;
context->desc.av1enc.rc[i].max_qp = 255;
context->desc.av1enc.rc[i].min_qp = 1;
context->desc.av1enc.rc[i].frame_rate_num = 30;
context->desc.av1enc.rc[i].frame_rate_den = 1;
}
break;
default:
break;

View file

@ -1280,17 +1280,6 @@ vlVaEndPicture(VADriverContextP ctx, VAContextID context_id)
if (u_reduce_video_profile(context->templat.profile) == PIPE_VIDEO_FORMAT_MPEG4_AVC)
context->desc.h264enc.frame_num_cnt++;
/* keep other path the same way */
if (!screen->get_video_param(screen, context->templat.profile,
context->decoder->entrypoint,
PIPE_VIDEO_CAP_ENC_QUALITY_LEVEL)) {
if (u_reduce_video_profile(context->templat.profile) == PIPE_VIDEO_FORMAT_MPEG4_AVC)
getEncParamPresetH264(context);
else if (u_reduce_video_profile(context->templat.profile) == PIPE_VIDEO_FORMAT_HEVC)
getEncParamPresetH265(context);
}
if (surf->efc_surface) {
assert(surf == drv->last_efc_surface);
context->target = surf->efc_surface->buffer;

View file

@ -114,12 +114,6 @@ VAStatus vlVaHandleVAEncSequenceParameterBufferTypeAV1(vlVaDriver *drv, vlVaCont
if (!context->decoder)
return VA_STATUS_ERROR_ALLOCATION_FAILED;
getEncParamPresetAV1(context);
context->desc.av1enc.intra_refresh.mode = INTRA_REFRESH_MODE_NONE;
context->desc.av1enc.intra_refresh.offset = 0;
context->desc.av1enc.intra_refresh.region_size = 0;
context->desc.av1enc.intra_refresh.need_sequence_header = 0;
}
context->desc.av1enc.seq.tier = av1->seq_tier;
@ -865,40 +859,6 @@ vlVaHandleVAEncMiscParameterTypeFrameRateAV1(vlVaContext *context, VAEncMiscPara
return VA_STATUS_SUCCESS;
}
void getEncParamPresetAV1(vlVaContext *context)
{
for (int i = 0; i < ARRAY_SIZE(context->desc.av1enc.rc); i++) {
struct pipe_av1_enc_rate_control *rc = &context->desc.av1enc.rc[i];
rc->vbv_buffer_size = 20000000;
rc->vbv_buf_lv = 48;
rc->fill_data_enable = 1;
rc->enforce_hrd = 1;
rc->max_qp = 255;
rc->min_qp = 1;
if (rc->frame_rate_num == 0 ||
rc->frame_rate_den == 0) {
rc->frame_rate_num = 30;
rc->frame_rate_den = 1;
}
if (rc->target_bitrate == 0)
rc->target_bitrate = 20 * 1000000;
if (rc->peak_bitrate == 0)
rc->peak_bitrate = rc->target_bitrate * 3 / 2;
rc->target_bits_picture = rc->target_bitrate * rc->frame_rate_den /
rc->frame_rate_num;
rc->peak_bits_picture_integer = rc->peak_bitrate * rc->frame_rate_den /
rc->frame_rate_num;
rc->peak_bits_picture_fraction = 0;
}
}
VAStatus vlVaHandleVAEncSliceParameterBufferTypeAV1(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
{
VAEncTileGroupBufferAV1 *tile_buf = (VAEncTileGroupBufferAV1*) buf->data;

View file

@ -252,19 +252,6 @@ vlVaHandleVAEncSequenceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *con
surf->buffer = context->decoder->create_dpb_buffer(context->decoder, &context->desc.base, &surf->templat);
dpb->buffer = surf->buffer;
}
getEncParamPresetH264(context);
context->desc.h264enc.rate_ctrl[0].vbv_buffer_size = 20000000;
context->desc.h264enc.rate_ctrl[0].vbv_buf_lv = 48;
context->desc.h264enc.rate_ctrl[0].fill_data_enable = 1;
context->desc.h264enc.rate_ctrl[0].enforce_hrd = 1;
context->desc.h264enc.rate_ctrl[0].max_qp = 51;
context->desc.h264enc.rate_ctrl[0].min_qp = 0;
context->desc.h264enc.enable_vui = false;
context->desc.h264enc.intra_refresh.mode = INTRA_REFRESH_MODE_NONE;
context->desc.h264enc.intra_refresh.offset = 0;
context->desc.h264enc.intra_refresh.region_size = 0;
context->desc.h264enc.intra_refresh.need_sequence_header = 0;
}
context->desc.h264enc.ip_period = h264->ip_period;
@ -881,23 +868,3 @@ vlVaHandleVAEncMiscParameterTypeHRDH264(vlVaContext *context, VAEncMiscParameter
return VA_STATUS_SUCCESS;
}
void getEncParamPresetH264(vlVaContext *context)
{
//rate control
if (context->desc.h264enc.rate_ctrl[0].frame_rate_num == 0 ||
context->desc.h264enc.rate_ctrl[0].frame_rate_den == 0) {
context->desc.h264enc.rate_ctrl[0].frame_rate_num = 30;
context->desc.h264enc.rate_ctrl[0].frame_rate_den = 1;
}
context->desc.h264enc.rate_ctrl[0].target_bits_picture =
context->desc.h264enc.rate_ctrl[0].target_bitrate *
((float)context->desc.h264enc.rate_ctrl[0].frame_rate_den /
context->desc.h264enc.rate_ctrl[0].frame_rate_num);
context->desc.h264enc.rate_ctrl[0].peak_bits_picture_integer =
context->desc.h264enc.rate_ctrl[0].peak_bitrate *
((float)context->desc.h264enc.rate_ctrl[0].frame_rate_den /
context->desc.h264enc.rate_ctrl[0].frame_rate_num);
context->desc.h264enc.rate_ctrl[0].peak_bits_picture_fraction = 0;
}

View file

@ -252,18 +252,6 @@ vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *con
surf->buffer = context->decoder->create_dpb_buffer(context->decoder, &context->desc.base, &surf->templat);
dpb->buffer = surf->buffer;
}
getEncParamPresetH265(context);
context->desc.h265enc.rc[0].vbv_buffer_size = 20000000;
context->desc.h265enc.rc[0].vbv_buf_lv = 48;
context->desc.h265enc.rc[0].fill_data_enable = 1;
context->desc.h265enc.rc[0].enforce_hrd = 1;
context->desc.h265enc.rc[0].max_qp = 51;
context->desc.h265enc.rc[0].min_qp = 0;
context->desc.h265enc.intra_refresh.mode = INTRA_REFRESH_MODE_NONE;
context->desc.h265enc.intra_refresh.offset = 0;
context->desc.h265enc.intra_refresh.region_size = 0;
context->desc.h265enc.intra_refresh.need_sequence_header = 0;
}
context->desc.h265enc.seq.general_profile_idc = h265->general_profile_idc;
@ -1172,23 +1160,3 @@ vlVaHandleVAEncMiscParameterTypeTemporalLayerHEVC(vlVaContext *context, VAEncMis
return VA_STATUS_SUCCESS;
}
void getEncParamPresetH265(vlVaContext *context)
{
//rate control
if (context->desc.h265enc.rc[0].frame_rate_num == 0 ||
context->desc.h265enc.rc[0].frame_rate_den == 0) {
context->desc.h265enc.rc[0].frame_rate_num = 30;
context->desc.h265enc.rc[0].frame_rate_den = 1;
}
context->desc.h265enc.rc[0].target_bits_picture =
context->desc.h265enc.rc[0].target_bitrate *
((float)context->desc.h265enc.rc[0].frame_rate_den /
context->desc.h265enc.rc[0].frame_rate_num);
context->desc.h265enc.rc[0].peak_bits_picture_integer =
context->desc.h265enc.rc[0].peak_bitrate *
((float)context->desc.h265enc.rc[0].frame_rate_den /
context->desc.h265enc.rc[0].frame_rate_num);
context->desc.h265enc.rc[0].peak_bits_picture_fraction = 0;
}

View file

@ -595,9 +595,6 @@ void vlVaHandleSliceParameterBufferVP9(vlVaContext *context, vlVaBuffer *buf);
void vlVaDecoderVP9BitstreamHeader(vlVaContext *context, vlVaBuffer *buf);
void vlVaHandlePictureParameterBufferAV1(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
void vlVaHandleSliceParameterBufferAV1(vlVaContext *context, vlVaBuffer *buf);
void getEncParamPresetH264(vlVaContext *context);
void getEncParamPresetH265(vlVaContext *context);
void getEncParamPresetAV1(vlVaContext *context);
void vlVaHandleVAEncMiscParameterTypeQualityLevel(struct pipe_enc_quality_modes *p, vlVaQualityBits *in);
VAStatus vlVaHandleVAEncPictureParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
VAStatus vlVaHandleVAEncSliceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);