I. Introduction

Première couche syntaxique du MPEG, l'ES (Elementary Stream) est le signal brut en sortie de compression. Dans la réalité, on ne travaille jamais directement avec ce type de signal. il reste caché au coeur des codeurs.

Un flux élémentaire ne contient rien de plus que ce qui est nécessaire au décodeur pour s'approcher au mieux de l'image. En MPEG, la syntaxe du signal compressé est strictement définie de façon à s'assurer que les décodeurs puissent l'interpréter. Le codeur n'a pas d'autre définition que l'obligation d'émettre selon la syntaxe convenable. L'avantage de ce concept est qu'il s'approche du monde réel dans lequel il y a vraisemblablement plus de décodeurs que de codeurs. En standardisant le décodeur, on peut diminuer sensiblement le coût de sa fabrication. Inversement, le codeur peut être bien plus compliqué et plus onéreux et il peut procurer une forte amélioration de l'image sans être pénalisé par un coût excessif. Quand le codeur et le décodeur présentent des degrés de complexité différents, le système est dit "asymétrique".

L'approche MPEG donne également la possibilité d'améliorer la qualité de l'image en redéfinissant les algorithmes tout en conservant des flux de bits susceptibles d'être interprétés par des décodeurs de fabrication plus ancienne. Cette approche permet également d'utiliser des algorithmes privés de codage qui n'ont pas à entrer dans le domaine public.

II. Flux élémentaire vidéo

L'illustration ci-dessous montre la structure du flux élémentaire vidéo. L'unité fondamentale de l'information d'image est le bloc DCT qui représente un réseau de 8 x 8 pixels pouvant être Y, Cr ou Cb. La composante continue est d'abord émise avec une précision supérieure à celle des autres coefficients. Viennent ensuite les autres coefficients et le code de fin de bloc (EOB, end of bloc). Les blocs sont groupés en macroblocs qui constituent l'unité fondamentale d'une image et qui peuvent faire l'objet de la compensation de mouvement. Chaque macrobloc comporte, dans son en-tête, un vecteur de mouvement bi-dimensionnel.

structure du flux élémentaire vidéo
structure du flux élémentaire vidéo

Dans les images B, les vecteurs peuvent être vers l'avant ou l'arrière. La compensation de mouvement peut être basée sur l'image ou la trame et cela est indiqué, ainsi que l'échelle utilisée pour la re-quantification des coefficients. Le décodeur se sert des vecteurs pour prendre les informations des images précédente et suivante pour bâtir une image prédite. Les blocs subissent la transformée inverse pour produire l'image de correction qui est ajoutée à l'image prédite afin d'obtenir le signal de sortie du décodeur.

En codage 4:2:0, chaque macrobloc comporte quatre blocs Y et deux blocs de différence de couleurs. Pour rendre possible l'identification de leur contenu (Y, Cr ou Cb), les blocs sont émis dans un ordre particulier. Les macroblocs sont assemblés en tranches représentant toujours des bandes horizontales balayant l'image de la gauche vers la droite. En MPEG, les tranches peuvent commencer n'importe où et être d'une taille quelconque. En ATSC, elles doivent commencer du côté gauche de l'image.

Plusieurs tranches peuvent se placer sur la largeur de l'écran. La tranche est l'unité fondamentale de synchronisation pour les longueurs variables et le codage différentiel. Les premiers vecteurs d'une tranche sont émis intégralement tandis que les autres sont transmis en mode différentiel. Dans les images I, les premiers coefficients de composante continue de la tranche sont transmis intégralement et les coefficients de composante continue suivants le sont différentiellement. Dans les images de différence, cette technique ne se justifie pas. Si une erreur de bits se produit dans un flux élémentaire, cela créera soit une rupture dans la dé-sérialisation des symboles à longueur variable, soit une erreur des coefficients ou des vecteurs émis ultérieurement en mode différentiel. La structure en tranches permet de retrouver rapidement le bon décodage en fournissant un point de re-synchronisation dans le flux de bits. Plusieurs tranches sont groupées pour constituer une image qui est la part active d'une trame.

L'entête de l'image précise si le codage de l'image est de type I, P ou B et comporte une référence temporelle de façon que l'image soit présentée à la bonne place. Dans le cas de panoramiques ou de travellings verticaux, les vecteurs seront identiques dans tous les macroblocs. Un vecteur global peut alors être émis pour l'ensemble de l'image et les vecteurs individuels deviennent des différences de cette valeur globale. Les images peuvent être combinées pour constituer un groupe d'images (GOP, Group Of Pictures) qui commencera par une image I.

Le GOP est l'unité fondamentale d'un codage temporel. En standard MPEG, l'utilisation de GOPs est optionnelle mais elle est pratiquement nécessaire. Entre les images I peuvent être placées diverses images de type P et B. Un GOP peut être ouvert ou fermé. Dans un GOP fermé, la dernière image B n'a pas besoin de l'image I du groupe suivant pour être décodée et le flux de bits peut être coupé à la fin de ce GOP. Si on utilise des GOPs, plusieurs GOPs peuvent être combinés pour produire une séquence vidéo.

La séquence commence par un code de début de séquence, suivi par un en-tête et se termine par un code de fin de séquence. Des en-têtes supplémentaires peuvent être placés au cours de la séquence. Cette disposition permet de commencer un décodage n'importe où dans la séquence comme cela peut se produire dans la lecture de disques vidéo numériques ou de cassettes. L'en-tête de séquence définit les tailles horizontale et verticale de l'image, le rapport d'image, le format de sous-échantillonage de chroma, la fréquence d'image, le type de balayage (progressif ou entrelacé), le profil, le niveau et le débit de bits ainsi que les matrices de quantification utilisées dans les images intra-codées et inter-codées. Sans la donnée d'en-tête de séquence, un décodeur ne peut interpréter le flux de bits et c'est pourquoi les en-tête de séquence deviennent des points d'entrée où les décodeurs peuvent démarrer correctement leur opération. L'espacement entre les points d'entrée influence directement le temps que met le décodeur à opérer convenablement après une commutation d'un canal à l'autre.

III. Flux élémentaires audio

Plusieurs sortes d'audio peuvent être insérées dans un multiplex MPEG-2. Ces catégories comprennent l'audio codée selon les normes des couches 1, 2 ou 3 du MPEG ou l'ATSC. Le type de codage doit être inclus dans un indicateur que le décodeur lira de façon à faire appel au type de décodage approprié.

Le processus de compression audio est sensiblement différent de celui de la vidéo. Il ne comporte rien d'équivalent aux différents types d'image I, P ou B et les trames audio contiennent toujours la même quantité de données audio. Il n'y a également pas d'équivalence au codage bi-directionnel et les trames audio ne sont pas transmises autrement qu'en séquence naturelle.

En MPEG-2 audio, l'indicateur de l'en-tête de séquence contient le numéro de la couche utilisée pour la compression audio et le type de compression employé (stéréo par exemple), ainsi que la fréquence d'échantillonnage initiale. La séquence audio est organisée en unités d'accès (AU, Access Units) qui constitueront les trames audio codées. Si le codage AC-3 est utilisé, cette disposition est répétée dans l'en-tête de séquence. L'unité d'accès audio est une trame synchronisée en AC-3 . La trame AC-3 représente une excursion de temps équivalente à 1536 échantillons audio, ce qui fait 32 ms pour un échantillonnage à 48 KHz et 48 ms en 32 KHz.

IV. Le Packet Elementary Stream

Pour des raisons de commodité, les flux élémentaires continus transportant de l'audio ou de la vidéo en provenance de compresseurs doivent être divisés en paquets. Ces paquets sont identifiés par des en-têtes contenant des marqueurs temporels pour la synchronisation. A partir des PES, on peut créer des Flux de Programme et des Flux de Transport.

A. Paquets PES

Dans le flux élémentaire en paquets (PES), un flux élémentaire continu est divisé en paquets d'une taille adaptée à l'application. La taille peut atteindre plusieurs centaines de kilo-octets et varie en fonction de l'application. Chaque paquet est précédé par un en-tête PES. Le paquet commence par un préfixe de 24 bits (préfixe de départ) et un identificateur de flux caractérisant le contenu du paquet (audio ou vidéo), et si nécessaire, le type de codage audio.

Ces deux paramètres (préfixe de départ et identificateur de flux) constituent le code de départ identifiant le code de début du paquet. Il est important de ne pas confondre le paquet d'un PES et le paquet plus petit utilisé dans les flux de transport, ces deux éléments portant malheureusement le même nom. Comme le MPEG ne définit que le flux de transport, et non le codeur, un concepteur peut décider de fabriquer un multiplexeur convertissant les flux élémentaires en flux de transport en une seule étape. Dans ce cas, les paquets PES ne peuvent exister sous une forme identifiable, mais ils font logiquement partie intégrante de la charge du flux de transport. C'est d'ailleurs majoritairement le cas.

B. Marqueurs temporels

Après la compression, les images sont extraites de la séquence à cause du codage bi-directionnel. Elles nécessitent une quantité variable de données et sont sujettes à un retard variable en raison du multiplexage et de la transmission. Des marqueurs temporels sont périodiquement incorporés dans chaque image afin de verrouiller la synchronisation entre l'audio et la vidéo.

Un marqueur temporel est un nombre de 33 bits constitué par la valeur d'un compteur piloté par une horloge à 90 KHz. Cette horloge est le résultat de la division par 300 de l'horloge de programme à 27 MHz. Comme les temps sont régulièrement espacés à la présentation, il n'est pas indispensable d'inclure un marqueur temporel à chaque unité de présentation en sortie. Les marqueurs de temps peuvent, au lieu de cela, être interpolés par le décodeur mais ils ne doivent jamais être séparés de plus de 700 ms, que ce soit dans le flux de programme ou le flux de transport.

Les marqueurs de temps indiquent à quelle référence temporelle une unité d'accès particulière appartient. La synchronisation des mouvements de lèvres est obtenue en incorporant des marqueurs de temps simultanément dans les paquets PES vidéo et audio.

Quand un décodeur reçoit un paquet PES sélectionné, il décode chaque unité d'accès et la sauvegarde dans une mémoire tampon en RAM. Quand la valeur du code temporel de ligne atteint celle du marqueur temporel, la RAM est lue. Cette opération a deux résultats attendus. Primo, une correction de base de temps est effectivement réalisée dans chaque flux élémentaire. Secundo, les flux élémentaires vidéo et audio peuvent être synchronisés pour constituer un programme.

C. PTS/DTS

Quand on utilise un code bidirectionnel, une image doit avoir été décodée quelque temps avant d'être présentée de façon à pouvoir être utilisée comme source de données pour une image B. Bien que, par exemple, l'on puisse présenter les images dans l'ordre IBBP, elles seront transmises dans l'ordre IPBB. Il existera donc deux types de marqueurs temporels.

les marqueur temporel de décodage  (DTS) et de présentation  (PTS)
les marqueur temporel de décodage (DTS) et de présentation (PTS)

Le marqueur temporel de décodage (DTS, Decode Time Stamp) indique quand une image doit être décodée, tandis que le marqueur temporel de présentation (PTS, Presentation Time Stamp) indique quand l'image doit être présentée à la sortie du décodeur. Les images B sont décodées et présentées simultanément, c'est pourquoi ils ne comportent qu'un PTS. Quand une séquence IPBB est reçue, les images I et P doivent être décodées avant la première image B. Pendant que l'image P est en cours de décodage, l'image I est présentée en sortie de façon à pouvoir être suivie des images B.

La figure précédente démontre que, quand une unité d'accès contenant une image I est reçue, les deux marqueurs DTS et PTS doivent exister dans l'en-tête et qu'ils doivent être séparés d'au moins une période d'images. Si le codage bidirectionnel est utilisé, une image P doit venir ensuite et cette image est également dotée d'un PTS et d'un DTS, mais la séparation entre les deux marqueurs doit être de trois périodes d'images pour permettre l'intervention des images B. Ainsi, si une séquence IPBB est reçue, l'image I est retardée d'une image, l'image P de trois images et les deux images B n'ont aucun retard. La présentation devient alors IBBP.

En clair, si la structure de GOP est changée de façon à ce qu'il y ait plus d'images B insérées entre les images I et P, la différence entre le DTS et le PTS des images P sera augmentée. Les indicateurs PTS/DTS de l'en-tête du paquet sont placés de façon à indiquer la présence d'un PTS seul ou des deux marqueurs PTS et DTS. Les paquets audio peuvent contenir plusieurs unités d'accès et l'en-tête de paquet contient un PTS. Comme les paquets audio ne sont pas transmis autrement qu'en séquence naturelle, il n'y a pas de DTS dans un paquet audio.

V. Le Flux de Programme et le Flux de Transport

Les flux de programme et de transport constituent deux façons d'assembler plusieurs flux de paquets PES.

A. Enregistrement contre transmission

Pour une qualité d'image donnée, le débit de données variera selon le contenu de l'image. Un canal à débit variable donnera donc un meilleur résultat. Dans le domaine des transmissions, la plupart des canaux sont fixes et le débit global de bits est maintenu constant par l'addition d'un bourrage (données sans signification).

Dans le cas du DVD, l'utilisation de ce bourrage constitue un gaspillage d'espace de stockage. Cependant, on peut accélérer ou ralentir la vitesse d'un moyen de stockage soit physiquement soit, dans le cas d'une unité de disque, en changeant les demandes de transfert de données. Cette approche permet d'avoir un canal à débit variable sans perte de capacité. Quand un support est relu, on peut ajuster la vitesse de façon à conserver le tampon à moitié plein quel que soit le débit dynamique qui peut être dynamiquement ajusté.

Si le décodeur lit dans le tampon à une vitesse croissante, cela a tendance à le vider et le système de l'unité de disque augmentera simplement le débit d'accès pour rétablir l'équilibre. Cette technique ne peut s'utiliser que si l'audio et la vidéo ont été codées à partir de la même horloge, sinon elles se décaleront dans le temps au cours de l'enregistrement. Pour répondre à ces impératifs conflictuels, les Flux de Transport et les Flux de Programme ont été imaginés comme deux possibilités.

Un flux de programme est bien adapté à un unique programme à débit variable dans un contexte d'enregistrement (DVD); un flux de transport conviendra mieux à la transmission de programmes multiples à débit constant (Bouquet satellite et câble). Dans le cas de la transmission, le décodeur doit recréer la base de temps sous peine de devoir supporter un défaut ou un excès de charge. C'est pourquoi un flux de transport utilise comme référence une Horloge de Programme (PCR, Program Clock Reference) tandis que flux de programme n'a pas besoin d'horloge de programme.

B. Introduction aux flux de programme

Un flux de programme est un multiplex de paquets PES qui véhicule plusieurs flux élémentaires préalablement codés à partir de la même horloge-mère ou de la même référence. Le flux peut être constitué d'un flux vidéo et de ses flux audio associés ou seulement un canal de multi-programmes audio.

Le flux élémentaire vidéo est divisé en unités d'accès contenant chacune des données compressées décrivant une image. Ces images sont du type I, P ou B et chacune comporte un numéro d'unité d'accès qui indique la séquence d'affichage convenable. Une unité d'accès vidéo devient un paquet de flux de programme. En vidéo, la taille de ces paquets varie. Un paquet d'images I sera, par exemple, plus grand que celui d'une image B. Les unités d'accès de l'audionumérique sont généralement de la même taille et plusieurs d'entre elles constituent un paquet de flux de programme.

Ces paquets ne doivent pas être confondus avec les paquets de flux de transport qui sont de taille inférieure et fixes. Les limites des unités d'accès vidéo et audio coïncident rarement sur l'axe des temps mais cette absence de coïncidence n'est pas un problème car chaque limite possède sa propre structure de marqueur temporel.

C. Flux de transport

Un flux de transport est bien plus qu'un simple multiplexage de plusieurs paquets PES. Dans les flux de programme, les marqueurs temporels sont suffisants pour recréer l'axe des temps parce que l'audio et la vidéo sont verrouillées sur une référence commune. Pour télécharger des données dans un réseau éloigné, un impératif supplémentaire est nécessaire dans le décodeur pour recréer l'horloge de chaque programme. Cela impose un élément supplémentaire dans la syntaxe afin de fournir la référence d'horloge de programme (PCR, Program Clock Reference).

Le flux de transport véhicule plusieurs programmes différents utilisant chacun un débit et un facteur de compression susceptibles de varier dynamiquement, même si le débit global reste constant. Cette propriété est appelée multiplexage statistique et permet à un programme supportant des images difficiles de prendre de la bande à un programme supportant des images plus statiques.

A chaque PES vidéo peut être associé un certain nombre de PES audio et de PES de données. En dépit de cette souplesse, un décodeur doit être capable de passer d'un programme à l'autre et sélectionner convenablement les canaux de l'audio et des données. Certains programmes sont protégés et ne doivent être accessibles qu'aux personnes ayant souscrit un abonnement ou acquitté une redevance. Le flux de transport doit donc comporter l'information d'accés conditionnel (Conditional access table) pour gérer cette protection. Le flux de transport contient des informations spécifiques de programme (PSI, Program Specific Information) pour s'acquitter de ces tâches.

La couche de transport convertit les PES de données en petits paquets autonomes de longueur constante de 188 octets. Quand ces paquets parviennent au décodeur, il se peut qu'ils soient affectés d'une certaine jigue. Le multiplexage temporel est aussi une cause de retard mais son amplitude n'est pas fixe car l'allocation de bits n'est pas fixe pour chaque programme. Les marqueurs temporels constituent une partie de la solution mais à la seule condition qu'une horloge disponible soit stable. Le flux de transport doit donc comporter d'autres données permettant la reconstitution d'une horloge stable.

L'exploitation d'un équipement vidéo numérique dépend grandement de la distribution d'un système d'horloge stable pour la synchronisation. En production vidéo, le genlock est utilisé mais, sur des grandes distances, la distribution d'une horloge séparée n'est pas commode. Dans un flux de transport, les programmes peuvent provenir de différentes origines qui ne sont pas nécessairement synchrones. Par conséquent, le flux de transport doit être capable de fournir des moyens de synchro pour chacun des programmes. Cette synchro supplémentaire est appelée Référence d'Horloge de Programme (PCR, Program Clock Reference) et permet de reconstituer une référence d'horloge stable à partir de laquelle, par division, on recrée une fréquence ligne dans le décodeur de façon à pouvoir utiliser convenablement les marqueurs temporels dans chaque flux élémentaire.

On définit par conséquent un programme comme un jeu de flux élémentaires partageant la même référence temporelle. Dans un flux de transport de programme simple (SPTS, Single Program Transport Stream), il y aura un canal PCR qui recrée une horloge de programme pour l'audio et la vidéo.

D. Les Paquets

La figure suivante montre la structure d'un paquet de flux de transport. La longueur constante est de 188 octets répartis entre un en-tête et une charge utile. La figure A montre l'en-tête minimal de 4 octets. Les informations les plus importantes de cet en-tête sont:

Image non disponible

1. L'octet de synchro

Cet octet est reconnu par le décodeur de façon à pouvoir dé-sérialiser l'en-tête et la charge utile.

2. L'indicateur d'erreur de transport

Cet indicateur est validé si le système de correction d'erreur gérant la fonction de transport détecte un taux d'erreurs de bits trop élevé pour être corrigé. Il indique que le paquet est susceptible de contenir des erreurs.

3. L'identification de paquet (PID)

Ce code de 13 bits sert à faire la distinction entre les différents types de paquet. Il sera détaillé ultérieurement.

4. Le compteur de continuité

Sa valeur sur 4 bits est incrémentée par le codeur chaque fois qu'un nouveau paquet ayant le même PID est émis. Il sert à déterminer si un paquet particulier est perdu, répété ou hors séquence. L'en-tête a parfois besoin de plus d'informations et, si c'est le cas, les bits de contrôle du champ d'adaptation sont placés pour indiquer que la taille de l'en-tête est supérieure à la normale. La longueur supplémentaire de l'en-tête est alors définie par la longueur du champ d'adaptation. Quand l'en-tête est allongé, la charge utile est diminuée pour conserver une longueur constante au paquet.

5. Référence d'horloge de programme

Le codeur utilisé pour un programme particulier sera piloté par une horloge de programme à 27 Mhz. Si l'entrée provient d'une interface numérique série (SDI, Serial Digital Interface), la fréquence d'horloge est divisée par 10 pour générer l'horloge de programme. Quand plusieurs programmes parviennent à la même unité de production, il est possible qu'ils aient tous la même référence. Si l'entrée vidéo est analogique, la fréquence ligne sera multipliée par une constante dans une boucle de phase verrouillée (PLL, Phase Locked Loop) pour obtenir du 27 MHz.

Dans l'en-tête du paquet, le champ d'adaptation sert périodiquement à introduire le code PCR qui permet la génération d'une horloge verrouillée dans le décodeur. Si le codeur ou un multiplexeur change de source, il peut se produire une discontinuité dans la référence PCR. Le compteur de continuité peut également être perturbé. Cette situation est gérée par l'indicateur de discontinuité qui avertit le décodeur de la possibilité d'une perturbation. Sinon, la discontinuité créera une condition d'erreur.

La figure suivante montre comment le décodeur utilise la PCR pour recréer une version déportée de l'horloge 27 MHz pour chaque programme.

Image non disponible

L'horloge du codeur pilote un compteur binaire permanent dont les valeurs sont périodiquement lues et placées dans le champ d'adaptation de l'en-tête en tant que PCR. Comme le marqueur de temps de présentation (PTS, Presentation Time Stamp), le PCR comporte 33 bits et représente une valeur du compteur piloté par une horloge à 90 Khz.

Chaque codeur génère des paquets ayant une identification de paquet (PID) différente. Le décodeur reconnaît les paquets associés à l'identification correspondant au programme sélectionné et ignore les autres. Dans le décodeur, un oscillateur local (VCO) génère une horloge nominale à 27 Mhz qui pilote le compteur PCR. La valeur du PCR local est comparée au PCR de l'en-tête du paquet et la différence constitue l'erreur de phase PCR. Cette erreur est filtrée pour piloter le VCO afin que le PCR local se verrouille sur le PCR de l'en-tête.

Un puissant filtrage du VCO évite au VCO d'être modulé par une jigue éventuelle dans la transmission du PCR. L'indicateur de discontinuité réinitialise le compteur local et peut être éventuellement utilisé pour atténuer le filtrage afin d'accélérer le verrouillage du compteur local sur la nouvelle valeur temporelle.

Le MPEG implique que le PCR soit émis au moins 10 fois par seconde tandis que la Diffusion Vidéo Numérique (DVB, Digital Video Broadcasting) spécifie une cadence minimale de 25 PCR par seconde.

6. Identification de paquet (PID)

Dans l'en-tête du paquet de transport, un champ de 13 bits contient le code d'identification de paquet (PID). Le PID est utilisé par le décodeur pour faire la distinction entre les paquets contenant divers types d'information. Le débit de bits du flux de transport doit être constant, bien que la somme des débits de tous les différents flux puisse varier. Cet impératif est réalisé par l'adjonction de bits nuls (contenant des " 0 ") dans la partie utile. Si le débit utile diminue, plus de paquets nuls sont ajoutés. Les paquets nuls ont toujours la même identification qui est 8191, soit 13 " 1 ".

Dans un flux de transport donné, tous les paquets appartenant à un flux élémentaire donné comportent la même identification. Les paquets appartenant à un autre flux élémentaire auront une identification différente. Le dé-multiplexeur peut aisément sélectionner toutes les données d'un flux élémentaire donné en acceptant seulement les paquets porteurs de l'identification convenable. On peut sélectionner les données d'un programme complet grâce aux PIDs de l'audio, la vidéo et les données de télétexte. Le dé-multiplexeur ne peut convenablement sélectionner les paquets que s'il peut les associer au flux de transport auquel ils appartiennent. Il ne peut exécuter cette tâche que s'il connaît les PIDs. C'est le rôle de l'information spécifique de programme (PSI, Program Specific Information).