Freigeben über


DMO-Medientypen

[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.]

Ein Medientyp beschreibt das Format, das einem Datenstrom von Mediendaten zugeordnet ist. In diesem Artikel wird beschrieben, wie DMOs Medientypen verarbeiten. Es ist in erster Linie für Entwickler gedacht, die ihre eigenen benutzerdefinierten DMOs schreiben.

Medientypen werden mithilfe der DMO_MEDIA_TYPE-Struktur definiert. Diese Struktur enthält die folgenden Informationen:

  • Der Haupttyp ist eine GUID (Globally Unique Identifier), die eine breite Kategorie definiert, z. B. Audio oder Video.
  • Der Untertyp ist eine GUID, die spezifischere Aspekte des Typs definiert. Beispielsweise umfassen die Untertypen innerhalb von Videos 16-Bit-RGB, 24-Bit-RGB, UYVY, DV-codiertes Video usw.
  • Der Formatblock ist eine sekundäre Struktur, die das Format vollständig angibt. Das Layout des Formatblocks hängt vom Datentyp ab. PcM-Audio verwendet beispielsweise die WAVEFORMATEX-Struktur . Video verwendet verschiedene andere Strukturen, einschließlich VIDEOINFOHEADER und VIDEOINFOHEADER2. Das Layout des Formatblocks wird durch eine Formattyp-GUID identifiziert. Beispielsweise gibt FORMAT_WaveFormatEx eine WAVEFORMATEX-Struktur an.

Wenn ein DMO zum ersten Mal erstellt wird, verfügen die Streams nicht über einen Medientyp. Bevor die DMO Daten verarbeiten kann, muss der Client einen Medientyp für jeden Stream festlegen. Dieser Prozess wird aus Sicht des Clients unter Festlegen von Medientypen für eine DMO beschrieben.

Medientypen in der Registrierung

Ein DMO kann der Registrierung eine Liste der unterstützten Medientypen hinzufügen, indem die Funktion DMORegister aufgerufen wird. Eine Anwendung kann diese Informationen verwenden, um nach DMOs zu suchen, die einem bestimmten Format entsprechen. Die Informationen in der Registrierung sollen nicht umfassend sein. In der Regel würden Sie nur die Standard Typen einschließen, die von der DMO unterstützt werden. Der Registrierungseintrag verfügt über separate Schlüssel für Eingabe- und Ausgabetypen, unterscheidet jedoch nicht zwischen einzelnen Streams.

Die DMORegister-Funktion verwendet die DMO_PARTIAL_MEDIATYPE-Struktur , um Medientypen zu beschreiben. Diese Struktur enthält eine Teilmenge der Informationen, die in der DMO_MEDIA_TYPE-Struktur gefunden werden, nämlich den Haupttyp und den Untertyp. Es enthält keinen Formatblock, da der Formatblock in der Regel Informationen enthält, die zu detailliert sind, um in die Registrierung aufzunehmen, z. B. die Höhe und Breite eines Videobilds.

Bevorzugte Medientypen

Nachdem die Anwendung ein DMO erstellt hat, kann sie den DMO nach den unterstützten Medientypen abfragen. Für jeden Stream erstellt der DMO eine Liste der Medientypen (möglicherweise leer), sortiert nach Präferenz. Die Methoden IMediaObject::GetInputType und IMediaObject::GetOutputType auflisten die bevorzugten Typen. Die bevorzugten Typen eines Streams können sich dynamisch ändern, wenn die Anwendung Medientypen für andere Datenströme festlegt. Beispielsweise kann sich die Liste der bevorzugten Ausgabetypen ändern, nachdem der Eingabetyp festgelegt wurde oder umgekehrt. Die DMO ist jedoch nicht erforderlich, um die bevorzugten Typen dynamisch zu aktualisieren. Die Anwendung kann nicht davon ausgehen, dass jeder empfangene Typ gültig ist. Aus diesem Grund unterstützen die Methoden IMediaObject::SetInputType und IMediaObject::SetOutputType ein Flag zum Testen eines bestimmten Typs.

Die Methoden GetInputType und GetOutputType geben beide eine DMO_MEDIA_TYPE-Struktur zurück. Die DMO kann einige Der Informationen in dieser Struktur leer lassen, um einen Bereich von Typen anzugeben. Der Haupttyp oder Untertyp kann GUID_NULL sein, und der Formatblock kann leer sein (null Bytes). Wenn der Formatblock leer ist, muss der Formattyp GUID_NULL sein.

Nachdem die Anwendung alle Eingabetypen eines DMO festgelegt hat, sollte die DMO im Allgemeinen mindestens einen vollständigen Typ für jeden Ausgabedatenstrom zurückgeben. Ein vollständiger Ausgabetyp erleichtert tests, und Anwendungen können ihn als vernünftigen Standard verwenden. Die DMO-Testanwendung basiert auf diesem Verhalten. (Siehe Verwenden der DMOTest-Anwendung.)

Festlegen der Medientypen

Anwendungen verwenden die Methoden SetInputType und SetOutputType , um Typen für einen angegebenen Stream zu testen, festzulegen oder zu löschen. Die Anwendung muss den Typ vollständig angeben. Die DMO überprüft, ob der vorgeschlagene Typ akzeptiert werden kann. Die Antwort hängt möglicherweise davon ab, welche Typen für andere Streams festgelegt wurden. Das flag DMO_SET_TYPEF_CLEAR löscht den Typ eines Datenstroms, sodass die Anwendung "zurück" und eine andere Kombination ausprobieren kann.

Beispielszenarien

In den folgenden Beispielen werden einige typische Szenarien beschrieben, um die in den vorherigen Abschnitten dargelegten Punkte zu veranschaulichen.

  • Videodecoder. In einem typischen Videodecoder bestimmt der Eingabetyp teilweise den Ausgabetyp. In der Regel müssen z. B. beide Datenströme die gleiche Bildfrequenz und Bildabmessungen aufweisen. Eine Option besteht darin, keine bevorzugten Ausgabetypen zu definieren, bis der Eingabetyp festgelegt ist. Eine weitere Möglichkeit besteht darin, einen Satz unvollständiger Typen aufzulisten, wobei der Formatblock weggelassen wird. Verwenden Sie den Untertyp, um die unterstützten unkomprimierten Typen anzugeben, z. B. 16-Bit-RGB, 24-Bit-RGB usw. Außerdem unterstützen Videodecoder in der Regel das Festlegen des Ausgabetyps vor dem Eingabetyp nicht. Das übliche Szenario besteht darin, ein bekanntes Eingabeformat zu decodieren, sodass diese Einschränkung sinnvoll ist.
  • Audiodecoder. Ein Audiodecoder unterstützt möglicherweise einen begrenzten, festen Satz von Ausgabeformaten. In diesem Fall kann es möglicherweise eine Liste der bevorzugten Ausgabeformate erstellen, bevor das Eingabeformat bekannt ist.
  • Kompressoren. In den meisten Fällen kann ein Videokompressor seine bevorzugten Ausgabeformate erst vollständig angeben, wenn die Anwendung das Eingabeformat festlegt und umgekehrt. Stattdessen sollte die DMO einen unvollständigen Typ ohne Formatblock zurückgeben. Sowohl für die Audio- als auch für die Videokomprimierung muss die Anwendung in der Regel verschiedene Ausgabeparameter festlegen, z. B. die Bitrate. Nachdem der Eingabetyp jedoch festgelegt wurde, sollte der Kompressor aus den zuvor genannten Gründen mindestens einen vollständigen Ausgangstyp zurückgeben.

Schreiben einer DMO