23 #include "config_components.h"
28 #define DECODER_IS_SDR(codec_id) \
29 (((codec_id) == AV_CODEC_ID_FFV1) || \
30 ((codec_id) == AV_CODEC_ID_DPX) || \
31 ((codec_id) == AV_CODEC_ID_APV) || \
32 ((codec_id) == AV_CODEC_ID_PRORES_RAW) || \
33 ((codec_id) == AV_CODEC_ID_PRORES))
35 #if CONFIG_H264_VULKAN_HWACCEL
38 #if CONFIG_HEVC_VULKAN_HWACCEL
41 #if CONFIG_VP9_VULKAN_HWACCEL
44 #if CONFIG_AV1_VULKAN_HWACCEL
47 #if CONFIG_FFV1_VULKAN_HWACCEL
50 #if CONFIG_PRORES_RAW_VULKAN_HWACCEL
53 #if CONFIG_PRORES_VULKAN_HWACCEL
56 #if CONFIG_DPX_VULKAN_HWACCEL
59 #if CONFIG_APV_VULKAN_HWACCEL
64 #if CONFIG_H264_VULKAN_HWACCEL
67 #if CONFIG_HEVC_VULKAN_HWACCEL
70 #if CONFIG_VP9_VULKAN_HWACCEL
73 #if CONFIG_AV1_VULKAN_HWACCEL
76 #if CONFIG_FFV1_VULKAN_HWACCEL
79 #if CONFIG_PRORES_RAW_VULKAN_HWACCEL
82 #if CONFIG_PRORES_VULKAN_HWACCEL
85 #if CONFIG_DPX_VULKAN_HWACCEL
88 #if CONFIG_APV_VULKAN_HWACCEL
96 #if CONFIG_VP9_VULKAN_HWACCEL
97 VkVideoDecodeVP9ProfileInfoKHR vp9_profile;
117 const VkVideoProfileListInfoKHR *profile_list;
119 VkStructureType profile_struct_type =
122 #if CONFIG_VP9_VULKAN_HWACCEL
126 VK_STRUCTURE_TYPE_MAX_ENUM;
127 if (profile_struct_type == VK_STRUCTURE_TYPE_MAX_ENUM)
131 VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR);
135 for (
int i = 0;
i < profile_list->profileCount;
i++)
137 return &profile_list->pProfiles[
i];
185 vkpic->
view.
ref = VK_NULL_HANDLE;
186 vkpic->
view.
out = VK_NULL_HANDLE;
213 if (
ctx->common.layered_dpb && alloc_dpb) {
216 }
else if (alloc_dpb) {
227 dpb_hwfc->format[0], VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR);
234 if (!alloc_dpb || is_current) {
242 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR |
243 (hwfc->usage & VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR));
259 const uint8_t *
data,
size_t size,
int add_startcode,
260 uint32_t *nb_slices,
const uint32_t **
offsets)
265 static const uint8_t startcode_prefix[3] = { 0x0, 0x0, 0x1 };
266 const size_t startcode_len = add_startcode ?
sizeof(startcode_prefix) : 0;
267 const int nb = nb_slices ? *nb_slices : 0;
273 ctx->caps.minBitstreamBufferSizeAlignment;
274 new_size =
FFALIGN(new_size,
ctx->caps.minBitstreamBufferSizeAlignment);
278 (nb + 1)*
sizeof(slice_off));
288 if (!vkbuf || vkbuf->
size < new_size) {
293 size_t buf_size =
FFMAX(new_size, 1024*1024);
297 buf_size = 2 <<
av_log2(buf_size);
303 void *buf_pnext =
ctx->s.hwfc->create_pnext;
304 if (
ctx->s.hwfc->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
306 VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR);
309 (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
310 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) :
311 VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR;
314 buf_usage, buf_pnext, buf_size,
315 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
316 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
319 buf_usage, buf_pnext, buf_size,
320 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
336 memcpy(slices + vp->
slices_size, startcode_prefix, startcode_len);
351 VkVideoSessionParametersKHR *empty_session_params)
356 VkVideoDecodeH264SessionParametersCreateInfoKHR h264_params = {
357 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR,
359 VkVideoDecodeH265SessionParametersCreateInfoKHR h265_params = {
360 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR,
362 StdVideoAV1SequenceHeader av1_empty_seq = { 0 };
363 VkVideoDecodeAV1SessionParametersCreateInfoKHR av1_params = {
364 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR,
365 .pStdSequenceHeader = &av1_empty_seq,
367 VkVideoSessionParametersCreateInfoKHR session_params_create = {
368 .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
373 .videoSession =
ctx->common.session,
379 ret = vk->CreateVideoSessionParametersKHR(
s->hwctx->act_dev, &session_params_create,
380 s->hwctx->alloc, empty_session_params);
381 if (
ret != VK_SUCCESS) {
382 av_log(avctx,
AV_LOG_ERROR,
"Unable to create empty Vulkan video session parameters: %s!\n",
396 VkVideoBeginCodingInfoKHR decode_start = {
397 .sType = VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR,
398 .videoSession =
ctx->common.session,
403 &decode_start.videoSessionParameters);
408 VkVideoCodingControlInfoKHR decode_ctrl = {
409 .sType = VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR,
410 .flags = VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR,
413 .sType = VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR,
419 vk->CmdBeginVideoCodingKHR(exec->
buf, &decode_start);
420 vk->CmdControlVideoCodingKHR(exec->
buf, &decode_ctrl);
425 if (decode_start.videoSessionParameters) {
430 vk->DestroyVideoSessionParametersKHR(
s->hwctx->act_dev,
431 decode_start.videoSessionParameters,
448 VkCommandBuffer cmd_buf;
459 const int layered_dpb =
ctx->common.layered_dpb;
461 VkVideoBeginCodingInfoKHR decode_start = {
462 .sType = VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR,
463 .videoSession =
ctx->common.session,
466 .referenceSlotCount = vp->
decode_info.referenceSlotCount,
467 .pReferenceSlots = vp->
decode_info.pReferenceSlots,
470 .sType = VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR,
473 VkImageMemoryBarrier2 img_bar[37];
475 size_t data_size =
FFALIGN(vp->slices_size,
476 ctx->caps.minBitstreamBufferSizeAlignment);
481 VkVideoReferenceSlotInfoKHR *cur_vk_ref;
482 cur_vk_ref = (
void *)&decode_start.pReferenceSlots[decode_start.referenceSlotCount];
483 cur_vk_ref[0] = vp->ref_slot;
484 cur_vk_ref[0].slotIndex = -1;
485 decode_start.referenceSlotCount++;
487 sd_buf = vp->slices_buf;
490 if (!(sd_buf->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
491 VkMappedMemoryRange flush_buf = {
492 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
493 .memory = sd_buf->mem,
495 .size =
FFALIGN(vp->slices_size,
496 ctx->s.props.properties.limits.nonCoherentAtomSize),
499 ret = vk->FlushMappedMemoryRanges(
ctx->s.hwctx->act_dev, 1, &flush_buf);
500 if (
ret != VK_SUCCESS) {
507 vp->decode_info.srcBuffer = sd_buf->buf;
508 vp->decode_info.srcBufferOffset = 0;
509 vp->decode_info.srcBufferRange = data_size;
521 if (dec->session_params)
525 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
526 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR);
535 img_bar[nb_img_bar] = (VkImageMemoryBarrier2) {
536 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
538 .srcStageMask = VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
539 .dstStageMask = VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
540 .srcAccessMask = VK_ACCESS_2_NONE,
541 .dstAccessMask = VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,
542 .oldLayout = vkf->layout[0],
543 .newLayout = (layered_dpb || vp->dpb_frame) ?
544 VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR :
545 VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR,
546 .srcQueueFamilyIndex = vkf->queue_family[0],
547 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
548 .image = vkf->img[0],
549 .subresourceRange = (VkImageSubresourceRange) {
550 .aspectMask = vp->view.aspect,
556 &img_bar[nb_img_bar], &nb_img_bar);
561 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
562 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR);
570 for (
int i = 0;
i < vp->decode_info.referenceSlotCount;
i++) {
576 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
577 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR);
589 img_bar[nb_img_bar] = (VkImageMemoryBarrier2) {
590 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
592 .srcStageMask = VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
593 .dstStageMask = VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
594 .srcAccessMask = VK_ACCESS_2_NONE,
595 .dstAccessMask = VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR |
596 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,
597 .oldLayout = rvkf->
layout[0],
598 .newLayout = VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR,
600 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
601 .image = rvkf->
img[0],
602 .subresourceRange = (VkImageSubresourceRange) {
609 &img_bar[nb_img_bar], &nb_img_bar);
612 }
else if (vp->decode_info.referenceSlotCount ||
613 vp->view.out != vp->view.ref) {
616 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
617 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR);
623 vk->CmdPipelineBarrier2(cmd_buf, &(VkDependencyInfo) {
624 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
625 .dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT,
626 .pImageMemoryBarriers = img_bar,
627 .imageMemoryBarrierCount = nb_img_bar,
631 vk->CmdBeginVideoCodingKHR(cmd_buf, &decode_start);
632 vk->CmdDecodeVideoKHR(cmd_buf, &vp->decode_info);
633 vk->CmdEndVideoCodingKHR(cmd_buf, &
decode_end);
666 if (
ctx->sd_ctx_free)
695 if (vk_desc->
queue_flags & VK_QUEUE_VIDEO_DECODE_BIT_KHR) {
698 VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME);
718 VkVideoDecodeH264CapabilitiesKHR *h264_caps,
719 VkVideoDecodeH265CapabilitiesKHR *h265_caps,
720 #
if CONFIG_VP9_VULKAN_HWACCEL
721 VkVideoDecodeVP9CapabilitiesKHR *vp9_caps,
723 VkVideoDecodeAV1CapabilitiesKHR *av1_caps,
724 VkVideoCapabilitiesKHR *caps,
725 VkVideoDecodeCapabilitiesKHR *dec_caps,
728 VkVideoDecodeUsageInfoKHR *
usage = &prof->
usage;
730 VkVideoProfileListInfoKHR *profile_list = &prof->
profile_list;
732 VkVideoDecodeH264ProfileInfoKHR *h264_profile = &prof->
h264_profile;
733 VkVideoDecodeH265ProfileInfoKHR *h265_profile = &prof->
h265_profile;
734 #if CONFIG_VP9_VULKAN_HWACCEL
735 VkVideoDecodeVP9ProfileInfoKHR *vp9_profile = &prof->vp9_profile;
737 VkVideoDecodeAV1ProfileInfoKHR *av1_profile = &prof->
av1_profile;
744 dec_caps->pNext = h264_caps;
745 usage->pNext = h264_profile;
746 h264_profile->sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR;
755 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR :
756 VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_KHR;
758 dec_caps->pNext = h265_caps;
759 usage->pNext = h265_profile;
760 h265_profile->sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR;
761 h265_profile->stdProfileIdc = cur_profile;
762 #if CONFIG_VP9_VULKAN_HWACCEL
764 dec_caps->pNext = vp9_caps;
765 usage->pNext = vp9_profile;
766 vp9_profile->sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PROFILE_INFO_KHR;
767 vp9_profile->stdProfile = cur_profile;
770 dec_caps->pNext = av1_caps;
771 usage->pNext = av1_profile;
772 av1_profile->sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR;
773 av1_profile->stdProfile = cur_profile;
777 usage->sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_USAGE_INFO_KHR;
778 usage->videoUsageHints = VK_VIDEO_DECODE_USAGE_DEFAULT_KHR;
780 profile->sType = VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR;
787 profile_list->sType = VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR;
788 profile_list->profileCount = 1;
789 profile_list->pProfiles =
profile;
792 caps->sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR;
793 caps->pNext = dec_caps;
794 dec_caps->sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR;
797 return vk->GetPhysicalDeviceVideoCapabilitiesKHR(hwctx->
phys_dev,
profile,
807 int max_level, base_profile, cur_profile;
820 VkVideoCapabilitiesKHR *caps = &
ctx->caps;
821 VkVideoDecodeCapabilitiesKHR *dec_caps = &
ctx->dec_caps;
823 VkVideoDecodeH264CapabilitiesKHR h264_caps = {
824 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR,
826 VkVideoDecodeH265CapabilitiesKHR h265_caps = {
827 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR,
829 #if CONFIG_VP9_VULKAN_HWACCEL
830 VkVideoDecodeVP9CapabilitiesKHR vp9_caps = {
831 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_CAPABILITIES_KHR,
834 VkVideoDecodeAV1CapabilitiesKHR av1_caps = {
835 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR,
838 VkPhysicalDeviceVideoFormatInfoKHR fmt_info = {
839 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR,
842 VkVideoFormatPropertiesKHR *ret_info;
843 uint32_t nb_out_fmts = 0;
854 #if CONFIG_VP9_VULKAN_HWACCEL
863 #
if CONFIG_VP9_VULKAN_HWACCEL
870 if (
ret == VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR &&
872 avctx->
profile != base_profile) {
874 "again with profile %s\n",
878 cur_profile = base_profile;
882 #
if CONFIG_VP9_VULKAN_HWACCEL
891 if (
ret == VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR) {
893 "%s profile \"%s\" not supported!\n",
897 }
else if (
ret == VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR) {
899 "format (%s) not supported!\n",
902 }
else if (
ret == VK_ERROR_FEATURE_NOT_PRESENT ||
903 ret == VK_ERROR_FORMAT_NOT_SUPPORTED) {
905 }
else if (
ret != VK_SUCCESS) {
911 #if CONFIG_VP9_VULKAN_HWACCEL
921 max_level, avctx->
level);
923 caps->minCodedExtent.width, caps->maxCodedExtent.width);
925 caps->minCodedExtent.height, caps->maxCodedExtent.height);
927 caps->pictureAccessGranularity.width);
929 caps->pictureAccessGranularity.height);
931 caps->minBitstreamBufferOffsetAlignment);
933 caps->minBitstreamBufferSizeAlignment);
937 caps->maxActiveReferencePictures);
939 caps->stdHeaderVersion.extensionName,
941 av_log(avctx,
AV_LOG_VERBOSE,
" Codec header version: %i.%i.%i (driver), %i.%i.%i (compiled)\n",
942 CODEC_VER(caps->stdHeaderVersion.specVersion),
945 dec_caps->flags ?
"" :
947 dec_caps->flags & VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR ?
948 " reuse_dst_dpb" :
"",
949 dec_caps->flags & VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR ?
950 " dedicated_dpb" :
"");
954 caps->flags & VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR ?
956 caps->flags & VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR ?
957 " separate_references" :
"");
960 if (avctx->
coded_width < caps->minCodedExtent.width ||
967 avctx->
level > max_level)
971 if (!(dec_caps->flags & (VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR |
972 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR))) {
974 "VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR nor "
975 "VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR are set!\n");
977 }
else if ((dec_caps->flags & (VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR |
978 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR) ==
979 VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR) &&
980 !(caps->flags & VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR)) {
981 av_log(avctx,
AV_LOG_ERROR,
"Cannot initialize Vulkan decoding session, buggy driver: "
982 "VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR set "
983 "but VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR is unset!\n");
987 dec->
dedicated_dpb = !(dec_caps->flags & VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR);
989 !(caps->flags & VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR);
992 fmt_info.imageUsage = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR;
994 fmt_info.imageUsage = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR |
995 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR |
996 VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
997 VK_IMAGE_USAGE_SAMPLED_BIT;
1001 fmt_info.imageUsage |= VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
1005 ret = vk->GetPhysicalDeviceVideoFormatPropertiesKHR(hwctx->
phys_dev,
1007 &nb_out_fmts,
NULL);
1008 if (
ret == VK_ERROR_FORMAT_NOT_SUPPORTED ||
1009 (!nb_out_fmts &&
ret == VK_SUCCESS)) {
1011 }
else if (
ret != VK_SUCCESS) {
1017 ret_info =
av_mallocz(
sizeof(*ret_info)*nb_out_fmts);
1021 for (
int i = 0;
i < nb_out_fmts;
i++)
1022 ret_info[
i].sType = VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR;
1024 ret = vk->GetPhysicalDeviceVideoFormatPropertiesKHR(hwctx->
phys_dev,
1026 &nb_out_fmts, ret_info);
1027 if (
ret == VK_ERROR_FORMAT_NOT_SUPPORTED ||
1028 (!nb_out_fmts &&
ret == VK_SUCCESS)) {
1031 }
else if (
ret != VK_SUCCESS) {
1040 *vk_fmt = best_vkfmt = VK_FORMAT_UNDEFINED;
1043 av_log(avctx,
AV_LOG_DEBUG,
"Choosing best pixel format for decoding from %i:\n", nb_out_fmts);
1044 for (
int i = 0;
i < nb_out_fmts;
i++) {
1052 if (
tmp == best_format)
1053 best_vkfmt = ret_info[
i].format;
1063 av_log(avctx,
AV_LOG_ERROR,
"No valid/compatible pixel format found for decoding!\n");
1071 *vk_fmt = best_vkfmt;
1085 int err, dedicated_dpb;
1108 prof, &dedicated_dpb);
1120 hwfc->create_pnext = &prof->profile_list;
1122 hwfc->format[0] = VK_FORMAT_UNDEFINED;
1147 hwfc->format[3] = VK_FORMAT_R16_UNORM;
1153 hwfc->format[0] = VK_FORMAT_R16_UNORM;
1154 hwfc->format[1] = VK_FORMAT_R16_UNORM;
1155 hwfc->format[2] = VK_FORMAT_R16_UNORM;
1162 if (hwfc->tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
1163 hwfc->tiling = VK_IMAGE_TILING_OPTIMAL;
1165 hwfc->usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
1166 VK_IMAGE_USAGE_STORAGE_BIT |
1167 VK_IMAGE_USAGE_SAMPLED_BIT;
1172 hwfc->usage |= VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR;
1173 if (!dec->dedicated_dpb)
1174 hwfc->usage |= VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR;
1176 ctx = dec->shared_ctx;
1179 hwfc->usage |= VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
1189 VkVideoSessionParametersKHR *par = obj;
1190 vk->DestroyVideoSessionParametersKHR(
ctx->s.hwctx->act_dev, *par,
1191 ctx->s.hwctx->alloc);
1195 const VkVideoSessionParametersCreateInfoKHR *session_params_create)
1197 VkVideoSessionParametersKHR *par;
1206 ret = vk->CreateVideoSessionParametersKHR(
ctx->s.hwctx->act_dev, session_params_create,
1207 ctx->s.hwctx->alloc, par);
1208 if (
ret != VK_SUCCESS) {
1209 av_log(logctx,
AV_LOG_ERROR,
"Unable to create Vulkan video session parameters: %s!\n",
1211 *par = VK_NULL_HANDLE;
1238 const VkVideoProfileInfoKHR *
profile;
1241 VkVideoSessionCreateInfoKHR session_create = {
1242 .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR,
1274 session_create.queueFamilyIndex =
ctx->qf->idx;
1275 session_create.maxCodedExtent =
ctx->caps.maxCodedExtent;
1276 session_create.maxDpbSlots =
ctx->caps.maxDpbSlots;
1277 session_create.maxActiveReferencePictures =
ctx->caps.maxActiveReferencePictures;
1278 session_create.pictureFormat =
s->hwfc->format[0];
1279 session_create.referencePictureFormat = session_create.pictureFormat;
1280 session_create.pStdHeaderVersion = &vk_desc->
ext_props;
1281 session_create.pVideoProfile =
profile;
1282 #ifdef VK_KHR_video_maintenance2
1284 session_create.flags = VK_VIDEO_SESSION_CREATE_INLINE_SESSION_PARAMETERS_BIT_KHR;
1296 async_depth, 0, 0, 0,
profile);
1312 if (!
ctx->common.dpb_hwfc_ref) {
1325 VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR);
1330 VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT);
1331 if (drm_create_pnext) {
1333 dpb_hwfc->
tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
1337 dpb_hwfc->
tiling = VK_IMAGE_TILING_OPTIMAL;
1339 dpb_hwfc->
format[0] =
s->hwfc->format[0];
1340 dpb_hwfc->
usage = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR;
1342 if (
ctx->common.layered_dpb)
1349 if (
ctx->common.layered_dpb) {
1351 if (!
ctx->common.layered_frame) {
1357 &
ctx->common.layered_view,
1358 &
ctx->common.layered_aspect,
1360 s->hwfc->format[0], VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR);
1376 const VkPhysicalDeviceDriverProperties *driver_props;
1378 if (driver_props->driverID == VK_DRIVER_ID_NVIDIA_PROPRIETARY &&
1379 driver_props->conformanceVersion.major == 1 &&
1380 driver_props->conformanceVersion.minor == 3 &&
1381 driver_props->conformanceVersion.subminor == 8 &&
1382 driver_props->conformanceVersion.patch < 3)