frontends/va: Only use parameters for first slice in H264/5 encode

We don't store these params per slice, so we should only use the values
from first slice.

Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Reviewed-By: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30672>
This commit is contained in:
David Rosca
2024-08-16 10:51:26 +02:00
committed by Marge Bot
parent cc14724d73
commit f5af70c6b8
2 changed files with 39 additions and 41 deletions

View File

@@ -148,6 +148,24 @@ vlVaHandleVAEncSliceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *contex
unsigned slice_qp;
h264 = buf->data;
/* Handle the slice control parameters */
struct h264_slice_descriptor slice_descriptor;
memset(&slice_descriptor, 0, sizeof(slice_descriptor));
slice_descriptor.macroblock_address = h264->macroblock_address;
slice_descriptor.num_macroblocks = h264->num_macroblocks;
slice_descriptor.slice_type = h264->slice_type;
assert(slice_descriptor.slice_type <= PIPE_H264_SLICE_TYPE_I);
if (context->desc.h264enc.num_slice_descriptors < ARRAY_SIZE(context->desc.h264enc.slices_descriptors))
context->desc.h264enc.slices_descriptors[context->desc.h264enc.num_slice_descriptors++] = slice_descriptor;
else
return VA_STATUS_ERROR_NOT_ENOUGH_BUFFER;
/* Only use parameters for first slice */
if (h264->macroblock_address)
return VA_STATUS_SUCCESS;
memset(&context->desc.h264enc.ref_idx_l0_list, VA_INVALID_ID, sizeof(context->desc.h264enc.ref_idx_l0_list));
memset(&context->desc.h264enc.ref_idx_l1_list, VA_INVALID_ID, sizeof(context->desc.h264enc.ref_idx_l1_list));
memset(&context->desc.h264enc.ref_list0, PIPE_H2645_LIST_REF_INVALID_ENTRY, sizeof(context->desc.h264enc.ref_list0));
@@ -175,37 +193,19 @@ vlVaHandleVAEncSliceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *contex
}
}
/**
* VAEncSliceParameterBufferH264.slice_type
* Slice type.
* Range: 0..2, 5..7, i.e. no switching slices.
*/
struct h264_slice_descriptor slice_descriptor;
memset(&slice_descriptor, 0, sizeof(slice_descriptor));
slice_descriptor.macroblock_address = h264->macroblock_address;
slice_descriptor.num_macroblocks = h264->num_macroblocks;
slice_qp = context->desc.h264enc.init_qp + h264->slice_qp_delta;
if ((h264->slice_type == 1) || (h264->slice_type == 6)) {
context->desc.h264enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_B;
slice_descriptor.slice_type = PIPE_H264_SLICE_TYPE_B;
context->desc.h264enc.quant_b_frames = slice_qp;
} else if ((h264->slice_type == 0) || (h264->slice_type == 5)) {
context->desc.h264enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_P;
slice_descriptor.slice_type = PIPE_H264_SLICE_TYPE_P;
context->desc.h264enc.quant_p_frames = slice_qp;
} else if ((h264->slice_type == 2) || (h264->slice_type == 7)) {
if (context->desc.h264enc.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR) {
if (slice_descriptor.macroblock_address == 0) {
/* Increment it only for the first slice of the IDR frame */
context->desc.h264enc.idr_pic_id++;
}
slice_descriptor.slice_type = PIPE_H264_SLICE_TYPE_I;
} else {
if (context->desc.h264enc.picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR)
context->desc.h264enc.idr_pic_id++;
else
context->desc.h264enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_I;
slice_descriptor.slice_type = PIPE_H264_SLICE_TYPE_I;
}
context->desc.h264enc.quant_i_frames = slice_qp;
} else {
context->desc.h264enc.picture_type = PIPE_H2645_ENC_PICTURE_TYPE_SKIP;
@@ -216,13 +216,6 @@ vlVaHandleVAEncSliceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *contex
context->desc.h264enc.dbk.alpha_c0_offset_div2 = h264->slice_alpha_c0_offset_div2;
context->desc.h264enc.dbk.beta_offset_div2 = h264->slice_beta_offset_div2;
/* Handle the slice control parameters */
if (context->desc.h264enc.num_slice_descriptors < ARRAY_SIZE(context->desc.h264enc.slices_descriptors)) {
context->desc.h264enc.slices_descriptors[context->desc.h264enc.num_slice_descriptors++] = slice_descriptor;
} else {
return VA_STATUS_ERROR_NOT_ENOUGH_BUFFER;
}
return VA_STATUS_SUCCESS;
}

View File

@@ -149,6 +149,24 @@ vlVaHandleVAEncSliceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *contex
unsigned slice_qp;
h265 = buf->data;
/* Handle the slice control parameters */
struct h265_slice_descriptor slice_descriptor;
memset(&slice_descriptor, 0, sizeof(slice_descriptor));
slice_descriptor.slice_segment_address = h265->slice_segment_address;
slice_descriptor.num_ctu_in_slice = h265->num_ctu_in_slice;
slice_descriptor.slice_type = h265->slice_type;
assert(slice_descriptor.slice_type <= PIPE_H265_SLICE_TYPE_I);
if (context->desc.h265enc.num_slice_descriptors < ARRAY_SIZE(context->desc.h265enc.slices_descriptors))
context->desc.h265enc.slices_descriptors[context->desc.h265enc.num_slice_descriptors++] = slice_descriptor;
else
return VA_STATUS_ERROR_NOT_ENOUGH_BUFFER;
/* Only use parameters for first slice */
if (h265->slice_segment_address)
return VA_STATUS_SUCCESS;
memset(&context->desc.h265enc.ref_idx_l0_list, VA_INVALID_ID, sizeof(context->desc.h265enc.ref_idx_l0_list));
memset(&context->desc.h265enc.ref_idx_l1_list, VA_INVALID_ID, sizeof(context->desc.h265enc.ref_idx_l1_list));
memset(&context->desc.h265enc.ref_list0, PIPE_H2645_LIST_REF_INVALID_ENTRY, sizeof(context->desc.h265enc.ref_list0));
@@ -198,19 +216,6 @@ vlVaHandleVAEncSliceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *contex
break;
}
/* Handle the slice control parameters */
struct h265_slice_descriptor slice_descriptor;
memset(&slice_descriptor, 0, sizeof(slice_descriptor));
slice_descriptor.slice_segment_address = h265->slice_segment_address;
slice_descriptor.num_ctu_in_slice = h265->num_ctu_in_slice;
slice_descriptor.slice_type = h265->slice_type;
assert(slice_descriptor.slice_type <= PIPE_H265_SLICE_TYPE_I);
if (context->desc.h265enc.num_slice_descriptors < ARRAY_SIZE(context->desc.h265enc.slices_descriptors))
context->desc.h265enc.slices_descriptors[context->desc.h265enc.num_slice_descriptors++] = slice_descriptor;
else
return VA_STATUS_ERROR_NOT_ENOUGH_BUFFER;
return VA_STATUS_SUCCESS;
}