ストリーム終了通知
ソース フィルタがデータの送信を完了すると、ダウンストリームの入力ピンの IPin::EndOfStream メソッドを呼び出す。ダウンストリーム フィルタはこの呼び出しを次のフィルタに伝達し、以下同様に処理が行われる。EndOfStream 呼び出しがレンダラに達すると、レンダラはフィルタ グラフ マネージャに EC_COMPLETE イベントを送信する。レンダラに複数の入力ピンがある場合、すべての入力ピンがストリーム終了通知を受信した後、レンダラは EC_COMPLETE を送信する。
フィルタは、IMemInputPin::Receive などの他のストリーミング呼び出しと共に EndOfStream 呼び出しを継続して処理する必要がある。(言い換えれば、ダウンストリーム フィルタは常に正しい順序で呼び出しを受信する必要がある。)
場合によっては、ソース フィルタより前にダウンストリーム フィルタがストリーム終了を検出する。(たとえば、ダウンストリーム フィルタはストリームを解析することがある。)その場合、ダウンストリーム フィルタはストリーム終了通知を送信できる。この場合、グラフが停止するかフラッシュするまで、IMemInputPin::Receive から S_FALSE を返す必要がある。戻り値 S_FALSE は、ソース フィルタにデータ送信の停止を知らせる。
EC_COMPLETE のデフォルト処理
デフォルトでは、フィルタ グラフ マネージャはすべての EC_COMPLETE イベントをアプリケーションには転送しない。代わりに、すべてのストリームが EC_COMPLETE を通知するまで待機した後で、EC_COMPLETE イベントを 1 つ送信する。したがって、すべてのストリームが完了した後にアプリケーションはイベントを受信する。
ストリームの数を調べるため、フィルタ グラフ マネージャはシークをサポートし (IMediaSeeking または IMediaPosition を使用)、"レンダリングされた" 入力ピンを持つフィルタを数える。レンダリングされた入力ピンは対応する出力を持たない入力ピンとして定義される。フィルタ グラフ マネージャは、次のどちらか 1 つの方法を使い、ピンがレンダリングされているかどうかを調べる。
- ピンの IPin::QueryInternalConnections メソッドは nPin パラメータでゼロを返す。
- フィルタは IAMFilterMiscFlags インターフェイスを公開し、AM_FILTER_MISC_FLAGS_IS_RENDERER フラグを返す。
プル モードのストリーム終了通知
IAsyncReader 接続で、ソース フィルタはストリーム終了通知を送信しない。代わりに、ダウンストリーム フィルタ (通常はパーサー フィルタ) が行う。パーサーはダウンロード方向に EndOfStream 呼び出しを送信する。アップストリームのソース フィルタには送信しない。
参照