Schritt 3 Medientypverhandlung unterstützen

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Dies ist Schritt 3 des Tutorials Schreiben von Transformationsfiltern.

Wenn zwei Pins eine Verbindung herstellen, müssen sie sich auf einen Medientyp für die Verbindung einigen. Der Medientyp beschreibt das Format der Daten. Ohne den Medientyp kann ein Filter eine Art von Daten bereitstellen, nur damit sie von einem anderen Filter als etwas anderes behandelt wird.

Der grundlegende Mechanismus zum Aushandeln von Medientypen ist die IPin::ReceiveConnection-Methode . Der Ausgabenadel ruft diese Methode auf dem Eingabenadel mit einem vorgeschlagenen Medientyp auf. Der Eingabenadel akzeptiert die Verbindung oder lehnt sie ab. Wenn die Verbindung abgelehnt wird, kann der Ausgabenadel einen anderen Medientyp ausprobieren. Wenn keine geeigneten Typen gefunden werden, schlägt die Verbindung fehl. Optional kann der Eingabenadel über die IPin::EnumMediaTypes-Methode eine Liste von Typen ankündigen, die er bevorzugt. Der Ausgabenadel kann diese Liste verwenden, wenn er Medientypen vorschlägt, obwohl dies nicht muss.

Die CTransformFilter-Klasse implementiert wie folgt ein allgemeines Framework für diesen Prozess:

  • Der Eingabenadel weist keine bevorzugten Medientypen auf. Es basiert vollständig auf dem Upstream-Filter, um den Medientyp vorzuschlagen. Für Videodaten ist dies sinnvoll, da der Medientyp die Bildgröße und die Bildrate enthält. In der Regel müssen diese Informationen von einem Upstream Quellfilter oder Parserfilter bereitgestellt werden. Bei Audiodaten ist der Satz möglicher Formate kleiner, sodass es für den Eingabestift praktisch sein kann, einige bevorzugte Typen anzubieten. Überschreiben Sie in diesem Fall CBasePin::GetMediaType am Eingabenadel.
  • Wenn der Upstream-Filter einen Medientyp vorschlägt, ruft die Eingabenadel die CTransformFilter::CheckInputType-Methode auf, die den Typ akzeptiert oder ablehnt.
  • Der Ausgabepin wird erst dann verbunden, wenn der Eingabenadel zuerst verbunden ist. Dieses Verhalten ist typisch für Transformationsfilter. In den meisten Fällen muss der Filter den Eingabetyp bestimmen, bevor er den Ausgabetyp festlegen kann.
  • Wenn der Ausgabepin eine Verbindung herstellt, enthält er eine Liste von Medientypen, die er dem Nachstromfilter vorschlägt. Sie ruft die CTransformFilter::GetMediaType-Methode auf, um diese Liste zu generieren. Der Ausgabenadel versucht auch alle Medientypen, die der nachgeschaltete Filter vorschlägt.
  • Um zu überprüfen, ob ein bestimmter Ausgabetyp mit dem Eingabetyp kompatibel ist, ruft die Ausgabenadel die CTransformFilter::CheckTransform-Methode auf.

Die drei zuvor aufgeführten CTransformFilter-Methoden sind reine virtuelle Methoden, sodass ihre abgeleitete Klasse sie implementieren muss. Keine dieser Methoden gehört zu einer COM-Schnittstelle. Sie sind einfach Teil der Implementierung, die von den Basisklassen bereitgestellt wird.

In den folgenden Abschnitten werden die einzelnen Methoden ausführlicher beschrieben:

Herstellen einer Verbindung mit Filtern

Schreiben von DirectShow-Filtern