diff options
author | Zhao Zhili <zhilizhao@tencent.com> | 2024-02-22 22:42:42 +0800 |
---|---|---|
committer | Zhao Zhili <zhilizhao@tencent.com> | 2024-03-01 17:20:21 +0800 |
commit | 6f9730cb2847e157049909308a9d05384a57d926 (patch) | |
tree | 5fe98195fad31343b288ea11befb9282a57ae9cd /libavutil | |
parent | 3bb00c0a420c3ce83c6fafee30270d69622ccad7 (diff) |
avutil/hwcontext_vulkan: Fix leaks when semaphore creation fails
Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
Diffstat (limited to 'libavutil')
-rw-r--r-- | libavutil/hwcontext_vulkan.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index a84713e621..747f8de3ce 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -1807,16 +1807,22 @@ static void vulkan_frame_free(AVHWFramesContext *hwfc, AVVkFrame *f) VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; FFVulkanFunctions *vk = &p->vkctx.vkfn; int nb_images = ff_vk_count_images(f); + int nb_sems = 0; + + while (nb_sems < FF_ARRAY_ELEMS(f->sem) && f->sem[nb_sems]) + nb_sems++; + + if (nb_sems) { + VkSemaphoreWaitInfo sem_wait = { + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, + .flags = 0x0, + .pSemaphores = f->sem, + .pValues = f->sem_value, + .semaphoreCount = nb_sems, + }; - VkSemaphoreWaitInfo sem_wait = { - .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, - .flags = 0x0, - .pSemaphores = f->sem, - .pValues = f->sem_value, - .semaphoreCount = nb_images, - }; - - vk->WaitSemaphores(hwctx->act_dev, &sem_wait, UINT64_MAX); + vk->WaitSemaphores(hwctx->act_dev, &sem_wait, UINT64_MAX); + } vulkan_free_internal(f); @@ -2098,7 +2104,8 @@ static int create_frame(AVHWFramesContext *hwfc, AVVkFrame **frame, if (ret != VK_SUCCESS) { av_log(hwctx, AV_LOG_ERROR, "Failed to create semaphore: %s\n", ff_vk_ret2str(ret)); - return AVERROR_EXTERNAL; + err = AVERROR_EXTERNAL; + goto fail; } f->queue_family[i] = p->nb_img_qfs > 1 ? VK_QUEUE_FAMILY_IGNORED : p->img_qfs[0]; |