Freigeben über


Filterketten

[Das dieser Seite zugeordnete Feature DirectShow-ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngineund Audio/Video Capture in Media Foundationersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-, IMFMediaEngine und Audio-/Videoaufnahme in Media Foundation anstelle von DirectShow-verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben werden.]

Eine Filterkette ist eine Abfolge von Filtern, die die folgenden Bedingungen erfüllen:

  • Jeder Filter in der Kette verfügt über höchstens einen angeschlossenen Eingabestift und einen angeschlossenen Ausgabestift.
  • Es ist möglich, jeden Filter in der Kette zu durchlaufen, ohne Filter außerhalb der Kette zu durchlaufen.

Im folgenden Diagramm sind beispielsweise Filter A–B, C–D und F–G–H Filterketten. Jede Unterkette in F–G–H (F–G und G–H) ist auch eine Filterkette. Eine Filterkette kann aus einem einzigen Filter bestehen, sodass Filter A, B, C, D, F, G und H auch unterschiedliche Filterketten sind. Filter E verfügt über zwei Eingabeverbindungen, sodass jede Abfolge von Filtern, die Filter E enthält, keine Filterkette ist.

Filterkette (Beispiel 1)

Die IFilterChain Schnittstelle stellt die folgenden Methoden zum Steuern von Filterketten bereit:

Etikett Wert
IFilterChain::StartChain Startet eine Kette.
IFilterChain::StopChain Stoppt eine Kette.
IFilterChain::P auseChain Hält eine Kette an.
IFilterChain::RemoveChain Entfernt eine Kette aus dem Diagramm.

 

Es gibt keine spezifische Methode zum Hinzufügen einer Kette. Um eine Kette hinzuzufügen, fügen Sie die neuen Filter mithilfe der IFilterGraph::AddFilter-Methode ein. Verbinden Sie dann die Filter, indem Sie IGraphBuilder::Connect, IGraphBuilder::Renderoder ähnliche Methoden aufrufen.

Wenn das Diagramm ausgeführt wird, kann eine Filterkette zwischen ausführung und beendet werden. Wenn das Diagramm angehalten wird, kann es zwischen angehalten und angehalten werden. Dies sind die einzigen Statusübergänge, die mit Filterketten möglich sind.

Richtlinien für Filterketten

Wenn Sie IFilterChain--Methoden verwenden, ist es wichtig, sicherzustellen, dass die Filter im Diagramm Filterkettenvorgänge unterstützen können. Andernfalls können Sie Deadlocks oder Diagrammfehler verursachen. Filter, die mit der Kette verbunden sind, müssen ordnungsgemäß funktionieren, nachdem sich der Zustand der Kette geändert hat.

Die beste Möglichkeit, IFilterChain- zu verwenden, ist eine Reihe von Filtern, die Sie speziell für die Verkettung entwickelt haben. Verwenden Sie die folgenden Richtlinien, um sicherzustellen, dass Ihre Filter für Filterkettenvorgänge sicher sind. Diese Punkte beziehen sich auf das folgende Diagramm.

Filterkette (Beispiel 2)

  • Bevor sich der Status der Filterkette ändert, müssen alle Datenverarbeitungsaufrufe an der Grenze der Filterkette abgeschlossen werden. Diese Regel gilt für die Methoden IMemInputPin::Receive, IPin::NewSegmentund IPin::EndOfStream. Filter in der Kette müssen von Aufrufen an diese Methoden zurückgegeben werden, die von Filtern außerhalb der Kette vorgenommen werden; und Filter außerhalb der Kette müssen von Aufrufen zurückgegeben werden, die von Filtern innerhalb der Kette ausgeführt werden.

Im vorherigen Diagramm muss z. B. filter B alle Datenverarbeitungsaufrufe aus filter A abschließen, und filter E muss alle Aufrufe aus filter D abschließen. Wenn die Pins die IPinFlowControl und IPinConnection Schnittstellen verfügbar machen, können Sie die Daten über das Diagramm übertragen, indem Sie die IPinFlowControl::Block und IGraphConfig::P ushThroughData--Methoden aufrufen, wie in Dynamic Reconnectionbeschrieben. Filter unterstützen möglicherweise auch private Methoden zum Pushen der Daten.

  • Upstreamfilter müssen erwarten, dass sich der Zustand der Kette ändert. Nehmen wir beispielsweise im vorherigen Diagramm an, dass die Kette beendet wird, aber A-Aufrufe IMemInputPin::Receivefiltern. Der Anruf schlägt fehl, und die Antwort von Filter A besteht darin, das Streaming zu beenden. Wenn die Anwendung die Kette neu startet, hat sie keine Auswirkung, da filter A keine Daten mehr streamt.
  • Nachgeschaltete Filter müssen auch davon ausgehen, dass sich der Zustand der Kette ändert. Wenn nicht, blockiert der nachgeschaltete Filter möglicherweise, während er auf Proben wartet, die nie eingehen. Multiplexer-Filter (MUX) erfordern z. B. häufig Daten aus allen Eingabenadeln. Durch das Anhalten des Datenflusses von einem Eingabenadel können die anderen Datenströme an der Verarbeitung gehindert werden. Dies kann dazu führen, dass das Diagramm deadlockt.
  • Jede Pinverbindung von einem Filter außerhalb der Kette zu einem Filter innerhalb der Kette sollte über einen eigenen Zuweisungstyp verfügen, der nicht von anderen Verbindungen gemeinsam genutzt wird. Wenn sich der Zustand der Kette ändert oder aus dem Diagramm entfernt wird, wird der Allocator möglicherweise nicht mehr verwendet. Wenn andere Verbindungen denselben Ocator verwenden, können sie keine Proben mehr verarbeiten.
  • Entfernen Sie keine Kette, es sei denn, die mit der Kette verbundenen Filter unterstützen die dynamische Trennung. In der Regel unterstützen die verbundenen Filter die IPinConnection- oder IPinFlowControl--Schnittstelle, unterstützen jedoch stattdessen private Schnittstellen.

Dynamic Graph Building