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

时间:2017-03-28 11:38:45

标签: c++ windows com directshow

我们有一个DirectShow图形,由我们自己的Source过滤器组成,使用CaptureGraphBuilder进行渲染。在预览模式下,图形会产生[来源] - > [SmartTee] - (PreviewPin) - > [解码器] - > [渲染器]。我们自己的过滤器有一个自定义分配器,并通知SmartTee。现在退出将很好,所有对象都会被释放。

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

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

1 个答案:

答案 0 :(得分:0)

您可以在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 此时应使用分配器,并且outpin调用IMemInputPin :: NotifyAllocator以通知输入引脚选择。如果NotifyAllocator返回错误,则分配器将被释放。 您是否已将输出引脚设置在CBaseOutputPin上并更换了DecideAllocator方法?