다음을 통해 공유


샘플 수신 및 제공

[이 페이지와 연결된 기능인 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 를 호출합니다. 필터는 여러 핀에 샘플을 제공할 수 있습니다.