Erneutes Verbinden von Pins

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

Während einer Pinverbindung kann ein Filter einen seiner anderen Pins wie folgt trennen und erneut verbinden:

  1. Der Filter ruft IPin::QueryAccept auf der Pin des anderen Filters auf und gibt den neuen Medientyp an.
  2. Wenn QueryAccept S_OK zurückgibt, ruft der Filter IFilterGraph2::ReconnectEx auf, um die Pins wiederherzustellen.

Im Folgenden sind einige Beispiele dafür aufgeführt, wenn ein Filter möglicherweise die Pins erneut verbinden muss:

  • Tee-Filter. Ein Abschlagfilter teilt einen Eingabedatenstrom in mehrere Ausgaben auf, ohne die Daten im Stream zu ändern. Ein Abschlagfilter kann eine Reihe von Medientypen akzeptieren, aber die Typen müssen über alle Pinverbindungen übereinstimmen. Wenn der Eingabenadel eine Verbindung herstellt, muss der Filter möglicherweise alle vorhandenen Verbindungen an den Ausgabepins neu aushandeln und umgekehrt. Ein Beispiel finden Sie unter InfTee-Filterbeispiel.
  • Direkte Filter. Ein direktes Filtern ändert die Eingabedaten im ursprünglichen Puffer, anstatt die Daten in einen separaten Ausgabepuffer zu kopieren. Ein ortsübergreifender Filter muss für die Upstream und die Downstreamverbindungen denselben Zuweisungsator verwenden. Der erste Pin zum Verbinden (Eingabe oder Ausgabe) handelt eine Zuweisung auf die übliche Weise aus. Wenn der andere Pin jedoch eine Verbindung herstellt, ist die erste Zuweisung möglicherweise nicht akzeptabel. In diesem Fall wählt der zweite Pin eine andere Zuweisung aus, und der erste Pin wird mithilfe der neuen Zuweisung wieder verbunden. Eine Beispielimplementierung finden Sie in der CTransInPlaceFilter-Klasse .

In der ReconnectEx-Methode trennt der Filter Graph-Manager die Pins asynchron und verbindet sie erneut. Der Filter darf nicht versuchen, die Verbindung wiederherzustellen, es sei denn , QueryAccept gibt S_OK zurück. Andernfalls bleibt der Pin getrennt, was zu Diagrammfehlern führt. Außerdem sollte der Filter die erneute Verbindung aus der IPin::Connect-Methode im selben Thread anfordern. Wenn die Connect-Methode für einen Thread zurückgibt, während ein anderer Thread die Anforderung zur Wiederherstellung der Verbindung vornimmt, kann der Filter Graph-Manager den Graphen ausführen, bevor er die erneute Verbindung herstellt, was zu Diagrammfehlern führt.