ストリームの終了通知
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
ソース フィルターは、データの送信が完了すると、ダウンストリーム入力ピンで IPin::EndOfStream メソッドを呼び出します。 ダウンストリーム フィルターは、呼び出しを次のフィルターに伝達します。 EndOfStream 呼び出しがレンダラーに到達すると、レンダラーはフィルター グラフ マネージャーにEC_COMPLETE イベントを送信します。 レンダラーに複数の入力ピンがある場合、すべての入力ピンがストリームの終了通知を受信した後、EC_COMPLETE イベントが配信されます。
フィルターは、IMemInputPin::Receive などの他のストリーミング呼び出しで EndOfStream 呼び出しをシリアル化する必要があります。 (つまり、ダウンストリーム フィルターは常に正しい順序で呼び出しを受信する必要があります)。
場合によっては、ダウンストリーム フィルターがソース フィルターの前にストリームの末尾を検出する場合があります。 (たとえば、ダウンストリーム フィルターがストリームを解析している可能性があります)。その場合、ダウンストリーム フィルターはストリームの終了通知を送信できます。その場合は、グラフが停止またはフラッシュされるまで IMemInputPin::Receive からS_FALSEを返す必要があります。 S_FALSE戻り値は、データの送信を停止するようにソース フィルターに通知します。
EC_COMPLETEの既定の処理
既定では、Filter Graph Manager では、すべてのEC_COMPLETE イベントがアプリケーションに転送されるわけではありません。 代わりに、すべてのストリームがEC_COMPLETE通知されるまで待機し、1 つのEC_COMPLETE イベントを送信します。 したがって、アプリケーションは、すべてのストリームが完了した後にイベントを受け取ります。
ストリームの数を決定するために、Filter Graph Manager は、シークをサポートするフィルターの数 ( IMediaSeeking または IMediaPosition を使用) をカウントし、 レンダリングされた 入力ピンを持ちます。これは、対応する出力がない入力ピンとして定義されます。 フィルター グラフ マネージャーは、次の 2 つの方法のいずれかでピンをレンダリングするかどうかを決定します。
- ピンの IPin::QueryInternalConnections メソッドは 、nPin パラメーターで 0 を返します。
- このフィルターは IAMFilterMiscFlags インターフェイスを 公開し、AM_FILTER_MISC_FLAGS_IS_RENDERER フラグを返します。
プル モードでのストリームの終了通知
IAsyncReader 接続では、ソース フィルターはストリームの終了通知を送信しません。 Instread では、これはダウンストリーム フィルター (通常はパーサー フィルター) によって行われます。 パーサーは EndOfStream 呼び出しをダウンストリームに送信します。 ソース フィルターにアップストリームを送信しません。
関連トピック