如何检查我的DirectShow渲染器filter是否被使用?

在我的DirectShow项目中,我创build了一个filter(从CBaseVideoRenderer派生)来渲染到一块内存。 这在大多数情况下工作得很好,我添加了filter

  mGraphBuilder->AddFilter(pInterfaceInfo, MemoryRendererName); 

并依靠GraphBuilder来完成剩下的工作。 但是,在某些情况下,graphics构build器和我的filter无法达成共同的格式,并会绕过我的filter创build一个新的ActiveMovie窗口。

我想知道这是什么时候发生的,所以我知道我的filter没有被使用,但不能解决问题。

我列举了我的图中的所有filter,使用以下方法查找我的filter:

(编辑:我把我的GraphBuilder对象作为pGraphparameter passing给我时)

 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; } 

但它不能按预期工作,因为我的filter总是被发现,无论它是否在使用中。

如何知道我的filter用作我的DirectShowgraphics的video渲染器,何时不是?

Solutions Collecting From Web of "如何检查我的DirectShow渲染器filter是否被使用?"