送信のサンプル
ここでは、フィルタがサンプルを送信する方法について説明する。IMemInputPin メソッドを使ったプッシュ モデルと IAsyncReader を使ったプル モデルについて説明する。
プッシュ モデル : サンプルの送信
出力ピンがサンプルを送信するときは、IMemInputPin::Receive メソッドを呼び出すか、機能は同じだがサンプルの配列を送信する IMemInputPin::ReceiveMultiple メソッドを呼び出す。入力ピンは Receive (または ReceiveMultiple) 内で動作を停止できる。ピンが動作を停止する場合があるが、その IMemInputPin::ReceiveCanBlock メソッドは S_OK を返す。ピンが動作を停止しないと保証できる場合、ReceiveCanBlock は S_FALSE を返す。戻り値 S_OK は、Receive の動作が常に停止することを意味するのではなく、停止する可能性があることを意味する。
Receive は動作を停止してリソースが利用できるようになるまで待機できるが、アップストリーム フィルタからさらにデータが届くまで動作を停止して "待機しない" こと。そのようにすると、アップストリーム フィルタはダウンストリーム フィルタによってサンプルが解放されるまで待機し、デッドロックが発生することがある。ダウンストリーム フィルタはアップストリーム フィルタの処理を待つため、サンプルは決して解放されないためである。しかし、フィルタに複数の入力ピンがある場合、1 つのピンは別のピンがデータを受信するまで待機できる。たとえば、AVI Mux フィルタでは、オーディオとビデオのデータをインターリーブするためにこの処理を行う。
ピンは、次のようなさまざまな理由でサンプルを拒否することがある。
- ピンがフラッシュしている (「フラッシュ」を参照すること)。
- ピンが接続されていない。
- フィルタが停止している。
- 他のエラーが発生した。
1 番目の場合、Receive メソッドは S_FALSE を返し、それ以外の場合には、ある失敗コードを返す。戻り値が S_OK 以外の場合、アップストリーム フィルタはサンプルの送信を停止する。
最初の 3 つの場合は、フィルタがサンプルの受信に適さない状態にあったという意味で、"予期していた" 失敗と見なせる。予期しない失敗が起きると、ピンが受信状態にあるにもかかわらず、ピンはサンプルを拒否する。この種のエラーが発生した場合、ピンはダウンストリーム方向にストリーム終了通知を送信し、フィルタ グラフ マネージャに EC_ERRORABORT イベントを送信する必要がある。
DirectShow 基底クラスで、CBaseInputPin::CheckStreaming メソッドは、フラッシュ、停止などの一般的な失敗があるかどうかを調べる。派生クラスでは、フィルタに固有な失敗の有無を調べる必要がある。エラーの場合、CBaseInputPin::Receive メソッドはストリーム終了通知と EC_ERRORABORT イベントを送信する。
プル モデル : サンプルの要求
IAsyncReader インターフェイスで、入力ピンは次のメソッドの 1 つを呼び出して、出力ピンからサンプルを要求する。
Request メソッドは非同期的である。入力ピンは IAsyncReader::WaitForNext を呼び出して、要求が完了するまで待機する。他の 2 つのメソッドは同期的である。
参照