如何检查我的DirectShow渲染器过滤器是否正在使用?

时间:2012-05-30 18:37:20

标签: windows c++-cli directshow multimedia

在我的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图形的视频渲染器,何时不用?

1 个答案:

答案 0 :(得分:3)

找到渲染器过滤器后,找到它的输入引脚并检查它是否已连接(IPin :: ConnectedTo)