diff --git a/src/gallium/frontends/va/picture_hevc.c b/src/gallium/frontends/va/picture_hevc.c index b83acfed806..2dd77878609 100644 --- a/src/gallium/frontends/va/picture_hevc.c +++ b/src/gallium/frontends/va/picture_hevc.c @@ -177,6 +177,12 @@ void vlVaHandlePictureParameterBufferHEVC(vlVaDriver *drv, vlVaContext *context, } context->desc.h265.pps->st_rps_bits = hevc->st_rps_bits; context->desc.h265.UseStRpsBits = true; + + context->desc.h265.slice_parameter.slice_count = 0; + context->desc.h265.slice_parameter.slice_info_present = false; + memset(context->desc.h265.slice_parameter.slice_data_flag, 0, sizeof(context->desc.h265.slice_parameter.slice_data_flag)); + memset(context->desc.h265.slice_parameter.slice_data_offset, 0, sizeof(context->desc.h265.slice_parameter.slice_data_offset)); + memset(context->desc.h265.slice_parameter.slice_data_size, 0, sizeof(context->desc.h265.slice_parameter.slice_data_size)); } void vlVaHandleIQMatrixBufferHEVC(vlVaContext *context, vlVaBuffer *buf) @@ -220,4 +226,31 @@ void vlVaHandleSliceParameterBufferHEVC(vlVaContext *context, vlVaBuffer *buf) context->desc.h265.RefPicList[i][j] = h265->RefPicList[i][j]; } context->desc.h265.UseRefPicList = true; + + const size_t max_pipe_hevc_slices = ARRAY_SIZE(context->desc.h265.slice_parameter.slice_data_offset); + assert(context->desc.h265.slice_parameter.slice_count < max_pipe_hevc_slices); + + context->desc.h265.slice_parameter.slice_info_present = true; + context->desc.h265.slice_parameter.slice_data_size[context->desc.h265.slice_parameter.slice_count] = h265->slice_data_size; + context->desc.h265.slice_parameter.slice_data_offset[context->desc.h265.slice_parameter.slice_count] = h265->slice_data_offset; + + switch (h265->slice_data_flag) { + case VA_SLICE_DATA_FLAG_ALL: + context->desc.h265.slice_parameter.slice_data_flag[context->desc.h265.slice_parameter.slice_count] = PIPE_SLICE_BUFFER_PLACEMENT_TYPE_WHOLE; + break; + case VA_SLICE_DATA_FLAG_BEGIN: + context->desc.h265.slice_parameter.slice_data_flag[context->desc.h265.slice_parameter.slice_count] = PIPE_SLICE_BUFFER_PLACEMENT_TYPE_BEGIN; + break; + case VA_SLICE_DATA_FLAG_MIDDLE: + context->desc.h265.slice_parameter.slice_data_flag[context->desc.h265.slice_parameter.slice_count] = PIPE_SLICE_BUFFER_PLACEMENT_TYPE_MIDDLE; + break; + case VA_SLICE_DATA_FLAG_END: + context->desc.h265.slice_parameter.slice_data_flag[context->desc.h265.slice_parameter.slice_count] = PIPE_SLICE_BUFFER_PLACEMENT_TYPE_END; + break; + default: + break; + } + + /* assert(buf->num_elements == 1) above; */ + context->desc.h265.slice_parameter.slice_count++; } diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h index c6aa603c50a..185b600fada 100644 --- a/src/gallium/include/pipe/p_video_state.h +++ b/src/gallium/include/pipe/p_video_state.h @@ -131,6 +131,18 @@ enum pipe_h2645_enc_rate_control_method PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE = 0x04 }; +enum pipe_slice_buffer_placement_type +{ + /* whole slice is in the buffer */ + PIPE_SLICE_BUFFER_PLACEMENT_TYPE_WHOLE = 0x0, + /* The beginning of the slice is in the buffer but the end is not */ + PIPE_SLICE_BUFFER_PLACEMENT_TYPE_BEGIN = 0x1, + /* Neither beginning nor end of the slice is in the buffer */ + PIPE_SLICE_BUFFER_PLACEMENT_TYPE_MIDDLE = 0x2, + /* end of the slice is in the buffer */ + PIPE_SLICE_BUFFER_PLACEMENT_TYPE_END = 0x3, +}; + struct pipe_picture_desc { enum pipe_video_profile profile; @@ -659,6 +671,15 @@ struct pipe_h265_picture_desc uint8_t RefPicList[2][15]; bool UseRefPicList; bool UseStRpsBits; + + struct + { + 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]; + } slice_parameter; }; struct pipe_mjpeg_picture_desc