Gestion des modifications de flux

Cette rubrique décrit comment une transformation Media Foundation (MFT) doit gérer les modifications de format pendant la diffusion en continu.

Important

Cette rubrique ne s’applique pas aux encodeurs. Les encodeurs ne doivent pas propager les modifications de format comme décrit dans cette rubrique. Les encodeurs doivent accepter uniquement un type d’entrée qui correspond au type de sortie actuellement configuré.

 

Vue d’ensemble des modifications de format

En règle générale, il existe deux raisons pour lesquelles un format peut changer pendant la diffusion en continu.

  • Le client peut basculer vers un flux avec un nouveau format. Par exemple, dans la télévision numérique, cela peut se produire en raison d’un changement de canal.
  • Dans certains formats vidéo, tels que H.264, le flux de bits peut signaler une modification de format. Ces modifications peuvent inclure des changements dans la domination des champs, la résolution vidéo ou le rapport d’aspect pixel.

Si le type d’encodage change, le client peut avoir besoin de supprimer le MFT du pipeline et de le remplacer par un autre MFT. (Par exemple, le client peut avoir besoin d’échanger dans un nouveau décodeur.) Cette rubrique ne couvre pas cette situation. Cette rubrique couvre uniquement le cas où le MFT actuel peut gérer le nouveau format.

Si le format change, le MFT peut nécessiter un nouveau type d’entrée, un nouveau type de sortie ou les deux.

  • Les modifications apportées au type d’entrée sont lancées par le client. Un MFT ne change jamais son propre type d’entrée.
  • Les modifications apportées au type de sortie sont lancées par le MFT. Le MFT signale qu’il nécessite un nouveau type de sortie et que le client négocie le nouveau type de sortie avec le MFT.

Ainsi, trois cas distincts sont possibles :

  • Le client définit un nouveau type d’entrée. MFT consomme le nouveau format, sans modification du type de sortie.
  • Le client définit un nouveau type d’entrée, et cela déclenche une modification dans le type de sortie.
  • Le type d’entrée ne change pas, mais MFT détecte une modification de format dans le flux de bits, ce qui nécessite un nouveau type de sortie.

Implémentation des modifications de format

Le reste de cette rubrique décrit comment le client doit traiter une modification de format et comment implémenter des modifications de format dans un MFT.

Type de sortie

Tout MFT peut lancer une modification de son type de sortie, comme suit :

  1. Le client appelle IMFTransform::P rocessOutput. Le MFT répond comme suit :
    1. Le MFT ne produit pas d’exemple de sortie dans ProcessOutput.
    2. MFT définit l’indicateur MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE dans le membre dwStatus de la structure MFT_OUTPUT_DATA_BUFFER .
    3. La méthode ProcessOutput retourne le code d’erreur MF_E_TRANSFORM_STREAM_CHANGE.
  2. Le client appelle IMFTransform::GetOutputAvailableType. Cette méthode retourne un ensemble mis à jour de types de sortie.
  3. Le client appelle SetOutputType pour définir un nouveau type de sortie.
  4. Le client reprend l’appel de ProcessInputProcessOutput/.

Type d’entrée

Les modifications apportées au type d’entrée sont lancées par le client, jamais par le MFT. Si le type d’entrée change, il peut déclencher une modification du type de sortie.

La séquence exacte d’événements dépend de la valeur de l’attribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE .

Valeur Description
FALSE Avant que le client ne définit un nouveau type d’entrée, il doit drainer le MFT.
TRUE Le client peut définir un nouveau type d’entrée sans drainer le MFT.

 

Un MFT expose cet attribut par le biais de sa méthode IMFTransform::GetAttributes . La valeur par défaut de cet attribut est FALSE ; si MFT ne définit pas l’attribut, traitez la valeur comme FALSE.

MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE est FALSE

  1. Le client envoie le message MFT_MESSAGE_COMMAND_DRAIN .
  2. Le client vide le MFT en appelant IMFTransform::P rocessOutput jusqu’à ce que ProcessOutput retourne MF_E_TRANSFORM_NEED_MORE_INPUT.
  3. Le client appelle IMFTransform::SetInputType pour définir le nouveau type d’entrée.
  4. MFT valide le type d’entrée. Si le type n’est pas valide, SetInputType retourne MF_E_INVALIDMEDIATYPE ou un autre code d’erreur. Sinon, SetInputType retourne S_OK.
  5. En supposant que le type d’entrée est valide, MFT évalue si le type de sortie change également. Si ce n’est pas le cas, la diffusion en continu continue et aucune action supplémentaire n’est nécessaire.
  6. Si le type de sortie change :
    1. MFT invalide son type de média de sortie actuel et met à jour la liste des types de supports de sortie disponibles.
    2. L’appel suivant à ProcessOutput retourne MF_E_TRANSFORM_STREAM_CHANGE, comme décrit dans la section précédente.
    3. Le client appelle IMFTransform::GetOutputAvailableType pour obtenir la liste mise à jour des types de sortie.
    4. Le client appelle SetOutputType.

MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE est TRUE

  1. Le client appelle IMFTransform::SetInputType pour définir le nouveau type d’entrée.
  2. MFT valide le type d’entrée. Si le type n’est pas valide, SetInputType retourne MF_E_INVALIDMEDIATYPE ou un autre code d’erreur. Sinon, SetInputType retourne S_OK.
  3. En supposant que le type d’entrée est valide, MFT évalue si le type de sortie change également. Si ce n’est pas le cas, la diffusion en continu continue et aucune action supplémentaire n’est nécessaire.
  4. Avant que le type de sortie ne change, le MFT doit traiter tous les exemples d’entrée mis en cache, comme suit :
    1. Le MFT n’invalide pas son type de sortie actuel.
    2. Le MFT produit autant de sortie que possible à partir des exemples d’entrée mis en cache.
    3. Il est facultatif si le MFT accepte de nouveaux exemples d’entrée pendant qu’il traite les exemples mis en cache. Dans ce cas, les nouveaux exemples d’entrée utilisent le nouveau format d’entrée, de sorte que MFT doit suivre le point lorsque le format a changé.
  5. Une fois que le MFT traite tous les échantillons qu’il a reçus avant la modification du type d’entrée, le IMFTransform::P rocessOutput retourne MF_E_TRANSFORM_STREAM_CHANGE.
  6. MFT invalide son type de sortie actuel et met à jour la liste des types de supports de sortie disponibles.
  7. Le client négocie le nouveau type de sortie, comme décrit précédemment.

Les mfT asynchrones doivent retourner la valeur TRUE pour l’attribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE . Lorsque vous utilisez un MFT asynchrone, le client peut supposer que l’attribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE est défini sur TRUE.

Lorsque MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE est TRUE, la principale différence est que le client n’est pas nécessaire pour vider le MFT avant de définir un nouveau type d’entrée. Par conséquent, le type d’entrée peut changer pendant que le MFT est en attente d’exemples d’entrée. Il est important que le MFT ne supprime pas simplement ces échantillons. En outre, le type de sortie ne peut pas changer tant que MFT ne traite pas toutes ses données mises en cache.

Le paragraphe précédent s’applique particulièrement aux décodeurs vidéo, qui peuvent recevoir des images codées en dehors de l’ordre temporel, et doivent donc les mettre en cache. Si un MFT ne met pas en cache des échantillons d’entrée, le drain est essentiellement un objet non op. Dans ce cas, le MFT peut définir MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE sur FALSE (ou laisser l’attribut non défini).

Notez également que chaque MFT est censé gérer correctement les modifications de format après avoir été vidées. L’attribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE indique si MFT prend en charge les modifications de format sans drainer.

Modification en mode interlacé

Les modifications apportées au mode d’interlacement vidéo sont un cas spécial, car elles n’invalident pas le type de média actuel. Au lieu de cela, le mode interlacé est spécifié pour chaque image vidéo en définissant des attributs sur l’exemple multimédia. Une vidéo MFT doit vérifier chaque exemple d’entrée pour la présence de ces indicateurs.

Le mode interlacé peut changer lorsque la domination du champ passe du champ supérieur au champ inférieur ou lorsque la vidéo bascule entre les images progressives et interlacées.

Pour plus d’informations, consultez Indicateurs d’interlace sur les exemples.

Écriture d’un MFT personnalisé