From f5af70c6b86800b0bf0feadf72909ce9f90baf3d Mon Sep 17 00:00:00 2001 From: David Rosca Date: Fri, 16 Aug 2024 10:51:26 +0200 Subject: [PATCH] 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 Reviewed-By: Sil Vilerino Part-of: --- src/gallium/frontends/va/picture_h264_enc.c | 49 +++++++++------------ src/gallium/frontends/va/picture_hevc_enc.c | 31 +++++++------ 2 files changed, 39 insertions(+), 41 deletions(-) diff --git a/src/gallium/frontends/va/picture_h264_enc.c b/src/gallium/frontends/va/picture_h264_enc.c index fbd5241aaf6..0fb3b1f1676 100644 --- a/src/gallium/frontends/va/picture_h264_enc.c +++ b/src/gallium/frontends/va/picture_h264_enc.c @@ -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; } diff --git a/src/gallium/frontends/va/picture_hevc_enc.c b/src/gallium/frontends/va/picture_hevc_enc.c index 43c2b26d6d0..4c27ffff276 100644 --- a/src/gallium/frontends/va/picture_hevc_enc.c +++ b/src/gallium/frontends/va/picture_hevc_enc.c @@ -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; }