Le problème des résumés est de faire qqchose de concis et clair. Si j’avais 10 pages à faire, ce serait facile, y a pleins de trucs à raconter sur l’H.264. Mais faire une introduction très générale (les lecteurs sont supposés ne pas connaitre l’H.264), puis parler d’une des techniques les plus pointus du-dit H.264 (CAVLC: Context-Adaptive Variable Length Coding, Codage contextuel à longueur variable), c’est très … rigolo.
L’H.264/AVC, également connu sous la dénomination MPEG-4 part 10, est le codec vidéo le plus abouti à l’heure actuelle. Il s’appuie néanmoins sur les techniques de compression déjà utilisées dans le MPEG-2 et le MPEG-4 part 2. Ainsi, les deux principales techniques de compression sont la prédiction spatiale et la prédiction temporelle.
Une séquence vidéo est une succession d’image. Chaque image est composé de macroblock. Un macroblock est un carré de 16pixels de côté.
La compression d’un MB se fait en 3 étapes: - prédiction du macroblock - calcul du macroblock de différence (macroblock de départ - macroblock prédit) - transformée, quantification et encodage du macroblock de différence
Il y a 3 modes de prédiction possible pour un macroblock:
- la prédiction I (spatiale), les mbs gauche, supérieur et supérieur droit sont utilisés pour obtenir une prédiction du mb.
- la prédiction P (temporelle), un mb d’une image préalablement décodée sert de prédiction
- la prédiction B (temporelle), deux mbs fusionnés pondérés d’images différentes préalablement décodées servent de prédictions
Une image est dite de type I si tous ces macroblocks sont codés à partir d’une prédiction de type I. Une image est dite de type P (resp. B) si au moins un de ses blocks est codé à partir d’ue prédiction de type P (resp. B).
Une fois un macroblock transformé (via une DCT) et quantifié, les coefficients QDCT sont réorganisés puis encodés. Il en résulte une séquence binaire de la forme {level_prefix.level_suffix}*
Au début du décodage d’un macroblock, une variable suffixLength est initialisé à zéro. Pour chaque level à décoder, le mot level_prefix est reconnu automatiquement. Le mot level_suffix sera reconnu comme étant les suffixLength bits suivant le mot level_prefix. Le level est obtenu par le calcul: level = (level_prefix << suffixLength) + level_suffix. Si la valeur décodée dépasse un certain seuil (3 << (suffixLength - 1)), la variable suffixLength sera incrémenté d’une unité pour le décodage du level suivant.
Ainsi, le nombre de bits lus pour le décodage de chaque bits est directement relié à la valeur précédemment décodée.
Un problème apparait donc si la chaine de bit cryptée provoque chez le décodeur un nombre excessif (ou insuffisant) de lecture de bits. Le décodeur sera alors décalé sur le flot de bits, et le décodage deviendra totalement hasardeux. Il faut donc garantir que la chaine cryptée conservera le même nombre de bits lus comme “bits de coefficients”
Une solution proposée est donc une encryption qui garantisse l’intégrité vis-à-vis du décodeur.