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.]
Gdy wykres filtru jest uruchomiony, dowolne ilości danych mogą być przenoszone przez graf. Niektóre z nich mogą znajdować się w kolejkach, czekając na dostarczenie. Czasami wykres filtru musi jak najszybciej usunąć te oczekujące dane i zastąpić je nowymi danymi. Na przykład po poleceniu wyszukiwania filtr źródłowy generuje przykłady z nowej pozycji w źródle. Aby zminimalizować opóźnienie, filtry podrzędne powinny odrzucać wszystkie próbki, które zostały utworzone przed poleceniem wyszukiwania. Proces odrzucania próbek nazywa się spłukiwanie. Dzięki temu wykres może być bardziej dynamiczny, gdy zdarzenia zmieniają normalny przepływ danych.
Opróżnianie jest obsługiwane nieco inaczej przez model ściągania niż model wypychania. Ten artykuł rozpoczyna się od opisania modelu wypychania; następnie opisuje różnice w modelu ściągania.
Opróżnianie odbywa się na dwóch etapach.
- Najpierw filtr źródłowy wywołuje IPin::BeginFlush na złączu wejściowym filtru podrzędnego. Filtr podrzędny rozpoczyna odrzucanie próbek z nadrzędnego strumienia. Odrzuca również wszystkie przechowywane próbki i wysyła BeginFlush wywołanie dalej do następnego filtra.
- Gdy filtr źródłowy jest gotowy do wysyłania nowych danych, wywołuje IPin::EndFlush na źródle wejściowym. Sygnalizuje to, że filtr podrzędny może odbierać nowe próbki. Filtr podrzędny wysyła wywołanie EndFlush do następnego filtru.
W metodzie BeginFlush pin wejściowy wykonuje następujące czynności:
- Wywołuje BeginFlush na podrzędnych wyprowadzeniach wejściowych.
- Odrzuca wszelkie dalsze wywołania dotyczące strumienia danych, w tym Receive i EndOfStream.
- Odblokuje wszystkie filtry nadrzędne, które są blokowane, czekając na próbkę z alokatora filtru. Niektóre filtry zwalniają swoje alokatory do tego celu.
- Wychodzi z jakiegokolwiek czekania, które blokuje przesyłanie strumieniowe. Na przykład filtry renderera blokują się po wstrzymaniu. Blokują również czas oczekiwania na renderowanie próbki w odpowiednim czasie strumienia. Filtr musi zostać odblokowany, aby próbki w kolejce mogły być dostarczane lub odrzucane. Ten krok gwarantuje, że wszystkie filtry nadrzędne w końcu się odblokują.
W metodzie EndFlush wyprowadzenie wejściowe wykonuje następujące czynności:
- Czeka na skasowanie wszystkich próbek w kolejce.
- Zwalnia wszystkie buforowane dane. Ten krok może być czasami wykonywany w metodzie BeginFlush. Jednak BeginFlush nie jest synchronizowana z wątkiem przesyłania strumieniowego. Filtr nie może przetwarzać ani buforować danych między wywołaniem BeginFlush a wywołaniem EndFlush.
- Czyści wszystkie oczekujące powiadomienia EC_COMPLETE.
- Wywołuje EndFlush w dół strumienia.
Na tym etapie filtr może ponownie akceptować przykłady. Wszystkie próbki mają gwarancję, że są nowsze niż opróżnianie.
W modelu ściągania filtr analizatora inicjuje opróżnianie, a nie filtr źródłowy. Nie tylko wywołuje IPin::BeginFlush i IPin::EndFlush w filtrze podrzędnym, wywołuje również IAsyncReader::BeginFlush i IAsyncReader::EndFlush w danych wyjściowych wyprowadzenia filtru źródłowego. Jeśli filtr źródłowy ma oczekujące żądania odczytu, odrzuci je.
Tematy pokrewne