0

私の 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 グラフのビデオ レンダラーとして使用されている場合と使用されていない場合をどのように確認できますか?

4

1 に答える 1

3

レンダラー フィルターを見つけたら、その入力ピンを見つけて、接続されているかどうかを確認します (IPin::ConnectedTo)。

于 2012-05-30T19:36:41.740 に答える