Freigeben über


Informationen zu MFTs

Media Foundation-Transformationen (MFTs) stellen ein generisches Modell für die Verarbeitung von Mediendaten bereit. MFTs werden für Decoder, Encoder und digitale Signalprozessoren (Digital Signal Processor, DSPs) verwendet. Kurz gesagt, alles, was sich in der Medienpipeline zwischen der Medienquelle und der Mediensenke befindet, ist ein MFT.

Für die meisten Anwendungen werden die Details der MFT-Datenverarbeitung durch höhere Ebenen der Media Foundation-Architektur ausgeblendet. Viele Media Foundation-Anwendungen führen nie einen direkten Aufruf an eine MFT durch. Es ist jedoch sicher möglich, ein MFT direkt in Ihrer Anwendung zu hosten.

MFTs sind eine Weiterentwicklung des Transformationsmodells, das erstmals mit DirectX Media Objects (DMOs) eingeführt wurde. Tatsächlich ist es relativ einfach, eine Transformation zu erstellen, die beide Modelle unterstützt. Im Vergleich zu DMOs sind die erforderlichen Verhaltensweisen von MFTs deutlicher angegeben, was das Schreiben einer korrekten Implementierung erleichtert. Darüber hinaus können MFTs hardwarebeschleunigte Videoverarbeitung unterstützen.

Dieses Thema bietet einen kurzen Überblick über das MFT-Verarbeitungsmodell, das sich auf das allgemeine Design und nicht auf bestimmte Methodenaufrufe konzentriert. Eine detailliertere, schrittweise Beschreibung finden Sie unter Grundmodell der MFT-Verarbeitung.

Bäche

Ein MFT verfügt über Eingabedatenströme und Ausgabedatenströme. Eingabedatenströme empfangen Daten, und Ausgabedatenströme erzeugen Daten. Beispielsweise verfügt ein Decoder über einen Eingabedatenstrom, der die codierten Daten empfängt, und einen Ausgabedatenstrom, der die decodierten Daten erzeugt.

Die Datenströme in einem MFT werden nicht als unterschiedliche COM-Objekte dargestellt. Stattdessen verfügt jeder Datenstrom über einen bestimmten Datenstrombezeichner, und die Methoden in der IMFTransform-Schnittstelle übernehmen Datenstrombezeichner als Eingabeparameter.

Einige MFTs weisen eine feste Anzahl von Datenströmen auf. Beispielsweise verfügen Decoder und Encoder normalerweise über genau eine Eingabe und eine Ausgabe. Andere MFTs weisen eine dynamische Anzahl von Datenströmen auf. Wenn ein MFT dynamische Datenströme unterstützt, kann der Client neue Eingabedatenströme hinzufügen. Der Client kann keine Ausgabedatenströme hinzufügen, aber der MFT fügt ausgabestreams während der Verarbeitung hinzu oder entfernt sie. Multiplexer ermöglichen es dem Client in der Regel, Eingabedatenströme hinzuzufügen und einen Ausgang für den multiplexierten Datenstrom zu haben. Demultiplexer sind das Gegenteil, mit einem Eingang und einer dynamischen Anzahl von Ausgabestreams, abhängig vom Inhalt des Eingabestreams. Die folgende Abbildung zeigt den Unterschied zwischen Multiplexer und Demultiplexer.

Diagramm mit einem Encoder/Decoder (1 Eingabe, 1 Ausgabe), einem Multiplexer (2 Eingaben, 1 Ausgabe) und einem Demultiplexer (1 Eingabe, 2 Ausgaben)

Medientypen

Wenn ein MFT zum ersten Mal erstellt wird, weist keiner der Datenströme ein etabliertes Format auf. Bevor MFT Daten verarbeiten kann, muss der Client die Formate für die Datenströme festlegen. Bei einem Decoder ist das Eingabeformat beispielsweise das Komprimierungsformat, das in der ursprünglichen Quelldatei verwendet wird, und das Ausgabeformat ist ein nicht komprimiertes Format, z. B. PCM-Audio oder RGB-Video. Die Datenstromformate werden mithilfe von Medientypen beschrieben.

Je nach internem Status des MFT kann eine Liste möglicher Medientypen für jeden Datenstrom bereitgestellt werden. Sie können diese Liste als Hinweis verwenden, wenn Sie die Medientypen festlegen. Durch Festlegen des Medientyps auf einem Datenstrom kann die Liste der möglichen Typen für einen anderen Datenstrom geändert werden. Beispielsweise kann ein Decoder in der Regel keine Ausgabetypen bereitstellen, bis der Client den Eingabetyp festlegt. Der Eingabetyp enthält die Informationen, die der Decoder benötigt, um eine Liste möglicher Ausgabetypen zurückzugeben.

Zum Festlegen des Medientyps für einen Datenstrom rufen Sie IMFTransform::SetInputType oder IMFTransform::SetOutputType auf. Rufen Sie IMFTransform::GetInputAvailableType oder IMFTransform::GetOutputAvailableType auf, um die Liste der möglichen Medientypen für einen Datenstrom zu erhalten.

Verarbeiten von Daten

Nachdem der Client die Medientypen für die Datenströme festgelegt hat, kann MFT Daten verarbeiten. Um dies zu erreichen, wechselt der Client zwischen der Bereitstellung von Eingabedaten an die MFT und dem Abrufen von Ausgabedaten aus dem MFT:

Die ProcessInput-Methode verwendet einen Zeiger auf ein vom Client zugewiesenes Medienbeispiel. Die Medienprobe enthält einen oder mehrere Puffer, und jeder Puffer enthält Eingabedaten zur Verarbeitung durch das MFT.

Die ProcessOutput-Methode unterstützt zwei verschiedene Zuordnungsmodelle: Entweder weist der MFT die Ausgabepuffer zu, oder der Client weist die Ausgabepuffer zu. Einige MFTs unterstützen beide Zuordnungsmodelle, aber es ist nicht erforderlich, dass ein MFT beides unterstützt. Ein MFT kann z. B. erfordern, dass der Client die Ausgabepuffer zuordnet. Die IMFTransform::GetOutputStreamInfo-Methode gibt Informationen zu einem Ausgabedatenstrom zurück, einschließlich des vom MFT unterstützten Zuordnungsmodells.

MFTs sind so konzipiert, dass so wenig Daten wie möglich gepuffert werden, um die Latenz in der Pipeline zu minimieren. Daher kann der MFT jederzeit eine der folgenden Bedingungen signalisieren:

  • Die MFT erfordert mehr Eingabedaten. In diesem Zustand kann die MFT die Ausgabe erst erzeugen, wenn der Client ProcessInput mindestens einmal aufruft.
  • Die MFT akzeptiert keine weiteren Eingaben, bis der Client ProcessOutput mindestens einmal aufruft.

Angenommen, Sie verwenden einen Videodecoder, um einen Videostream zu decodieren, der eine Mischung aus Keyframes und Deltaframes enthält. Zunächst erfordert die MFT einige Eingaben, bevor sie alle Frames decodieren kann. Der Client ruft ProcessInput auf, um den ersten Frame bereitzustellen. Angenommen, der erste Frame ist ein Delta-Frame (im folgenden Diagramm als "P" für vorhergesagte Frames dargestellt). Der Decoder hält sich an diesen Frame, aber er kann keine Ausgabe erzeugen, bis er den nächsten Keyframe erhält.

Diagramm, das das MFT zeigt, welches Eingaben benötigt und auf einen vorhergesagten Frame hinweist

Der Client ruft ProcessInput weiterhin auf und erreicht schließlich den nächsten Keyframe (im nächsten Diagramm als "I" für den intracodierten Frame dargestellt). Jetzt verfügt der Decoder über genügend Frames, um mit der Decodierung zu beginnen. An diesem Punkt wird die Annahme von Eingaben beendet, und der Client muss ProcessOutput aufrufen, um die decodierten Frames abzurufen.

Diagramm mit einem Mft, der keine Eingabe akzeptiert, zeigt auf einen intracodierten Frame und drei vorhergesagte Frames

Der einfachste Ansatz für den Client besteht darin, einfach Aufrufe von ProcessInput und ProcessOutput abwechselnd auszuführen. Ein komplexerer Algorithmus wird im Thema Basic MFT Processing Model beschrieben.

Media Foundation-Transformationen