次の方法で共有


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 を返す。

基底クラスでは、このメソッドは次のステップを実行する。

  1. CBaseInputPin::CheckStreaming メソッドを呼び出し、ピンがサンプルを今処理できることを検証する。処理できない場合 (たとえばピンが停止中)、メソッドは失敗する。
  2. サンプル プロパティを取得し、フォーマットが変更されたかどうかをチェックする (次を参照)。
  3. フォーマットが変更されている場合、メソッドは CBasePin::CheckMediaType メソッドを呼び出し、新しいフォーマットが受け入れ可能かどうかを調べる。
  4. 新しいフォーマットが受け入れ可能でない場合、メソッドは CBasePin::EndOfStream メソッドを呼び出し、EC_ERRORABORT イベントを送信して、エラーコードを返す。
  5. エラーがなければ、メソッドは S_OK を返す。

フォーマット変更についてのテストは次のように行う。

  • サンプルが IMediaSample2 インターフェイスをサポートする場合は、AM_SAMPLE2_PROPERTIES 構造体の dwSampleFlags メンバをチェックする。AM_SAMPLE_TYPECHANGED フラグが含まれていれば、フォーマットは変更されている。
  • サンプルが IMediaSample2 をサポートしていない場合は、IMediaSample::GetMediaType メソッドを呼び出す。メソッドが NULL 値以外を返した場合、フォーマットは変更されている。

基底クラスでは、このメソッドはサンプルを処理しない。派生クラスでこのメソッドをオーバーライドして処理を実行する必要がある。処理の内容はフィルタに完全に依存する。派生クラスで基底クラスのメソッドを呼び出して、前述のエラーの有無をチェックする必要がある。

参照