在我的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图形的视频渲染器,何时不用?
答案 0 :(得分:3)
找到渲染器过滤器后,找到它的输入引脚并检查它是否已连接(IPin :: ConnectedTo)