フィルター チェーン
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
フィルター チェーンは、次の条件を満たすフィルターのシーケンスです。
- チェーン内の各フィルタには、最大で 1 つの接続入力ピンと 1 つの接続された出力ピンがあります。
- チェーンの外側にあるフィルターを走査することなく、チェーン内のすべてのフィルターを走査できます。
たとえば、次の図では、フィルター A–B、C–D、F–G–H はフィルター チェーンです。 F–G–H (F–G および G–H) の各サブチェーンもフィルター チェーンです。 フィルター チェーンは 1 つのフィルターで構成できるため、フィルター A、B、C、D、F、G、H も個別のフィルター チェーンです。 フィルター E には 2 つの入力接続があるため、フィルター E を含むフィルターのシーケンスはフィルター チェーンではありません。
IFilterChain インターフェイスには、フィルター チェーンを制御するための次のメソッドが用意されています。
Label | 値 |
---|---|
IFilterChain::StartChain | チェーンを開始します。 |
IFilterChain::StopChain | チェーンを停止します。 |
IFilterChain::P auseChain | チェーンを一時停止します。 |
IFilterChain::RemoveChain | グラフからチェーンを削除します。 |
チェーンを追加するための特定の方法はありません。 チェーンを追加するには、 IFilterGraph::AddFilter メソッドを使用して新しいフィルターを挿入します。 次に、IGraphBuilder::Connect、IGraphBuilder::Render、または同様のメソッドを呼び出してフィルターを接続します。
グラフが実行中の場合、フィルター チェーンは実行中と停止の間で切り替えることができます。 グラフを一時停止すると、一時停止と停止を切り替えることができます。 これらは、フィルター チェーンで可能な唯一の状態遷移です。
フィルター チェーンのガイドライン
IFilterChain メソッドを使用する場合は、グラフ内のフィルターがフィルター チェーン操作をサポートできることを確認することが重要です。 そうしないと、デッドロックやグラフ エラーが発生する可能性があります。 チェーンに接続されているフィルターは、チェーンの状態が変更された後に正しく機能する必要があります。
IFilterChain を使用する最善の方法は、チェーン専用に設計したフィルターのセットです。 フィルターチェーン操作でフィルターが安全であることを確認するには、次のガイドラインを使用します。 これらの点は、次の図を参照しています。
- フィルター チェーンの状態が変更される前に、フィルター チェーンの境界にあるすべてのデータ処理呼び出しを完了する必要があります。 この規則は、 IMemInputPin::Receive、 IPin::NewSegment、 および IPin::EndOfStream の各メソッドに適用されます。 チェーン内のフィルターは、チェーン外のフィルターによって行われたこれらのメソッドの呼び出しから返される必要があります。および チェーン外のフィルターは、チェーン内のフィルターによって行われた呼び出しからを返す必要があります。
たとえば、前の図では、フィルター B はフィルター A からのデータ処理呼び出しを完了し、フィルター E はフィルター D からの呼び出しを完了する必要があります。ピンで IPinFlowControl インターフェイスと IPinConnection インターフェイスが公開されている場合は、「動的再接続」で説明されているように、IPinFlowControl::Block メソッドと IGraphConfig::P ushThroughData メソッドを呼び出すことで、グラフを介してデータをプッシュできます。 フィルターでは、データをプッシュするためのプライベート メソッドもサポートされている場合があります。
- アップストリーム フィルターでは、チェーンの状態が変更される必要があります。 たとえば、前の図では、チェーンが停止しているが、フィルター A が IMemInputPin::Receive を呼び出したとします。 呼び出しは失敗し、フィルター A の応答はストリーミングを停止することです。 アプリケーションがチェーンを再起動しても、フィルター A はデータをストリーミングしなくなったため、影響はありません。
- ダウンストリーム フィルターでは、チェーンの状態が変化することも想定する必要があります。 そうでない場合、ダウンストリーム フィルターは、到着しないサンプルを待機している間にブロックする可能性があります。 たとえば、マルチプレクサー (MUX) フィルターでは、多くの場合、すべての入力ピンからのデータが必要です。 1 つの入力ピンからのデータ フローを停止すると、他のストリームの処理がブロックされる可能性があります。 これにより、グラフがデッドロックする可能性があります。
- チェーン外のフィルターからチェーン内のフィルターへの各ピン接続には、他の接続では共有されない独自のアロケーターが必要です。 チェーンの状態が変わるか、グラフから削除されると、アロケーターがコミット解除される可能性があります。 他の接続で同じアロケーターを使用していた場合は、サンプルを処理できなくなります。
- チェーンに接続されているフィルターが動的切断をサポートしない限り、チェーンを削除しないでください。 通常、接続されたフィルターは IPinConnection または IPinFlowControl インターフェイスをサポートしますが、代わりにプライベート インターフェイスをサポートする場合があります。
関連トピック