次の方法で共有


IAsyncReader::Request

Request メソッドは、非同期データ要求をキューに入れる。

構文

  HRESULT Request(
  IMediaSample *pSample,
  DWORD_PTR dwUser
);

パラメータ

pSample

呼び出し元が提供するメディア サンプルの IMediaSample インターフェイスへのポインタ。

dwUser

[in] 要求が完了したときに返される任意の値を指定する。

戻り値

HRESULT 値を返す。可能な値は次のとおりである。

戻りコード 説明
S_OK 成功。
VFW_E_BADALIGN バッファは正しくアラインメントされていない。
VFW_E_SAMPLE_TIME_NOT_SET サンプルにタイム スタンプが設定されていなかった。
VFW_E_WRONG_STATE ピンがフラッシュしている。
HRESULT_FROM_WIN32(ERROR_HANDLE_EOF) 要求された開始位置はファイルの末尾を超えている。
E_OUTOFMEMORY メモリ不足。

注意

このメソッドを呼び出す前に、ピンのアロケータからメディア サンプルを取得すること。要求しているバイト オフセット (最初と最後のバイトを含めて 10,000,000 を掛けた値) でサンプルにタイム スタンプを設定する。バイト オフセットは、ストリームの開始からの相対値である。

開始位置と停止位置は、ピンが接続されたときに決められたアラインメントと一致していること。一致しない場合は、メソッドは VFW_E_BADALIGN を返す。合意したアラインメントがストリームの実際のアラインメントよりも粗いときは、停止位置は実際の時間幅を超える場合がある。その場合、メソッドは停止位置を実際のアラインメントに丸める。

技術的には COM ルール違反だが、呼び出し元は、未処理の参照カウントをサンプルに残す必要がある。Request メソッドは、AddRef または Release を呼び出さないので、サンプルをアクティブに保持しておくためには、参照カウントが必要である。

要求が完了する前に、呼び出し元へ制御が戻される。要求を待機するには、IAsyncReader::WaitForNext メソッドを呼び出すこと。要求が未処理のときは、元のメディア サンプルを再利用してはならない。WaitForNext メソッドは、元のサンプルへのポインタを返す。要求が成功すると、サンプルには要求されたデータが含まれる。WaitForNext メソッドも、dwUser 引数で指定された値を返す。呼び出し元は、この値を使ってサンプルを識別できる。

サンプル コード

以下の例は、入力ピンが要求をキューに入れるために使えるヘルパー関数を示したものである。

CMyPin::QueueSample(long cbFirst, long cbLast, DWORD dwuser)
{
    IMediaSample* pSample;
    HRESULT hr = m_pAlloc->GetBuffer(&pSample, NULL, NULL, 0);
    if (FAILED(hr)) { return hr; }

    LONGLONG tStart = cbFirst * 10000000, tStop = cbLast * 10000000;
    pSample->SetTime(&tCurrent, &tStopThis);
    hr = m_pReader->Request(pSample, dwuser);
    if (FAILED(hr))
    {
        pSample->Release();
    }
    return hr;
}

参照