This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 72e83b42d1da93df7cc677ea6bc8d0bc379075cb Author: Lynne <[email protected]> AuthorDate: Sat Dec 13 02:53:23 2025 +0100 Commit: Lynne <[email protected]> CommitDate: Sat Dec 13 19:12:24 2025 +0100 vulkan_decode: clean up decoder initialization Now that we don't reset on every seek, we can simplify it. --- libavcodec/vulkan_decode.c | 151 +++++++++++++++++++++++---------------------- libavcodec/vulkan_decode.h | 7 --- 2 files changed, 78 insertions(+), 80 deletions(-) diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c index 654149851d..3560d18324 100644 --- a/libavcodec/vulkan_decode.c +++ b/libavcodec/vulkan_decode.c @@ -372,17 +372,65 @@ int ff_vk_decode_add_slice(AVCodecContext *avctx, FFVulkanDecodePicture *vp, return 0; } -void ff_vk_decode_flush(AVCodecContext *avctx) +static int create_empty_session_parameters(AVCodecContext *avctx, + FFVulkanDecodeShared *ctx, + VkVideoSessionParametersKHR *empty_session_params) { - FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; - FFVulkanDecodeShared *ctx = dec->shared_ctx; + if (avctx->codec_id == AV_CODEC_ID_VP9) + return 0; + + VkVideoDecodeH264SessionParametersCreateInfoKHR h264_params = { + .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR, + }; + VkVideoDecodeH265SessionParametersCreateInfoKHR h265_params = { + .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR, + }; + StdVideoAV1SequenceHeader av1_empty_seq = { 0 }; + VkVideoDecodeAV1SessionParametersCreateInfoKHR av1_params = { + .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR, + .pStdSequenceHeader = &av1_empty_seq, + }; + VkVideoSessionParametersCreateInfoKHR session_params_create = { + .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR, + .pNext = avctx->codec_id == AV_CODEC_ID_H264 ? (void *)&h264_params : + avctx->codec_id == AV_CODEC_ID_HEVC ? (void *)&h265_params : + avctx->codec_id == AV_CODEC_ID_AV1 ? (void *)&av1_params : + NULL, + .videoSession = ctx->common.session, + }; + + VkResult ret; + FFVulkanContext *s = &ctx->s; + FFVulkanFunctions *vk = &s->vkfn; + ret = vk->CreateVideoSessionParametersKHR(s->hwctx->act_dev, &session_params_create, + s->hwctx->alloc, empty_session_params); + if (ret != VK_SUCCESS) { + av_log(avctx, AV_LOG_ERROR, "Unable to create empty Vulkan video session parameters: %s!\n", + ff_vk_ret2str(ret)); + return AVERROR_EXTERNAL; + } + + return 0; +} + +static int decode_reset(AVCodecContext *avctx, FFVulkanDecodeShared *ctx) +{ + int err; + FFVulkanContext *s = &ctx->s; + FFVulkanFunctions *vk = &s->vkfn; - FFVulkanFunctions *vk = &ctx->s.vkfn; VkVideoBeginCodingInfoKHR decode_start = { .sType = VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR, .videoSession = ctx->common.session, - .videoSessionParameters = ctx->empty_session_params, }; + + if (!(ctx->s.extensions & FF_VK_EXT_VIDEO_MAINTENANCE_2)) { + err = create_empty_session_parameters(avctx, ctx, + &decode_start.videoSessionParameters); + if (err < 0) + return err; + } + VkVideoCodingControlInfoKHR decode_ctrl = { .sType = VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR, .flags = VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR, @@ -391,21 +439,30 @@ void ff_vk_decode_flush(AVCodecContext *avctx) .sType = VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR, }; - VkCommandBuffer cmd_buf; - FFVkExecContext *exec; + FFVkExecContext *exec = ff_vk_exec_get(&ctx->s, &ctx->exec_pool); + ff_vk_exec_start(&ctx->s, exec); - /* Non-video queues do not need to be reset */ - if (!(get_codecdesc(avctx->codec_id)->decode_op)) - return; + vk->CmdBeginVideoCodingKHR(exec->buf, &decode_start); + vk->CmdControlVideoCodingKHR(exec->buf, &decode_ctrl); + vk->CmdEndVideoCodingKHR(exec->buf, &decode_end); - exec = ff_vk_exec_get(&ctx->s, &ctx->exec_pool); - ff_vk_exec_start(&ctx->s, exec); - cmd_buf = exec->buf; + err = ff_vk_exec_submit(&ctx->s, exec); - vk->CmdBeginVideoCodingKHR(cmd_buf, &decode_start); - vk->CmdControlVideoCodingKHR(cmd_buf, &decode_ctrl); - vk->CmdEndVideoCodingKHR(cmd_buf, &decode_end); - ff_vk_exec_submit(&ctx->s, exec); + if (decode_start.videoSessionParameters) { + /* Wait to complete to delete the temporary session parameters */ + if (err >= 0) + ff_vk_exec_wait(&ctx->s, exec); + + vk->DestroyVideoSessionParametersKHR(s->hwctx->act_dev, + decode_start.videoSessionParameters, + s->hwctx->alloc); + } + + if (err < 0) + av_log(avctx, AV_LOG_ERROR, "Unable to reset decoder: %s", + ff_vk_ret2str(err)); + + return err; } int ff_vk_decode_frame(AVCodecContext *avctx, @@ -651,7 +708,6 @@ static void free_common(AVRefStructOpaque unused, void *obj) { FFVulkanDecodeShared *ctx = obj; FFVulkanContext *s = &ctx->s; - FFVulkanFunctions *vk = &ctx->s.vkfn; /* Wait on and free execution pool */ ff_vk_exec_pool_free(&ctx->s, &ctx->exec_pool); @@ -659,12 +715,6 @@ static void free_common(AVRefStructOpaque unused, void *obj) /* This also frees all references from this pool */ av_frame_free(&ctx->common.layered_frame); - /* Destroy parameters */ - if (ctx->empty_session_params) - vk->DestroyVideoSessionParametersKHR(s->hwctx->act_dev, - ctx->empty_session_params, - s->hwctx->alloc); - av_buffer_pool_uninit(&ctx->buf_pool); ff_vk_video_common_uninit(s, &ctx->common); @@ -1237,47 +1287,6 @@ int ff_vk_decode_uninit(AVCodecContext *avctx) return 0; } -static int create_empty_session_parameters(AVCodecContext *avctx, - FFVulkanDecodeShared *ctx) -{ - VkResult ret; - FFVulkanContext *s = &ctx->s; - FFVulkanFunctions *vk = &s->vkfn; - - VkVideoDecodeH264SessionParametersCreateInfoKHR h264_params = { - .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR, - }; - VkVideoDecodeH265SessionParametersCreateInfoKHR h265_params = { - .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR, - }; - StdVideoAV1SequenceHeader av1_empty_seq = { 0 }; - VkVideoDecodeAV1SessionParametersCreateInfoKHR av1_params = { - .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR, - .pStdSequenceHeader = &av1_empty_seq, - }; - VkVideoSessionParametersCreateInfoKHR session_params_create = { - .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR, - .pNext = avctx->codec_id == AV_CODEC_ID_H264 ? (void *)&h264_params : - avctx->codec_id == AV_CODEC_ID_HEVC ? (void *)&h265_params : - avctx->codec_id == AV_CODEC_ID_AV1 ? (void *)&av1_params : - NULL, - .videoSession = ctx->common.session, - }; - - if (avctx->codec_id == AV_CODEC_ID_VP9) - return 0; - - ret = vk->CreateVideoSessionParametersKHR(s->hwctx->act_dev, &session_params_create, - s->hwctx->alloc, &ctx->empty_session_params); - if (ret != VK_SUCCESS) { - av_log(avctx, AV_LOG_ERROR, "Unable to create empty Vulkan video session parameters: %s!\n", - ff_vk_ret2str(ret)); - return AVERROR_EXTERNAL; - } - - return 0; -} - int ff_vk_decode_init(AVCodecContext *avctx) { int err; @@ -1287,7 +1296,6 @@ int ff_vk_decode_init(AVCodecContext *avctx) int async_depth; const VkVideoProfileInfoKHR *profile; const FFVulkanDecodeDescriptor *vk_desc; - const VkPhysicalDeviceDriverProperties *driver_props; VkVideoSessionCreateInfoKHR session_create = { .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR, @@ -1405,17 +1413,16 @@ int ff_vk_decode_init(AVCodecContext *avctx) } if (!DECODER_IS_SDR(avctx->codec_id)) { - if (!(ctx->s.extensions & FF_VK_EXT_VIDEO_MAINTENANCE_2)) { - err = create_empty_session_parameters(avctx, ctx); - if (err < 0) - return err; - } + err = decode_reset(avctx, ctx); + if (err < 0) + return err; } else { /* For SDR decoders, this alignment value will be 0. Since this will make * add_slice() malfunction, set it to a sane default value. */ ctx->caps.minBitstreamBufferSizeAlignment = AV_INPUT_BUFFER_PADDING_SIZE; } + const VkPhysicalDeviceDriverProperties *driver_props; driver_props = &dec->shared_ctx->s.driver_props; if (driver_props->driverID == VK_DRIVER_ID_NVIDIA_PROPRIETARY && driver_props->conformanceVersion.major == 1 && @@ -1424,8 +1431,6 @@ int ff_vk_decode_init(AVCodecContext *avctx) driver_props->conformanceVersion.patch < 3) dec->quirk_av1_offset = 1; - ff_vk_decode_flush(avctx); - av_log(avctx, AV_LOG_VERBOSE, "Vulkan decoder initialization successful\n"); return 0; diff --git a/libavcodec/vulkan_decode.h b/libavcodec/vulkan_decode.h index e32468f317..c75f0710db 100644 --- a/libavcodec/vulkan_decode.h +++ b/libavcodec/vulkan_decode.h @@ -46,8 +46,6 @@ typedef struct FFVulkanDecodeShared { VkVideoCapabilitiesKHR caps; VkVideoDecodeCapabilitiesKHR dec_caps; - VkVideoSessionParametersKHR empty_session_params; - /* Software-defined decoder context */ void *sd_ctx; void (*sd_ctx_free)(struct FFVulkanDecodeShared *ctx); @@ -176,11 +174,6 @@ int ff_vk_get_decode_buffer(FFVulkanDecodeContext *ctx, AVBufferRef **buf, int ff_vk_decode_create_params(AVBufferRef **par_ref, void *logctx, FFVulkanDecodeShared *ctx, const VkVideoSessionParametersCreateInfoKHR *session_params_create); -/** - * Flush decoder. - */ -void ff_vk_decode_flush(AVCodecContext *avctx); - /** * Free decoder. */ _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
