CBasePin-Verbindungsprozess
[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.]
In diesem Abschnitt wird beschrieben, wie die CBasePin-Klasse den Anheftverbindungsprozess implementiert.
Der Filter Graph-Manager initiiert alle Pinverbindungen. Es ruft die IPin::Connect-Methode des Ausgabepins auf und gibt den Eingabenadel an. Der Ausgabepin schließt die Verbindung durch Aufrufen der IPin::ReceiveConnection-Methode des Eingabepins ab. Der Eingabenadel kann die Verbindung annehmen oder ablehnen.
Der Filter Graph-Manager kann auch einen Medientyp für die Verbindung angeben. Wenn ja, versuchen die Pins, eine Verbindung mit diesem Typ herzustellen. Andernfalls müssen die Pins den Typ aushandeln. Der Filter Graph-Manager kann auch einen Teilmedientyp angeben, der den Wert GUID_NULL für den Haupttyp, Untertyp oder Formattyp aufweist. In diesem Fall versuchen die Pins, den angegebenen Teil des Medientyps abzugleichen. der Wert GUID_NULL als Wildcard fungiert.
Die CBasePin::Connect-Methode beginnt mit der Überprüfung, ob die Pin eine Verbindung akzeptieren kann. Beispielsweise wird überprüft, ob die Stecknadel noch nicht verbunden ist. Der Rest des Verbindungsprozesses wird an die CBasePin::AgreeMediaType-Methode delegiert. Alles, was darauf folgt, wird von AgreeMediaType ausgeführt.
Wenn der Medientyp vollständig angegeben ist, ruft der Pin die CBasePin::AttemptConnection-Methode auf, um die Verbindung zu versuchen. Andernfalls werden Medientypen in der folgenden Reihenfolge ausprobiert:
- Die bevorzugten Typen des Eingabepins.
- Die bevorzugten Typen des Ausgabepins.
Sie können diese Reihenfolge umkehren, indem Sie das Flag CBasePin::m_bTryMyTypesFirst auf TRUE festlegen.
In jedem Fall ruft der Pin IPin::EnumMediaTypes auf, um die Medientypen aufzulisten. Diese Methode ruft ein Enumeratorobjekt ab, das an die CBasePin::TryMediaTypes-Methode übergeben wird. Die TryMediaTypes-Methode durchläuft jeden Medientyp und ruft AttemptConnection für jeden Typ auf.
Innerhalb der AttemptConnection-Methode ruft der Ausgabepin die folgenden Methoden auf:
- CBasePin::CheckConnect wird auf sich selbst aufgerufen, um zu überprüfen, ob der Eingabepin geeignet ist.
- CBasePin::CheckMediaType wird für sich selbst aufgerufen, um den Medientyp zu überprüfen.
- IPin ::ReceiveConnection wird am Eingabenadel aufgerufen. Der Eingabenadel verwendet diese Methode, um zu bestimmen, ob er die Verbindung akzeptieren soll.
- CBasePin::CompleteConnect wird für sich selbst aufgerufen, um die Verbindung abzuschließen.
Beachten Sie Folgendes:
- CheckConnect ist eine virtuelle Methode. In der Basisklasse überprüft diese Methode, ob die Pinrichtungen kompatibel sind. Ausgabepins müssen eine Verbindung mit Eingabepins herstellen und umgekehrt. Die abgeleitete Pinklasse überschreibt in der Regel diese Methode, um andere Überprüfungen durchzuführen. Sie kann beispielsweise den anderen Pin nach einer Schnittstelle abfragen, die für die Verbindung erforderlich ist. Wenn die abgeleitete Klasse CheckConnect überschreibt, sollte sie auch die CBasePin-Methode aufrufen.
- CheckMediaType ist eine reine virtuelle Methode, die von der abgeleiteten Klasse implementiert werden muss.
- CompleteConnect ist eine virtuelle Methode, die in der Basisklasse nichts ausführt. Abgeleitete Klassen können diese Methode überschreiben, um zusätzliche Aufgaben auszuführen, die zum Abschließen der Verbindung erforderlich sind, z. B. die Entscheidung über eine Speicherzuweisung.
Wenn einer dieser Schritte fehlschlägt, ruft der Ausgabepin die CBasePin::BreakConnect-Methode auf, um die von CheckConnect ausgeführten Schritte rückgängig zu machen.
Die ReceiveConnection-Methode des Eingabepins ruft die Methoden CheckConnect, CheckMediaType und CompleteConnect des Eingabepins auf. Wenn einer dieser Fehler auftritt, schlägt auch der Verbindungsversuch fehl.
Das folgende Diagramm zeigt den Verbindungsprozess in CBasePin:
Zugehörige Themen