Condividi tramite


Formati YUV a 8 bit consigliati per il rendering video

Gary Sullivan e Stephen Estrop

Microsoft Corporation

Aprile 2002, aggiornato novembre 2008

In questo argomento vengono descritti i formati di colore YUV a 8 bit consigliati per il rendering video nel sistema operativo Windows. Questo articolo presenta tecniche per la conversione tra formati YUV e RGB e fornisce anche tecniche per l'upsampling dei formati YUV. Questo articolo è destinato a chiunque lavori con la decodifica o il rendering di video YUV in Windows.

Introduzione

Numerosi formati YUV sono definiti in tutto il settore video. Questo articolo identifica i formati YUV a 8 bit consigliati per il rendering video in Windows. I fornitori di decodificatori e i fornitori di display sono invitati a supportare i formati descritti in questo articolo. Questo articolo non riguarda altri usi del colore YUV, come ad esempio la fotografia statica.

I formati descritti in questo articolo usano tutti 8 bit per posizione pixel per codificare il canale Y (detto anche canale luma) e usare 8 bit per campione per codificare ogni campione di colore U o V. Tuttavia, la maggior parte dei formati YUV usa in media meno di 24 bit per pixel, perché contengono meno campioni di te e V rispetto a Y. Questo articolo non tratta i formati YUV con canali Y a 10 bit o superiori.

Nota

Ai fini di questo articolo, il termine U equivale a Cb e il termine V equivale a Cr.

 

Questo articolo illustra gli argomenti seguenti:

Campionamento YUV

I canali Chroma possono avere una frequenza di campionamento inferiore rispetto al canale luma, senza alcuna perdita drammatica di qualità percettiva. Una notazione chiamata "A:B:C" viene utilizzata per descrivere con quale frequenza sono campionati U e V rispetto a Y:

  • 4:4:4 significa che non viene eseguito alcun downcampionamento dei canali cromatici.
  • 4:2:2 significa downcampionamento orizzontale 2:1, senza downcampionamento verticale. Ogni riga di analisi contiene quattro campioni Y per ogni due campioni U o V.
  • 4:2:0 significa downcampionamento orizzontale di 2:1, con downcampionamento verticale di 2:1.
  • 4:1:1 significa il downcampionamento orizzontale 4:1, senza downcampionamento verticale. Ogni riga di scansione contiene quattro campioni Y per ogni campione U e V. Il campionamento 4:1:1 è meno comune di altri formati e non viene descritto in dettaglio in questo articolo.

I diagrammi seguenti illustrano come viene campionata la cromatica per ognuna delle frequenze di downcampionamento. I campioni Luma sono rappresentati da una croce e i campioni di cromatica sono rappresentati da un cerchio.

figura 1. campionamento cromatico

La forma dominante del campionamento 4:2:2 è definita in ITU-R Raccomandazione BT.601. Esistono due varianti comuni di campionamento 4:2:0. Uno di questi viene usato nel video MPEG-2 e l'altro viene usato in MPEG-1 e in ITU-T Recommendations H.261 e H.263.

Rispetto allo schema MPEG-1, è più semplice eseguire la conversione tra lo schema MPEG-2 e le griglie di campionamento definite per i formati 4:2:2 e 4:4:4. Per questo motivo, lo schema MPEG-2 è preferibile in Windows e deve essere considerato l'interpretazione predefinita dei formati 4:2:0.

Definizioni di superfici

Questa sezione descrive i formati YUV a 8 bit consigliati per il rendering video. Questi rientrano in diverse categorie:

Prima di tutto, è necessario conoscere i concetti seguenti per comprendere quanto segue:

  • Origine della superficie. Per i formati YUV descritti in questo articolo, l'origine (0,0) è sempre l'angolo superiore sinistro della superficie.
  • Stride. Lo stride di una superficie, talvolta detto passo, è la larghezza della superficie espressa in byte. Data un'origine di superficie nell'angolo superiore sinistro, lo stride è sempre positivo.
  • Allineamento. L'allineamento di una superficie è a discrezione del driver di visualizzazione grafico. La superficie deve essere sempre allineata a DWORD; ovvero, le singole linee all'interno della superficie hanno la garanzia di avere origine su un limite DWORD (32 bit). L'allineamento può essere maggiore di 32 bit, tuttavia, a seconda delle esigenze dell'hardware.
  • Formato compresso rispetto al formato planare. I formati YUV sono suddivisi in formati compressi e planari. In un formato compresso, i componenti Y, U e V vengono archiviati in una singola matrice. I pixel sono organizzati in gruppi di macropixel, il cui layout dipende dal formato. In un formato planare, i componenti Y, U e V vengono archiviati come tre piani separati.

Ognuno dei formati YUV descritti in questo articolo ha un codice FOURCC assegnato. Un codice FOURCC è un intero senza segno a 32 bit creato concatenando quattro caratteri ASCII.

Formati 4:4:4, 32 bit per pixel

AYUV

È consigliabile un singolo formato 4:4:4, con il codice FOURCC AYUV. Si tratta di un formato compresso, in cui ogni pixel viene codificato come quattro byte consecutivi, disposti nella sequenza illustrata nella figura seguente.

figura 2. layout di memoria ayuv

I byte contrassegnati come A contengono valori per alpha.

Formati 4:2:2, 16 bit per pixel

Sono consigliati due formati 4:2:2, con i codici FOURCC seguenti:

  • YUY2
  • UYVY

Entrambi sono formati impacchettati, dove ogni macropixel è composto da due pixel codificati come quattro byte consecutivi. Ciò comporta un sottocampionamento orizzontale della crominanza per un fattore di due.

YUY2

In formato YUY2, i dati possono essere considerati come una matrice di valori char, dove il primo byte contiene il primo campione Y, il secondo byte contiene il primo campione U (Cb), il terzo byte contiene il secondo esempio Y e il quarto byte contiene il primo esempio V (Cr), come illustrato nel diagramma seguente.

figura 3. yuy2 layout di memoria

Se l'immagine viene indirizzata come matrice di valori WORD little-endian, la prima WORD contiene il primo campione Y nei bit meno significativi (LSB) e il primo campione U (Cb) nei bit più significativi (MSB). Il secondo WORD contiene il secondo campione Y nei LSB e il primo campione V (Cr) nei MSB.

YUY2 è il formato 4:2:2 pixel preferito per l'accelerazione video DirectX (DirectX VA). È previsto un requisito intermedio per gli acceleratori DIRECTX VA che supportano il video 4:2:2.

UYVY

Questo formato è uguale al formato YUY2, ad eccezione dell'ordine dei byte invertito, ovvero i byte chroma e luma vengono capovolti (Figura 4). Se l'immagine è considerata come un array di due WORD in formato little-endian, il primo WORD contiene U nei LSB e Y0 nei MSB, e il secondo WORD contiene V nei LSB e Y1 nei MSB.

Figura 4. layout di memoria uyvy

Formati 4:2:0, 16 bit per pixel

Sono consigliati due formati a 4:2:0 a 16 bit per pixel (bpp), con i codici FOURCC seguenti:

  • IMC1
  • IMC3

Entrambi questi formati YUV sono formati planari. I canali cromatici sono sottocampionati da un fattore di due nelle dimensioni orizzontali e verticali.

IMC1

Tutti i campioni Y appaiono per primi in memoria come matrice di valori char non firmati. Questo è seguito da tutti gli esempi V (Cr) e quindi da tutti gli esempi U (Cb). I piani V e U hanno lo stesso stride del piano Y, con conseguente presenza di aree di memoria inutilizzate, come illustrato nella figura 5. I piani U e V devono iniziare su limiti di memoria che sono un multiplo di 16 righe. La figura 5 mostra l'origine di U e V per un fotogramma video 352 x 240. Gli indirizzi iniziali dei piani U e V vengono calcolati come segue:

BYTE* pV = pY + (((Height + 15) & ~15) * Stride);
BYTE* pU = pY + (((((Height * 3) / 2) + 15) & ~15) * Stride);

dove pY è un puntatore di byte all'inizio della matrice di memoria, come illustrato nel diagramma seguente.

Figura 5. layout di memoria imc1 (esempio)

IMC3

Questo formato è identico a IMC1, ad eccezione dei piani U e V che vengono scambiati, come illustrato nel diagramma seguente.

figura 6. diagramma di memoria imc3

Formati 4:2:0, 12 bit per pixel

Sono consigliati quattro formati 4:2:0 12-bpp, con i codici FOURCC seguenti:

  • IMC2
  • IMC4
  • YV12
  • NV12

In tutti questi formati, i canali cromatici sono sottocampionati da un fattore di due nelle dimensioni orizzontali e verticali.

IMC2

Questo formato è identico a IMC1, tranne per la seguente differenza: le linee V (Cr) e U (Cb) vengono interlacciate ai confini di mezza larghezza di passo. In altre parole, ogni linea a pieno passo nell'area cromatica inizia con una riga di campioni V, seguita da una riga di campioni U che inizia al limite del passo successivo (Figura 7). Questo layout rende più efficiente l'uso dello spazio indirizzi rispetto a IMC1. Dimezza lo spazio degli indirizzi cromatici, e quindi riduce lo spazio totale degli indirizzi del 25%. Tra i formati 4:2:0, IMC2 è il secondo formato preferito, dopo NV12. L'immagine seguente illustra questo processo.

figura 7. layout di memoria imc2

IMC4

Questo formato è identico a IMC2, ad eccezione del fatto che le linee U (Cb) e V (Cr) sono scambiate, come illustrato nella figura seguente.

figura 8. layout di memoria IMC4

YV12

Tutti i campioni Y appaiono per primi in memoria come una matrice di valori char non firmati . Questa matrice è seguita immediatamente da tutti gli esempi V (Cr). Lo stride del piano V è metà dello stride del piano Y; e il piano V contiene la metà delle linee del piano Y. Il piano V è seguito immediatamente da tutti i campioni U (Cb), mantenendo lo stesso passo e numero di righe del piano V, come illustrato nella figura seguente.

figura 9. Layout di memoria yv12

NV12

Tutti gli esempi Y vengono visualizzati per primi in memoria come matrice di valori di char non firmati con un numero pari di righe. Il piano Y è seguito immediatamente da una matrice di valori char senza segno char che contiene campioni U (Cb) e V (Cr). Quando la matrice U-V combinata viene indirizzata come matrice di valori little-endian WORD, i LSB contengono i valori U e gli MSB contengono i valori V. NV12 è il formato 4:2:0 pixel preferito per DirectX VA. È previsto un requisito intermedio per gli acceleratori DIRECTX VA che supportano il video 4:2:0. La figura seguente mostra il piano Y e la matrice che contiene campioni U e V impacchettati.

figura 10. layout di memoria nv12

Conversioni dello spazio dei colori e della frequenza di campionamento cromatica

Questa sezione fornisce linee guida per la conversione tra YUV e RGB e per la conversione tra alcuni formati YUV diversi. In questa sezione vengono considerati due schemi di codifica RGB: RGB per computer a 8 bit, noti anche come sRGB o RGB a "scala completa", e RGB per video di studio, noto anche come "RGB con margine superiore e margine inferiore". Questi sono definiti come segue:

  • Rgb computer usa 8 bit per ogni campione di rosso, verde e blu. Il nero è rappresentato da R = G = B = B = 0 e il bianco è rappresentato da R = G = B = 255.
  • Il video RGB di Studio usa alcuni bit N per ogni campione di rosso, verde e blu, dove N è 8 o più. RGB video studio usa un fattore di scala diverso rispetto a RGB del computer e ha un offset. Il nero è rappresentato da R = G = B = 16*2^(N-8) e il bianco è rappresentato da R = G = B = 235*2^(N-8). Tuttavia, i valori effettivi possono non rientrare in questo intervallo.

Studio video RGB è la definizione RGB preferita per il video in Windows, mentre computer RGB è la definizione RGB preferita per le applicazioni non video. In entrambe le forme di RGB, le coordinate della cromaticità sono specificate in ITU-R BT.709 per la definizione delle primarie di colore RGB. Le coordinate (x,y) di R, G e B sono rispettivamente (0,64, 0,33), (0,30, 0,60) e (0,15, 0,06). Il bianco di riferimento è D65 con coordinate (0,3127, 0,3290). La gamma nominale è 1/0,45 (circa 2,2), con gamma precisa definita in dettaglio in ITU-R BT.709.

conversione tra RGB e 4:4:4 YUV

Per prima cosa viene descritta la conversione tra RGB e 4:4:4 YUV. Per convertire 4:2:0 o 4:2:2 YUV in RGB, è consigliabile convertire i dati YUV in 4:4:4 YUV e quindi convertire da 4:4:4 YUV a RGB. Il formato AYUV, che è un formato 4:4:4, usa 8 bit per gli esempi Y, U e V. È anche possibile definire YUV usando più di 8 bit per esempio per alcune applicazioni.

Per il video digitale sono state definite due conversioni YUV dominanti da RGB. Entrambi sono basati sulla specifica nota come Raccomandazione ITU-R BT.709. La prima conversione è la precedente forma YUV definita per l'uso a 50 Hz nel BT.709. È uguale alla relazione specificata in ITU-R Raccomandazione BT.601, nota anche dal nome precedente, CCIR 601. Deve essere considerato il formato YUV preferito per la risoluzione TV a definizione standard (720 x 576) e video a bassa risoluzione. È caratterizzato dai valori di due costanti Kr e Kb:

Kr = 0.299
Kb = 0.114

La seconda conversione è il formato YUV più recente definito per l'uso a 60-Hz in BT.709 e deve essere considerato il formato preferito per le risoluzioni video sopra SDTV. È caratterizzato da valori diversi per queste due costanti:

Kr = 0.2126
Kb = 0.0722

La conversione da RGB a YUV viene definita a partire da quanto segue:

L = Kr * R + Kb * B + (1 - Kr - Kb) * G

I valori YUV vengono quindi ottenuti come segue:

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))

dove

  • M è il numero di bit per campione YUV (M >= 8).
  • Z è la variabile a livello di nero. Per il computer RGB, Z è uguale a 0. Per il video di studio RGB, Z è uguale a 16*2^(N-8), dove N è il numero di bit per campione RGB (N >= 8).
  • S è la variabile di ridimensionamento. Per il computer RGB, S è uguale a 255. Per il video di studio RGB, S è uguale a 219*2^(N-8).

La funzione floor(x) restituisce il numero intero più grande minore o uguale a x. La funzione clip3(x, y, z) è definita come segue:

clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))

Nota

Clip3 deve essere implementato come funzione anziché come macro del preprocessore; in caso contrario, verranno eseguite più valutazioni degli argomenti.

 

L'esempio Y rappresenta la luminosità e i campioni you e V rappresentano rispettivamente le deviazioni di colore verso il blu e il rosso. L'intervallo nominale per Y è compreso tra 16*2^(M-8) e 235*2^(M-8). Il nero è rappresentato come 16*2^(M-8) e il bianco è rappresentato come 235*2^(M-8). L'intervallo nominale per U e V è da 16*2^(M-8) a 240*2^(M-8), con il valore 128*2^(M-8) che rappresenta la cromia neutra. Tuttavia, i valori effettivi possono non rientrare in questi intervalli.

Per i dati di input sotto forma di video in formato RGB da studio, l'operazione di ritaglio è necessaria per mantenere i valori U e V compresi nell'intervallo da 0 a (2^M)-1. Se l'input è RGB del computer, l'operazione di ritaglio non è necessaria, perché la formula di conversione non può produrre valori al di fuori di questo intervallo.

Queste sono le formule esatte senza approssimazione. Tutto ciò che segue in questo documento è derivato da queste formule. In questa sezione vengono descritte le conversioni seguenti:

Conversione di RGB888 in YUV 4:4:4

Nel caso dell'input RGB del computer e dell'output YUV a 8 bit BT.601, riteniamo che le formule fornite nella sezione precedente possano essere ragionevolmente approssimative in base alle seguenti:

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

Queste formule producono risultati a 8 bit usando coefficienti che richiedono non più di 8 bit di precisione (senza segno). I risultati intermedi richiedono fino a 16 bit di precisione.

Conversione di YUV a 8 bit in RGB888

Dalle formule RGB-to-YUV originali, è possibile derivare le relazioni seguenti per 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

Di conseguenza, data:

C = Y - 16
D = U - 128
E = V - 128

Le formule per convertire YUV in RGB possono essere derivate come segue:

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                   ) )

dove clip() indica il clipping nel intervallo di [0..255]. Riteniamo che queste formule possano essere ragionevolmente approssimative in base alle seguenti:

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)

Queste formule usano alcuni coefficienti che richiedono più di 8 bit di precisione per produrre ogni risultato a 8 bit e i risultati intermedi richiederanno più di 16 bit di precisione.

Per convertire 4:2:0 o 4:2:2 YUV in RGB, è consigliabile convertire i dati YUV in 4:4:4 YUV e quindi convertire da 4:4:4 YUV a RGB. Le sezioni seguenti presentano alcuni metodi per la conversione dei formati 4:2:0 e 4:2:2 in 4:4:4.

Conversione di 4:2:0 YUV in 4:2:2 YUV

La conversione di YUV 4:2:0 in 4:2:2 YUV richiede l'upconversione verticale per un fattore di due. Questa sezione descrive un metodo di esempio per eseguire l'upconversion. Il metodo presuppone che le immagini video siano a scansione progressiva.

Nota

Il processo di conversione da 4:2:0 a 4:2:2 nel formato interlacciato presenta problemi atipici ed è difficile da implementare. Questo articolo non affronta il problema della conversione della scansione interlacciata da 4:2:0 a 4:2:2.

 

Si lasci che ogni linea verticale di campioni di cromatica in ingresso sia una matrice Cin[] che va da 0 a N - 1. La riga verticale corrispondente nell'immagine di output sarà una matrice Cout[] compresa tra 0 e 2N - 1. Per convertire ogni linea verticale, eseguire il processo seguente:

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);

dove clip() indica il ritaglio in un intervallo di [0...255].

Nota

Le equazioni per la gestione dei bordi possono essere semplificate matematicamente. Vengono mostrati in questo formato per illustrare l'effetto di blocco ai bordi dell'immagine.

 

In effetti, questo metodo calcola ogni valore mancante interpolando la curva sui quattro pixel adiacenti, ponderati verso i valori dei due pixel più vicini (Figura 11). Il metodo di interpolazione specifico usato in questo esempio genera campioni mancanti a posizioni di mezzo intero usando un metodo noto come interpolazione Catmull-Rom, anche noto come interpolazione per convoluzione cubica.

figura 11. diagramma che mostra l'upsampling da 4:2:0 a 4:2:2

In termini di elaborazione dei segnali, l'upconversione verticale dovrebbe includere idealmente una compensazione dello spostamento di fase per tenere conto dell'offset verticale a metà pixel (rispetto alla griglia di campionamento 4:2:2) tra le posizioni delle linee di esempio 4:2:0 e la posizione di ogni altra riga di esempio 4:2:2. Tuttavia, l'introduzione di questo offset aumenterebbe la quantità di elaborazione necessaria per generare i campioni e renderebbe impossibile ricostruire i campioni originali 4:2:0 dall'immagine upsampled 4:2:2. Renderebbe inoltre impossibile decodificare il video direttamente in superfici 4:2:2 e quindi usarle come immagini di riferimento per decodificare le immagini successive nel flusso. Pertanto, il metodo fornito qui non tiene conto dell'allineamento verticale preciso dei campioni. In questo modo probabilmente non è visivamente dannoso a risoluzioni di immagine ragionevolmente elevate.

Se si inizia con un video 4:2:0 che utilizza la griglia di campionamento definita in H.261, H.263 o MPEG-1, la fase dei campioni cromatici di output 4:2:2 verrà anch'essa spostata da un offset orizzontale di mezzo pixel rispetto alla spaziatura sulla griglia di campionamento della luma (offset di un quarto di pixel rispetto alla spaziatura della griglia di campionamento 4:2:2). Tuttavia, la forma MPEG-2 di video 4:2:0 è probabilmente più comunemente usata nei PC e non soffre di questo problema. Inoltre, la distinzione probabilmente non è visivamente dannosa a risoluzioni di immagini ragionevolmente elevate. Il tentativo di risolvere questo problema crea lo stesso tipo di problemi descritti per l'offset di fase verticale.

Conversione di 4:2:2 YUV in 4:4:4 YUV

La conversione di 4:2:2 YUV in 4:4:4 YUV richiede un'espansione orizzontale con un fattore di moltiplicazione di due. Il metodo descritto in precedenza per l'upconversione verticale può essere applicato anche all'upconversione orizzontale. Per mpeg-2 e ITU-R video BT.601, questo metodo produrrà campioni con l'allineamento della fase corretto.

Conversione da 4:2:0 YUV a 4:4:4 YUV

Per convertire 4:2:0 YUV in 4:4:4 YUV, è sufficiente seguire i due metodi descritti in precedenza. Convertire l'immagine 4:2:0 in 4:2:2 e quindi convertire l'immagine 4:2:2 in 4:4:4. È anche possibile cambiare l'ordine dei due processi di conversione verso l'alto, poiché l'ordine dell'operazione non influisce realmente sulla qualità visiva del risultato.

Altri formati YUV

Altri formati YUV meno comuni includono:

  • AI44 è un formato YUV palettizzato con 8 bit per campione. Ogni esempio contiene un indice nei 4 bit più significativi (MSB) e un valore alfa nei 4 bit meno significativi (LSB). L'indice fa riferimento a un array di elementi della tavolozza YUV, che deve essere definito nel tipo di supporto del formato. Questo formato viene usato principalmente per le immagini di sottopicture.
  • NV11 è un formato planare 4:1:1 con 12 bit per pixel. Gli esempi Y vengono visualizzati per primi in memoria. Il piano Y è seguito da una matrice di campioni U (Cb) e V (Cr). Quando la matrice U-V combinata viene indirizzata come matrice di valori di WORD little-endian, gli esempi U sono contenuti nei LSB di ogni WORDe gli esempi V sono contenuti nei database MSB. Questo layout di memoria è simile a NV12 anche se il campionamento cromatico è diverso.
  • Y41P è un formato 4:1:1, con U e V campionati ogni quarto pixel orizzontalmente. Ogni macropixel contiene 8 pixel in tre byte, con il layout di byte seguente: U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
  • Y41T è identico a Y41P, ad eccezione del bit meno significativo di ogni campione Y specifica la chiave cromatica (0 = trasparente, 1 = opaco).
  • Y42T è identico a UYVY, ad eccezione del bit meno significativo di ogni campione Y specifica la chiave cromatica (0 = trasparente, 1 = opaco).
  • YVYU equivale a YUYV, ad eccezione del fatto che i campioni U e V vengono scambiati.

Identificazione dei formati YUV in Media Foundation

Ognuno dei formati YUV descritti in questo articolo ha un codice FOURCC assegnato. Un codice FOURCC è un intero senza segno a 32 bit creato concatenando quattro caratteri ASCII.

Esistono varie macro C/C++ che semplificano la dichiarazione di valori FOURCC nel codice sorgente. Ad esempio, la macro MAKEFOURCC viene dichiarata in Mmsystem.h e la macro FCC viene dichiarata in Aviriff.h. Usarli come segue:

DWORD fccYUY2 = MAKEFOURCC('Y','U','Y','2');
DWORD fccYUY2 = FCC('YUY2');

È anche possibile dichiarare un codice FOURCC direttamente come stringa letterale semplicemente invertendo l'ordine dei caratteri. Per esempio:

DWORD fccYUY2 = '2YUY';  // Declares the FOURCC 'YUY2'

Il ripristino dell'ordine è necessario perché il sistema operativo Windows usa un'architettura little-endian. 'Y' = 0x59, 'U' = 0x55 e '2' = 0x32, quindi '2YUY' è 0x32595559.

In Media Foundation i formati sono identificati da un GUID di tipo principale e da un GUID di sottotipo. Il tipo principale per i formati video del computer è sempre MFMediaType_Video . Il sottotipo può essere costruito eseguendo il mapping del codice FOURCC a un GUID, come indicato di seguito:

XXXXXXXX-0000-0010-8000-00AA00389B71 

dove XXXXXXXX è il codice FOURCC. Di conseguenza, il GUID del sottotipo per YUY2 è:

32595559-0000-0010-8000-00AA00389B71 

Le costanti per i GUID di formato YUV più comuni sono definite nel file di intestazione mfapi.h. Per un elenco di queste costanti, vedere GUID sottotipo video.

Informazioni sul video YUV

tipi di supporti video