IFilterGraph2
COM公式ドキュメント
IFilterGraph2 インターフェースは、フィルターグラフを構築するためのメソッドを含む IFilterGraph および IGraphBuilder インターフェースを拡張します。このインターフェースは Filter Graph Manager によって実装されます。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
AddSourceFilterForMoniker メソッドは、IMoniker ポインターからソースフィルターを作成し、そのフィルターをグラフに追加します。
| pMoniker | IMoniker* | in | IMoniker インターフェースへのポインター。 |
| pCtx | IBindCtx* | in | IBindCtx バインドコンテキストインターフェースへのポインター。 |
| lpcwstrFilterName | LPWSTR | in | フィルターの名前。 |
| ppFilter | IBaseFilter** | out | ソースフィルターの IBaseFilter ポインターを受け取ります。呼び出し側はこのインターフェースを解放する必要があります。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| リターン コード | 説明 |
|---|---|
| 成功しました。 | |
| 成功しましたが、指定された名前が重複していたため、Filter Graph Manager が名前を変更しました。 | |
| 失敗しました。 | |
| メモリが不足しています。 | |
| 重複した名前のフィルターの追加に失敗しました。 | |
| ソースフィルターを読み込めませんでした。 | |
| このファイルのメディアタイプは認識されません。 |
解説(Remarks)
Filter Graph Manager は、フィルターがグラフから削除されるか、Filter Graph Manager が解放されるまで、そのフィルターへの参照カウントを保持します。
例
| C++ |
|---|
IBaseFilter *pSource = NULL; IMoniker *pMoniker = NULL; |
ReconnectEx メソッドは、既存のピン接続を切断し、指定したメディアタイプを使用して同じピンに再接続します。
| ppin | IPin* | in | 切断して再接続するピンへのポインター。 |
| pmt | AM_MEDIA_TYPE* | inoptional | 再接続に使用するメディアタイプへのポインター。既存のメディアタイプを使用するには NULL を指定します。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| リターン コード | 説明 |
|---|---|
| 成功しました。 | |
| ピンは接続されていませんでした。エラーではありません。 | |
| 失敗しました。 | |
| NULL ポインター引数です。 | |
| フィルターが停止しておらず、かつ実行状態での再接続をサポートしていません。 |
解説(Remarks)
フィルターは、ピン接続を再ネゴシエートするためにこのメソッドを呼び出すことができます。このメソッドは別のスレッドで実行されます。このメソッドを呼び出す前に、相手側のピンに対して IPin::QueryAccept を呼び出し、再接続の試行が成功することを確認してください。QueryAccept が S_OK を返さない限り、このメソッドを呼び出さないでください。そうしないと、再接続は非同期に実行されるため、ReconnectEx メソッド自体が成功しても再接続が失敗し、フィルターグラフが不整合な状態のまま残る可能性があります。
このメソッドは、メディアタイプを指定できる点で IFilterGraph::Reconnect メソッドを改良したものです。これにより、再接続が成功する可能性が高まります。
RenderEx メソッドは、既存のレンダラーのみを使用するオプションを指定して、出力ピンをレンダリングします。
| pPinOut | IPin* | in | 出力ピンの IPin インターフェースへのポインター。 |
| dwFlags | DWORD | in | ピンをどのようにレンダリングするかを指定するフラグ。値が AM_RENDEREX_RENDERTOEXISTINGRENDERERS の場合、メソッドはフィルターグラフ内に既に存在するレンダラーの使用を試みます。新しいレンダラーをグラフに追加することはありません。(必要に応じて中間の変換フィルターは追加されます。)メソッドが成功するには、グラフに適切なレンダラーが含まれ、それらのレンダラーに未接続の入力ピンがなければなりません。値が 0 の場合、メソッドは IGraphBuilder::Render メソッドと同一の動作をします。 |
| pvContext | DWORD* | optional | 予約済み。NULL でなければなりません。 |
戻り値
HRESULT 値を返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IFilterGraph2 "{36B73882-C2C8-11CF-8B46-00805F6CEF60}" #usecom global IFilterGraph2 IID_IFilterGraph2 "{}" #comfunc global IFilterGraph2_AddSourceFilterForMoniker 18 sptr,sptr,wstr,sptr #comfunc global IFilterGraph2_ReconnectEx 19 sptr,var #comfunc global IFilterGraph2_RenderEx 20 sptr,int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IFilterGraph2 "{36B73882-C2C8-11CF-8B46-00805F6CEF60}" #usecom global IFilterGraph2 IID_IFilterGraph2 "{}" #comfunc global IFilterGraph2_AddSourceFilterForMoniker 18 sptr,sptr,wstr,sptr #comfunc global IFilterGraph2_ReconnectEx 19 sptr,sptr #comfunc global IFilterGraph2_RenderEx 20 sptr,int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。