次の方法で共有


送信のサンプル

ここでは、フィルタがサンプルを送信する方法について説明する。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 つのメソッドは同期的である。

参照