Freigeben über


DMO-Medientypen

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

Ein Medientyp beschreibt das Format, das einem Datenstrom von Mediendaten zugeordnet ist. In diesem Artikel wird beschrieben, wie DMOs Medientypen behandeln. Es richtet sich in erster Linie an Entwickler, die eigene benutzerdefinierte DMOs schreiben.

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

  • Der Haupttyp ist ein GUID (Globally Unique Identifier), der eine breite Kategorie definiert, z. B. Audio oder Video.
  • Der Untertyp ist eine GUID, die spezifischere Aspekte des Typs definiert. Beispielsweise enthalten die Untertypen 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. Beispielsweise verwendet PCM-Audio 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 Datenströme nicht über einen Medientyp. Bevor die DMO daten verarbeiten kann, muss der Client für jeden Datenstrom einen Medientyp festlegen. Dieser Prozess wird aus der Sicht des Clients unter Festlegen von Medientypen für ein DMO-beschrieben.

Medientypen in der Registrierung

Ein DMO kann eine Liste von Medientypen hinzufügen, die es der Registrierung unterstützt, indem die DMORegister--Funktion 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 Haupttypen 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 Datenströmen.

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 präzise sind, um in die Registrierung einzuschließen, z. B. die Höhe und Breite eines Videobilds.

bevorzugte Medientypen

Nachdem die Anwendung ein DMO erstellt hat, kann die DMO nach den unterstützten Medientypen abgefragt werden. Für jeden Datenstrom erstellt die DMO eine Liste der Medientypen (möglicherweise leer), die in der Reihenfolge der Voreinstellung bewertet werden. Die IMediaObject::GetInputType und IMediaObject::GetOutputType Methoden auflisten die bevorzugten Typen. Die bevorzugten Typen eines Datenstroms 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 IMediaObject::SetInputType- und IMediaObject::SetOutputType- Methoden 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 (null Bytes) sein. Wenn der Formatblock leer ist, muss der Formattyp GUID_NULL werden.

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

Festlegen der Medientypen

Anwendungen verwenden die SetInputType- und SetOutputType- Methoden zum Testen, Festlegen oder Löschen von Typen in einem angegebenen Datenstrom. 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 Datenströme festgelegt wurden. Das DMO_SET_TYPEF_CLEAR Flag 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 vorgenommenen Punkte zu veranschaulichen.

  • Videodecoder. In einem typischen Videodecoder bestimmt der Eingabetyp teilweise den Ausgabetyp. In der Regel müssen 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 Option besteht darin, einen Satz unvollständiger Typen aufzählen und den Formatblock wegzulassen. Verwenden Sie den Untertyp, um die unterstützten nicht komprimierten Typen anzugeben, z. B. 16-Bit-RGB, 24-Bit-RGB usw. Außerdem unterstützen Videodecoder im Allgemeinen das Festlegen des Ausgabetyps vor dem Eingabetyp nicht. Das übliche Szenario besteht darin, ein bekanntes Eingabeformat zu decodieren, sodass diese Einschränkung angemessen ist.
  • Audiodecoder. Ein Audiodecoder unterstützt möglicherweise einen begrenzten, festen Satz von Ausgabeformaten. In diesem Fall kann es möglich sein, eine Liste der bevorzugten Ausgabeformate zu erstellen, bevor das Eingabeformat bekannt ist.
  • Kompressoren. In den meisten Fällen kann ein Videokompressor seine bevorzugten Ausgabeformate nicht vollständig angeben, bis die Anwendung das Eingabeformat festlegt und umgekehrt. Stattdessen sollte der DMO einen unvollständigen Typ ohne Formatblock zurückgeben. Bei der Audio- und Videokomprimierung muss die Anwendung in der Regel verschiedene Ausgabeparameter festlegen, z. B. die Bitrate. Nachdem der Eingabetyp festgelegt wurde, sollte der Kompressor jedoch aus den zuvor genannten Gründen mindestens einen vollständigen Ausgabetyp zurückgeben.

Schreiben eines DMO-