在我的 DirectShow 项目中,我创建了一个过滤器(从 派生CBaseVideoRenderer
)来渲染到一块内存。这在大多数情况下都非常有效,我添加了过滤器
mGraphBuilder->AddFilter(pInterfaceInfo, MemoryRendererName);
并依靠 GraphBuilder 来完成其余的工作。但是在某些情况下,图形生成器和我的过滤器无法就通用格式达成一致,它会绕过我的过滤器创建一个新的 ActiveMovie 窗口。
我想检测何时发生这种情况,以便我知道我的过滤器没有被使用,但无法确定如何使用。
我使用以下方法枚举图表中的所有过滤器,寻找我的过滤器:
(编辑:当我调用它时,我将我的 GraphBuilder 对象作为 pGraph 参数传递)
HRESULT MediaPlayer::CheckFilterGraphFor(IFilterGraph *pGraph, IBaseFilter* pFilterToLookFor)
{
IEnumFilters *pEnum = NULL;
IBaseFilter *pFilter;
ULONG cFetched;
HRESULT enumeratedFilterCount = 0;
FILTER_INFO pRefFilterInfo;
pFilterToLookFor->QueryFilterInfo(&pRefFilterInfo);
HRESULT hr = pGraph->EnumFilters(&pEnum);
if (SUCCEEDED(hr))
{
while(pEnum->Next(1, &pFilter, &cFetched) == S_OK)
{
enumeratedFilterCount--;
FILTER_INFO FilterInfo;
hr = pFilter->QueryFilterInfo(&FilterInfo);
if (SUCCEEDED(hr))
{
if(wcscmp(FilterInfo.achName, pRefFilterInfo.achName) == 0)
{
pRefFilterInfo.pGraph->Release();
return S_OK;
}
// The FILTER_INFO structure holds a pointer to the Filter Graph
// Manager, with a reference count that must be released.
if (FilterInfo.pGraph != NULL)
{
FilterInfo.pGraph->Release();
}
pFilter->Release();
}
}
pEnum->Release();
}
pRefFilterInfo.pGraph->Release();
return enumeratedFilterCount;
}
但它并没有按预期工作,因为无论是否在使用我的过滤器总是能找到。
如何判断我的过滤器何时用作 DirectShow 图形的视频渲染器,何时不使用?