サンプルの受信と配信
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/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 を呼び出します。 フィルターは、複数のピンにサンプルを配信する場合があります。