Behandeln von Streamänderungen

In diesem Thema wird beschrieben, wie eine Media Foundation-Transformation (MFT) Formatänderungen während des Streamings behandeln sollte.

Wichtig

Dieses Thema gilt nicht für Encoder. Encoder sollten Formatänderungen nicht weitergeben, wie in diesem Thema beschrieben. Encoder sollten nur einen Eingabetyp akzeptieren, der dem aktuell konfigurierten Ausgabetyp entspricht.

 

Übersicht über Formatänderungen

Im Allgemeinen gibt es zwei Gründe, warum sich ein Format während des Streamings ändern kann.

  • Der Client wechselt möglicherweise zu einem Stream mit einem neuen Format. Im digitalen Fernsehen kann dies beispielsweise aufgrund eines Kanalwechsels auftreten.
  • In einigen Videoformaten, z. B. H.264, kann der Bitstream eine Formatänderung signalisieren. Solche Änderungen können Änderungen der Felddominanz, der Videoauflösung oder des Pixelseitenverhältnisses umfassen.

Wenn sich der Codierungstyp ändert, muss der Client möglicherweise das MFT aus der Pipeline entfernen und durch einen anderen MFT ersetzen. (Beispielsweise muss der Client möglicherweise einen neuen Decoder austauschen.) In diesem Thema wird diese Situation nicht behandelt. In diesem Thema wird nur der Fall behandelt, in dem das aktuelle MFT das neue Format verarbeiten kann.

Wenn sich das Format ändert, erfordert die MFT möglicherweise einen neuen Eingabetyp, einen neuen Ausgabetyp oder beides.

  • Änderungen am Eingabetyp werden vom Client initiiert. Ein MFT ändert nie seinen eigenen Eingabetyp.
  • Änderungen am Ausgabetyp werden vom MFT initiiert. Der MFT signalisiert, dass ein neuer Ausgabetyp erforderlich ist, und der Client verhandelt den neuen Ausgabetyp mit dem MFT.

Somit sind drei verschiedene Fälle möglich:

  • Der Client legt einen neuen Eingabetyp fest. Der MFT verwendet das neue Format, ohne dass der Ausgabetyp geändert wird.
  • Der Client legt einen neuen Eingabetyp fest, und dies löst eine Änderung des Ausgabetyps aus.
  • Der Eingabetyp ändert sich nicht, aber der MFT erkennt eine Formatänderung im Bitstream, was einen neuen Ausgabetyp erfordert.

Implementieren von Formatänderungen

Im weiteren Verlauf dieses Themas wird beschrieben, wie der Client eine Formatänderung verarbeiten soll und wie Formatänderungen in einem MFT implementiert werden.

Ausgabetyp

Jedes MFT kann wie folgt eine Änderung des Ausgabetyps initiieren:

  1. Der Client ruft IMFTransform::P rocessOutput auf. Der MFT antwortet wie folgt:
    1. Das MFT erzeugt kein Ausgabebeispiel in ProcessOutput.
    2. Das MFT legt das flag MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE im dwStatus-Element der MFT_OUTPUT_DATA_BUFFER-Struktur fest.
    3. Die ProcessOutput-Methode gibt den Fehlercode MF_E_TRANSFORM_STREAM_CHANGE zurück.
  2. Der Client ruft IMFTransform::GetOutputAvailableType auf. Diese Methode gibt einen aktualisierten Satz von Ausgabetypen zurück.
  3. Der Client ruft SetOutputType auf, um einen neuen Ausgabetyp festzulegen.
  4. Der Client setzt den Aufruf von ProcessInput/ProcessOutput fort.

Eingabetyp

Änderungen am Eingabetyp werden vom Client initiiert, niemals vom MFT. Wenn sich der Eingabetyp ändert, wird möglicherweise eine Änderung des Ausgabetyps ausgelöst.

Die genaue Abfolge der Ereignisse hängt vom Wert des attributs MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE ab.

Wert BESCHREIBUNG
FALSE Bevor der Client einen neuen Eingabetyp festlegt, muss er den MFT leeren.
TRUE Der Client kann einen neuen Eingabetyp festlegen, ohne den MFT zu belasten.

 

Ein MFT macht dieses Attribut über seine IMFTransform::GetAttributes-Methode verfügbar. Der Standardwert dieses Attributs ist FALSE. Wenn das Attribut vom MFT nicht festgelegt wird, behandeln Sie den Wert als FALSE.

MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE ist FALSE.

  1. Der Client sendet die MFT_MESSAGE_COMMAND_DRAIN Nachricht.
  2. Der Client entleert die MFT durch Aufrufen von IMFTransform::P rocessOutput, bis ProcessOutputMF_E_TRANSFORM_NEED_MORE_INPUT zurückgibt.
  3. Der Client ruft IMFTransform::SetInputType auf, um den neuen Eingabetyp festzulegen.
  4. Der MFT überprüft den Eingabetyp. Wenn der Typ ungültig ist, gibt SetInputTypeMF_E_INVALIDMEDIATYPE oder einen anderen Fehlercode zurück. Andernfalls gibt SetInputType S_OK zurück.
  5. Wenn der Eingabetyp gültig ist, wertet der MFT aus, ob sich auch der Ausgabetyp ändert. Andernfalls wird das Streaming fortgesetzt, und es ist keine weitere Aktion erforderlich.
  6. Wenn sich der Ausgabetyp ändert:
    1. Der MFT ungültigt seinen aktuellen Ausgabemedientyp und aktualisiert die Liste der verfügbaren Ausgabemedientypen.
    2. Der nächste Aufruf von ProcessOutput gibt MF_E_TRANSFORM_STREAM_CHANGE zurück, wie im vorherigen Abschnitt beschrieben.
    3. Der Client ruft IMFTransform::GetOutputAvailableType auf, um die aktualisierte Liste der Ausgabetypen abzurufen.
    4. Der Client ruft SetOutputType auf.

MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE is TRUE

  1. Der Client ruft IMFTransform::SetInputType auf, um den neuen Eingabetyp festzulegen.
  2. Der MFT überprüft den Eingabetyp. Wenn der Typ ungültig ist, gibt SetInputTypeMF_E_INVALIDMEDIATYPE oder einen anderen Fehlercode zurück. Andernfalls gibt SetInputType S_OK zurück.
  3. Wenn der Eingabetyp gültig ist, wertet der MFT aus, ob sich auch der Ausgabetyp ändert. Andernfalls wird das Streaming fortgesetzt, und es ist keine weitere Aktion erforderlich.
  4. Bevor sich der Ausgabetyp ändert, muss der MFT alle zwischengespeicherten Eingabebeispiele wie folgt verarbeiten:
    1. Der aktuelle Ausgabetyp wird vom MFT nicht ungültig.
    2. Der MFT erzeugt so viele Ausgaben wie möglich aus den zwischengespeicherten Eingabebeispielen.
    3. Es ist optional, ob das MFT neue Eingabebeispiele akzeptiert, während die zwischengespeicherten Beispiele verarbeitet werden. Wenn ja, verwenden die neuen Eingabebeispiele das neue Eingabeformat, sodass der MFT den Zeitpunkt nachverfolgen muss, an dem sich das Format geändert hat.
  5. Nachdem der MFT alle Beispiele verarbeitet hat, die er empfangen hat, bevor sich der Eingabetyp geändert hat, gibt IMFTransform::P rocessOutputMF_E_TRANSFORM_STREAM_CHANGE zurück.
  6. Der MFT ungültigt seinen aktuellen Ausgabetyp und aktualisiert die Liste der verfügbaren Ausgabemedientypen.
  7. Der Client handelt den neuen Ausgabetyp aus, wie zuvor beschrieben.

Asynchrone MFTs müssen den Wert TRUE für das attribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE zurückgeben. Bei Verwendung eines asynchronen MFT kann der Client davon ausgehen, dass das attribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE auf TRUE festgelegt ist.

Wenn MFT_SUPPORT_DYNAMIC_FORMAT_CHANGETRUE ist, besteht der Standard Unterschied darin, dass der Client den MFT vor dem Festlegen eines neuen Eingabetyps nicht leeren muss. Daher kann sich der Eingabetyp ändern, während die MFT an Eingabebeispielen festhält. Es ist wichtig, dass die MFT diese Beispiele nicht einfach fallen lässt. Außerdem kann sich der Ausgabetyp erst ändern, wenn der MFT alle zwischengespeicherten Daten verarbeitet.

Der vorherige Absatz gilt insbesondere für Videodecoder, die intercodierte Frames außerhalb der zeitlichen Reihenfolge empfangen und daher zwischenspeichern müssen. Wenn ein MFT keine Eingabebeispiele zwischenspeichert, ist die Entleerung im Wesentlichen ein No-Op. In diesem Fall kann der MFT MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE auf FALSE festlegen (oder das Attribut nicht festgelegt lassen).

Beachten Sie außerdem, dass von jedem MFT erwartet wird, dass Formatänderungen nach dem Leeren ordnungsgemäß verarbeitet werden. Das attribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE gibt an, ob der MFT Formatänderungen ohne Entleerung unterstützt.

Ändern im Interlace-Modus

Änderungen im Video-Interlacing-Modus sind ein Sonderfall, da sie den aktuellen Medientyp nicht ungültig machen. Stattdessen wird der Interlace-Modus für jeden Videoframe angegeben, indem Attribute für das Medienbeispiel festgelegt werden. Ein Video-MFT sollte jedes Eingabebeispiel auf das Vorhandensein dieser Flags überprüfen.

Der Interlace-Modus kann sich ändern, wenn die Felddominanz vom oberen feld zum unteren Feld wechselt oder wenn das Video zwischen progressiven und interlaced Bildern wechselt.

Weitere Informationen finden Sie unter Interlace-Flags in Beispielen.

Schreiben eines benutzerdefinierten MFT