Formats YUV 8 bits recommandés pour le rendu vidéo
Gary Sullivan et Stephen Estrop
Microsoft Corporation
Avril 2002, mise à jour novembre 2008
Cette rubrique décrit les formats de couleur YUV 8 bits recommandés pour le rendu vidéo dans le système d’exploitation Windows. Cet article présente les techniques de conversion entre les formats YUV et RVB, et fournit également des techniques pour le upsampling des formats YUV. Cet article est destiné à toute personne travaillant avec le décodage ou le rendu vidéo YUV dans Windows.
Introduction
De nombreux formats YUV sont définis dans l’industrie vidéo. Cet article identifie les formats YUV 8 bits recommandés pour le rendu vidéo dans Windows. Les fournisseurs de décodeurs et les fournisseurs d’affichage sont encouragés à prendre en charge les formats décrits dans cet article. Cet article ne traite pas d’autres utilisations de la couleur YUV, telles que la photographie fixe.
Les formats décrits dans cet article utilisent tous 8 bits par emplacement de pixels pour encoder le canal Y (également appelé canal luma) et utilisent 8 bits par exemple pour encoder chaque exemple de chroma U ou V. Toutefois, la plupart des formats YUV utilisent moins de 24 bits par pixel en moyenne, car ils contiennent moins d’échantillons de vous et de V que de Y. Cet article ne couvre pas les formats YUV avec des canaux Y 10 bits ou plus.
Notes
Pour les besoins de cet article, le terme U équivaut à Cb, et le terme V équivaut à Cr.
Cet article aborde les thèmes suivants :
- Échantillonnage YUV. Décrit les techniques d’échantillonnage YUV les plus courantes.
- Définitions de Surface. Décrit les formats YUV recommandés.
- Conversions d’espace de couleurs et de taux d’échantillonnage chromatique. Fournit des instructions pour la conversion entre les formats YUV et RVB et pour la conversion entre différents formats YUV.
- Identification des formats YUV dans Media Foundation. Explique comment décrire les types de format YUV dans Media Foundation.
Échantillonnage YUV
Les canaux Chroma peuvent avoir un taux d’échantillonnage inférieur à celui du canal luma, sans perte spectaculaire de la qualité perceptive. Une notation appelée notation « A:B:C » est utilisée pour décrire la fréquence à laquelle vous et V êtes échantillonné par rapport à Y :
- 4:4:4 signifie pas de sous-échantillonnage des canaux chroma.
- 4:2:2 signifie un sous-échantillonnage horizontal 2:1, sans sous-échantillonnage vertical. Chaque ligne d’analyse contient quatre exemples Y pour deux exemples U ou V.
- 4:2:0 signifie un sous-échantillonnage horizontal 2:1, avec un sous-échantillonnage vertical 2:1.
- 4:1:1 signifie un sous-échantillonnage horizontal 4:1, sans sous-échantillonnage vertical. Chaque ligne d’analyse contient quatre exemples Y pour chaque exemple vous et V. L’échantillonnage 4:1:1 est moins courant que d’autres formats et n’est pas abordé en détail dans cet article.
Les diagrammes suivants montrent comment la chroma est échantillonnées pour chacun des taux de sous-échantillonnage. Les échantillons de Luma sont représentés par une croix, et les échantillons de chroma sont représentés par un cercle.
La forme dominante de l’échantillonnage 4:2:2 est définie dans la Recommandation UIT-R BT.601. Il existe deux variantes courantes de l’échantillonnage 4:2:0. L’une d’elles est utilisée dans la vidéo MPEG-2 et l’autre dans MPEG-1 et dans les Recommandations UIT-T H.261 et H.263.
Par rapport au schéma MPEG-1, il est plus simple de convertir entre le schéma MPEG-2 et les grilles d’échantillonnage définies pour les formats 4:2:2 et 4:4:4. Pour cette raison, le schéma MPEG-2 est préféré dans Windows et doit être considéré comme l’interprétation par défaut des formats 4:2:0.
Définitions surface
Cette section décrit les formats YUV 8 bits recommandés pour le rendu vidéo. Celles-ci se répartissent en plusieurs catégories :
- Formats 4:4:4, 32 bits par pixel
- Formats 4:2:2, 16 bits par pixel
- Formats 4:2:0, 16 bits par pixel
- Formats 4:2:0, 12 bits par pixel
Tout d’abord, vous devez connaître les concepts suivants afin de comprendre ce qui suit :
- Origine de Surface. Pour les formats YUV décrits dans cet article, l’origine (0,0) est toujours le coin supérieur gauche de la surface.
- Stride. La foulée d’une surface, parfois appelée pas, est la largeur de la surface en octets. Étant donné l’origine de la surface dans le coin supérieur gauche, la foulée est toujours positive.
- Alignement. L’alignement d’une surface est à la discrétion du pilote d’affichage graphique. La surface doit toujours être alignée DWORD ; autrement dit, il est garanti que les lignes individuelles de la surface proviennent d’une limite 32 bits (DWORD). Toutefois, l’alignement peut être supérieur à 32 bits, en fonction des besoins du matériel.
- Format empaqueté ou format planaire. Les formats YUV sont divisés en formats pack et en formats planaires . Dans un format packed, les composants Y, U et V sont stockés dans un tableau unique. Les pixels sont organisés en groupes de macropixels, dont la disposition dépend du format. Dans un format planaire, les composants Y, U et V sont stockés sous la forme de trois plans distincts.
Chacun des formats YUV décrits dans cet article a un code FOURCC affecté. Un code FOURCC est un entier non signé 32 bits créé en concaténant quatre caractères ASCII.
- 4:4:4 (32 bpp)
- 4:2:2 (16 bpp)
- 4:2:0 (16 bpp)
- 4:2:0 (12 bpp)
Formats 4:4:4, 32 bits par pixel
AYUV
Un format 4:4:4 unique est recommandé, avec le code FOURCC AYUV. Il s’agit d’un format pack, où chaque pixel est encodé en quatre octets consécutifs, organisés dans la séquence illustrée dans l’illustration suivante.
Les octets marqués A contiennent des valeurs pour alpha.
Formats 4:2:2, 16 bits par pixel
Deux formats 4:2:2 sont recommandés, avec les codes FOURCC suivants :
- YUY2
- UYVY
Les deux sont des formats packed, où chaque macropixel a deux pixels encodés sous forme de quatre octets consécutifs. Cela entraîne un sous-échantillonnage horizontal de la chroma d’un facteur de deux.
YUY2
Au format YUY2, les données peuvent être traitées comme un tableau de valeurs char non signées, où le premier octet contient le premier échantillon Y, le deuxième octet contient le premier échantillon U (Cb), le troisième octet contient le deuxième échantillon Y et le quatrième octet contient le premier exemple V (Cr), comme illustré dans le diagramme suivant.
Si l’image est traitée sous la forme d’un tableau de valeurs WORD peu endiennes, le premier échantillon WORD contient le premier échantillon Y dans les bits les moins significatifs (LSB) et le premier exemple U (Cb) dans les bits les plus significatifs (MSB). Le deuxième word contient le deuxième exemple Y dans les LSB et le premier exemple V (Cr) dans les msbs.
YUY2 est le format de pixels 4:2:2 préféré pour l’accélération vidéo Microsoft DirectX (DirectX VA). Il est prévu qu’il s’agit d’une exigence à moyen terme pour les accélérateurs VA DirectX prenant en charge la vidéo 4:2:2.
UYVY
Ce format est le même que le format YUY2, sauf que l’ordre des octets est inversé, c’est-à-dire que les octets chromatique et luma sont retournés (Figure 4). Si l’image est traitée sous la forme d’un tableau de deux valeurs WORD little endian, le premier WORD contient U dans les LSBs et Y0 dans les bases de données msb, et le second WORD contient V dans les LSBs et Y1 dans les bases de données msb.
Formats 4:2:0, 16 bits par pixel
Deux formats 4:2:0 16 bits par pixel (bpp) sont recommandés, avec les codes FOURCC suivants :
- IMC1
- IMC3
Ces deux formats YUV sont des formats planaires. Les canaux chromaiques sont sous-échantillonné par un facteur de deux dans les dimensions horizontales et verticales.
IMC1
Tous les exemples Y apparaissent d’abord en mémoire sous la forme d’un tableau de valeurs char non signées. Cette opération est suivie de tous les échantillons V (Cr), puis de tous les échantillons U (Cb). Les plans V et U ont la même foulée que le plan Y, ce qui entraîne des zones de mémoire inutilisées, comme le montre la figure 5. Les plans vous et V doivent démarrer sur des limites de mémoire qui sont un multiple de 16 lignes. La figure 5 montre l’origine de vous et de V pour une image vidéo de 352 x 240. L’adresse de départ des plans vous et V est calculée comme suit :
BYTE* pV = pY + (((Height + 15) & ~15) * Stride);
BYTE* pU = pY + (((((Height * 3) / 2) + 15) & ~15) * Stride);
où pY est un pointeur d’octets vers le début du tableau de mémoire, comme illustré dans le diagramme suivant.
IMC3
Ce format est identique à IMC1, sauf que les plans vous et V sont échangés, comme illustré dans le diagramme suivant.
Formats 4:2:0, 12 bits par pixel
Quatre formats 4:2:0 12-bpp sont recommandés, avec les codes FOURCC suivants :
- IMC2
- IMC4
- YV12
- NV12
Dans tous ces formats, les canaux chromatique sont sous-échantillonné par un facteur de deux dans les dimensions horizontales et verticales.
IMC2
Ce format est le même que IMC1, à l’exception de la différence suivante : Les lignes V (Cr) et U (Cb) sont entrelacées à des limites de demi-foulée. En d’autres termes, chaque ligne de foulée complète dans la zone chromatique commence par une ligne d’échantillons V, suivie d’une ligne d’échantillons U qui commence à la limite de demi-foulée suivante (Figure 7). Cette disposition permet une utilisation plus efficace de l’espace d’adressage qu’IMC1. Il réduit de moitié l’espace d’adressage chromatique, et donc l’espace d’adressage total de 25 %. Parmi les formats 4:2:0, IMC2 est le deuxième format préféré, après NV12. L’image suivante illustre ce processus.
IMC4
Ce format est identique à IMC2, sauf que les lignes U (Cb) et V (Cr) sont permutées, comme le montre l’illustration suivante.
YV12
Tous les exemples Y apparaissent d’abord en mémoire sous la forme d’un tableau de valeurs char non signées. Ce tableau est immédiatement suivi par tous les exemples V (Cr). La foulée du plan V est la moitié de la foulée du plan Y; et le plan V contient deux fois moins de lignes que le plan Y. Le plan V est immédiatement suivi par tous les échantillons U (Cb), avec la même foulée et le même nombre de lignes que le plan V, comme illustré dans l’illustration suivante.
NV12
Tous les exemples Y apparaissent d’abord en mémoire sous la forme d’un tableau de valeurs char non signées avec un nombre pair de lignes. Le plan Y est immédiatement suivi d’un tableau de valeurs char non signées qui contient des échantillons U (Cb) et V (Cr) compressés. Lorsque le tableau U-V combiné est traité sous la forme d’un tableau de valeurs WORD little-endian, les LSB contiennent les valeurs U et les bases de données msb contiennent les valeurs V. NV12 est le format de pixels 4:2:0 préféré pour DirectX VA. Il est prévu qu’il s’agit d’une exigence à moyen terme pour les accélérateurs VA DirectX prenant en charge la vidéo 4:2:0. L’illustration suivante montre le plan Y et le tableau qui contient des exemples vous et V compressés.
Conversions d’espace de couleurs et de taux d’échantillonnage chromatique
Cette section fournit des instructions pour la conversion entre YUV et RVB, ainsi que pour la conversion entre différents formats YUV. Nous considérons deux schémas d’encodage RVB dans cette section : RVB d’ordinateur 8 bits, également appelé RVB ou RVB « à grande échelle », et RVB vidéo studio, ou « RVB avec salle de tête et de toe-room ». Celles-ci sont définies comme suit :
- Le RVB de l’ordinateur utilise 8 bits pour chaque échantillon de rouge, vert et bleu. Le noir est représenté par R = G = B = 0, et le blanc est représenté par R = G = B = 255.
- Studio video RVB utilise un certain nombre de bits N pour chaque échantillon de rouge, vert et bleu, où N est égal ou supérieur à 8. Studio video RVB utilise un facteur de mise à l’échelle différent de l’ordinateur RVB, et il a un décalage. Le noir est représenté par R = G = B = 16*2^(N-8), et le blanc est représenté par R = G = B = 235*2^(N-8). Toutefois, les valeurs réelles peuvent sortir de cette plage.
Studio video RVB est la définition RVB préférée pour la vidéo dans Windows, tandis que le RVB de l’ordinateur est la définition RVB préférée pour les applications non vidéo. Dans l’une ou l’autre forme de RVB, les coordonnées de chromaticité sont spécifiées dans ITU-R BT.709 pour la définition des couleurs primaires RVB. Les coordonnées (x,y) de R, G et B sont (0,64, 0,33), (0,30, 0,60) et (0,15, 0,06), respectivement. Le blanc de référence est D65 avec des coordonnées (0,3127, 0,3290). Le gamma nominal est de 1/0,45 (environ 2,2), avec un gamma précis défini en détail dans LA BT.709 de l’UIT-R.
Conversion entre RVB et YUV 4:4:4
Nous décrivons d’abord la conversion entre RVB et 4:4:4 YUV. Pour convertir 4:2:0 ou 4:2:2 YUV en RVB, nous vous recommandons de convertir les données YUV en YUV 4:4:4, puis de convertir les données YUV 4:4:4 en RVB. Le format AYUV, qui est un format 4:4:4, utilise 8 bits chacun pour les exemples Y, U et V. YUV peut également être défini à l’aide de plus de 8 bits par exemple pour certaines applications.
Deux conversions YUV dominantes de RVB ont été définies pour la vidéo numérique. Les deux sont basés sur la spécification connue sous le nom de Recommandation UIT-R BT.709. La première conversion est l’ancienne forme YUV définie pour une utilisation de 50 Hz dans BT.709. Elle est identique à la relation spécifiée dans la Recommandation UIT-R BT.601, également connue sous son ancien nom, CCIR 601. Il doit être considéré comme le format YUV préféré pour la résolution TV à définition standard (720 x 576) et la vidéo à résolution inférieure. Elle se caractérise par les valeurs de deux constantes Kr et Kb :
Kr = 0.299
Kb = 0.114
La deuxième conversion est la forme YUV la plus récente définie pour une utilisation de 60 Hz en BT.709, et doit être considérée comme le format préféré pour les résolutions vidéo au-dessus de SDTV. Elle se caractérise par des valeurs différentes pour ces deux constantes :
Kr = 0.2126
Kb = 0.0722
La conversion de RVB en YUV est définie en commençant par les éléments suivants :
L = Kr * R + Kb * B + (1 - Kr - Kb) * G
Les valeurs YUV sont ensuite obtenues comme suit :
Y = floor(2^(M-8) * (219*(L-Z)/S + 16) + 0.5)
U = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(B-L) / ((1-Kb)*S) + 128) + 0.5))
V = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(R-L) / ((1-Kr)*S) + 128) + 0.5))
where
- M est le nombre de bits par échantillon YUV (M >= 8).
- Z est la variable de niveau noir. Pour l’ordinateur RVB, Z est égal à 0. Pour studio vidéo RVB, Z est égal à 16*2^(N-8), où N est le nombre de bits par exemple RVB (N >= 8).
- S est la variable de mise à l’échelle. Pour l’ordinateur RVB, S est égal à 255. Pour studio vidéo RVB, S est égal à 219*2^(N-8).
La fonction floor(x) retourne le plus grand entier inférieur ou égal à x. La fonction clip3(x, y, z) est définie comme suit :
clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))
Notes
clip3 doit être implémenté en tant que fonction plutôt qu’en tant que macro de préprocesseur ; sinon, plusieurs évaluations des arguments se produisent.
L’exemple Y représente la luminosité, et les exemples vous et V représentent les écarts de couleur vers le bleu et le rouge, respectivement. La plage nominale pour Y est comprise entre 16*2^(M-8) et 235*2^(M-8). Le noir est représenté par 16*2^(M-8), et le blanc est représenté par 235*2^(M-8). La plage nominale pour vous et V est comprise entre 16*2^(M-8) et 240*2^(M-8), avec la valeur 128*2^(M-8) représentant la chroma neutre. Toutefois, les valeurs réelles peuvent se trouver en dehors de ces plages.
Pour les données d’entrée sous la forme d’un RVB vidéo studio, l’opération de clip est nécessaire pour conserver les valeurs you et V dans la plage 0 à (2^M)-1. Si l’entrée est RVB de l’ordinateur, l’opération de clip n’est pas obligatoire, car la formule de conversion ne peut pas produire de valeurs en dehors de cette plage.
Il s’agit des formules exactes sans approximation. Tout ce qui suit dans ce document est dérivé de ces formules. Cette section décrit les conversions suivantes :
- Conversion de RGB888 en YUV 4:4:4
- Conversion de L’YUV 8 bits en RGB888
- Conversion de 4:2:0 YUV en 4:2:2 YUV
- Conversion de 4:2:2 YUV en 4:4:4 YUV
- Conversion de 4:2:0 YUV en 4:4:4:4 YUV
Conversion de RGB888 en YUV 4:4:4
Dans le cas d’une entrée RVB d’ordinateur et d’une sortie YUV BT.601 8 bits, nous pensons que les formules fournies dans la section précédente peuvent être raisonnablement approximatives par les éléments suivants :
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128
Ces formules produisent des résultats 8 bits à l’aide de coefficients qui ne nécessitent pas plus de 8 bits de précision (non signés). Les résultats intermédiaires nécessitent jusqu’à 16 bits de précision.
Conversion de L’YUV 8 bits en RGB888
À partir des formules RVB à YUV d’origine, vous pouvez dériver les relations suivantes pour BT.601.
Y = round( 0.256788 * R + 0.504129 * G + 0.097906 * B) + 16
U = round(-0.148223 * R - 0.290993 * G + 0.439216 * B) + 128
V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128
Par conséquent, compte tenu des points suivants :
C = Y - 16
D = U - 128
E = V - 128
Les formules permettant de convertir YUV en RVB peuvent être dérivées comme suit :
R = clip( round( 1.164383 * C + 1.596027 * E ) )
G = clip( round( 1.164383 * C - (0.391762 * D) - (0.812968 * E) ) )
B = clip( round( 1.164383 * C + 2.017232 * D ) )
où clip()
désigne le découpage en une plage de [0..255]. Nous pensons que ces formules peuvent être raisonnablement approximatives par les éléments suivants :
R = clip(( 298 * C + 409 * E + 128) >> 8)
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
B = clip(( 298 * C + 516 * D + 128) >> 8)
Ces formules utilisent des coefficients qui nécessitent plus de 8 bits de précision pour produire chaque résultat 8 bits, et les résultats intermédiaires nécessitent plus de 16 bits de précision.
Pour convertir 4:2:0 ou 4:2:2 YUV en RVB, nous vous recommandons de convertir les données YUV en YUV 4:4:4, puis de convertir de 4:4:4 YUV en RVB. Les sections suivantes présentent quelques méthodes pour convertir les formats 4:2:0 et 4:2:2 en formats 4:4:4.
Conversion de 4:2:0 YUV en 4:2:2 YUV
La conversion de 4:2:0 YUV en 4:2:2 YUV nécessite une upconversion verticale d’un facteur de deux. Cette section décrit un exemple de méthode pour effectuer la upconversion. La méthode suppose que les images vidéo sont à balayage progressif.
Notes
Le processus de conversion d’analyse entrelacés 4:2:0 vers 4:2:2 présente des problèmes atypiques et est difficile à implémenter. Cet article ne traite pas du problème de conversion de l’analyse entrelacée de 4:2:0 en 4:2:2.
Laissez chaque ligne verticale d’exemples de chroma d’entrée être un tableau Cin[]
allant de 0 à N - 1. La ligne verticale correspondante sur l’image de sortie sera un tableau Cout[]
allant de 0 à 2N - 1. Pour convertir chaque ligne verticale, effectuez le processus suivant :
Cout[0] = Cin[0];
Cout[1] = clip((9 * (Cin[0] + Cin[1]) - (Cin[0] + Cin[2]) + 8) >> 4);
Cout[2] = Cin[1];
Cout[3] = clip((9 * (Cin[1] + Cin[2]) - (Cin[0] + Cin[3]) + 8) >> 4);
Cout[4] = Cin[2]
Cout[5] = clip((9 * (Cin[2] + Cin[3]) - (Cin[1] + Cin[4]) + 8) >> 4);
...
Cout[2*i] = Cin[i]
Cout[2*i+1] = clip((9 * (Cin[i] + Cin[i+1]) - (Cin[i-1] + Cin[i+2]) + 8) >> 4);
...
Cout[2*N-3] = clip((9 * (Cin[N-2] + Cin[N-1]) - (Cin[N-3] + Cin[N-1]) + 8) >> 4);
Cout[2*N-2] = Cin[N-1];
Cout[2*N-1] = clip((9 * (Cin[N-1] + Cin[N-1]) - (Cin[N-2] + Cin[N-1]) + 8) >> 4);
où clip() désigne le découpage dans une plage de [0..255].
Notes
Les équations de gestion des arêtes peuvent être simplifiées mathématiquement. Ils sont présentés sous cette forme pour illustrer l’effet de serrage sur les bords de l’image.
En effet, cette méthode calcule chaque valeur manquante en interpolant la courbe sur les quatre pixels adjacents, pondérées vers les valeurs des deux pixels les plus proches (Figure 11). La méthode d’interpolation spécifique utilisée dans cet exemple génère des échantillons manquants à des positions demi-entières à l’aide d’une méthode bien connue appelée interpolation Catmull-Rom, également appelée interpolation de convolution cubique.
En termes de traitement du signal, la conversion verticale doit idéalement inclure une compensation de décalage de phase pour tenir compte du décalage vertical d’un demi-pixel (par rapport à la grille d’échantillonnage de sortie 4:2:2) entre les emplacements des lignes d’exemple 4:2:0 et l’emplacement de chaque autre ligne d’échantillon 4:2:2. Toutefois, l’introduction de ce décalage augmenterait la quantité de traitement nécessaire pour générer les exemples et empêcherait la reconstruction des échantillons 4:2:0 d’origine à partir de l’image 4:2:2 mise à jour. Il serait également impossible de décoder la vidéo directement sur des surfaces 4:2:2, puis d’utiliser ces surfaces comme images de référence pour décoder les images suivantes dans le flux. Par conséquent, la méthode fournie ici ne tient pas compte de l’alignement vertical précis des échantillons. Cela n’est probablement pas visuellement dangereux à des résolutions d’image raisonnablement élevées.
Si vous commencez par une vidéo 4:2:0 qui utilise la grille d’échantillonnage définie dans la vidéo H.261, H.263 ou MPEG-1, la phase de sortie des échantillons chroma 4:2:2 sera également décalée par un décalage horizontal d’un demi-pixel par rapport à l’espacement sur la grille d’échantillonnage luma (décalage d’un quart de pixel par rapport à l’espacement de la grille d’échantillonnage chromatique 4:2:2). Toutefois, la forme MPEG-2 de la vidéo 4:2:0 est probablement plus couramment utilisée sur les PC et ne souffre pas de ce problème. En outre, la distinction n’est probablement pas visuellement nuisible à des résolutions d’image raisonnablement élevées. La tentative de correction de ce problème créerait le même genre de problèmes abordés pour le décalage de phase verticale.
Conversion de 4:2:2 YUV en 4:4:4 YUV
La conversion de 4:2:2 YUV en 4:4:4 YUV nécessite une upconversion horizontale d’un facteur de deux. La méthode décrite précédemment pour l’upconversion verticale peut également être appliquée à la upconversion horizontale. Pour la vidéo MPEG-2 et ITU-R BT.601, cette méthode produit des échantillons avec l’alignement de phase correct.
Conversion de 4:2:0 YUV en 4:4:4:4 YUV
Pour convertir 4:2:0 YUV en 4:4:4 YUV, vous pouvez simplement suivre les deux méthodes décrites précédemment. Convertissez l’image 4:2:0 en 4:2:2, puis convertissez l’image 4:2:2 en 4:4:4. Vous pouvez également changer l’ordre des deux processus de upconversion, car l’ordre de fonctionnement n’a pas vraiment d’importance pour la qualité visuelle du résultat.
Autres formats YUV
Voici d’autres formats YUV moins courants :
- AI44 est un format YUV palettisé avec 8 bits par exemple. Chaque exemple contient un index dans les 4 bits les plus significatifs (SMB) et une valeur alpha dans les 4 bits les moins significatifs (LSB). L’index fait référence à un tableau d’entrées de palette YUV, qui doit être défini dans le type de média pour le format. Ce format est principalement utilisé pour les images de sous-image.
- NV11 est un format planaire 4:1:1 avec 12 bits par pixel. Les exemples Y apparaissent en premier dans la mémoire. Le plan Y est suivi d’un tableau d’échantillons U (Cb) et V (Cr) emballés. Lorsque le tableau U-V combiné est traité sous la forme d’un tableau de valeurs WORD peu endiennes, les exemples U sont contenus dans les LSB de chaque WORD, et les exemples V sont contenus dans les msbs. (Cette disposition de mémoire est similaire à NV12, bien que l’échantillonnage de la chroma soit différent.)
- Y41P est un format packé 4:1:1, avec vous et V échantillonnés tous les quatre pixels horizontalement. Chaque macropixel contient 8 pixels en trois octets, avec la disposition d’octet suivante :
U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
- Y41T est identique à Y41P, sauf que le bit le moins significatif de chaque échantillon Y spécifie la clé de chroma (0 = transparent, 1 = opaque).
- Y42T est identique à UYVY, sauf que le bit le moins significatif de chaque échantillon Y spécifie la clé de chroma (0 = transparent, 1 = opaque).
- YVYU équivaut à YUYV, sauf que les exemples vous et V sont échangés.
Identification des formats YUV dans Media Foundation
Chacun des formats YUV décrits dans cet article a un code FOURCC affecté. Un code FOURCC est un entier non signé 32 bits créé en concaténant quatre caractères ASCII.
Il existe différentes macros C/C++ qui facilitent la déclaration des valeurs FOURCC dans le code source. Par exemple, la macro MAKEFOURCC est déclarée dans Mmsystem.h et la macro FCC est déclarée dans Aviriff.h. Utilisez-les comme suit :
DWORD fccYUY2 = MAKEFOURCC('Y','U','Y','2');
DWORD fccYUY2 = FCC('YUY2');
Vous pouvez également déclarer un code FOURCC directement en tant que littéral de chaîne en inversant simplement l’ordre des caractères. Par exemple :
DWORD fccYUY2 = '2YUY'; // Declares the FOURCC 'YUY2'
Inverser l’ordre est nécessaire, car le système d’exploitation Windows utilise une architecture peu endienne. 'Y' = 0x59, 'U' = 0x55 et '2' = 0x32, '2YUY' est donc 0x32595559.
Dans Media Foundation, les formats sont identifiés par un GUID de type principal et un GUID de sous-type. Le type principal pour les formats vidéo d’ordinateur est toujours MFMediaType_Video . Le sous-type peut être construit en mappant le code FOURCC à un GUID, comme suit :
XXXXXXXX-0000-0010-8000-00AA00389B71
où XXXXXXXX
est le code FOURCC. Par conséquent, le GUID de sous-type pour YUY2 est :
32595559-0000-0010-8000-00AA00389B71
Les constantes des GUID de format YUV les plus courants sont définies dans le fichier d’en-tête mfapi.h. Pour obtenir la liste de ces constantes, consultez GUID de sous-type vidéo.
Rubriques connexes