From baad2575aed3d74c7e603947a485330bd31c0585 Mon Sep 17 00:00:00 2001 From: Sil Vilerino Date: Fri, 30 Sep 2022 15:45:23 -0400 Subject: [PATCH] frontends/va: Add VP9 decode multi slice information Reviewed-by: Ruijing Dong Part-of: --- src/gallium/frontends/va/picture_vp9.c | 44 ++++++++++++++++++++++-- src/gallium/include/pipe/p_video_state.h | 10 +++--- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/gallium/frontends/va/picture_vp9.c b/src/gallium/frontends/va/picture_vp9.c index ce5b046b990..0ce7073f29a 100644 --- a/src/gallium/frontends/va/picture_vp9.c +++ b/src/gallium/frontends/va/picture_vp9.c @@ -90,6 +90,15 @@ void vlVaHandlePictureParameterBufferVP9(vlVaDriver *drv, vlVaContext *context, if (!context->decoder && !context->templat.max_references) context->templat.max_references = NUM_VP9_REFS; + + context->desc.vp9.slice_parameter.slice_count = 0; + context->desc.vp9.slice_parameter.slice_info_present = false; + memset(context->desc.vp9.slice_parameter.slice_data_flag, 0, + sizeof(context->desc.vp9.slice_parameter.slice_data_flag)); + memset(context->desc.vp9.slice_parameter.slice_data_offset, 0, + sizeof(context->desc.vp9.slice_parameter.slice_data_offset)); + memset(context->desc.vp9.slice_parameter.slice_data_size, 0, + sizeof(context->desc.vp9.slice_parameter.slice_data_size)); } void vlVaHandleSliceParameterBufferVP9(vlVaContext *context, vlVaBuffer *buf) @@ -99,9 +108,38 @@ void vlVaHandleSliceParameterBufferVP9(vlVaContext *context, vlVaBuffer *buf) assert(buf->size >= sizeof(VASliceParameterBufferVP9) && buf->num_elements == 1); - context->desc.vp9.slice_parameter.slice_data_size = vp9->slice_data_size; - context->desc.vp9.slice_parameter.slice_data_offset = vp9->slice_data_offset; - context->desc.vp9.slice_parameter.slice_data_flag = vp9->slice_data_flag; + ASSERTED const size_t max_pipe_vp9_slices = ARRAY_SIZE(context->desc.vp9.slice_parameter.slice_data_offset); + assert(context->desc.vp9.slice_parameter.slice_count < max_pipe_vp9_slices); + + context->desc.vp9.slice_parameter.slice_info_present = true; + context->desc.vp9.slice_parameter.slice_data_size[context->desc.vp9.slice_parameter.slice_count] = + vp9->slice_data_size; + context->desc.vp9.slice_parameter.slice_data_offset[context->desc.vp9.slice_parameter.slice_count] = + vp9->slice_data_offset; + + switch (vp9->slice_data_flag) { + case VA_SLICE_DATA_FLAG_ALL: + context->desc.vp9.slice_parameter.slice_data_flag[context->desc.vp9.slice_parameter.slice_count] = + PIPE_SLICE_BUFFER_PLACEMENT_TYPE_WHOLE; + break; + case VA_SLICE_DATA_FLAG_BEGIN: + context->desc.vp9.slice_parameter.slice_data_flag[context->desc.vp9.slice_parameter.slice_count] = + PIPE_SLICE_BUFFER_PLACEMENT_TYPE_BEGIN; + break; + case VA_SLICE_DATA_FLAG_MIDDLE: + context->desc.vp9.slice_parameter.slice_data_flag[context->desc.vp9.slice_parameter.slice_count] = + PIPE_SLICE_BUFFER_PLACEMENT_TYPE_MIDDLE; + break; + case VA_SLICE_DATA_FLAG_END: + context->desc.vp9.slice_parameter.slice_data_flag[context->desc.vp9.slice_parameter.slice_count] = + PIPE_SLICE_BUFFER_PLACEMENT_TYPE_END; + break; + default: + break; + } + + /* assert(buf->num_elements == 1) above; */ + context->desc.vp9.slice_parameter.slice_count++; for (i = 0; i < 8; ++i) { context->desc.vp9.slice_parameter.seg_param[i].segment_flags.segment_reference_enabled = diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h index 16893f7a5e4..d75bedd0b49 100644 --- a/src/gallium/include/pipe/p_video_state.h +++ b/src/gallium/include/pipe/p_video_state.h @@ -902,11 +902,11 @@ struct pipe_vp9_picture_desc } picture_parameter; struct { - uint32_t slice_data_size; - uint32_t slice_data_offset; - - uint32_t slice_data_flag; - + bool slice_info_present; + uint32_t slice_count; + uint32_t slice_data_size[128]; + uint32_t slice_data_offset[128]; + enum pipe_slice_buffer_placement_type slice_data_flag[128]; struct vp9_segment_parameter seg_param[8]; } slice_parameter; };