Udostępnij przez


Łańcuchy filtró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.]

Łańcuch filtrów to sekwencja filtrów spełniających następujące warunki:

  • Każdy filtr w łańcuchu ma co najwyżej jeden podłączony numer PIN wejściowy i jeden podłączony wyprowadzenia wyjściowego.
  • Istnieje możliwość przechodzenia przez każdy filtr w łańcuchu bez przechodzenia filtrów poza łańcuchem.

Na przykład na poniższym diagramie filtry A–B, C–D i F–G–H to łańcuchy filtrów. Każdy podchyń w F–G–H (F–G i G–H) jest również łańcuchem filtrów. Łańcuch filtrów może składać się z jednego filtru, więc filtry A, B, C, D, F, G i H są również odrębnymi łańcuchami filtrów. Filtr E ma dwa połączenia wejściowe, więc każda sekwencja filtrów zawierających filtr E nie jest łańcuchem filtrów.

łańcuch filtrów (na przykład 1)

Interfejs IFilterChain zapewnia następujące metody kontrolowania łańcuchów filtrów:

Etykieta Wartość
IFilterChain::StartChain Uruchamia łańcuch.
IFilterChain::StopChain Zatrzymuje łańcuch.
IFilterChain::P auseChain Wstrzymuje łańcuch.
IFilterChain::RemoveChain Usuwa łańcuch z grafu.

 

Nie ma określonej metody dodawania łańcucha. Aby dodać łańcuch, wstaw nowe filtry przy użyciu metody IFilterGraph::AddFilter. Następnie połącz filtry, wywołując metodę IGraphBuilder::Connect, IGraphBuilder::Renderlub podobne metody.

Po uruchomieniu grafu łańcuch filtrów może przełączać się między uruchomionym i zatrzymanym. Po wstrzymaniu grafu można przełączać się między wstrzymane i zatrzymane. Są to jedyne przejścia stanu możliwe z łańcuchami filtrów.

Wytyczne dotyczące łańcucha filtrów

W przypadku używania metod IFilterChain należy upewnić się, że filtry na grafie mogą obsługiwać operacje tworzenia łańcuchów filtrów. W przeciwnym razie może spowodować zakleszczenia lub błędy grafu. Filtry połączone z łańcuchem muszą działać poprawnie po zmianie stanu łańcucha.

Najlepszym sposobem korzystania z IFilterChain jest zestaw filtrów przeznaczonych specjalnie do tworzenia łańcuchów. Skorzystaj z poniższych wskazówek, aby upewnić się, że filtry są bezpieczne dla operacji łańcucha filtrów. Te punkty odnoszą się do poniższego diagramu.

łańcuch filtrów (na przykład 2)

  • Przed zmianą stanu łańcucha filtrów należy ukończyć wszystkie wywołania przetwarzania danych na granicy łańcucha filtrów. Ta reguła dotyczy metod IMemInputPin::Receive, IPin::NewSegmenti IPin::EndOfStream. Filtry w łańcuchu muszą zwracać z wywołań do tych metod wykonanych przez filtry poza łańcuchem; filtry poza łańcuchem muszą być zwracane z wywołań wykonanych przez filtry w łańcuchu.

Na przykład na poprzednim diagramie filtr B musi wykonać wszystkie wywołania przetwarzania danych z filtru A, a filtr E musi zakończyć wszystkie wywołania z filtru D. Jeśli pinezki uwidaczniają interfejsy IPinFlowControl i IPinConnection, możesz wypchnąć dane za pośrednictwem grafu, wywołując IPinFlowControl::Block i IGraphConfig::P ushThroughData metod, zgodnie z opisem w dynamicznego ponownego łączenia. Filtry mogą również obsługiwać metody prywatne do wypychania danych.

  • Filtry nadrzędne muszą oczekiwać zmiany stanu łańcucha. Na przykład na poprzednim diagramie załóżmy, że łańcuch został zatrzymany, ale przefiltruj wywołania IMemInputPin::Receive. Wywołanie kończy się niepowodzeniem i odpowiedzią filtru A jest zatrzymanie przesyłania strumieniowego. Gdy aplikacja ponownie uruchomi łańcuch, nie ma żadnego wpływu, ponieważ filtr A nie przesyła już danych przesyłanych strumieniowo.
  • Filtry podrzędne muszą również oczekiwać zmiany stanu łańcucha. Jeśli nie, filtr podrzędny może blokować, czekając na próbki, które nigdy nie docierają. Na przykład filtry multiplekserów (MUX) często wymagają danych ze wszystkich numerów PIN wejściowych. Zatrzymanie przepływu danych z jednego wyprowadzenia wejściowego może uniemożliwić przetwarzanie innych strumieni. Może to spowodować zakleszczenie grafu.
  • Każde połączenie pinezki z filtru poza łańcuchem do filtru w łańcuchu powinno mieć własny alokator, który nie jest współużytkowany przez inne połączenia. Gdy łańcuch zmieni stan lub zostanie usunięty z grafu, alokator może zostać anulowany. Jeśli inne połączenia używały tego samego alokatora, nie mogą już przetwarzać próbek.
  • Nie usuwaj łańcucha, chyba że filtry połączone z łańcuchem obsługują rozłączenie dynamiczne. Zazwyczaj połączone filtry będą obsługiwać interfejsy IPinConnection lub interfejs IPinFlowControl, ale mogą obsługiwać interfejsy prywatne.

tworzenie dynamicznego grafu