gpt4 book ai didi

c++ - 在自定义源和 SmartTee 之间插入过滤器会泄漏 COM 对象

转载 作者:太空宇宙 更新时间:2023-11-04 13:04:14 24 4
gpt4 key购买 nike

我们有一个 DirectShow 图,它​​由我们自己的源过滤器组成,它是使用 CaptureGraphBuilder 呈现的。在预览模式下,图形结果为 [Source] -> [SmartTee] -(PreviewPin)-> [Decoder] -> [Renderer]。我们自己的过滤器有一个自定义分配器并通知 SmartTee。现在退出就可以了,所有对象都会被释放。

现在我们尝试在我们自己的源过滤器和 SmartTee 过滤器之间插入一个过滤器。将新创建的过滤器连接到我们的源过滤器时,会在源过滤器上创建一个新的分配器。将新过滤器(将在输出引脚本身上建议自定义分配器)连接到 SmartTee 过滤器时,SmartTee 会建议在源和 SmartTee 之间的第一个连接中创建的分配器。但是由于 BreakConnect,SmartTee 应该放弃这个分配器。现在退出应用程序会产生一个剩余的源分配器对象,它是在第一个连接中创建的分配器。

源过滤器以及插入过滤器在输出引脚上有一个 InitAllocator 函数来建议分配器。

最佳答案

您可以在 CBaseOutputPin 类中查看 DecideAllocator 函数的源代码。输出引脚选择一个分配器。它可以使用输入引脚提供的一个,或创建自己的:https://msdn.microsoft.com/en-us/library/windows/desktop/dd390924(v=vs.85).aspx为了做到这一点,CBaseOutputPin 调用输入引脚的 GetAllocator 并确定输入是否提供它自己的分配器。要为输出引脚提供分配器,请覆盖 CBaseOutputPin::InitAllocator 方法以创建分配器的实例:https://msdn.microsoft.com/en-us/library/windows/desktop/dd377477(v=vs.85).aspx此时应使用您的分配器,输出引脚调用 IMemInputPin::NotifyAllocator 以通知输入引脚选择。如果 NotifyAllocator 返回错误,则释放分配器。您的输出引脚是否基于 CBaseOutputPin 并替换了 DecideAllocator 方法?

关于c++ - 在自定义源和 SmartTee 之间插入过滤器会泄漏 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43068566/

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