接收和傳遞範例
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 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 。 篩選準則可能會將範例傳遞至數個針腳。