mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-02 18:10:17 +01:00
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:
parent
77d5e8ab19
commit
4e38b56d80
6 changed files with 31 additions and 122 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue