在自定义源和 SmartTee 之间插入筛选器会泄漏 COM 对象

Inserting filter between custom source and SmartTee leaks COM object

本文关键字:泄漏 COM 对象 筛选 插入 自定义 SmartTee 之间      更新时间:2023-10-16

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

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

源筛选器以及插入的筛选器在输出引脚上具有 InitAllocator 函数,用于建议分配器。

您可以在 CBaseOutputPin 类中检查决策分配器函数的来源。输出引脚选择一个分配器。它可以使用输入引脚提供的一个,也可以创建自己的引脚: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 以通知输入引脚选择。如果通知分配器返回错误,则分配器为"释放"。 您是否将输出引脚基于 CBaseOutputPin 并替换了决策分配器方法?