Module: Mesa Branch: main Commit: dd20ec5655b235739547357f498886839039b1d5 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dd20ec5655b235739547357f498886839039b1d5
Author: Benjamin Cheng <[email protected]> Date: Tue Aug 8 19:52:37 2023 -0400 radv/video: send h264 scaling list in raster order ITU spec defines the H264 ScalingList{4x4,8x8} in zig-zag order, but AMD HW wants raster order. Reviewed-by: Lynne <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24572> --- src/amd/vulkan/radv_video.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/amd/vulkan/radv_video.c b/src/amd/vulkan/radv_video.c index 83ac71c335a..254bdc2142f 100644 --- a/src/amd/vulkan/radv_video.c +++ b/src/amd/vulkan/radv_video.c @@ -31,6 +31,7 @@ #include "drm-uapi/amdgpu_drm.h" #endif +#include "util/vl_zscan_data.h" #include "vk_video/vulkan_video_codecs_common.h" #include "ac_uvd_dec.h" #include "ac_vcn_dec.h" @@ -749,6 +750,21 @@ get_h264_level(StdVideoH264LevelIdc level) return h264_levels[level]; } +static void +update_h264_scaling(unsigned char scaling_list_4x4[6][16], unsigned char scaling_list_8x8[2][64], + const StdVideoH264ScalingLists *scaling_lists) +{ + for (int i = 0; i < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS; i++) { + for (int j = 0; j < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS; j++) + scaling_list_4x4[i][vl_zscan_normal_16[j]] = scaling_lists->ScalingList4x4[i][j]; + } + + for (int i = 0; i < 2; i++) { + for (int j = 0; j < STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS; j++) + scaling_list_8x8[i][vl_zscan_normal[j]] = scaling_lists->ScalingList8x8[i][j]; + } +} + static rvcn_dec_message_avc_t get_h264_msg(struct radv_video_session *vid, struct radv_video_session_params *params, const struct VkVideoDecodeInfoKHR *frame_info, uint32_t *slice_offset, uint32_t *width_in_samples, @@ -822,9 +838,7 @@ get_h264_msg(struct radv_video_session *vid, struct radv_video_session_params *p StdVideoH264ScalingLists scaling_lists; vk_video_derive_h264_scaling_list(sps, pps, &scaling_lists); - memcpy(result.scaling_list_4x4, scaling_lists.ScalingList4x4, 6 * 16); - memcpy(result.scaling_list_8x8[0], scaling_lists.ScalingList8x8[0], 64); - memcpy(result.scaling_list_8x8[1], scaling_lists.ScalingList8x8[1], 64); + update_h264_scaling(result.scaling_list_4x4, result.scaling_list_8x8, &scaling_lists); memset(it_ptr, 0, IT_SCALING_TABLE_SIZE); memcpy(it_ptr, result.scaling_list_4x4, 6 * 16); @@ -1303,9 +1317,7 @@ get_uvd_h264_msg(struct radv_video_session *vid, struct radv_video_session_param StdVideoH264ScalingLists scaling_lists; vk_video_derive_h264_scaling_list(sps, pps, &scaling_lists); - memcpy(result.scaling_list_4x4, scaling_lists.ScalingList4x4, 6 * 16); - memcpy(result.scaling_list_8x8[0], scaling_lists.ScalingList8x8[0], 64); - memcpy(result.scaling_list_8x8[1], scaling_lists.ScalingList8x8[1], 64); + update_h264_scaling(result.scaling_list_4x4, result.scaling_list_8x8, &scaling_lists); memset(it_ptr, 0, IT_SCALING_TABLE_SIZE); memcpy(it_ptr, result.scaling_list_4x4, 6 * 16);
