vulkan: handle use_default_scaling_matrix_mask in h264 decoder

H264 specification defines this field to force usage of the default
scaling lists even if they are specified in ScalingList4x4 and
ScalingList8x8.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34096>
This commit is contained in:
MaciejDziuban 2025-03-13 14:22:52 +01:00 committed by Marge Bot
parent 20cce95ce5
commit a1bf7192e5

View file

@ -820,9 +820,16 @@ vk_video_derive_h264_scaling_list(const StdVideoH264SequenceParameterSet *sps,
for (int i = 0; i < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS; i++)
{
if (sps->pScalingLists->scaling_list_present_mask & (1 << i))
memcpy(temp.ScalingList4x4[i],
sps->pScalingLists->ScalingList4x4[i],
STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
{
if (sps->pScalingLists->use_default_scaling_matrix_mask & (1 << i))
memcpy(temp.ScalingList4x4[i],
(i < 3) ? h264_scaling_list_default_4x4_intra : h264_scaling_list_default_4x4_inter,
STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
else
memcpy(temp.ScalingList4x4[i],
sps->pScalingLists->ScalingList4x4[i],
STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
}
else /* fall-back rule A */
{
if (i == 0)
@ -844,8 +851,15 @@ vk_video_derive_h264_scaling_list(const StdVideoH264SequenceParameterSet *sps,
{
int i = j + STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS;
if (sps->pScalingLists->scaling_list_present_mask & (1 << i))
memcpy(temp.ScalingList8x8[j], sps->pScalingLists->ScalingList8x8[j],
STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
{
if (sps->pScalingLists->use_default_scaling_matrix_mask & (1 << i))
memcpy(temp.ScalingList8x8[j],
(i == 6 || i == 8 || i == 10) ? h264_scaling_list_default_8x8_intra : h264_scaling_list_default_8x8_inter,
STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
else
memcpy(temp.ScalingList8x8[j], sps->pScalingLists->ScalingList8x8[j],
STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
}
else /* fall-back rule A */
{
if (i == 6)
@ -877,8 +891,16 @@ vk_video_derive_h264_scaling_list(const StdVideoH264SequenceParameterSet *sps,
for (int i = 0; i < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS; i++)
{
if (pps->pScalingLists->scaling_list_present_mask & (1 << i))
memcpy(list->ScalingList4x4[i], pps->pScalingLists->ScalingList4x4[i],
STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
{
if (pps->pScalingLists->use_default_scaling_matrix_mask & (1 << i))
memcpy(list->ScalingList4x4[i],
(i < 3) ? h264_scaling_list_default_4x4_intra : h264_scaling_list_default_4x4_inter,
STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
else
memcpy(list->ScalingList4x4[i],
pps->pScalingLists->ScalingList4x4[i],
STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS);
}
else if (sps->flags.seq_scaling_matrix_present_flag) /* fall-back rule B */
{
if (i == 0 || i == 3)
@ -909,8 +931,16 @@ vk_video_derive_h264_scaling_list(const StdVideoH264SequenceParameterSet *sps,
{
int i = j + STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS;
if (pps->pScalingLists->scaling_list_present_mask & (1 << i))
memcpy(list->ScalingList8x8[j], pps->pScalingLists->ScalingList8x8[j],
STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
{
if (pps->pScalingLists->use_default_scaling_matrix_mask & (1 << i))
memcpy(list->ScalingList8x8[j],
(i == 6 || i == 8 || i == 10) ? h264_scaling_list_default_8x8_intra : h264_scaling_list_default_8x8_inter,
STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
else
memcpy(list->ScalingList8x8[j],
pps->pScalingLists->ScalingList8x8[j],
STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS);
}
else if (sps->flags.seq_scaling_matrix_present_flag) /* fall-back rule B */
{
if (i == 6 || i == 7)