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 binaire peut signaler un changement de format. Ces modifications peuvent inclure des modifications de la dominance des champs, de la résolution vidéo ou des proportions de pixels.

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 traite uniquement du 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 initiées par le client. Un MFT ne change jamais son propre type d’entrée.
  • Les modifications apportées au type de sortie sont initiées par le MFT. Le MFT signale qu’il nécessite un nouveau type de sortie, et 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. Le MFT utilise le nouveau format, sans modification de son type de sortie.
  • Le client définit un nouveau type d’entrée, ce qui déclenche une modification du type de sortie.
  • Le type d’entrée ne change pas, mais le MFT détecte un changement de format dans le flux binaire, 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 les modifications de format dans un MFT.

Type de sortie

Tout MFT peut initier 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 ProcessInput/ProcessOutput.

Type d’entrée

Les modifications apportées au type d’entrée sont initié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 des événements dépend de la valeur de l’attribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE .

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

 

Un MFT expose cet attribut via 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 a la valeur FALSE

  1. Le client envoie le message MFT_MESSAGE_COMMAND_DRAIN .
  2. Le client draine 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. Le 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, le MFT évalue si le type de sortie change également. Si ce n’est pas le cas, le streaming continue et aucune action supplémentaire n’est requise.
  6. Si le type de sortie change :
    1. Le 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 a la valeur TRUE

  1. Le client appelle IMFTransform::SetInputType pour définir le nouveau type d’entrée.
  2. Le 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, le MFT évalue si le type de sortie change également. Si ce n’est pas le cas, le streaming continue et aucune action supplémentaire n’est requise.
  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. 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 que MFT accepte de nouveaux exemples d’entrée pendant qu’il traite les exemples mis en cache. Si c’est le cas, les nouveaux exemples d’entrée utilisent le nouveau format d’entrée, de sorte que le MFT doit effectuer le suivi du point de modification du format.
  5. Une fois que le MFT a traite tous les échantillons qu’il a reçus avant que le type d’entrée ne change, imfTransform::P rocessOutput retourne MF_E_TRANSFORM_STREAM_CHANGE.
  6. Le 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 objets MFT asynchrones doivent retourner la valeur TRUE pour l’attribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE . Lors de l’utilisation d’un MFT asynchrone, le client peut supposer que l’attribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE a la valeur TRUE.

Lorsque MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE a la valeur TRUE, la différence main est que le client n’a pas besoin de 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 conserve des 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 le MFT ne traite pas toutes ses données mises en cache.

Le paragraphe précédent s’applique en particulier aux décodeurs vidéo, qui peuvent recevoir des trames codées en dehors de l’ordre temporel et doivent donc les mettre en cache. Si un MFT ne met pas en cache les échantillons d’entrée, le drainage est essentiellement une opération sans opération. Dans ce cas, la 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é. L’attribut MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE indique si MFT prend en charge les modifications de format sans drainage.

Modification du mode entrelacé

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

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

Pour plus d’informations, consultez Indicateurs entrelacs dans les exemples.

Écriture d’un MFT personnalisé