From: Lynne <dev@lynne.ee> To: Ffmpeg Devel <ffmpeg-devel@ffmpeg.org> Subject: [FFmpeg-devel] [PATCH] vulkan_decode: use the hwfc->user_opaque field to store the profile Date: Sun, 18 Jun 2023 14:19:53 +0200 (CEST) Message-ID: <NYDRcdf--3-9@lynne.ee> (raw) [-- Attachment #1: Type: text/plain, Size: 17 bytes --] Patch attached. [-- Attachment #2: 0001-vulkan_decode-use-the-hwfc-user_opaque-field-to-stor.patch --] [-- Type: text/x-diff, Size: 10653 bytes --] From fe6516e22880a067420a6e21a6928ad176f66b45 Mon Sep 17 00:00:00 2001 From: Lynne <dev@lynne.ee> Date: Tue, 13 Jun 2023 06:10:20 +0200 Subject: [PATCH] vulkan_decode: use the hwfc->user_opaque field to store the profile --- libavcodec/vulkan_decode.c | 60 ++++++++++++++++++++++++-------------- libavcodec/vulkan_decode.h | 6 ++-- 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c index 6ba939da46..7ccee94b01 100644 --- a/libavcodec/vulkan_decode.c +++ b/libavcodec/vulkan_decode.c @@ -196,7 +196,6 @@ int ff_vk_decode_add_slice(AVCodecContext *avctx, FFVulkanDecodePicture *vp, { FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; FFVulkanDecodeShared *ctx = (FFVulkanDecodeShared *)dec->shared_ref->data; - FFVulkanDecodeProfileData *prof = &ctx->profile_data; static const uint8_t startcode_prefix[3] = { 0x0, 0x0, 0x1 }; const size_t startcode_len = add_startcode ? sizeof(startcode_prefix) : 0; @@ -206,8 +205,8 @@ int ff_vk_decode_add_slice(AVCodecContext *avctx, FFVulkanDecodePicture *vp, FFVkVideoBuffer *vkbuf; size_t new_size = vp->slices_size + startcode_len + size + - prof->caps.minBitstreamBufferSizeAlignment; - new_size = FFALIGN(new_size, prof->caps.minBitstreamBufferSizeAlignment); + ctx->caps.minBitstreamBufferSizeAlignment; + new_size = FFALIGN(new_size, ctx->caps.minBitstreamBufferSizeAlignment); slice_off = av_fast_realloc(vp->slice_off, &vp->slice_off_max, (nb + 1)*sizeof(slice_off)); @@ -295,7 +294,6 @@ int ff_vk_decode_frame(AVCodecContext *avctx, FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; FFVulkanDecodeShared *ctx = (FFVulkanDecodeShared *)dec->shared_ref->data; - FFVulkanDecodeProfileData *prof = &ctx->profile_data; FFVulkanFunctions *vk = &ctx->s.vkfn; /* Output */ @@ -319,7 +317,7 @@ int ff_vk_decode_frame(AVCodecContext *avctx, VkImageMemoryBarrier2 img_bar[37]; int nb_img_bar = 0; size_t data_size = FFALIGN(vp->slices_size, - prof->caps.minBitstreamBufferSizeAlignment); + ctx->caps.minBitstreamBufferSizeAlignment); FFVkExecContext *exec = ff_vk_exec_get(&ctx->exec_pool); @@ -640,10 +638,10 @@ static VkResult vulkan_setup_profile(AVCodecContext *avctx, VkVideoDecodeH264CapabilitiesKHR *h264_caps, VkVideoDecodeH265CapabilitiesKHR *h265_caps, VkVideoDecodeAV1CapabilitiesMESA *av1_caps, + VkVideoCapabilitiesKHR *caps, + VkVideoDecodeCapabilitiesKHR *dec_caps, int cur_profile) { - VkVideoCapabilitiesKHR *caps = &prof->caps; - VkVideoDecodeCapabilitiesKHR *dec_caps = &prof->dec_caps; VkVideoDecodeUsageInfoKHR *usage = &prof->usage; VkVideoProfileInfoKHR *profile = &prof->profile; VkVideoProfileListInfoKHR *profile_list = &prof->profile_list; @@ -708,6 +706,7 @@ static VkResult vulkan_setup_profile(AVCodecContext *avctx, static int vulkan_decode_get_profile(AVCodecContext *avctx, AVBufferRef *frames_ref, enum AVPixelFormat *pix_fmt, VkFormat *vk_fmt, + FFVulkanDecodeProfileData *prof, int *dpb_dedicate) { VkResult ret; @@ -724,9 +723,8 @@ static int vulkan_decode_get_profile(AVCodecContext *avctx, AVBufferRef *frames_ FFVulkanDecodeShared *ctx = (FFVulkanDecodeShared *)dec->shared_ref->data; FFVulkanFunctions *vk = &ctx->s.vkfn; - FFVulkanDecodeProfileData *prof = &ctx->profile_data; - VkVideoCapabilitiesKHR *caps = &prof->caps; - VkVideoDecodeCapabilitiesKHR *dec_caps = &prof->dec_caps; + VkVideoCapabilitiesKHR *caps = &ctx->caps; + VkVideoDecodeCapabilitiesKHR *dec_caps = &ctx->dec_caps; VkVideoDecodeH264CapabilitiesKHR h264_caps = { .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR, @@ -765,6 +763,8 @@ static int vulkan_decode_get_profile(AVCodecContext *avctx, AVBufferRef *frames_ &h264_caps, &h265_caps, &av1_caps, + caps, + dec_caps, cur_profile); if (ret == VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR && avctx->flags & AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH && @@ -779,6 +779,8 @@ static int vulkan_decode_get_profile(AVCodecContext *avctx, AVBufferRef *frames_ &h264_caps, &h265_caps, &av1_caps, + caps, + dec_caps, cur_profile); } @@ -965,6 +967,11 @@ static int vulkan_decode_get_profile(AVCodecContext *avctx, AVBufferRef *frames_ return 0; } +static void free_profile_data(AVHWFramesContext *hwfc) +{ + av_free(hwfc->user_opaque); +} + int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx) { VkFormat vkfmt; @@ -972,7 +979,6 @@ int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx) AVHWFramesContext *frames_ctx = (AVHWFramesContext*)hw_frames_ctx->data; AVVulkanFramesContext *hwfc = frames_ctx->hwctx; FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; - FFVulkanDecodeShared *ctx; FFVulkanDecodeProfileData *prof; frames_ctx->sw_format = AV_PIX_FMT_NONE; @@ -981,15 +987,19 @@ int ff_vk_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx) if (err < 0) return err; - ctx = (FFVulkanDecodeShared *)dec->shared_ref->data; - prof = &ctx->profile_data; + prof = av_mallocz(sizeof(FFVulkanDecodeProfileData)); + if (!prof) + return AVERROR(ENOMEM); err = vulkan_decode_get_profile(avctx, hw_frames_ctx, &frames_ctx->sw_format, &vkfmt, - &dedicated_dpb); + prof, &dedicated_dpb); if (err < 0) return err; + frames_ctx->user_opaque = prof; + frames_ctx->free = free_profile_data; + frames_ctx->width = avctx->width; frames_ctx->height = avctx->height; frames_ctx->format = AV_PIX_FMT_VULKAN; @@ -1032,10 +1042,10 @@ int ff_vk_decode_init(AVCodecContext *avctx) VkResult ret; FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; FFVulkanDecodeShared *ctx; - FFVulkanDecodeProfileData *prof; FFVulkanContext *s; FFVulkanFunctions *vk; FFVkQueueFamilyCtx qf_dec; + const VkVideoProfileListInfoKHR *profile_list; VkVideoDecodeH264SessionParametersCreateInfoKHR h264_params = { .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR, @@ -1069,7 +1079,6 @@ int ff_vk_decode_init(AVCodecContext *avctx) /* Initialize contexts */ ctx = (FFVulkanDecodeShared *)dec->shared_ref->data; - prof = &ctx->profile_data; s = &ctx->s; vk = &ctx->s.vkfn; @@ -1080,6 +1089,13 @@ int ff_vk_decode_init(AVCodecContext *avctx) s->device = (AVHWDeviceContext *)s->frames->device_ref->data; s->hwctx = s->device->hwctx; + profile_list = ff_vk_find_struct(s->hwfc->create_pnext, + VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR); + if (!profile_list) { + av_log(avctx, AV_LOG_ERROR, "Profile list missing from frames context!"); + return AVERROR(EINVAL); + } + err = ff_vk_load_props(s); if (err < 0) goto fail; @@ -1101,13 +1117,13 @@ int ff_vk_decode_init(AVCodecContext *avctx) session_create.flags = 0x0; session_create.queueFamilyIndex = s->hwctx->queue_family_decode_index; - session_create.maxCodedExtent = prof->caps.maxCodedExtent; - session_create.maxDpbSlots = prof->caps.maxDpbSlots; - session_create.maxActiveReferencePictures = prof->caps.maxActiveReferencePictures; + session_create.maxCodedExtent = ctx->caps.maxCodedExtent; + session_create.maxDpbSlots = ctx->caps.maxDpbSlots; + session_create.maxActiveReferencePictures = ctx->caps.maxActiveReferencePictures; session_create.pictureFormat = s->hwfc->format[0]; session_create.referencePictureFormat = session_create.pictureFormat; session_create.pStdHeaderVersion = dec_ext[avctx->codec_id]; - session_create.pVideoProfile = &prof->profile_list.pProfiles[0]; + session_create.pVideoProfile = &profile_list->pProfiles[0]; /* Create decode exec context. * 2 async contexts per thread was experimentally determined to be optimal @@ -1152,14 +1168,14 @@ int ff_vk_decode_init(AVCodecContext *avctx) dpb_frames->height = s->frames->height; dpb_hwfc = dpb_frames->hwctx; - dpb_hwfc->create_pnext = (void *)&prof->profile_list; + dpb_hwfc->create_pnext = (void *)profile_list; dpb_hwfc->format[0] = s->hwfc->format[0]; dpb_hwfc->tiling = VK_IMAGE_TILING_OPTIMAL; dpb_hwfc->usage = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR | VK_IMAGE_USAGE_SAMPLED_BIT; /* Shuts validator up. */ if (dec->layered_dpb) - dpb_hwfc->nb_layers = prof->caps.maxDpbSlots; + dpb_hwfc->nb_layers = ctx->caps.maxDpbSlots; err = av_hwframe_ctx_init(ctx->dpb_hwfc_ref); if (err < 0) diff --git a/libavcodec/vulkan_decode.h b/libavcodec/vulkan_decode.h index 681d2476cd..3ac103f6b4 100644 --- a/libavcodec/vulkan_decode.h +++ b/libavcodec/vulkan_decode.h @@ -26,8 +26,6 @@ #include "vulkan_video.h" typedef struct FFVulkanDecodeProfileData { - VkVideoCapabilitiesKHR caps; - VkVideoDecodeCapabilitiesKHR dec_caps; VkVideoDecodeH264ProfileInfoKHR h264_profile; VkVideoDecodeH264ProfileInfoKHR h265_profile; VkVideoDecodeAV1ProfileInfoMESA av1_profile; @@ -40,7 +38,9 @@ typedef struct FFVulkanDecodeShared { FFVulkanContext s; FFVkVideoCommon common; FFVkExecPool exec_pool; - FFVulkanDecodeProfileData profile_data; + + VkVideoCapabilitiesKHR caps; + VkVideoDecodeCapabilitiesKHR dec_caps; AVBufferRef *dpb_hwfc_ref; /* Only used for dedicated_dpb */ -- 2.40.1 [-- Attachment #3: Type: text/plain, Size: 251 bytes --] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next reply other threads:[~2023-06-18 12:20 UTC|newest] Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-06-18 12:19 Lynne [this message] [not found] ` <NYDRcdf--3-9@lynne.ee-NYDRfjv----9> 2023-06-18 12:33 ` Lynne 2023-06-22 16:27 ` Lynne
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=NYDRcdf--3-9@lynne.ee \ --to=dev@lynne.ee \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git