フラッシュ
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
フィルター グラフの実行中は、任意の量のデータをグラフ内で移動できます。 その一部はキューに入り、配信を待機している可能性があります。 フィルター グラフでは、この保留中のデータをできるだけ早く削除し、新しいデータに置き換える必要がある場合があります。 たとえば、seek コマンドの後、ソース フィルターはソース内の新しい位置からサンプルを生成します。 待機時間を最小限に抑えるために、ダウンストリーム フィルターでは、seek コマンドの前に作成されたすべてのサンプルを破棄する必要があります。 サンプルを破棄するプロセスは 、フラッシュと呼ばれます。 これにより、イベントによって通常のデータ フローが変更されたときに、グラフの応答性が向上します。
フラッシュは、プッシュ モデルとはプル モデルによって若干異なる方法で処理されます。 この記事では、まずプッシュ モデルについて説明します。次に、プル モデルの違いについて説明します。
フラッシュは 2 つの段階で行われます。
- 最初に、ソース フィルターはダウンストリーム フィルターの入力ピンで IPin::BeginFlush を呼び出します。 ダウンストリーム フィルターは、アップストリームからのサンプルの拒否を開始します。 また、保持しているサンプルも破棄し、 BeginFlush 呼び出しをダウンストリームの次のフィルターに送信します。
- ソース フィルターは、新しいデータを送信する準備ができたら、入力ピンで IPin::EndFlush を呼び出します。 これにより、新しいサンプルを受信できることをダウンストリーム フィルターに通知します。 ダウンストリーム フィルターは、 EndFlush 呼び出しを次のフィルターに送信します。
BeginFlush メソッドでは、入力ピンによって次の処理が行われます。
- ダウンストリーム入力ピンで BeginFlush を呼び出します。
- Receive や EndOfStream など、データをストリームするそれ以上の呼び出しを拒否します。
- フィルターのアロケーターからのサンプルの待機中にブロックされているアップストリーム フィルターのブロックを解除します。 一部のフィルターは、この目的のためにアロケーターをコミット解除します。
- ストリーミングをブロックする待機から終了します。 たとえば、レンダラー フィルターは一時停止するとブロックされます。 また、正しいストリーム時間にサンプルのレンダリングを待機しているときにもブロックされます。 アップストリームにキューに登録されたサンプルを配信および拒否できるように、フィルターのブロックを解除する必要があります。 この手順により、すべてのアップストリーム フィルターが最終的にブロック解除されます。
EndFlush メソッドでは、入力ピンによって次の処理が行われます。
- キューに登録されているすべてのサンプルが破棄されるのを待ちます。
- バッファー内のデータを解放します。 この手順は、 BeginFlush メソッドで実行できる場合があります。 ただし、 BeginFlush はストリーミング スレッドと同期されません。 フィルターは、 BeginFlush の呼び出しと EndFlush の呼び出しの間に、それ以上のデータを処理またはバッファーすることはできません。
- 保留中のEC_COMPLETE通知をクリアします。
- EndFlush ダウンストリームを呼び出します。
この時点で、フィルターはもう一度サンプルを受け入れます。 すべてのサンプルは、フラッシュよりも最新であることが保証されます。
プル モデルでは、パーサー フィルターはソース フィルターではなくフラッシュを開始します。 ダウンストリーム フィルターで IPin::BeginFlush と IPin::EndFlush を呼び出すだけでなく、ソース フィルターの出力ピンで IAsyncReader::BeginFlush と IAsyncReader::EndFlush も呼び出します。 ソース フィルターに保留中の読み取り要求がある場合は、それらを破棄します。
関連トピック