gpt4 book ai didi

c++ - IMemAllocator :GetBuffer hangs

转载 作者:太空宇宙 更新时间:2023-11-04 12:23:56 27 4
gpt4 key购买 nike

有人知道为什么 IMemAllocator:GetBuffer 的任何原因吗? (Directshow) 挂起,除了所有正在使用的样本?

我有一个使用 GMFBridge by Geraint Davies 的 directshow 应用程序连接两个图形。 GMFBridge 用于能够切换输入,但我在这种情况下不切换。该应用程序捕获音频和视频,并且应该不间断地进行。但大约 10 小时后它停止了。我发现音频和视频都卡在了对 IMemAllocator:GetBuffer 的调用中:

/* _COM_SMARTPTR_TYPEDEF(IMemAllocator, IID_IMemAllocator); */
/* IMemAllocatorPtr m_pCopyAllocator; */

hr = m_pCopyAllocator->GetBuffer(&pOut, NULL, NULL, 0);

如果所有示例都在使用中,则此函数可能会阻塞,但我很确定情况并非如此。有两个线程调用此函数,一个用于视频样本,一个用于音频样本。音频线程首先阻塞,在 GetBuffer 返回了近 60 个视频样本的缓冲区后,视频线程也阻塞了。 (这是大约 2 秒后)

在将近 8 小时后,两个线程都继续了一小段时间,首先是音频线程,在返回了 45 个用于音频样本的缓冲区之后,视频线程也解除了阻塞。

因为两个线程不会同时阻塞,所以在我看来所有样本都在使用中没有问题。

堆栈跟踪显示 quartz.dll 中的一个函数正在那个时刻被调用。

更新

看来电脑上已经安装了解码器过滤器,导致内存泄漏。该图包括 mpeg 的解码,例如使用 cyberlink 解码器的音频解码。安装ffdshow后,改用ffdshow音视频解码器,问题似乎消失了。吸取教训,不要自动依赖现有过滤器。

最佳答案

不确定我能否根据给定的信息对此进行调试。你能创建一个日志文件吗(创建一个空文件 c:\gmfbridge.txt,运行直到它挂起,然后压缩文件并通过电子邮件发送)。此外,如果您使用 _NT_SYMBOL_PATH 设置您的符号,您可以查看堆栈跟踪以了解各种线程在 quartz.dll 中的位置。

G

关于c++ - IMemAllocator :GetBuffer hangs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3478403/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com