在发布IMFSample对象之前,我应该在IMFSample中释放缓冲区吗?

时间:2018-04-01 23:22:00

标签: ms-media-foundation

在实际释放IMFSample本身之前,我找不到有关在IMFSample中释放缓冲区的要求的任何信息。如果我只是释放IMFSample会自动释放它的缓冲区吗?我正在编写一个视频播放器应用程序,我正在收到IMFSourceReader :: ReadSample的示例。虽然我看到代码正在运行,但我看到VS2017中的内存使用率略有增加,我不确定它是否是泄漏。我正在使用的代码基于这篇文章中的示例代码。 Media Foundation webcam video H264 encode/decode produces artifacts when played back

我找到了IMFSample :: RemoveAllBuffers方法,它可能会也可能不会释放缓冲区,它没有在文档中指定。也许这需要在发布IMFSample之前使用? https://msdn.microsoft.com/en-us/library/windows/desktop/ms703108(v=vs.85).aspx

(我在研究中也遇到过另一篇相关文章,但我不认为它适用于我的问题:) Should I release the returned IMFSample of an internally allocated MFT output buffer?

谢谢!

3 个答案:

答案 0 :(得分:1)

适用常规COM接口指针管理规则:您只需释放IMFSample指针就可以了。

在某些情况下,释放样本指针不会导致实际释放内存,因为样本可能会被合并:已发布的样本对象将返回其父池并准备重用。

答案 1 :(得分:1)

只是回应罗马所说的,如果你只是处理一个IMFSample,你只需要发布这个IMFSample。如果您在IMFSample上添加AddBuffer,则必须将其删除(我同意它不清楚,但如果此时删除缓冲区,这将导致处理IMFSample的组件出现问题,并且在找到缓冲区之后将无法找到缓冲区)。也就是说,如果没有人在合适的时间调用RemoveAllBuffers,这种设计会引起问题。

不同的组件不应该在同一个IMFSample上使用AddBuffer。但是有可能做到这一点。

这是内存管理的糟糕设计。你必须处理它。

答案 2 :(得分:0)

最后但并非最不重要

根据Microsoft,您必须释放缓冲区(之前或之后都没有关系)。 参见:Decode the audio