Microsoft DirectX 8.0 |
このインターフェイスを使用すると、出力ピンからフィルタ グラフ マネージャに、フィルタ グラフのダウンストリーム部分をピン自体が構築することを通知できる。特殊な接続を必要とする出力ピンでは、このインターフェイスを実装して、フィルタ グラフ マネージャが使用するピン接続のデフォルト処理をオーバーライドできる。
vtable 順のメソッド
IUnknown メソッド 説明 QueryInterface サポートされているインターフェイスへのポインタを取得する。 AddRef 参照カウントをインクリメントする。 Release 参照カウントをデクリメントする。 IStreamBuilder メソッド 説明 Render このピンから始まるストリームのレンダリングを完了する。このとき必要に応じて、フィルタがフィルタ グラフに追加され、接続される。 Backout Render で行われたステップを元に戻す。Render 内で追加されたフィルタがあれば、その切断および削除も行われる。
Render で行われたステップを元に戻す。Render 内で追加されたフィルタがあれば、その切断および削除も行われる。
構文
HRESULT Backout( IPin *ppinOut IGraphBuilder *pGraph )
パラメータ
- ppinOut
- [in] このピンの IPin インターフェイスへのポインタ。
- pGraph
- [in] フィルタ グラフ マネージャの IGraphBuilder インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。グラフ ビルダにとって、リターン コード S_OK は切断が成功したことを示す。
注意
次のコードは、このメソッドを出力ピンに実装する方法を示す。
STDMETHODIMP CMyOutputPin::BackOut(IPin *pOutputPin, IGraphBuilder *pBuilder) { HRESULT hr = S_OK; if (m_Connected != NULL) { FILTER_INFO fi; // 自分のピンに接続しているピンのフィルタ ポインタを検索する。 hr = m_Connected->QueryFilterInfo(&fi); if (SUCCEEDED(hr)) { if (fi.pFilter != NULL) { // 切断する。 pBuilder->Disconnect(m_Connected); pBuilder->Disconnect(pOutputPin); // 追加したフィルタをグラフから削除する。 pBuilder->RemoveFilter(fi.pFilter); fi.pFilter->Release(); } else { hr = E_UNEXPECTED; } } } return hr; }
このピンから始まるストリームのレンダリングを完了する。このとき必要に応じて、フィルタがフィルタ グラフに追加され、接続される。
構文
HRESULT Render( IPin *ppinOut IGraphBuilder *pGraph );
パラメータ
- ppinOut
- [in] このピンの IPin インターフェイスへのポインタ。
- pGraph
- [in] フィルタ グラフ マネージャの IGraphBuilder インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。リターン コード S_OK はストリームのレンダリングが成功したことを示す。
注意
次のコードは、このメソッドを出力ピンに実装する方法を示す。
STDMETHODIMP CMyOutputPin::Render(IPin *pOutputPin, IGraphBuilder *pBuilder) { // このフィルタには自作の特殊なレンダラを接続する必要がある。 IBaseFilter *pMyRenderer = NULL; IPin *pMyRendererInputPin = NULL; bool bAddedToGraph = false; // 独自のレンダラを作成する。 HRESULT hr = CoCreateInstance(CLSID_MyRenderer, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&pMyRenderer); if (SUCCEEDED(hr)) { // レンダラをフィルタ グラフに追加する。 hr = pBuilder->AddFilter(pMyRenderer, L"My Renderer"); } // レンダラの入力ピンを検索する。 if (SUCCEEDED(hr)) { bAddedToGraph = true; IEnumPins *pEnumPins; hr = pMyRenderer->EnumPins(&pEnumPins); if (SUCCEEDED(hr)) { DWORD nPins; if (S_OK != pEnumPins->Next(1, &pMyRendererInputPin, &nPins)) { hr = E_UNEXPECTED; } } } if (SUCCEEDED(hr)) { // レンダラを自分の出力ピンに接続する。 hr = pBuilder->ConnectDirect(pOutputPin, pMyRendererInputPin); } if (FAILED(hr)) { if (bAddedToGraph) { pBuilder->RemoveFilter(pMyRenderer); } pMyRenderer->Release(); } if (NULL != pMyRendererOutputPin) { pMyRendererInputPin->Release(); } return hr; }