Encodage H.264 - CPU vs GPU : Nvidia CUDA, AMD Stream, Intel MediaSDK et x264 en test

Publié le 28/04/2011 par
Envoyer Imprimer
H.264
Parfois appelé AVC (souvent dans le cadre des Blu-ray) ou MPEG4 Part 10 (nomenclature ISO), le H.264 (nomenclature ITU) est un standard de compression vidéo souvent considéré comme le format de compression le plus avancé techniquement. Il fait suite, dans la nomenclature ISO au MPEG-1 (Video CD), MPEG 2 (utilisé sur les DVD) et au MPEG 4 Part 2 (XviD).

Il s'agit d'un standard dont la spécification est ouverte (téléchargeable ici) mais dont l'utilisation est soumise à un certain nombre de brevets appartenant à différents grands noms de l'informatique, de l'électronique, des télécommunications ou divers instituts universitaires (Apple, Cisco, France Telecom, Fraunhofer, Microsoft, Mitsubishi, Panasonic, Philips, Sony ou Toshiba pour n'en citer que quelques uns, la liste complète des brevets est disponible ici). Toutes ces sociétés se sont regroupées pour créer un pool de brevets gérés par le MPEG LA. Dans le cadre qui nous intéresse (utilisation personnelle et non commerciale), aucune licence n'est due pour l'utilisation du format.

Le H.264 est aujourd'hui largement répandu, que ce soit dans les Blu-ray (ou il coexiste avec un format de Microsoft, le VC-1, qui tombe lui aussi sous le coup de brevets du MPEG LA) ou pour le fait que son décodage soit accéléré dans la majorité des matériels grand publics modernes (smartphones, tablettes, consoles de jeux, etc). Il est également amplement utilisé par les sites de vidéo en ligne, ce que l'on avait pu remarquer lors de notre test de la plateforme Brazos d'AMD ou le logiciel Flash nous posait problème en matière d'accélération vidéo.

La compression vidéo en pratique
Sans rentrer trop dans les détails, nous allons vous donner une vue d'ensemble de la manière dont fonctionne H.264, ce qui nous permettra par la suite d'évoquer les points qui posent problème pour les divers encodeurs que nous avons testés.

Une vidéo est une suite d'images, compressées les unes après les autres. H.264, comme beaucoup de formats avant lui, subdivise ces images en blocs de pixels (des carrés de 4x4 pixels à 16x16, on parle de macroblocks). Pour arriver au résultat final, un encodeur doit arriver à déterminer les informations nécessaires pour recréer une image (on parle de prédiction, il y'en a de deux types) puis compresser de la manière la plus efficace possible ces données (là encore, deux types de compressions distinctes).

Prédiction temporelle
Derrière ce nom se cache un concept excessivement simple. La prédiction temporelle part d'un constat : les images qui se suivent dans une vidéo ont de fortes chances d'avoir un lien les unes par rapport aux autres. Que ce soit un plan fixe ou l'on voit des personnages bouger, ou un plan de caméra qui se déplace pour regarder un paysage, les images qui se suivent auront (souvent) de très nombreux liens entre elles. Partant de là, un encodeur va essayer de retrouver dans l'image de destination l'emplacement des blocs par rapport à une ou plusieurs des images précédentes. Ces mouvements peuvent d'ailleurs être minuscules, jusqu'à un quart de pixel. On parle d'estimation de mouvements (motion estimation), et il s'agit d'un traitement sur lequel on peut penser que les GPU seront excessivement efficaces. Par la suite on parlera plus simplement d'inter prédiction.


Avatar, Fox Pathé Europa


Sur cette image extraite d'une scène d'Avatar (via Elecard StreamEye) ou la caméra se déplace de gauche à droite tout en avançant, on peut voir que les éléments de l'image qui sont à des niveaux de profondeurs différents (la liane à gauche, les fougères en bas, les fougères claires en haut et les lianes en haut) ont tous des mouvements distincts.

Prédiction spatiale
Encore un nom plus compliqué qu'il n'y parait, la prédiction spatiale est là pour tenter de compresser une image par rapport à elle-même. Plutôt que de chercher des ressemblances d'une image par rapport aux précédentes, la prédiction spatiale cherche les similitudes au sein de l'image en elle-même. Un concept équivalent à la compression d'images fixes (JPEG, etc…), que l'on appellera par la suite intra prédiction.

Bien entendu, au sein d'une même image, un encodeur peut choisir de mélanger les types de prédictions. Si l'on reprend la même image que précédemment (toujours via Elecard StreamEye) :


En bleu/jaune, les blocs inter prédits (prédiction temporelle, par rapport à une image précédente) et en orange/rouge, les blocs intra prédits (prédiction spatiale, à l'intérieur de l'image). Avatar, Fox Pathé Europa


Notez que même si un encodeur fait de son mieux pour être le plus précis possible dans ses prédictions, elles ne sont pas forcément parfaites. Dans chaque cas de prédiction ou l'on tente de trouver des ressemblances d'un bloc par rapport à un autre (qu'il soit dans la même image, intra prédiction, ou dans une autre, inter prédiction), il se peut que la destination ne ressemble pas exactement à la source. Pas un problème, il suffit simplement de sauver la différence ! Elle est par définition petite, vu qu'après tout, les blocs se ressemblent !

Compresser quoi, et comment ?
Nos prédictions génèrent deux types d'informations assez distinctes. D'un côté nous avons des informations précises, comme les vecteurs de mouvements utilisés dans les prédictions. Si l'encodeur s'est extenué à obtenir une précision au quart de pixel près, ce n'est pas pour que l'on compresse ces informations avec pertes. Pour ces informations essentielles, H.264 utilise un codage sans perte (codage entropique) et deux types distincts sont disponibles, le CAVLC et le CABAC. Différence entre les deux, le second est beaucoup plus gourmand, que ce soit à encoder ou à décoder. Vous vous souvenez peut être qu'il y a quelques temps, les GeForce 8800 proposaient un décodage des flux H.264 accéléré, mais partiel. Manquait à l'appel à l'époque le décodage CABAC qui n'était pas géré par le GPU (et qui fut ajouté dans les générations suivantes). CAVLC est moins gourmand en ressources, mais aussi moins efficace (son taux de compression est moindre).

Pour les types de données qui peuvent subir une (légère) perte, comme par exemple l'image résiduelle qui correspond à la différence entre les blocs sources et destination lors d'une prédiction (voir plus haut), une compression destructive est appliquée, ce que l'on appelle la quantification (quantization).

Au final, le mélange de ces données compressées (sans perte et avec pertes) constitue notre fichier vidéo H.264.

Maintenant que les grandes lignes sont posées, voyons quelques points de détails qui auront fait la différence lors de nos tests.
Vos réactions

Top articles