H.264框架内存泄漏一些解码器(H.264 Frames Memory Leak With Som

2019-07-30 00:36发布

我收到的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解码过滤器。 实施例图是下面。

也H264帧是在低于其是由VLC可玩的链接的单个原始H264文件(带有错误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 BytesPrivate Bytes似乎是稳定的。 什么可能导致连续Working Set内存增量仅发生与Microsoft DTV-DVD Video Decoder

Answer 1:

你不做任何同步在你的变量

BYTE* m_buffer;
DWORD m_bufferSize;
bool isFrameReady;

他们是从两个并发线程使用。 您只需通过这种不准确的分配/释放和/或访问冲突让你的代码崩溃泄露你的记忆。 您的DLL的调试版本通过展示为您运行测试你“堆腐败”警报表明这一点。 运行时behavoir可能与解码器和环境而有所不同,但是这绝对是一个严峻的bug被修复。

例如,你可以使用CAutoLock cAutoLock(m_pLock); 在你的线程填充缓冲以防止流线程访问,而你是从文件中读取数据。

请注意,您读下一帧到同一个缓冲区指针,未作检查以前分配的内存是否被释放或没有,你只是简单地覆盖指针可能留下漏洞。

内存泄漏/工作组更新 :现在,当代码问题整理出来,不需要的运行时行为是增加Working Set的大小。 这不是一个泄漏。 这是Windows认为过程作为一种优先的(为什么不呢?它是积极的和有记忆的作品),并引发更真实的网页朝着这个过程中,以促进其表现的指标。 见这个答案的过程内存指标如何对应内存泄漏的应用程序很好的解释。

你可能会看到解码器之间的差异是可能的事实,有些解码器是很好的与缓冲区的金额,或重用他们更积极,如更喜欢采取同样的缓冲出池,而不是由一个选择之一引起所有可用的。



文章来源: H.264 Frames Memory Leak With Some Decoders