Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
[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.