샘플 수신 및 제공
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 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 를 호출합니다. 필터는 여러 핀에 샘플을 제공할 수 있습니다.