frontends/va: Create encoder at context creation

Instead of creating it when handling sequence parameter buffer. Drivers
don't use the max_references value (and it was only somewhat correct for
H264) and level is also available from sequence parameters.

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 10:52:57 +02:00
committed by Marge Bot
parent 5632a6e24f
commit 0818ed770d
4 changed files with 11 additions and 48 deletions
+9
View File
@@ -378,6 +378,7 @@ 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->templat.max_references = PIPE_H264_MAX_REFERENCES;
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;
@@ -392,6 +393,7 @@ vlVaCreateContext(VADriverContextP ctx, VAConfigID config_id, int picture_width,
util_dynarray_init(&context->desc.h264enc.raw_headers, NULL);
break;
case PIPE_VIDEO_FORMAT_HEVC:
context->templat.max_references = PIPE_H265_MAX_REFERENCES;
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;
@@ -406,6 +408,7 @@ vlVaCreateContext(VADriverContextP ctx, VAConfigID config_id, int picture_width,
util_dynarray_init(&context->desc.h265enc.raw_headers, NULL);
break;
case PIPE_VIDEO_FORMAT_AV1:
context->templat.max_references = PIPE_AV1_MAX_REFERENCES;
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;
@@ -422,6 +425,12 @@ vlVaCreateContext(VADriverContextP ctx, VAConfigID config_id, int picture_width,
break;
}
context->desc.base.packed_headers = config->packed_headers;
mtx_lock(&drv->mutex);
context->decoder = drv->pipe->create_video_codec(drv->pipe, &context->templat);
mtx_unlock(&drv->mutex);
if (!context->decoder)
return VA_STATUS_ERROR_ALLOCATION_FAILED;
}
context->surfaces = _mesa_set_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal);
@@ -107,15 +107,6 @@ VAStatus vlVaHandleVAEncSequenceParameterBufferTypeAV1(vlVaDriver *drv, vlVaCont
{
VAEncSequenceParameterBufferAV1 *av1 = buf->data;
if (!context->decoder) {
context->templat.max_references = PIPE_AV1_MAX_REFERENCES;
context->templat.level = av1->seq_level_idx;
context->decoder = drv->pipe->create_video_codec(drv->pipe, &context->templat);
if (!context->decoder)
return VA_STATUS_ERROR_ALLOCATION_FAILED;
}
context->desc.av1enc.seq.tier = av1->seq_tier;
context->desc.av1enc.seq.level = av1->seq_level_idx;
context->desc.av1enc.seq.intra_period = av1->intra_period;
+1 -19
View File
@@ -233,27 +233,9 @@ vlVaHandleVAEncSliceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *contex
VAStatus
vlVaHandleVAEncSequenceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
{
VAEncSequenceParameterBufferH264 *h264 = buf->data;
uint32_t num_units_in_tick = 0, time_scale = 0;
VAEncSequenceParameterBufferH264 *h264 = (VAEncSequenceParameterBufferH264 *)buf->data;
if (!context->decoder) {
context->templat.max_references = h264->max_num_ref_frames;
context->templat.level = h264->level_idc;
context->decoder = drv->pipe->create_video_codec(drv->pipe, &context->templat);
if (!context->decoder)
return VA_STATUS_ERROR_ALLOCATION_FAILED;
struct pipe_h264_enc_dpb_entry *dpb =
&context->desc.h264enc.dpb[context->desc.h264enc.dpb_curr_pic];
if (dpb->id && !dpb->buffer && context->decoder->create_dpb_buffer) {
vlVaSurface *surf = handle_table_get(drv->htab, dpb->id);
if (!surf)
return VA_STATUS_ERROR_INVALID_PARAMETER;
surf->buffer = context->decoder->create_dpb_buffer(context->decoder, &context->desc.base, &surf->templat);
dpb->buffer = surf->buffer;
}
}
context->desc.h264enc.ip_period = h264->ip_period;
context->desc.h264enc.intra_idr_period =
h264->intra_idr_period != 0 ? h264->intra_idr_period : PIPE_DEFAULT_INTRA_IDR_PERIOD;
+1 -20
View File
@@ -232,28 +232,9 @@ vlVaHandleVAEncSliceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *contex
VAStatus
vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
{
VAEncSequenceParameterBufferHEVC *h265 = (VAEncSequenceParameterBufferHEVC *)buf->data;
VAEncSequenceParameterBufferHEVC *h265 = buf->data;
uint32_t num_units_in_tick = 0, time_scale = 0;
if (!context->decoder) {
context->templat.max_references = PIPE_H265_MAX_NUM_LIST_REF;
context->templat.level = h265->general_level_idc;
context->decoder = drv->pipe->create_video_codec(drv->pipe, &context->templat);
if (!context->decoder)
return VA_STATUS_ERROR_ALLOCATION_FAILED;
struct pipe_h265_enc_dpb_entry *dpb =
&context->desc.h265enc.dpb[context->desc.h265enc.dpb_curr_pic];
if (dpb->id && !dpb->buffer && context->decoder->create_dpb_buffer) {
vlVaSurface *surf = handle_table_get(drv->htab, dpb->id);
if (!surf)
return VA_STATUS_ERROR_INVALID_PARAMETER;
surf->buffer = context->decoder->create_dpb_buffer(context->decoder, &context->desc.base, &surf->templat);
dpb->buffer = surf->buffer;
}
}
context->desc.h265enc.seq.general_profile_idc = h265->general_profile_idc;
context->desc.h265enc.seq.general_level_idc = h265->general_level_idc;
context->desc.h265enc.seq.general_tier_flag = h265->general_tier_flag;