Partager via


Horodatages et durées

Cette rubrique décrit comment Media Foundation Transforms doit gérer les horodatages.

Un MFT doit définir un horodatage et une durée aussi précis que possible sur tous les exemples de sortie. Pour un MFT simple qui prend une mémoire tampon d’entrée et la traite complètement dans une mémoire tampon de sortie, le MFT doit simplement copier l’horodatage et la durée directement à partir de l’exemple d’entrée dans l’exemple de sortie. Toutefois, de nombreuses transformations sont plus complexes que cela et peuvent nécessiter des calculs plus complexes du temps de sortie. Tous les TPF doivent respecter les règles de base suivantes :

  • Un MFT doit essayer de placer un horodatage et une durée sur tous les échantillons de sortie vidéo ou audio non compressés si un horodatage précis ou une durée est donné sur les exemples d’entrée ou peut être calculé. L’interpolation peut être nécessaire pour certains horodatages de sortie, en particulier pour les décodeurs.
  • Les horodatages et les durées des échantillons d’entrée doivent être conservés autant que possible sur les échantillons de sortie.
  • Les horodatages de sortie ou les durées peuvent ne pas correspondre à l’entrée, car le MFT retent des données ou divise la sortie en différents morceaux de taille que l’entrée. Dans ce cas, le MFT doit calculer l’horodatage de sortie à partir de l’exemple d’entrée le plus ancien qui contient des données utilisées pour créer l’exemple de sortie. Pour calculer l’horodatage de sortie, ajoutez l’horodatage d’entrée de l’exemple d’entrée approprié à la durée des données qui ont déjà été transformées à partir de cet exemple. Le deuxième exemple à la fin de cette section illustre cette idée.
  • Si les exemples d’entrée ont une durée, cette durée doit être conservée. Si un exemple d’entrée n’a pas de durée, le MFT doit calculer une durée si possible à partir de la taille de la mémoire tampon de sortie ou du taux de données donné par le type de média.
  • Les durées calculées doivent être tronquées (arrondies vers le bas), et non arrondies à l’incrément le plus proche. Le pipeline a suffisamment de marge pour gérer les durées légèrement inexactes, mais il est plus facile pour le pipeline de gérer une durée de 1% trop courte qu’une durée de 1% trop longue. Cela dit, il n’y a aucune raison de raccourcir délibérément les durées, autres que d’arrondir.

Décodeurs

Un décodeur convertit les paquets compressés en données non compressées. Étant donné que la sortie n’est pas compressée, les décodeurs ont une obligation spéciale d’obtenir les horodatages et les durées correctes. Certains formats compressés, notamment MPEG-2, n’ont pas d’horodatages sur tous les paquets d’entrée et n’ont souvent aucune durée sur un paquet. Pour ces formats, le décodeur est chargé de placer un horodatage et une durée valides sur chaque échantillon de sortie, en additionnant les durées implicites de toutes les sorties depuis le dernier exemple d’entrée horodaté.

Pour la vidéo, si la durée n’est pas disponible dans le format compressé, le décodeur doit calculer la durée comme inverse de la fréquence d’images, convertie en unités de 100 nanosecondes et arrondie vers le bas.

Pour l’audio, si la durée n’est pas disponible au format compressé, le décodeur doit calculer la durée comme inverse du taux d’échantillonnage audio multiplié par le nombre d’échantillons dans la mémoire tampon de sortie, converti en unités de 100 nanosecondes et arrondis vers le bas.

La seule fois qu’une transformation doit générer un échantillon sans horodatage, c’est-à-dire si le MFT n’a jamais reçu d’horodatage sur un échantillon d’entrée, ou s’il n’existe aucun moyen de calculer un horodatage de sortie précis à partir de l’horodatage d’entrée précédent.

Décodeurs audio

Pour les décodeurs audio, la durée de chaque échantillon de sortie est calculée à partir du taux d’échantillonnage audio et du nombre d’échantillons PCM par canal dans la mémoire tampon de sortie.

La bonne façon de calculer les horodatages de sortie dépend du fait que les exemples d’entrée contiennent des horodatages.

Si les exemples d’entrée contiennent des horodatages, le décodeur calcule les horodatages de sortie des horodatages d’entrée, comme suit :

  • Si chaque mémoire tampon d’entrée contient une ou plusieurs images compressées complètes, sans trames partielles, l’horodatage de sortie est égal à l’horodatage d’entrée, moins la latence connue du décodeur. Par exemple, un décodeur Dolby Digital (AC-3) a une latence de 256 exemples PCM. Par exemple, à un taux d’échantillonnage de 48 kHz, la latence est de 5,33 millisecondes (msec). Par conséquent, si l’horodatage d’entrée est de 1 000 msec, l’horodatage de sortie est de 1000 à 5,33 = 994,66 msec. Si la mémoire tampon d’entrée inclut plusieurs images compressées entières, le décodeur produit un exemple de sortie pour chaque image de l’exemple d’entrée. Tous les échantillons de sortie seront horodatés correctement afin qu’il n’y ait pas d’écarts.
  • Selon le format de transport, une mémoire tampon d’entrée peut contenir des images partielles. Par exemple, une mémoire tampon peut contenir une partie d’une trame à partir de la mémoire tampon d’entrée précédente, suivie d’une ou de plusieurs images complètes, suivie du début de l’image suivante. Dans ce cas, il est généralement correct de supposer que l’horodatage d’entrée correspond au premier frame qui démarre dans la mémoire tampon. (Autrement dit, une image partielle qui a démarré dans la mémoire tampon précédente n’est pas incluse dans l’horodatage de la mémoire tampon actuelle.) Calculez l’horodatage de sortie en conséquence.

Si les exemples d’entrée ne contiennent aucun horodatage :

  • Le décodeur doit générer ses propres horodatages, en définissant le premier horodatage de sortie sur zéro.
  • La durée de l’exemple est calculée à partir du nombre d’échantillons de sortie dans la mémoire tampon et du taux d’échantillonnage.
  • Les horodatages suivants sont calculés à partir de l’horodatage précédent et de la durée : horodatage actuel + durée actuelle = horodatage suivant. Il ne doit y avoir aucune lacune dans les horodatages de sortie.

Si le flux d’entrée contient initialement des horodatages, mais pour une raison quelconque, le décodeur doit continuer à générer ses propres horodatages de sortie, de sorte qu’ils sont continus et qu’il n’y a pas d’écart.

Si le flux d’entrée contient des horodatages, mais qu’il y a des lacunes dans les temps, le décodeur propage simplement ces lacunes. En d’autres termes, le décodeur ne doit pas tenter de corriger les horodatages incohérents dans le flux d’entrée.

Mélangeurs

Note

Dans Windows Vista, le pipeline Media Foundation ne prend pas en charge les mfTs avec plusieurs entrées. Les MFT à entrée multiple sont pris en charge dans Windows 7.

 

Un mélangeur prend plusieurs entrées et les mélange en une seule sortie. Si les flux d’entrée ne sont pas complètement verrouillés par débit ou sont légèrement décalés dans le temps les uns des autres, il peut y avoir des ambiguïtés quant à l’heure à définir sur la sortie. Voici quelques instructions, en fonction du type de média :

  • Audio. Au démarrage ou immédiatement après un drain ou un vidage, un mixeur audio doit attendre de produire des échantillons de sortie jusqu’à ce qu’il ait reçu un échantillon d’entrée sur tous les flux d’entrée requis. À ce stade, il doit choisir l’horodatage le plus ancien des échantillons initiaux à utiliser comme base de référence pour les horodatages de sortie. Les autres flux doivent être rembourrés avec le silence pour constituer n’importe quelle différence de temps. Si un exemple est reçu sur un flux d’entrée facultatif, il doit également être pris en compte dans le calcul. À partir de là, le MFT doit s’efforcer de produire une chaîne continue et sans interruption d’horodatages de sortie. En général, le MFT ne doit pas essayer de tenir compte d’une dérive de flux par rapport à une autre. Au lieu de cela, il doit calculer les horodatages de sortie à partir de l’horodatage de référence, du taux de sortie et des tailles de mémoire tampon. Lorsqu’un autre drain ou vidage se produit, le MFT doit réinitialiser ses horodatages de référence.

  • Vidéo. Au démarrage ou immédiatement après un drain ou un vidage, un mélangeur vidéo doit attendre de produire des échantillons de sortie jusqu’à ce qu’il ait reçu un échantillon d’entrée sur tous les flux d’entrée requis. À ce stade, il doit choisir l’horodatage le plus ancien des échantillons initiaux à utiliser comme base de référence pour les horodatages de sortie. En règle générale, il doit s’efforcer de conserver les horodatages de sortie continus et réguliers et les durées fixes, même si l’entrée n’est pas aussi régulière, si nécessaire en répétant des images d’entrée.

Encodeurs

Un encodeur convertit l’audio ou la vidéo non compressé en paquets compressés. Un encodeur doit suivre ces instructions :

  • L’encodeur doit suivre les conventions du format de sortie. Si le format n’horodat généralement pas chaque échantillon, comme dans MPEG-2, chaque échantillon de sortie n’a pas besoin d’avoir un horodatage et une durée.

  • Les horodatages d’entrée doivent être conservés dans le format de sortie, si le format comporte des champs pour les horodatages, sauf si de meilleures informations de temps sont disponibles à partir d’une autre source, telle que l’application elle-même.

Multiplexeurs

Note

Dans Windows Vista, le pipeline Media Foundation ne prend pas en charge les mfTs avec plusieurs entrées. Les MFT à entrée multiple sont pris en charge dans Windows 7.

 

Un multiplexeur combine deux flux audio ou vidéo différents dans un format entrelacé, tel qu’AVI ou MPEG-2 Transport Stream. Un multiplexeur doit suivre ces instructions :

  • Le multiplexeur doit suivre les conventions du format de sortie. Si le format n’horodat généralement pas chaque échantillon, comme dans MPEG-2, chaque échantillon de sortie n’a pas besoin d’avoir un horodatage et une durée.

  • L’horodatage doit refléter l’heure la plus ancienne qui serait placée sur n’importe quelle image qui commence dans ce paquet, ou l’heure du premier échantillon audio qui serait décodé de ce paquet. Ignorez cette directive si elle est en conflit avec les conventions du format de sortie.

Démultiplexeurs

Un démultiplexeur fractionne un format entrelacé, tel qu’AVI ou MPEG-2 Transport Stream, en flux audio et vidéo sous-jacents.

Si le format contient des informations d’horodatage spécifiques qui peuvent être utilisées pour calculer des horodatages de sortie précis en fonction des horodatages d’entrée, ces informations doivent être utilisées. Toutefois, si le format contient des heures dans une base complètement différente qui n’ont aucune relation avec les horodatages d’entrée et qu’un décalage précis de l’horodatage d’entrée ne peut pas être calculé, les temps propres au format doivent être ignorés.

Si le format n’a pas d’informations d’horodatage utilisables, le démultiplexeur doit respecter les règles suivantes :

  • Les flux de sortie non compressés doivent avoir des horodatages et des durées valides si possible, calculés à partir de l’horodatage d’entrée le plus proche.

  • Les flux de sortie compressés doivent avoir des horodatages uniquement sur le premier exemple de sortie dérivé d’un échantillon d’entrée avec un horodatage. Si l’exemple d’entrée n’a pas d’horodatage, aucun échantillon de sortie dérivé de cet exemple d’entrée ne doit avoir un horodatage. Si l’exemple d’entrée est divisé en plusieurs exemples de sortie, seul le premier échantillon de sortie doit avoir un horodatage et le reste ne doit pas avoir d’horodatage.

Exemples

Exemple 1. Supposons qu’un effet vidéo accepte toujours une image d’entrée non compressée, applique l’effet et le copie dans la sortie. Il ne conserve jamais de trames ni de mémoire tampons d’entrée. Ce MFT copie simplement l’horodatage et la durée de l’exemple d’entrée vers l’exemple de sortie, s’ils sont disponibles et ne calcule pas de temps du tout.

Exemple 2. Supposons qu’un effet audio transforme toutes les 10 millisecondes (ms) de chaque mémoire tampon d’entrée, en enregistrant les 10 ms supplémentaires à combiner avec la mémoire tampon suivante. Il obtient un flux d’échantillons dont la durée est de 50 ms. Les heures d’entrée sont indiquées dans le tableau suivant.

Échantillon Heure d’entrée Durée d’entrée Heure de sortie Durée de sortie
1 20 50 20 40
2 70 50 60 50
3 121 50 110 50
4 171 50 161 50

 

Notez l’écart de 1 ms entre la durée réelle de l’échantillon 2 et la durée implicite en fonction du prochain horodatage (121 ? 70 = 51).

Étant donné que le MFT conserve 10 ms, il génère les 40 premiers ms de l’exemple d’entrée 1 comme échantillon de sortie 1, avec un horodatage de 20 ms et une durée de 40 ms.

L’exemple de sortie 2 combine les 10 ms précédemment conservés avec 40 ms de l’exemple d’entrée 2. Cet exemple reçoit un horodatage de 60 ms (horodatage de l’exemple d’entrée précédent, 20 ms, ainsi que la durée des données déjà traitées à partir de cet échantillon, 40 ms). Il est donné une durée de 50 ms.

De même, l’exemple suivant a un horodatage de 110 ms (70 ms + 40 ms) avec une durée de 50 ms.

Le calcul suivant est plus intéressant. L’horodatage implicite de l’heure de sortie précédente et la durée seraient de 160 ms (horodatage 110 ms + durée 50 ms). Toutefois, l’horodatage de sortie est censé être calculé à partir de l’horodatage d’entrée du premier échantillon d’entrée qui chevauche l’exemple de sortie dans le temps, ainsi que la longueur des données déjà traitées à partir de cet échantillon. L’exemple d’entrée qui se chevauche le plus proche est l’exemple 4 (horodatage = 171), mais ce n’est pas le plus ancien. L’échantillon qui se chevauche le plus tôt est l’échantillon 3 (horodatage = 121). Ajout des 40 ms qui ont déjà été traitées à partir de cet exemple, le résultat est 161.

écrire un MFT personnalisé