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
ピンが停止しています。

解説

アップストリーム出力ピンは、このメソッドを呼び出して、入力ピンにサンプルを配信します。 入力ピンは、次のいずれかの操作を行う必要があります。

  • 戻る前にサンプルを処理します。
  • ワーカー スレッドでサンプルを返して処理します。
  • サンプルを拒否します。

ピンでワーカー スレッドを使用してサンプルを処理する場合は、このメソッド内のサンプルに参照カウントを追加します。 メソッドが戻った後、アップストリームピンはサンプルを解放します。 サンプルの参照カウントが 0 に達すると、サンプルは再使用のためにアロケーターに戻ります。

このメソッドは同期的であり、ブロックできます。 メソッドがブロックされる可能性がある場合、ピンの 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 以外の値を返す場合、形式は変更されています。

基底クラスでは、このメソッドはサンプルを処理しません。 派生クラスは、このメソッドをオーバーライドして処理を実行する必要があります。 (これに伴う内容は、フィルターによって完全に異なります)。派生クラスは、基底クラス メソッドを呼び出して、前に説明したエラーを確認する必要があります。

要件

要件
ヘッダー
Amfilter.h (ストリーム.h を含む)
ライブラリ
Strmbase.lib (リテール ビルド);
Strmbasd.lib (デバッグ ビルド)

関連項目

CBaseInputPin クラス