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

标签 c++ windows com directshow

我们有一个 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/

相关文章:

python - 权限错误 : [Errno 13] Permission denied: 'pro.csv'

用于从外部线程更改标签文本的 C# 通用方法。

c++ - 未按描述收到事件通知

c++ - 错误 C2440 : '=' : cannot convert from 'char [5]' to 'char [20]'

c++ - 为什么ubuntu 12.04下的OpenMP比串口版本慢

c++ - 将值插入到 multimap vector 中

c# - 将大型虚拟文件从 C# 拖放到 Windows 资源管理器

c++ - 这是编写接受参数数量可变的函数指针的函数模板的正确方法吗?

c - 在 c 中激活和停用 usb 设备?

c# - 使用 COM 对 C# 应用程序进行内存分析