diff --git a/common/libs/VkCodecUtils/VkVideoFrameToFile.cpp b/common/libs/VkCodecUtils/VkVideoFrameToFile.cpp index 57c5c979..9322d3ac 100644 --- a/common/libs/VkCodecUtils/VkVideoFrameToFile.cpp +++ b/common/libs/VkCodecUtils/VkVideoFrameToFile.cpp @@ -206,13 +206,14 @@ class VkVideoFrameToFileImpl : public VkVideoFrameOutput { assert(pOutputBuffer != nullptr); assert((pFrame->displayWidth >= 0) && (pFrame->displayHeight >= 0)); - - WaitAndGetStatus(vkDevCtx, + if (pFrame->frameCompleteFence) { + WaitAndGetStatus(vkDevCtx, *vkDevCtx, pFrame->frameCompleteFence, pFrame->queryPool, pFrame->startQueryId, pFrame->pictureIndex, false, "frameCompleteFence"); + } VkFormat format = imageResource->GetImageCreateInfo().format; const VkMpFormatInfo* mpInfo = YcbcrVkFormatInfo(format); diff --git a/vk_video_decoder/libs/VulkanVideoFrameBuffer/VulkanVideoFrameBuffer.cpp b/vk_video_decoder/libs/VulkanVideoFrameBuffer/VulkanVideoFrameBuffer.cpp index eea49faf..12e652cb 100644 --- a/vk_video_decoder/libs/VulkanVideoFrameBuffer/VulkanVideoFrameBuffer.cpp +++ b/vk_video_decoder/libs/VulkanVideoFrameBuffer/VulkanVideoFrameBuffer.cpp @@ -284,7 +284,7 @@ class VkVideoFrameBuffer : public VulkanVideoFrameBuffer { , m_perFrameDecodeImageSet() , m_displayFrames() , m_queryPool() - , m_ownedByDisplayMask(0) + , m_ownedByDisplay() , m_frameNumInDisplayOrder(0) , m_numberParameterUpdates(0) , m_maxNumImageTypeIdx(0) @@ -377,7 +377,9 @@ class VkVideoFrameBuffer : public VulkanVideoFrameBuffer { DestroyVideoQueries(); - m_ownedByDisplayMask = 0; + for (size_t i = 0; i < VulkanVideoFrameBuffer::maxImages; i++) { + m_ownedByDisplay[i] = 0; + } m_frameNumInDisplayOrder = 0; m_perFrameDecodeImageSet.Deinit(m_vkDevCtx); @@ -511,8 +513,7 @@ class VkVideoFrameBuffer : public VulkanVideoFrameBuffer { numberofPendingFrames = (int)m_displayFrames.size(); pictureIndex = m_displayFrames.front(); assert((pictureIndex >= 0) && ((uint32_t)pictureIndex < m_perFrameDecodeImageSet.size())); - assert(!(m_ownedByDisplayMask & (1 << pictureIndex))); - m_ownedByDisplayMask |= (1 << pictureIndex); + m_ownedByDisplay[pictureIndex]++; m_displayFrames.pop(); m_perFrameDecodeImageSet[pictureIndex].m_inDisplayQueue = false; m_perFrameDecodeImageSet[pictureIndex].m_ownedByConsummer = true; @@ -596,10 +597,8 @@ class VkVideoFrameBuffer : public VulkanVideoFrameBuffer { assert((picId >= 0) && ((uint32_t)picId < m_perFrameDecodeImageSet.size())); assert(m_perFrameDecodeImageSet[picId].m_decodeOrder == pDecodedFrameRelease->decodeOrder); - assert(m_perFrameDecodeImageSet[picId].m_displayOrder == pDecodedFrameRelease->displayOrder); - assert(m_ownedByDisplayMask & (1 << picId)); - m_ownedByDisplayMask &= ~(1 << picId); + m_ownedByDisplay[picId]--; m_perFrameDecodeImageSet[picId].m_inDecodeQueue = false; m_perFrameDecodeImageSet[picId].m_ownedByConsummer = false; m_perFrameDecodeImageSet[picId].Release(); @@ -770,7 +769,7 @@ class VkVideoFrameBuffer : public VulkanVideoFrameBuffer { NvPerFrameDecodeImageSet m_perFrameDecodeImageSet; std::queue m_displayFrames; VkQueryPool m_queryPool; - uint32_t m_ownedByDisplayMask; + uint32_t m_ownedByDisplay[VulkanVideoFrameBuffer::maxImages]; int32_t m_frameNumInDisplayOrder; uint32_t m_numberParameterUpdates; uint32_t m_maxNumImageTypeIdx : 4;