diff --git a/src/amd/vulkan/radv_video_enc.c b/src/amd/vulkan/radv_video_enc.c index d2c35ba1e47..292e819373a 100644 --- a/src/amd/vulkan/radv_video_enc.c +++ b/src/amd/vulkan/radv_video_enc.c @@ -1940,41 +1940,48 @@ radv_GetEncodedVideoSessionParametersKHR(VkDevice device, case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: { const struct VkVideoEncodeH264SessionParametersGetInfoKHR *h264_get_info = vk_find_struct_const(pVideoSessionParametersInfo->pNext, VIDEO_ENCODE_H264_SESSION_PARAMETERS_GET_INFO_KHR); + size_t sps_size = 0, pps_size = 0; if (h264_get_info->writeStdSPS) { const StdVideoH264SequenceParameterSet *sps = vk_video_find_h264_enc_std_sps(&templ->vk, h264_get_info->stdSPSId); assert(sps); - vk_video_encode_h264_sps(sps, size_limit, &total_size, pData); + vk_video_encode_h264_sps(sps, size_limit, &sps_size, pData); } if (h264_get_info->writeStdPPS) { const StdVideoH264PictureParameterSet *pps = vk_video_find_h264_enc_std_pps(&templ->vk, h264_get_info->stdPPSId); assert(pps); + char *data_ptr = pData ? (char *)pData + sps_size : NULL; vk_video_encode_h264_pps(pps, templ->vk.h264_enc.profile_idc == STD_VIDEO_H264_PROFILE_IDC_HIGH, size_limit, - &total_size, pData); + &pps_size, data_ptr); } + total_size = sps_size + pps_size; break; } case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: { const struct VkVideoEncodeH265SessionParametersGetInfoKHR *h265_get_info = vk_find_struct_const(pVideoSessionParametersInfo->pNext, VIDEO_ENCODE_H265_SESSION_PARAMETERS_GET_INFO_KHR); + size_t sps_size = 0, pps_size = 0, vps_size = 0; if (h265_get_info->writeStdVPS) { const StdVideoH265VideoParameterSet *vps = vk_video_find_h265_enc_std_vps(&templ->vk, h265_get_info->stdVPSId); assert(vps); - vk_video_encode_h265_vps(vps, size_limit, &total_size, pData); + vk_video_encode_h265_vps(vps, size_limit, &vps_size, pData); } if (h265_get_info->writeStdSPS) { const StdVideoH265SequenceParameterSet *sps = vk_video_find_h265_enc_std_sps(&templ->vk, h265_get_info->stdSPSId); assert(sps); - vk_video_encode_h265_sps(sps, size_limit, &total_size, pData); + char *data_ptr = pData ? (char *)pData + vps_size : NULL; + vk_video_encode_h265_sps(sps, size_limit, &sps_size, data_ptr); } if (h265_get_info->writeStdPPS) { const StdVideoH265PictureParameterSet *pps = vk_video_find_h265_enc_std_pps(&templ->vk, h265_get_info->stdPPSId); assert(pps); - vk_video_encode_h265_pps(pps, size_limit, &total_size, pData); + char *data_ptr = pData ? (char *)pData + vps_size + sps_size : NULL; + vk_video_encode_h265_pps(pps, size_limit, &pps_size, data_ptr); } + total_size = sps_size + pps_size + vps_size; break; } default: diff --git a/src/intel/vulkan/anv_video.c b/src/intel/vulkan/anv_video.c index bbbe1579b1f..20536541033 100644 --- a/src/intel/vulkan/anv_video.c +++ b/src/intel/vulkan/anv_video.c @@ -575,40 +575,47 @@ anv_GetEncodedVideoSessionParametersKHR(VkDevice device, case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: { const struct VkVideoEncodeH264SessionParametersGetInfoKHR *h264_get_info = vk_find_struct_const(pVideoSessionParametersInfo->pNext, VIDEO_ENCODE_H264_SESSION_PARAMETERS_GET_INFO_KHR); + size_t sps_size = 0, pps_size = 0; if (h264_get_info->writeStdSPS) { for (unsigned i = 0; i < params->vk.h264_enc.h264_sps_count; i++) if (params->vk.h264_enc.h264_sps[i].base.seq_parameter_set_id == h264_get_info->stdSPSId) - vk_video_encode_h264_sps(¶ms->vk.h264_enc.h264_sps[i].base, size_limit, &total_size, pData); + vk_video_encode_h264_sps(¶ms->vk.h264_enc.h264_sps[i].base, size_limit, &sps_size, pData); } if (h264_get_info->writeStdPPS) { + char *data_ptr = pData ? (char *)pData + sps_size : NULL; for (unsigned i = 0; i < params->vk.h264_enc.h264_pps_count; i++) if (params->vk.h264_enc.h264_pps[i].base.pic_parameter_set_id == h264_get_info->stdPPSId) { - vk_video_encode_h264_pps(¶ms->vk.h264_enc.h264_pps[i].base, false, size_limit, &total_size, pData); + vk_video_encode_h264_pps(¶ms->vk.h264_enc.h264_pps[i].base, false, size_limit, &pps_size, data_ptr); } } + total_size = sps_size + pps_size; break; } case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: { const struct VkVideoEncodeH265SessionParametersGetInfoKHR *h265_get_info = vk_find_struct_const(pVideoSessionParametersInfo->pNext, VIDEO_ENCODE_H265_SESSION_PARAMETERS_GET_INFO_KHR); + size_t sps_size = 0, pps_size = 0, vps_size = 0; if (h265_get_info->writeStdVPS) { for (unsigned i = 0; i < params->vk.h265_enc.h265_vps_count; i++) if (params->vk.h265_enc.h265_vps[i].base.vps_video_parameter_set_id == h265_get_info->stdVPSId) - vk_video_encode_h265_vps(¶ms->vk.h265_enc.h265_vps[i].base, size_limit, &total_size, pData); + vk_video_encode_h265_vps(¶ms->vk.h265_enc.h265_vps[i].base, size_limit, &vps_size, pData); } if (h265_get_info->writeStdSPS) { + char *data_ptr = pData ? (char *)pData + vps_size : NULL; for (unsigned i = 0; i < params->vk.h265_enc.h265_sps_count; i++) if (params->vk.h265_enc.h265_sps[i].base.sps_seq_parameter_set_id == h265_get_info->stdSPSId) { - vk_video_encode_h265_sps(¶ms->vk.h265_enc.h265_sps[i].base, size_limit, &total_size, pData); + vk_video_encode_h265_sps(¶ms->vk.h265_enc.h265_sps[i].base, size_limit, &sps_size, data_ptr); } } if (h265_get_info->writeStdPPS) { + char *data_ptr = pData ? (char *)pData + vps_size + sps_size : NULL; for (unsigned i = 0; i < params->vk.h265_enc.h265_pps_count; i++) if (params->vk.h265_enc.h265_pps[i].base.pps_seq_parameter_set_id == h265_get_info->stdPPSId) { params->vk.h265_enc.h265_pps[i].base.flags.cu_qp_delta_enabled_flag = 0; - vk_video_encode_h265_pps(¶ms->vk.h265_enc.h265_pps[i].base, size_limit, &total_size, pData); + vk_video_encode_h265_pps(¶ms->vk.h265_enc.h265_pps[i].base, size_limit, &pps_size, data_ptr); } } + total_size = sps_size + pps_size + vps_size; break; } default: