次の方法で共有


サンプルの受信と配信

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

次の擬似コードは、 IMemInput::Receive メソッドを実装する方法を示しています。

HRESULT CMyInputPin::Receive(IMediaSample *pSample)
{
    CAutoLock cObjectLock(&m_csReceive);

    // Perhaps the filter needs to wait on something.
    WaitForSingleObject(m_hSomeEventThatReceiveNeedsToWaitOn, INFINITE);

    // Before using resources, make sure it is safe to proceed. Do not
    // continue if the base-class method returns anything besides S_OK.
    hr = CBaseInputPin::Receive(pSample);
    if (hr != S_OK) 
    {
        return hr;
    }

    /* It is safe to use resources allocated in Active and Pause. */

    // Deliver sample(s), via your output pin(s).
    for (each output pin)
        pOutputPin->Deliver(pSample);

    return hr;
}

Receive メソッドは、フィルター ロックではなくストリーミング ロックを保持します。 フィルターは、 WaitForSingleObject の呼び出しによってここに示されているデータを処理する前に、何らかのイベントを待機する必要がある場合があります。 すべてのフィルターでこれを行う必要はありません。 CBaseInputPin::Receive メソッドは、一般的なストリーミング条件をいくつか検証します。 フィルターが停止した場合はVFW_E_WRONG_STATEを返し、フィルターがフラッシュされている場合はS_FALSEします。 S_OK以外のリターン コードは 、Receive メソッドがサンプルを処理するのではなく、直ちにを返す必要があることを示します。

サンプルが処理されたら、 CBaseOutputPin::D eliver を呼び出してダウンストリーム フィルターに渡します。 このヘルパー メソッドは、ダウンストリーム入力ピンで IMemInputPin::Receive を呼び出します。 フィルターは、複数のピンにサンプルを配信する場合があります。