IFilterGraph
COM公式ドキュメント
IFilterGraph インターフェイスは、フィルターグラフを構築するためのメソッドを提供します。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
AddFilter メソッドは、グラフにフィルターを追加します。
| pFilter | IBaseFilter* | in | 追加するフィルターの IBaseFilter インターフェイスへのポインター。 |
| pName | LPWSTR | in | フィルターの名前を含むワイド文字列へのポインター。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| 重複した名前のフィルターを正常に追加しました。 | |
| 失敗。 | |
| メモリが不足しています。 | |
| NULL ポインター引数。 | |
| このフィルターの使用はソフトウェアキーによって制限されています。 | |
| 重複した名前のフィルターの追加に失敗しました。 |
解説(Remarks)
フィルターの名前は NULL にすることができ、その場合は Filter Graph Manager が名前を生成します。名前が NULL でなく、かつ一意でない場合、このメソッドは新しい一意の名前を生成しようとして名前を変更します。これが成功すると、このメソッドは VFW_S_DUPLICATE_NAME を返します。一意の名前を生成できない場合は、VFW_E_DUPLICATE_NAME を返します。
AddFilter は、フィルターが追加されたことを通知するために、フィルターの IBaseFilter::JoinFilterGraph メソッドを呼び出します。追加したフィルターに属するピンを接続またはレンダリングするために IGraphBuilder::Connect、IFilterGraph::ConnectDirect、または IGraphBuilder::Render メソッドを使用する前に、AddFilter を呼び出す必要があります。
Filter Graph Manager は、フィルターがグラフから削除されるか Filter Graph Manager が解放されるまで、フィルターへの参照カウントを保持します。
RemoveFilter メソッドは、グラフからフィルターを削除します。
| pFilter | IBaseFilter* | in | グラフから削除するフィルターへのポインター。 |
戻り値
解説(Remarks)
Filter Graph Manager は、フィルターの IBaseFilter::JoinFilterGraph メソッドを NULL 引数で呼び出すことにより、フィルターが削除されることを通知します。RemoveFilter を呼び出す前にフィルターのピンを切断する必要はありませんが、フィルターグラフは停止状態にしておく必要があります。フィルターが停止していない場合、RemoveFilter はピンの切断に失敗し、その結果グラフからのフィルターの削除に失敗することがあります。IGraphConfig::RemoveFilterEx を使用すると、アプリケーションはピンを自動的に切断せずにフィルターを削除できます。これにより、接続された複数のフィルターを新しいグラフへまとめて移動したい場合のパフォーマンスが向上します。
EnumFilters メソッドは、グラフ内のすべてのフィルターの列挙子を提供します。
| ppEnum | IEnumFilters** | out | IEnumFilters インターフェイスへのポインターを受け取ります。このインターフェイスを使用してフィルターを列挙します。呼び出し側はインターフェイスを解放する必要があります。 |
戻り値
次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| 列挙子を作成するためのメモリが不足しています。 | |
| NULL ポインター引数。 |
FindFilterByName メソッドは、特定の名前でフィルターグラフに追加されたフィルターを検索します。
| pName | LPWSTR | in | [in, string] 検索する名前へのポインター。 |
| ppFilter | IBaseFilter** | out | フィルターの IBaseFilter インターフェイスへのポインターを受け取ります。呼び出し側はインターフェイスを解放する必要があります。 |
戻り値
次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| NULL ポインター引数。 | |
| 指定された名前のフィルターが見つかりませんでした。 |
解説(Remarks)
フィルターが見つからない場合、このメソッドは ppFilter パラメーターに NULL ポインターを返します。
返される IBaseFilter インターフェイスには未解放の参照カウントがあります。呼び出し側はインターフェイスを解放する必要があります。
ConnectDirect メソッドは、2 つのピンを(間にフィルターを介さずに)直接接続します。
| ppinOut | IPin* | in | 出力ピンへのポインター。 |
| ppinIn | IPin* | in | 入力ピンへのポインター。 |
| pmt | AM_MEDIA_TYPE* | inoptional | 接続に使用するメディアタイプへのポインター(省略可能。NULL にできます)。 |
戻り値
次のいずれかの値、または IPin::Connect が返すエラー値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| NULL ポインター引数。 | |
| 指定されたピンの一方がグラフ内にありません。 | |
| 入力ピンが出力ピンの上流にあり、循環したグラフになってしまいます。 |
Reconnect メソッドは、ピンを切断してから同じピンに再接続します。
| ppin | IPin* | in | 再接続するピンの IPin インターフェイスへのポインター。 |
戻り値
次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| 失敗。 | |
| NULL ポインター引数。 | |
| ピンが接続されていません。 | |
| フィルターが停止していません。 |
解説(Remarks)
このメソッドは廃止されています。代わりに IFilterGraph2::ReconnectEx メソッドを使用してください。
フィルターは、ピン接続を再ネゴシエートするためにこのメソッドを呼び出すことができます。このメソッドは別のスレッドで実行されます。このメソッドを呼び出す前に、もう一方のピンに対して IPin::QueryAccept を呼び出し、再接続の試行が成功することを確認してください。QueryAccept が S_OK を返さない限り、このメソッドを呼び出さないでください。そうしないと、再接続は非同期に実行されるため、Reconnect メソッド自体は成功しても再接続が失敗し、フィルターグラフが不整合な状態のまま残ることがあります。
Disconnect メソッドは、このピンを切断します。
| ppin | IPin* | in | 切断するピンへのポインター。 |
戻り値
次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| ピンは接続されていませんでした。エラーではありません。 | |
| 失敗。 | |
| NULL ポインター引数。 | |
| フィルターが停止しておらず、実行状態での再接続をサポートしていません。 |
解説(Remarks)
このメソッドは接続を完全には切断しません。接続を完全に切断するには、両端を切断する必要があります。
フィルターをフィルターグラフから完全に削除するには、IFilterGraph::RemoveFilter メソッドを呼び出してください。
SetDefaultSyncSource メソッドは、参照クロックを既定のクロックに設定します。
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| 成功。 | |
| フィルターグラフが停止していません。 |
解説(Remarks)
このメソッドは、既定のアルゴリズムを使用して参照クロックを選択するよう Filter Graph Manager に指示します。使用されるアルゴリズムの詳細については、Reference Clocks を参照してください。
通常、Filter Graph Manager が自動的にクロックを選択するため、このメソッドを呼び出す必要はありません。ただし、IMediaFilter::SetSyncSource を呼び出してクロックを上書きした場合は、SetDefaultSyncSource を使用して既定のクロックに戻すことができます。
フィルターグラフが実行中または一時停止中の場合、このメソッドは失敗します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IFilterGraph "{56A8689F-0AD4-11CE-B03A-0020AF0BA770}" #usecom global IFilterGraph IID_IFilterGraph "{}" #comfunc global IFilterGraph_AddFilter 3 sptr,wstr #comfunc global IFilterGraph_RemoveFilter 4 sptr #comfunc global IFilterGraph_EnumFilters 5 sptr #comfunc global IFilterGraph_FindFilterByName 6 wstr,sptr #comfunc global IFilterGraph_ConnectDirect 7 sptr,sptr,var #comfunc global IFilterGraph_Reconnect 8 sptr #comfunc global IFilterGraph_Disconnect 9 sptr #comfunc global IFilterGraph_SetDefaultSyncSource 10 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IFilterGraph "{56A8689F-0AD4-11CE-B03A-0020AF0BA770}" #usecom global IFilterGraph IID_IFilterGraph "{}" #comfunc global IFilterGraph_AddFilter 3 sptr,wstr #comfunc global IFilterGraph_RemoveFilter 4 sptr #comfunc global IFilterGraph_EnumFilters 5 sptr #comfunc global IFilterGraph_FindFilterByName 6 wstr,sptr #comfunc global IFilterGraph_ConnectDirect 7 sptr,sptr,sptr #comfunc global IFilterGraph_Reconnect 8 sptr #comfunc global IFilterGraph_Disconnect 9 sptr #comfunc global IFilterGraph_SetDefaultSyncSource 10 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。