FR 2899758 A1 20071012 FR 0651264 A 20060407 Procédé et dispositif de codage de données en un flux scalable L'invention concerne le codage, la transmission et le décodage de signaux vidéo scalables. L'invention propose d'améliorer les algorithmes existants d'extraction et de décodage vidéo scalables, en particulier celui de MPEG4-SVC, pour le décodage à un débit et une résolution spatiotemporelle donnée. Plus particulièrement, on se positionne dans un contexte de codage vidéo scalable basé sur une décomposition temporelle multiple avec compensation en mouvement et représentation par couches avec prédiction inter-couches. Actuellement, la plupart des codeurs vidéo génèrent un seul flux compressé correspondant à l'intégralité de la séquence codée. Si plusieurs clients souhaitent exploiter le fichier compressé pour décodage et visualisation, ils devront pour cela télécharger (ou "streamer") le fichier compressé complet. Or, dans un système hétérogène (e.g. Internet), tous les clients ne disposent pas du même type d'accès aux données : la bande passante, les capacités de traitement et les écrans des terminaux des clients peuvent être très différents. Par exemple, sur un réseau Internet, l'un des clients pourra disposer d'un débit ADSL à 1024 kb/s et d'un PC puissant alors que l'autre ne bénéficiera que d'un accès modem et d'un PDA. Une solution à ce problème consiste à générer plusieurs flux compressés correspondant à différents débits/résolutions de la séquence vidéo : cette solution est dite "simulcast". Par exemple, une même séquence vidéo pourra être codée deux fois pour générer un flux A à 256kb/s en résolution QCIF pour le PDA et un flux à B à 512kb/s et résolution super VGA pour le PC. Avec cette solution, si l'on ne connaît pas a priori la cible (ou si les deux types de cibles sont présentes sur le réseau), il faut transporter les deux flux A et B pour un débit total de A+B (768 kb/s). On voit donc que cette solution est sous-optimale en termes d'efficacité de la représentation puisque les mêmes informations (celles correspondant au flux de plus faible débit et résolution A) sont codées plusieurs fois (dans le flux A et dans le flux B). De plus, cette méthode suppose de connaître à l'avance les caractéristiques de tous les clients potentiels. Plus récemment sont apparus des algorithmes de codage vidéo dit scalables, c'est-à-dire à qualité adaptable et résolution spatio-temporelle variable, pour lesquels le codeur génère un flux compressé en plusieurs couches, chacune de ces couches étant emboîtée dans la couche de niveau supérieur. Ainsi le flux A' à 256 kb/s servira-t-il dans l'exemple précédent au décodage de la vidéo pour le PDA, mais aussi pour le PC, le flux de résolution supérieur B' à 512 kb/s étant complémentaire de celui-ci. En d'autres termes, le débit nécessaire pour transporter les deux flux est ici B' (512kb/s). Cette solution est plus optimale en termes d'efficacité de la représentation que la solution précédente. La première génération de ces algorithmes scalables (cf travaux de MPEG-4, notamment avec les technologies de type FGS û Fine Grain Scalability) ne s'est pas imposée en raison d'une sous-optimalité de compression : le flux compressé scalable (B' dans notre exemple) est généralement inférieur en qualité au même flux compressé non scalable (i.e. dans notre exemple : Q(B') Plus récemment, de nouveaux algorithmes se sont imposés pour répondre à ce problème d'efficacité. Ils sont aujourd'hui en cours d'adoption par la norme MPEG, dans le contexte du groupe de travail MPEG4. De tels codeurs sont très utiles pour toutes les applications pour lesquelles la 30 génération d'un seul flux compressé, organisé en plusieurs couches de scalabilité, peut servir à plusieurs clients ayant des terminaux de caractéristiques différentes. On peut citer par exemple : - service de VOD (terminaux cibles : UMTS, PC ADSL, TV ADSL...), mobilité de session (reprise sur un PDA d'une session vidéo commencée sur TV; sur un mobile UMTS d'une session commencée sur GPRS), - continuité de session (partage de la bande passante avec une nouvelle application), - TV haute définition (encodage unique pour servir des clients SD û Standard Definition et HD û High Definition), - visioconférence (encodage unique pour des clients UMTS/Internet). Le JSVM MPEG est décrit dans le document "Joint Scalable Video Model JSVM-3", J. Reichel, M. Wien, H. Schwarz, JVTP202, July 2005, Poznan. Le modèle qui a été retenu récemment par MPEG-4 SVC est basé sur un codeur scalable basé sur des solutions de type AVC. Il s'agit d'un codeur vidéo scalable avec prédiction inter-couches et décomposition temporelle par prédiction bidirectionnelle (images B). Cette nouvelle norme sera capable de fournir des flux scalables à grain moyen dans les dimensions temporelle, spatiale, et en qualité. L'invention est une amélioration du codeur/décodeur du JSVM selon la technique antérieure. Le but de l'invention est de savoir de façon simple, c'est-à-dire en ne regardant que les informations de haut niveau (i.e. situées dans les entêtes des NAL unit), si une NAL de réhaussement en qualité est codée en mode progressif ou non (i.e. peut être tronquée lors d'une opération d'adaptation d'un flux vidéo). En effet, il est possible de coder les réhaussements en qualité SNR selon deux approches : codage par quantification progressive (i..e. en utilisant des types de slice dénommées PR) ou codage par quantification successive des résidus (i.e. en utilisant des types de slices dénommées El, EP ou EB). L'approche de codage par quantification progressive offre l'avantage de pouvoir tronquer les NAL units codant cette information et ainsi de proposer une évolution graduelle de la qualité SNR. La seconde approche de codage est moins intéressante pour une opération de troncature, puisque amenant à une réhaussement en qualité non uniforme sur l'image. Il est important pour un décodeur ou un extracteur de savoir sur quel type de NAL il travaille et s'il peut ou non faire une troncature. Actuellement, le type de codage d'un réhaussement en qualité SNR est signalé via l'élément syntaxique "slice_type" codé dans le slice_header des NAL units SVC. Toutefois les informations contenues dans le slice_header sont difficilement lisibles par un simple parseur de flux, puisque codées via des mots de codes à longueurs variables. Seules les informations de haut niveau (i.e. accessible via les entêtes de NAL unit) sont simplement accessible pour un parseur. L'invention propose une méthode de signalisation du type de codage utilisé pour un réhaussement en qualité SNR proposé par une NAL unit SVC. Plus précisément, on indiquera pour chaque NAL de ce type, si elle peut être tronquée ou non. Cette signalisation du type de codage permet alors pour un parseur de haut niveau ayant une puissance de traitement disponible limitée, de pouvoir identifier simplement si un mécanisme de troncature d'information peut être appliqué sur la NAL unit considérée. Il en résulte l'insertion dans les informations d'entête d'une NAL unit SVC d'un bit définissant si cette NAL unit peut être tronquée ou non. Selon une caractéristique préférée, l'indication de la troncature d'une NAL unit SVC est réalisée en utilisant le bit associé à l'élément syntaxe "reserved_bit" disponible dans l'entête de NAL SVC. Selon une autre caractéristique préférée, le marquage de troncature n'est pas lié directement au type de slice utilisé. L'inventin concerne aussi un dispositif de codage de données en un flux scalable organisé en unités, caractérisé en ce qu'il comporte des moyens pour indiquer dans l'entête d'une NAL unit SVC si cette NAL peut être tronquée ou non lors d'une opération d'adaptation du flux scalable considéré. L'invention concerne également un produit programme d'ordinateur 15 comprenant des instructions de programme pour l'exécution du procédé de codage précédent. L'invention concerne aussi un signal comportant des données en un flux scalable organisé en unités, caractérisé en ce qu'il comporte une information 20 dans l'entête d'une NAL unit SVC pour indiquer si cette NAL peut être tronquée ou non lors d'une opération d'adaptation du flux scalable considéré. D'autres caractéristiques et avantages de l'invention apparaîtront à l'aide de la description qui suit faite en regard de dessins annexés qui représentent : 25 - la figure 1 représente un codeur scalable basé sur des solutions de type AVC, - la figure 2 représente la structure générale du flux SVC, - la figure 3 représente le format des en-têtes de NAL dans la version actuelle de SVC, 30 - la figure 4 représente une variante des entêtes de NAL SVC, - la figure 5 illustre la syntaxe associée à une entête d'une NAL unit SVC, - la figure 6 illustre la syntaxe associée à une entête d'une NAL SVC selon l'invention. Le codeur scalable basé sur une solution de type AVC est schématisé à la figure 1. Les caractéristiques principales de ce codeur sont les suivantes : - solution pyramidale avec sous-échantillonnage dyadique des composantes d'entrée ; - décomposition temporelle par images B à chaque niveau ; -codage des couches successives en mode CGS ou en mode FGS. Le mode FGS Codage par quantification progressive est caractérisé par : - Codage d'une version basse résolution de la séquence vidéo jusqu'à un débit donné R_r0_max qui correspond au débit maximum décodable pour la résolution spatiale basse r0. (ce niveau de base est compatible AVC). - Codage des niveaux supérieurs par soustraction du niveau précédent reconstruit et sur échantillonné et codage des résidus sous forme : o D'un niveau de base o D'un ou plusieurs niveaux de réhaussement obtenus par codage multipasse de plans de bits (par la suite : FGS). Le résidu de prédiction est codé jusqu'à un débit R_ri_max qui correspond au débit maximum décodable pour la résolution ri. La technique de codage progressif utilisée dans le JSVM est la quantification progressive. Cette technique consiste à quantifier avec un premier pas de quantification grossier les différents coefficients. Puis, les différents coefficients sont reconstruits et la différence entre la valeur du coefficient et la valeur quantifiée est calculée. Cette différence est ensuite quantifiée avec un deuxième pas de quantification plus fin. On procède ainsi itérativement avec un certain nombre de pas de quantification. A chaque pas de quantification, les coefficients quantifiés sont codés en 30 deux passes. - une passe de signifiance qui code les nouveaux coefficients signifiants, ceux qui n'ont pas été codés au pas de quantification précédent. Pour ces nouveaux coefficients, on code le signe du coefficient et sa valeur. - une passe de raffinement qui raffine/code les coefficients qui étaient déjà signifiants au pas de quantification précédent. Pour ces coefficients, on code la valeur +1 ou -1 de raffinement. Dans ce mode de codage progressif, les coefficients sont en plus parcourus dans un ordre particulier à travers les blocs constituants une image afin que, lors d'une troncature du paquet d'information rattaché à ce réhaussement en qualité SNR, l'incrément en qualité soit à peu près bien réparti sur l'image. Pour ce faire, le codage des coefficients se fait en plusieurs passes sur les différents blocs constituant une image ; à chaque passe de codage on ne code qu'un nombre limité de coefficient pour chaque bloc. Ce type de NALs peut être tronquée avant décodage. Le mode CGS (Codage par couches) est caractérisé par : - Niveau de base codé à une qualité 0 (layer 0, avc QPO) ; - Niveaux de réhaussement codé à une qualité supérieure (QPi) ; - Raffinement de l'information de texture et mouvement ; - Différence entre les couches et codage entropique. Ce type de NALs ne peut pas être tronquée avant décodage. 25 On détaille maintenant la syntaxe du flux SVC. La structure générale est décrite en référence à la figure 2. Le flux SVC est organisé en unités d'accés (en anglais : Access units (AUs)) correspondant chacune à un instant et comprenant une ou plusieurs unités d'accès pour le 30 réseau (paquet) ou NALUs. Chaque NALU est associée à une image issue de la décomposition spatio-temporelle, un niveau de résolution spatiale, et un niveau de qualité de codage. Cette structure en NALUs permet de réaliser une adaptation en débit et/ou résolution spatio temporelle en supprimant les NALUs de résolution spatiale trop grande, ou de fréquence temporelle trop grande ou bien encore de qualité de codage trop grande. Chaque NALU encapsule un slice d'image. Un slice est un ensemble de macroblocs contenus dans une image. Le format des en-têtes de NAL dans la version actuelle de SVC est maintenant décrit en référence à la figure 3. Chaque NAL unit spécifique à SVC (NAL unit de type 20 ou 21) comporte un octet d'entête AVC (NAL unit type byte) et un ou deux octets d'en-tête SVC contenant les champs (P,D,T,Q) (Priority_id, Dependency_id, Temporal_level, Quality_level). Ces champs peuvent être exploités pour réaliser une adaptation résolution spatiale et/ou fréquence temporelle et/ou qualité, en ne retenant que les NAL units ayant un niveau de champs (P,D,T,Q) suffisamment élevé. Le champ Priority_id indique un niveau de priorité d'une NAL pouvant servir 20 à guider une adaptation en qualité. Le champ Dependency_id permet de connaitre le niveau de résolution spatiale d'une couche hiérarchique de codage. Ce niveau peut aussi contrôler un niveau de rehaussement en qualité SNR ou de réhaussement temporel dans le cadre d'un codage en couche (i.e. pour un nombre de 25 points de fonctionnement discret). Le champ Temporal_level permet d'indiquer le niveau temporel indiquant la fréquence d'image. Le champ Quality_level permet d'indiquer le niveau de quantification progressive, et donc de contrôler le débit/qualité et/ou la complexité. 30 En référence à la figure 4, les entêtes de NAL SVC sont uniformisés et il y a toujours deux octets d'entête SVC. Le bit associé à l'élément syntaxique "extension_flag" a donc été transformé en l'élément syntaxique "reserved_bit" qui correspond à un bit non défini mais réservé pour une éventuelle utilisation future. On considère maintenant le format des en-têtes de slices dans la version actuelle de SVC. Un slice est un ensemble de macroblocs contenus dans une image. On peut retrouver plusieurs slices dans une image (typiquement pour limiter la taille des NAL unit, limiter l'impact d'une perte de paquet, réaliser un codage adaptatif par région d'image, ...). Chaque slice est encapsulé dans une NALU. Dans SVC, les informations de réhaussement en qualité SNR sont codées dans des NAL units de type 20 ou 21, ayant un "quality_level" non nul, et utilisant les "slice_type" suivants : - PR : slice codé en mode de raffinement progressif (Progressive Refinement) ; - El, EP, ou EB : slice codé en mode de raffinement non progressif (Enhanced I,P,B picture). Il est possible de coder un réhaussement en qualité SNR via l'utilisation d'un codage de type non progressif. Cette approche est motivée par une mise en oeuvre plus aisée d'un codage SVC (la mise en oeuvre d'un codage progressif est relativement difficile), tout en offrant une scalabilité (échelonnabilité) à grain moyen (i.e. par pas de l'ordre de 10%) en débit. La figure 5 illustre l'entête d'une NAL unit SVC qui est définie par la syntaxe suivante: - Le champ "simple_priority_id", codé sur 6 bits, permet de signaler une information de priorité pour la NAL unit considérée. Cette information de priorité peut être utilisée par un outil d'adaptation du flux vidéo lors de la réalisation d'une adaptation du flux vidéo (par exemple en ne gardant que les NAL units ayant un niveau de priorité suffisant). - le champ discardable_flag, codé sur un bit, indique si la NAL unit considérée est utile dans le codage inter-couche (inter layer prediction dans le vocabulaire SVC) d'une couche supérieure (par exemple correspondant à un niveau de résolution spatial supérieur). - le champ reserved_bit, codé sur un bit, n'est pas utilisé et est réservé à une future utilisation éventuelle. - le champ temporal_level, codé sur 3 bits, indique le niveau temporel associé à la NAL unit considérée. - le champ dependency_id, codé sur 3 bits, indique l'indice de couche de codage à laquelle la NAL considérée contribue. La notion de couche de codage peut correspondre aux différents niveaux de résolution spatiale lors d'une scalabilité en résolution, mais aussi aux différentes couches de qualité SNR (voire temporel) lors d'un codage en couche. - le champ quality_level, codé sur 2 bits, correspond au niveau de réhaussement en qualité SNR codé à l'intérieur d'une couche (dpendency_id) Afin de signaler si une NAL unit peut être tronquée ou non, l'invention propose alors dans un mode particulier de réalisation de réaffecter le bit_réservé disponible. La syntaxe associée à une entête d'une NAL SVC selon l'invention est alors définie en référence à la figure 6. Selon l'invention, l'indication de possibilité de la troncature d'une NAL unit SVC est réalisée en utilisant le bit associé à l'élément syntaxe "reserved_bit" disponible dans l'entête de NAL SVC. Ce champ est renommé "truncation_flag" : - si la valeur du champ truncation_flag vaut 1, alors la NAL unit considérée peut être tronquée lors d'une opération d'adaptation du flux vidéo ; - si la valeur du champ truncation_flag vaut 0, alors la NAL unit considérée ne peut pas être tronquée lors d'une opération d'adaptation du flux vidéo. Dans un mode particulier d'application, l'invention propose de ne pas lier directement le marquage de la possibilité de troncature au type de slice 10 utilisé. Dans SVC, on considère les cas suivants : une NAL unit correspondant à une slice de type PR peut être tronquée ; une NAL unit correspondant à une slice de type El, EP ou EB ne peut être tronquée. Ainsi, on peut être amené à l'aide de l'invention à signaler qu'une NAL codée 15 en mode non progressif peut être tronquée ou bien encore qu'une NAL codée en mode progressif ne peut être coupée. On cite ci-après à titre d'exemple des indications utiles pour contrôler les adaptations autorisées : - découper une NAL codée en mode non progressif si celle ci est trop 20 longue, - ne pas autoriser à tronquer une NAL codée en mode progressif parce qu'elle est trop petite, ou bien encore parce que le cadre applicatif considéré ne prend pas en compte la troncature de NAL. 25 En variante, on insére ce bit supplémentaire dans une NAL supplémentaire dans l'AU. REVENDICATIONS 1) Procédé de codage de données en un flux scalable organisé en unités, caractérisé en ce que l'on indique dans l'entête d'une NAL unit SVC si cette NAL peut être tronquée ou non lors d'une opération d'adaptation du flux scalable considéré. 2) Procédé de codage selon la revendication 1, caractérisé en ce que l'indication de la troncature d'une NAL unit SVC est réalisée en utilisant le bit associé à l'élément syntaxe "reserved_bit" disponible dans l'entête de NAL SVC. 10 3) Procédé de codage selon l'une quelconque des revendications précédentes, caractérisé en ce que le marquage de troncature n'est pas lié directement au type de slice utilisé. 4) Dispositif de codage de données en un flux scalable organisé en unités, 15 caractérisé en ce qu'il comporte des moyens pour indiquer dans l'entête d'une NAL unit SVC si cette NAL peut être tronquée ou non lors d'une opération d'adaptation du flux scalable considéré. 5) Produit programme d'ordinateur comprenant des instructions de 20 programme pour l'exécution du procédé de codage selon l'une au moins des revendications 1 à 3. 6) Signal comportant des données en un flux scalable organisé en unités, caractérisé en ce qu'il comporte une information dans l'entête d'une NAL unit 25 SVC pour indiquer si cette NAL peut être tronquée ou non lors d'une opération d'adaptation du flux scalable considéré. 30