Win32 API 日本語リファレンス
ホームMedia.DirectShow › IStreamBuilder

IStreamBuilder

COM
IID56a868bf-0ad4-11ce-b03a-0020af0ba770継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IStreamBuilder インターフェイスは、出力ピン自身がフィルターグラフの下流部分を構築することを、フィルターグラフマネージャーに通知できるようにします。

メソッド 2

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Render(IPin* ppinOut, IGraphBuilder* pGraph)

Render メソッドは、このピンを起点とするストリームのレンダリングを完了します。これには、フィルターグラフへのフィルターの追加やそれらの接続が含まれる場合があります。

ppinOutIPin*inこのピンの IPin インターフェイスへのポインター。
pGraphIGraphBuilder*inフィルターグラフマネージャーの IGraphBuilder インターフェイスへのポインター。

戻り値

HRESULT 値を返します。戻り値 S_OK は、ストリームが正常にレンダリングされたことを示します。

解説(Remarks)

次のコードは、このメソッドを出力ピンで実装する方法を示しています。この例では、フィルターが下流にカスタムレンダラーを必要とすることを前提としています。

C++
STDMETHODIMP CMyOutputPin::Render(IPin *pPin, IGraphBuilder *pGraph)
{
    CheckPointer(pPin, E_POINTER);
    CheckPointer(pGraph, E_POINTER);

    // This filter needs a special renderer connected to it.
    IBaseFilter *pMyRenderer = NULL;

    // Create the renderer.
    HRESULT hr = CoCreateInstance(CLSID_MyRenderer, NULL, CLSCTX_INPROC,
        IID_IBaseFilter, (void **)&pMyRenderer);
    if (FAILED(hr))
    {
        return hr;
    }
    
    // Add my renderer to the filter graph.
    hr = pGraph->AddFilter(pMyRenderer, L"My Renderer");
    if (FAILED(hr))
    {
        pMyRenderer->Release();
        return hr;
    }

    IEnumPins *pEnumPins;
    IPin *pMyRendererInputPin = NULL;
    hr = pMyRenderer->EnumPins(&pEnumPins);
    if (SUCCEEDED(hr)) 
    {
        if (S_OK != pEnumPins->Next(1, &pMyRendererInputPin, 0))
        {
            hr = E_UNEXPECTED;
         }
    }
    if (SUCCEEDED(hr)) 
    {
        // Connect my renderer to my output pin.
        hr = pGraph->ConnectDirect(pPin, pMyRendererInputPin);
        pMyRendererInputPin->Release();
    }
    if (FAILED(hr)) 
    {
        // Could not connect to my renderer. Remove it from the graph.
        pGraph->RemoveFilter(pMyRenderer);
    }
    pMyRenderer->Release();
    return hr;
}
vtbl 4 HRESULT Backout(IPin* ppinOut, IGraphBuilder* pGraph)

Backout メソッドは、IStreamBuilder::Render メソッドで行われた手順を取り消します。これには、Render 内で追加されたフィルターの切断および削除が含まれます。

ppinOutIPin*inこのピンの IPin インターフェイスへのポインター。
pGraphIGraphBuilder*inフィルターグラフマネージャーの IGraphBuilder インターフェイスへのポインター。

戻り値

HRESULT 値を返します。戻り値 S_OK は、切断が成功したことをグラフビルダーに示します。

解説(Remarks)

次の例は、IStreamBuilder::Render メソッドのコード例で示した手順を、フィルターが逆に戻す方法を示しています。

C++
STDMETHODIMP CMyOutputPin::BackOut(IPin *pPin, IGraphBuilder *pGraph)
{
    CheckPointer(pPin, E_POINTER);
    CheckPointer(pGraph, E_POINTER);

    HRESULT hr = S_OK;
    if (m_Connected != NULL) // Pointer to the pin we're connected to.
    {
        // Find the filter that owns the pin connected to us.
        FILTER_INFO fi;
        hr = m_Connected->QueryFilterInfo(&fi);
        if (SUCCEEDED(hr)) 
        {
            if (fi.pFilter != NULL) 
            {
                //  Disconnect the pins.
                pGraph->Disconnect(m_Connected);
                pGraph->Disconnect(pPin);
                // Remove the filter from the graph.
                pGraph->RemoveFilter(fi.pFilter);
                fi.pFilter->Release();
            } 
            else 
            {
                hr = E_UNEXPECTED;
            }
        }
    }
    return hr;
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

#define global IID_IStreamBuilder "{56A868BF-0AD4-11CE-B03A-0020AF0BA770}"
#usecom global IStreamBuilder IID_IStreamBuilder "{}"
#comfunc global IStreamBuilder_Render   3 sptr,sptr
#comfunc global IStreamBuilder_Backout  4 sptr,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。