Udostępnij przez


Odbieranie i dostarczanie przykładów

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Poniższy pseudokod pokazuje, jak zaimplementować metodę 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;
}

Metoda Receive przechowuje blokadę przesyłania strumieniowego, a nie blokadę filtru. Filtr może wymagać oczekiwania na pewne zdarzenie, zanim będzie mógł przetworzyć dane, pokazane tutaj przez wywołanie funkcji WaitForSingleObject. Nie każdy filtr będzie musiał to zrobić. Metoda CBaseInputPin::Receive weryfikuje niektóre ogólne warunki przesyłania strumieniowego. Zwraca VFW_E_WRONG_STATE, jeśli filtr jest zatrzymany, S_FALSE, jeśli filtr jest opróżniany, i tak dalej. Każdy kod powrotny inny niż S_OK wskazuje, że metoda Receive powinna zwracać natychmiast i nie przetwarzać próbki.

Po przetworzeniu próbki należy dostarczyć ją do filtru docelowego, wywołując CBaseOutputPin::Deliver. Ta metoda pomocnicza wywołuje IMemInputPin::Receive na niższym pinie wejściowym. Filtr może dostarczać próbki do kilku pinów.