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);

Reply via email to