Schritt 3: Unterstützung der Medientypverhandlung

Dies ist Schritt 3 des Lernprogramms zum Schreiben von Transformationsfiltern.

Wenn zwei Pins verbinden, müssen sie sich für die Verbindung auf einen Medientyp einigen. Der Medientyp beschreibt das Format der Daten. Ohne den Medientyp kann ein Filter eine Art von Daten liefern, nur um einen anderen Filter als etwas anderes zu behandeln.

Der grundlegende Mechanismus für die Verhandlung von Medientypen ist die IPin::ReceiveConnection-Methode . Die Ausgabehefte ruft diese Methode auf der Eingabehefte mit einem vorgeschlagenen Medientyp auf. Die Eingabehefte akzeptiert die Verbindung oder lehnt sie ab. Wenn die Verbindung abgelehnt wird, kann die Ausgabehefte einen anderen Medientyp ausprobieren. Wenn keine geeigneten Typen gefunden werden, schlägt die Verbindung fehl. Optional kann die Eingabehefte eine Liste von Typen ankündigen, die sie bevorzugt, über die IPin::EnumMediaTypes-Methode . Die Ausgabehefte können diese Liste verwenden, wenn sie Medientypen vorschlägt, obwohl sie nicht erforderlich ist.

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

  • Die Eingabehefte verfügt über keine bevorzugten Medientypen. 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 Framerate 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 die Eingabehefte praktisch sein kann, um einige bevorzugte Typen anzubieten. In diesem Fall überschreiben Sie CBasePin::GetMediaType auf der Eingabehefte.
  • Wenn der Upstreamfilter einen Medientyp vorschlägt, ruft die Eingabehefte die CTransformFilter::CheckInputType-Methode auf, die den Typ akzeptiert oder abgelehnt.
  • Die Ausgabehefte stellen keine Verbindung her, es sei denn, die Eingabehefte werden zuerst verbunden. 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 die Ausgabehefte eine Verbindung herstellen, verfügt sie über eine Liste der Medientypen, die sie dem nachgelagerten Filter vorschlägt. Es ruft die CTransformFilter::GetMediaType-Methode auf, um diese Liste zu generieren. Die Ausgabehefte versuchen auch alle Medientypen, die der nachgelagerte Filter vorschlägt.
  • Um zu überprüfen, ob ein bestimmter Ausgabetyp mit dem Eingabetyp kompatibel ist, ruft die Ausgabehefte die CTransformFilter::CheckTransform-Methode auf.

Die zuvor aufgeführten drei 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:

So filtern Verbinden

Schreiben von DirectShow-Filtern