Filterketten

Eine Filterkette ist eine Sequenz von Filtern, die die folgenden Bedingungen erfüllt:

  • Jeder Filter in der Kette verfügt über mindestens einen verbundenen Eingabepin und einen verbundenen Ausgabepin.
  • Es ist möglich, jeden Filter in der Kette zu durchlaufen, ohne Filter außerhalb der Kette zu durchlaufen.

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

Filterkette (Beispiel 1)

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

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

Es gibt keine bestimmte 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::Renderoder ähnliche Methoden aufrufen.

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

Richtlinien für Die Filterkette

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

IFilterChain kann am besten mit einer Reihe von Filtern verwendet werden, die Sie speziell für die Verkettung entworfen 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 Zustand 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 dieser Methoden zurückgeben, die von Filtern außerhalb der Kette vorgenommen wurden. Filter und außerhalb der Kette müssen von Aufrufen zurückgeben, die von Filtern innerhalb der Kette vorgenommen wurden.

Im vorherigen Diagramm muss filter B beispielsweise alle Datenverarbeitungsaufrufe von Filter A und Filter E alle Aufrufe aus Filter D abschließen. Wenn die Pins die Schnittstellen IPinFlowControl und IPinConnection verfügbar machen, können Sie die Daten durch pushen, indem Sie die Methoden IPinFlowControl::Block und IGraphConfig::P ushThroughData aufrufen, wie in Dynamic Reconnection beschrieben. Filter können auch private Methoden zum Pushen der Daten unterstützen.

  • Upstreamfilter müssen erwarten, dass sich der Zustand der Kette ändert. Nehmen wir beispielsweise im vorherigen Diagramm an, dass die Kette beendet wurde, aber A ruft IMemInputPin::Receive auf. Der Aufruf schlägt fehl, und die Antwort von Filter A ist das Beenden des Streamings. Wenn die Anwendung die Kette neu startet, hat dies keine Auswirkungen, da Filter A keine Daten mehr streamt.
  • Downstreamfilter müssen auch erwarten, dass sich der Zustand der Kette ändert. Ander denn, der Downstreamfilter kann blockiert werden, während er auf Stichproben wartet, die nie eintreffen. Beispielsweise erfordern Multiplexerfilter (MUX) häufig Daten von allen ihren Eingabepins. Das Anhalten des Datenflusses von einem Eingabepin kann die Verarbeitung der anderen Datenströme blockieren. Dies kann zu einem Deadlock des Graphen führen.
  • Jede Stecknadelverbindung von einem Filter außerhalb der Kette zu einem Filter innerhalb der Kette sollte über eine eigene Zuweisung verfügen, die nicht von anderen Verbindungen gemeinsam genutzt wird. Wenn sich der Zustand der Kette ändert oder aus dem Diagramm entfernt wird, wird die Zuweisung möglicherweise aufgehoben. Wenn andere Verbindungen dieselbe Zuweisung verwendet haben, können sie keine Beispiele mehr verarbeiten.
  • Entfernen Sie eine Kette nur, wenn die mit der Kette verbundenen Filter die dynamische Trennung unterstützen. In der Regel unterstützen die verbundenen Filter die IPinConnection- oder IPinFlowControl-Schnittstelle, aber möglicherweise auch private Schnittstellen.

Dynamic Graph Building