Filterketten

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 Ausgabehefter.
  • 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.

filter chain (example 1)

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

Bezeichnung 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::Verbinden, IGraphBuilder::Render oder ähnliche Methoden aufrufen.

Wenn das Diagramm ausgeführt wird, kann eine Filterkette zwischen laufendem und beendetem Wechsel wechseln. Wenn das Diagramm angehalten wird, kann es zwischen angehalten und beendet werden. Dies sind die einzigen Zustandsübergänge, die mit Filterketten möglich sind.

Filterkettenrichtlinien

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 Status der Kette ändert.

Die beste Möglichkeit, IFilterChain zu verwenden, besteht aus einer 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.

filter chain (example 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::NewSegment und IPin::EndOfStream. Filter in der Kette müssen von Aufrufen dieser Methoden zurückgegeben werden, die von Filtern außerhalb der Kette vorgenommen werden; und Filter außerhalb der Kette müssen von Anrufen zurückgegeben werden, die von Filtern innerhalb der Kette vorgenommen werden.

Im vorherigen Diagramm muss filter B beispielsweise alle Datenverarbeitungsaufrufe aus filter A abschließen, und der 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 Methoden IPinFlowControl::Block und IGraphConfig::P ushThroughData aufrufen, wie in Dynamic Reconnection beschrieben. Filter unterstützen möglicherweise auch private Methoden zum Pushen der Daten.

  • Vorgelagerte Filter müssen erwarten, dass sich der Status der Kette ändert. Nehmen wir beispielsweise im vorherigen Diagramm an, dass die Kette beendet wird, aber A-Aufrufe IMemInputPin::Receive filtern. Der Aufruf 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.
  • Nachgelagerte Filter müssen auch erwarten, dass sich der Zustand der Kette ändert. Wenn nicht, blockiert der nachgelagerte Filter möglicherweise, während es auf Beispiele wartet, die nie eintreffen. Beispielsweise benötigen Multiplexer-Filter (MUX) häufig Daten aus allen Eingabeheften. Das Anhalten des Datenflusses aus einem Eingabeheft kann die Verarbeitung der anderen Datenströme blockieren. Dies kann dazu führen, dass das Diagramm totsperrt wird.
  • Jede Pinverbindung von einem Filter außerhalb der Kette zu einem Filter innerhalb der Kette sollte über einen eigenen Allocator verfügen, der nicht von anderen Verbindungen geteilt wird. Wenn sich der Status der Kette ändert oder aus dem Diagramm entfernt wird, wird der Allocator möglicherweise nicht mehr verwendet. Wenn andere Verbindungen denselben Allocator verwenden, können sie keine Beispiele mehr verarbeiten.
  • Entfernen Sie keine Kette, es sei denn, die filter, die mit der Kette verbunden sind, unterstützen die dynamische Trennung. In der Regel unterstützen die verbundenen Filter die IPinConnection - oder IPinFlowControl-Schnittstelle , unterstützen jedoch stattdessen private Schnittstellen.

Dynamisches Graph Gebäude