【问题标题】:Should I release the buffers within IMFSample before I release the IMFSample object?我应该在释放 IMFSample 对象之前释放 IMFSample 中的缓冲区吗?
【发布时间】:2019-12-01 08:10:24
【问题描述】:

在实际释放 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?

谢谢!

【问题讨论】:

    标签: ms-media-foundation


    【解决方案1】:

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

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

    【讨论】:

    • 如果使用 'IMFSample::AddBuffer' 将缓冲区添加到样本中会怎样?释放样本也会释放它的缓冲区吗?也许需要先使用 'IMFSample::GetBufferByIndex' 清除缓冲区?谢谢。
    • 完全释放的样本会释放它引用的缓冲区——这些缓冲区足够简单,不需要任何额外的释放。如果向您提供样本的一方初始化池样本一次并假设缓冲区保留在重用样本中,则释放样本缓冲区实际上可能会成为一个问题。它不必发生,但在技术上是可能的。也就是说,为了避免麻烦,您不应该分离缓冲区,即使这似乎是一种更安全的资源处理方式。
    【解决方案2】:

    只是为了回应 Roman 所说的,如果你只是处理一个 IMFSample,你只需要释放这个 IMFSample。如果您在 IMFSample 上添加缓冲区,则必须将其删除(我同意不清楚,但如果此时删除缓冲区,这将给处理 IMFSample 的组件带来问题,并且之后它将找不到缓冲区)。也就是说,如果没有人在正确的时间调用 RemoveAllBuffers,这种设计可能会导致问题。

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

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

    【讨论】:

      【解决方案3】:

      最后但并非最不重要。

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

      【讨论】:

        猜你喜欢
        • 2017-01-14
        • 1970-01-01
        • 2011-02-15
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 2017-04-01
        • 1970-01-01
        相关资源
        最近更新 更多