다음을 통해 공유


샘플 수신 및 제공

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