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 (DSPs) verwendet. Kurz gesagt, alles, was sich in der Medienpipeline zwischen der Medienquelle und der Mediensenke befindet, ist ein MFT.

Bei den 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 einen MFT. Es ist jedoch sicher möglich, einen 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 werden 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, wobei der Schwerpunkt auf dem Gesamtentwurf und nicht auf bestimmten Methodenaufrufen liegt. Eine ausführlichere, schrittweise Beschreibung finden Sie unter Grundlegendes MFT-Verarbeitungsmodell.

Datenströme

Ein MFT verfügt über Eingabe- und Ausgabedatenströme. Eingabestreams empfangen Daten, und Ausgabedatenströme erzeugen Daten. Beispielsweise verfügt ein Decoder über einen Eingabestream, der die codierten Daten empfängt, und einen Ausgabestream, der die decodierten Daten erzeugt.

Die Datenströme in einem MFT werden nicht als unterschiedliche COM-Objekte dargestellt. Stattdessen verfügt jeder Stream über einen festgelegten Streambezeichner, und die Methoden in der IMFTransform-Schnittstelle verwenden Streambezeichner als Eingabeparameter.

Einige MFTs verfügen über eine feste Anzahl von Streams. Decoder und Encoder verfügen beispielsweise normalerweise über genau einen Eingang und einen Ausgang. Andere MFTs verfügen über eine dynamische Anzahl von Streams. Wenn ein MFT dynamische Streams unterstützt, kann der Client neue Eingabedatenströme hinzufügen. Der Client kann keine Ausgabedatenströme hinzufügen, aber der MFT kann während der Verarbeitung Ausgabedatenströme hinzufügen oder entfernen. Beispielsweise ermöglichen Multiplexer dem Client in der Regel das Hinzufügen von Eingabedatenströmen und eine Ausgabe für den multiplexten Stream. Demultiplexer sind das Gegenteil, mit einer Eingabe, aber einer dynamischen Anzahl von Ausgabedatenströmen, abhängig vom Inhalt des Eingabedatenstroms. Die folgende Abbildung zeigt den Unterschied zwischen Multiplexer und Demultiplexer.

Abbildung eines Encoders/Decoders (1 Eingang, 1 Ausgabe), eines Multiplexers (2 Eingänge, 1 Ausgabe) und eines Demultiplexers (1 Eingabe, 2 Ausgänge)

Medientypen

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

Je nach internem Status des MFT kann eine Liste möglicher Medientypen für jeden Stream bereitgestellt werden. Sie können diese Liste als Hinweis verwenden, wenn Sie die Medientypen festlegen. Das Festlegen des Medientyps für einen Stream kann die Liste der möglichen Typen für einen anderen Stream ändern. 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.

Um den Medientyp für einen Stream festzulegen, rufen Sie IMFTransform::SetInputType oder IMFTransform::SetOutputType auf. Um die Liste der möglichen Medientypen für einen Stream abzurufen, rufen Sie IMFTransform::GetInputAvailableType oder IMFTransform::GetOutputAvailableType auf.

Verarbeiten von Daten

Nachdem der Client die Medientypen für die Streams festgelegt hat, ist der MFT bereit, Daten zu verarbeiten. Um dies zu ermöglichen, wechselt der Client zwischen der Bereitstellung von Eingabedaten für den MFT und dem Abrufen von Ausgabedaten aus dem MFT:

Die ProcessInput-Methode verwendet einen Zeiger auf ein Vom Client zugewiesenes Medienbeispiel. Das Medienbeispiel enthält einen oder mehrere Puffer, und jeder Puffer enthält Eingabedaten für den zu verarbeitenden MFT.

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

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

  • Der MFT erfordert mehr Eingabedaten. In diesem Zustand kann der MFT keine Ausgabe erzeugen, bis der Client ProcessInput mindestens einmal aufruft.
  • Der 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 der MFT einige Eingaben, bevor er beliebige Frames decodieren kann. Der Client ruft ProcessInput auf, um den ersten Frame bereitzustellen. Angenommen, der erste Frame ist ein Deltaframe (im folgenden Diagramm als "P" für vorhergesagten Frame dargestellt). Der Decoder behält diesen Frame bei, kann jedoch keine Ausgabe erzeugen, bis er den nächsten Keyframe erhält.

Diagramm, das den MFT zeigt, für den eine Eingabe erforderlich ist und auf einen vorhergesagten Frame verweist

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

Diagramm, das einen MFT zeigt, der keine Eingabe akzeptiert und auf einen intracodierten Frame und drei vorhergesagte Frames verweist

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

Media Foundation-Transformationen