Behandeln von Datenstromänderungen

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

Wichtig

Dieses Thema gilt nicht für Encoder. Encoder sollten keine Formatänderungen verteilen, 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, aus denen sich ein Format während des Streamings ändern kann.

  • Der Client kann mit einem neuen Format zu einem Datenstrom wechseln. Beispielsweise kann dies im digitalen Fernsehen aufgrund einer Kanaländerung auftreten.
  • In einigen Videoformaten, z. B. H.264, kann der Bitstream eine Formatänderung signalisieren. Solche Änderungen können Änderungen an der Felddominanz, der Videoauflösung oder dem Pixel-Seitenverhältnis enthalten.

Wenn sich der Codierungstyp ändert, muss der Client möglicherweise die MFT aus der Pipeline entfernen und durch einen anderen MFT ersetzen. (Beispielsweise muss der Client möglicherweise in einem 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 niemals seinen eigenen Eingabetyp.
  • Änderungen am Ausgabetyp werden vom MFT initiiert. Die MFT signalisiert, dass ein neuer Ausgabetyp erforderlich ist und der Client den neuen Ausgabetyp mit dem MFT aushandelt.

Daher sind drei verschiedene Fälle möglich:

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

Implementieren von Formatänderungen

Der Rest dieses Themas beschreibt, wie der Client eine Formatänderung verarbeiten soll und wie Formatänderungen in einem MFT implementiert werden.

Ausgabetyp

Jede MFT kann eine Änderung an seinem Ausgabetyp initiieren, wie folgt:

  1. Der Client ruft IMFTransform::P rocessOutput auf. Die MFT antwortet wie folgt:
    1. Die MFT erzeugt kein Ausgabebeispiel in ProcessOutput.
    2. Die MFT legt das MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE Kennzeichen 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 ProcessInputProcessOutput/ fort.

Eingabetyp

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

Die genaue Abfolge von Ereignissen hängt vom Wert des MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE-Attributs ab.

Wert BESCHREIBUNG
FALSE Bevor der Client einen neuen Eingabetyp festlegt, muss er den MFT entwässern.
TRUE Der Client kann einen neuen Eingabetyp festlegen, ohne die MFT zu entwässern.

 

Ein MFT macht dieses Attribut über seine IMFTransform::GetAttributes-Methode verfügbar. Der Standardwert dieses Attributs ist FALSE; Wenn der MFT das Attribut nicht festgelegt hat, 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 entwässert den 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. Die 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, wird vom MFT ausgewertet, ob sich der Ausgabetyp ebenfalls ändert. Wenn nicht, 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 ist WAHR

  1. Der Client ruft IMFTransform::SetInputType auf, um den neuen Eingabetyp festzulegen.
  2. Die 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, wird vom MFT ausgewertet, ob sich der Ausgabetyp ebenfalls ändert. Wenn nicht, wird das Streaming fortgesetzt, und es ist keine weitere Aktion erforderlich.
  4. Bevor sich der Ausgabetyp ändert, muss die MFT alle zwischengespeicherten Eingabebeispiele wie folgt verarbeiten:
    1. Der MFT hat seinen aktuellen Ausgabetyp nicht ungültig.
    2. Die MFT erzeugt so viel Ausgabe wie aus den zwischengespeicherten Eingabebeispielen.
    3. Es ist optional, ob die MFT neue Eingabebeispiele akzeptiert, während sie die zwischengespeicherten Beispiele verarbeitet. Wenn ja, verwenden die neuen Eingabebeispiele das neue Eingabeformat, sodass der MFT den Punkt nachverfolgen muss, an dem das Format geändert wurde.
  5. Nachdem die MFT alle von ihr empfangenen Beispiele verarbeitet hat, bevor der Eingabetyp geändert wurde, gibt der 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 verhandelt den neuen Ausgabetyp, wie zuvor beschrieben.

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

Wenn MFT_SUPPORT_DYNAMIC_FORMAT_CHANGEWAHR ist, besteht der Hauptunterschied darin, dass der Client nicht zum Entwässern des MFT erforderlich ist, bevor ein neuer Eingabetyp festgelegt wird. Daher kann sich der Eingabetyp ändern, während die MFT an Eingabebeispielen hält. Es ist wichtig, dass die MFT diese Beispiele nicht einfach abgibt. Außerdem kann sich der Ausgabetyp erst ändern, wenn der MFT alle zwischengespeicherten Daten verarbeitet.

Der vorherige Absatz gilt insbesondere für Video-Decoder, die intercodierte Frames außerhalb der zeitlichen Reihenfolge empfangen und daher zwischengespeichert werden müssen. Wenn ein MFT keine Eingabebeispiele zwischenspeichert, ist die Entwässerung im Wesentlichen ein No-Op. In diesem Fall kann der MFT MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE auf FALSE festlegen (oder das Attribut unet lassen).

Beachten Sie außerdem, dass jede MFT die Formatierungsänderungen nach dem Ablassen ordnungsgemäß verarbeiten soll. Das MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE-Attribut gibt an, ob die MFT Formatänderungen unterstützt, ohne zu entwässern.

Ä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 die Anwesenheit dieser Flags überprüfen.

Der Interlace-Modus kann sich ändern, wenn die Felddominanz von top-field zu bottom-field wechselt oder wenn das Video zwischen progressiven und interlaced Bildern wechselt.

Weitere Informationen finden Sie unter "Interlace Flags" in Beispielen.

Schreiben eines benutzerdefinierten MFT