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 en mémoire tampon de sortie, le MFT doit simplement copier l’horodatage et la durée directement de l’exemple d’entrée vers 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 MFT doivent respecter les règles de base suivantes :

  • Un MFT doit essayer de mettre un horodatage et une durée sur tous les exemples de sortie vidéo ou audio non compressés si un horodatage ou une durée précis est donné sur les échantillons 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 ou les durées de sortie peuvent ne pas correspondre à l’entrée, car MFT retient les données ou fractionne la sortie en morceaux de taille différente de celle de 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 les 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 débit 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 des 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, autrement qu’en arrondissant.

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 corrects. Certains formats compressés, notamment MPEG-2, n’ont pas d’horodatage 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 mettre 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 l’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 dans le format compressé, le décodeur doit calculer la durée comme l’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 arrondi à la baisse.

Le seul moment où une transformation doit générer un échantillon sans horodatage est 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 méthode correcte pour calculer les horodatages de sortie dépend de la façon dont les exemples d’entrée contiennent ou non des horodatages.

Si les exemples d’entrée contiennent des horodatages, le décodeur calcule les horodatages de sortie à partir 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 1 000 – 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, de sorte qu’il n’y ait pas d’écarts.
  • Selon le format de transport, une mémoire tampon d’entrée peut contenir des trames partielles. Par exemple, une mémoire tampon peut contenir une partie d’une trame de la mémoire tampon d’entrée précédente, suivie d’une ou de plusieurs images complètes, puis 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 à la première image 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 pas d’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’échantillon 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 et de la durée précédents : 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, passe à aucun horodatage, le décodeur doit continuer à générer ses propres horodatages de sortie, de sorte qu’ils soient continus et qu’il n’y ait pas d’intervalle.

Si le flux d’entrée contient des horodatages, mais qu’il y a des intervalles dans les heures, le décodeur propage simplement ces écarts. 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

Notes

Dans Windows Vista, le pipeline Media Foundation ne prend pas en charge les MFT avec plusieurs entrées. Les mfts à 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 à taux ou sont légèrement décalés les uns des autres, il peut y avoir une ambiguïté quant à l’heure à définir sur la sortie. Voici quelques recommandations, en fonction du type de média :

  • Audio. Au démarrage ou immédiatement après un drainage ou un vidage, un mixeur audio doit attendre de produire des échantillons de sortie jusqu’à ce qu’il ait reçu un exemple 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 remplis de silence pour compenser tout écart de temps. Si un échantillon est reçu sur un flux d’entrée facultatif, il doit également être pris en compte dans le calcul. À partir de ce point, le MFT doit s’efforcer de produire une chaîne continue et ininterrompue d’horodatages de sortie. En général, le MFT ne doit pas essayer de prendre en compte la dérive d’un flux par rapport à un autre. Au lieu de cela, il doit calculer les horodatages de sortie à partir de l’horodatage de base, du taux de sortie et des tailles de mémoire tampon. Lorsqu’un autre drainage ou vidage se produit, le MFT doit réinitialiser ses horodatages de base.

  • Vidéo. Au démarrage ou immédiatement après un drainage 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 général, il doit s’efforcer de conserver des horodatages de sortie continus et réguliers et des durées fixes, même si l’entrée n’est pas aussi régulière, si nécessaire en répétant les trames d’entrée.

Encodeurs

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

  • L’encodeur doit suivre les conventions du format de sortie. Si le format n’est généralement pas horodaté chaque échantillon, comme dans MPEG-2, tous les exemples de sortie n’ont pas besoin d’un horodatage et d’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

Notes

Dans Windows Vista, le pipeline Media Foundation ne prend pas en charge les MFT avec plusieurs entrées. Les mfts à 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’est généralement pas horodaté chaque échantillon, comme dans MPEG-2, tous les exemples de sortie n’ont pas besoin d’un horodatage et d’une durée.

  • L’horodatage doit refléter l’heure la plus ancienne qui serait placée sur n’importe quelle image commençant dans ce paquet, ou l’heure du premier échantillon audio qui serait décodé à partir 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 aucun rapport 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 heures propres au format doivent être ignorées.

Si le format n’a pas d’informations d’horodatage utilisables, le démultiplexeur doit suivre 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 précédent le plus proche.

  • Les flux de sortie compressés doivent avoir des horodatages uniquement sur le premier échantillon de sortie dérivé d’un exemple d’entrée avec un horodatage. Si l’exemple d’entrée n’a pas d’horodatage, aucun exemple de sortie dérivé de cet exemple d’entrée ne doit avoir d’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 avoir aucun 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 retient jamais les images ou ne met en mémoire tampon aucune 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 n’effectue aucun calcul de temps.

Exemple 2. Supposons qu’un effet audio transforme tout sauf 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 qui ont tous une durée de 50 ms. Les heures d’entrée sont indiquées dans le tableau suivant.

Exemple 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 basée sur l’horodatage suivant (121 ? 70 = 51).

Étant donné que le MFT conserve 10 ms, il génère les 40 premières ms de l’exemple d’entrée 1 comme exemple 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 retenus avec 40 ms de l’exemple d’entrée 2. Cet exemple reçoit un horodatage de 60 ms (l’horodatage de l’exemple d’entrée précédent, 20 ms, plus la durée des données déjà traitées à partir de cet exemple, 40 ms). Une durée de 50 ms lui est attribuée.

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 et de la durée de sortie précédentes serait 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 exemple d’entrée qui chevauche l’exemple de sortie dans le temps, plus la longueur des données déjà traitées à partir de cet exemple. L’exemple d’entrée qui se chevauche le plus près est l’exemple 4 (horodatage = 171), mais il ne s’agit pas du plus ancien. L’échantillon le plus ancien qui se chevauche est l’échantillon 3 (horodatage = 121). En ajoutant les 40 ms qui ont déjà été traités à partir de cet exemple, le résultat est 161.

Écriture d’un MFT personnalisé