H.264帧存储器泄漏与一些解码器

Emi*_*dın 8 video memory-leaks stream codec h.264

我正在H.264 stream使用其SDK从DVR 接收.有内存泄漏,我认为这是导致所有泄漏的SDK.但是当我录制流并从磁盘上逐个读取帧时(没有涉及任何第三方dll),我注意到问题不是dll而是流本身.

奇怪的是,DivX H264 Decoder它是唯一不会导致内存泄漏的编解码器,但是当流运行很长时间时,有时DivX解码器也会崩溃.我更喜欢使用,Microsoft DTV-DVD Video Decoder但它会导致巨大的内存泄漏并丢失大量帧.我尝试过的许多其他H.264解码器的行为方式相同.

我检查了h.264 frames使用一些h.264 parsers与其他一些无问题的流比较,但我没有注意到日志中的任何明显的东西.

由于我的问题是关于h.264帧结构,我已经准备了一个名为的源过滤器FramesFromFileSourceFilter,你可以在下面下载.

http://www.akaydin.com/directshow/FramesFromFileSourceFilter.zip

这是一个Visual Studio 2008项目,所有依赖项都包含在相对位置的文件夹(包括h.264帧)中的zip文件中.因此,您需要做的就是编译项目,注册输出regsvr32.exe并使用GraphEdit或GraphStudio中的任何h.264解码器运行过滤器.示例图如下.

使用DivX的FramesFromFileSourceFilter

FramesFromFileSourceFilter与Microsoft DTV-DVD视频解码器

此外,h264帧可作为单个原始h264文件在下面的链接中使用,该链接可由VLC播放(错误的FPS,因为原始版本为12 FPS).

http://www.akaydin.com/directshow/stream.zip

题:

除DivX解码器外,许多着名的H264解码器可能导致内存泄漏问题.这个流有什么问题?

更新1

读取数据线程被删除,功能移入FillBuffer而不使用任何缓冲区和标志.问题依然存在.

http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate1.zip

更新2

UPDATE1使用Sleep()FillBuffer()这是导致一些问题的功能.现在我删除了Sleep()并且曾经SetTime()拥有~12 FPS.这也解决了Microsoft DTV-DVD Video Decoder丢帧问题,但没有解决内存问题.

http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate2.zip

内存增加Working Set仅发生.Virtual Bytes而且Private Bytes似乎很稳定.什么可能导致连续的Working Set内存增量只发生Microsoft DTV-DVD Video Decoder

Rom*_* R. 3

您不对变量进行任何同步

BYTE* m_buffer;
DWORD m_bufferSize;
bool isFrameReady;
Run Code Online (Sandbox Code Playgroud)

它们由两个并发线程使用。您只是通过这种不准确的分配/释放和/或让您的代码因访问冲突而崩溃而泄漏内存。DLL 的调试版本通过在运行测试时显示“堆损坏”警报来表明这一点。运行时行为可能会因解码器和环境而异,但这绝对是一个需要修复的严重错误。

例如,您可以CAutoLock cAutoLock(m_pLock);在线程中使用填充缓冲区来防止在从文件读取数据时进行流式线程访问。

请注意,您将下一帧读入同一缓冲区指针,而不检查先前分配的内存是否已释放,您只是覆盖了指针,可能会留下泄漏。

内存泄漏/工作集更新:现在,当解决代码问题时,不需要的运行时行为是Working Set大小增加。这不是泄漏。这表明 Windows 将该进程视为一种优先级(为什么不呢?它是活动的并且与内存一起工作)并向该进程抛出更多实际页面以提高其性能。请参阅此答案,了解进程内存指标如何与应用程序中的内存泄漏相对应。

您可能看到的解码器之间的差异可能是由于某些解码器适合较小数量的缓冲区,或者更积极地重用它们,例如更喜欢从池中取出相同的缓冲区而不是逐一挑选通过所有可用的。