CBaseInputPin::Receive
Receive メソッドは、ストリーム内の次のメディア サンプルを受け取る。このメソッドは IMemInputPin::Receive メソッドを実装する。
構文
HRESULT Receive(
IMediaSample *pSample
);
パラメータ
pSample
サンプルの IMediaSample インターフェイスへのポインタ。
戻り値
HRESULT 値を返す。次のいずれかの値を返す。
値 | 説明 |
S_OK | 成功。 |
S_FALSE | ピンは現在フラッシュ中である。サンプルは拒否された。 |
E_POINTER | NULL ポインタ引数。 |
VFW_E_INVALIDMEDIATYPE | 無効なメディア タイプ。 |
VFW_E_RUNTIME_ERROR | 実行時エラーが発生した。 |
VFW_E_WRONG_STATE | ピンは停止している。 |
注意
アップストリームの出力ピンはこのメソッドを呼び出し、入力ピンにサンプルを出力する。入力ピンは次のいずれかの処理を実行する必要がある。
- 戻る前にサンプルを処理する。
- 戻り、ワーカー スレッドでサンプルを処理する。
- サンプルを拒否する。
ピンがワーカー スレッドを使ってサンプルを処理する場合は、このメソッド内のサンプルへの参照カウントを追加する。このメソッドが戻った後で、アップストリームのピンはサンプルを解放する。サンプルの参照カウントがゼロになると、サンプルは再使用のためにアロケータに戻される。
このメソッドは同期であり、ブロックできる。メソッドがブロックした場合は、ピンの CBaseInputPin::ReceiveCanBlock メソッドが S_OK を返す。
基底クラスでは、このメソッドは次のステップを実行する。
- CBaseInputPin::CheckStreaming メソッドを呼び出し、ピンがサンプルを今処理できることを検証する。処理できない場合 (たとえばピンが停止中)、メソッドは失敗する。
- サンプル プロパティを取得し、フォーマットが変更されたかどうかをチェックする (次を参照)。
- フォーマットが変更されている場合、メソッドは CBasePin::CheckMediaType メソッドを呼び出し、新しいフォーマットが受け入れ可能かどうかを調べる。
- 新しいフォーマットが受け入れ可能でない場合、メソッドは CBasePin::EndOfStream メソッドを呼び出し、EC_ERRORABORT イベントを送信して、エラーコードを返す。
- エラーがなければ、メソッドは S_OK を返す。
フォーマット変更についてのテストは次のように行う。
- サンプルが IMediaSample2 インターフェイスをサポートする場合は、AM_SAMPLE2_PROPERTIES 構造体の dwSampleFlags メンバをチェックする。AM_SAMPLE_TYPECHANGED フラグが含まれていれば、フォーマットは変更されている。
- サンプルが IMediaSample2 をサポートしていない場合は、IMediaSample::GetMediaType メソッドを呼び出す。メソッドが NULL 値以外を返した場合、フォーマットは変更されている。
基底クラスでは、このメソッドはサンプルを処理しない。派生クラスでこのメソッドをオーバーライドして処理を実行する必要がある。処理の内容はフィルタに完全に依存する。派生クラスで基底クラスのメソッドを呼び出して、前述のエラーの有無をチェックする必要がある。
参照