Formati YUV consigliati a 8 bit per il rendering video

Gary Sullivan e Stephen Estrop

Microsoft Corporation

Aprile 2002, aggiornato novembre 2008

Questo argomento descrive 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 stia lavorando con decodifica video YUV o rendering 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 risolve altri usi del colore YUV, ad esempio la fotografia ancora.

I formati descritti in questo articolo usano tutti 8 bit per posizione pixel per codificare il canale Y (chiamato anche il canale luma) e usare 8 bit per esempio per codificare ogni campione U o V chroma. Tuttavia, la maggior parte dei formati YUV usa meno di 24 bit per pixel in media, perché contengono meno esempi di te e V di Y. Questo articolo non illustra 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 include 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. Viene usata una notazione denominata "A:B:C" per descrivere la frequenza con cui vengono campionati e V relativi a Y:

  • 4:4:4 significa che non viene eseguito alcun downampling dei canali chroma.
  • 4:2:2 significa 2:1 downsampling orizzontale, senza un downampling verticale. Ogni riga di analisi contiene quattro esempi di Y per ogni due esempi U o V.
  • 4:2:0 significa 2:1 downsampling orizzontale, con downsampling verticale 2:1.
  • 4:1:1 significa 4:1 downsampling orizzontale, senza un downampling verticale. Ogni riga di analisi contiene quattro esempi di Y per ogni esempio 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 campionato il chroma per ognuno dei tassi di downampling. Gli esempi di Luma sono rappresentati da una croce e i campioni di croma sono rappresentati da un cerchio.

figure 1. chroma sampling

La forma dominante di campionamento 4:2:2 è definita nella raccomandazione ITU-R 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 Consigli H.261 e H.263.

Rispetto allo schema MPEG-1, è più semplice convertire 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 è preferito in Windows e deve essere considerato l'interpretazione predefinita dei formati 4:2:0.

Definizioni di superficie

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

Prima di tutto, è necessario tenere presente 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 denominata passo, è la larghezza della superficie in byte. Dato un'origine di superficie all'angolo superiore sinistro, lo stride è sempre positivo.
  • Allineamento. L'allineamento di una superficie è a discrezione del driver di visualizzazione grafica. La superficie deve essere sempre allineata; ovvero, le singole righe all'interno della superficie sono garantite per origine su un limite A 32 bit (DWORD). 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 con pacchetti e formati 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, disposto nella sequenza illustrata nella figura seguente.

figure 2. ayuv memory layout

I byte contrassegnati da A contengono valori per alfa.

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 compressi, in cui ogni macropixel è codificato in due pixel come quattro byte consecutivi. Ciò comporta un downampling orizzontale del croma da un fattore di due.

YUY2

In formato YUY2, i dati possono essere considerati come una matrice di valori char senza segno, in cui il primo byte contiene il primo esempio 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.

figure 3. yuy2 memory layout

Se l'immagine viene indirizzata come matrice di valori WORD little-endian, la prima WORD contiene il primo esempio Y nei bit meno significativi (LSBS) e il primo esempio U (CB) nei bit più significativi (MSBS). Il secondo word contiene il secondo esempio di Y nei database di rete e il primo esempio V (Cr) negli MSBs.

YUY2 è il formato di 4:2:2 pixel preferito per l'accelerazione video DirectX (DirectX VA). Si prevede che sia 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 di byte inverso, ovvero i byte chroma e luma vengono capovolti (Figura 4). Se l'immagine viene indirizzata come matrice di due valori DI WORD little-endian, la prima parola contiene U nei database LSB e Y0 nei database MSB e la seconda parola contiene V nei database LSB e Y1 nei database MSB.

figure 4. uyvy memory layout

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 gli esempi Y vengono visualizzati per primi in memoria come matrice di valori char senza segno. Questo è seguito da tutti gli esempi V (Cr) e quindi tutti gli esempi U (Cb). I piani V e U hanno lo stesso stride del piano Y, causando aree inutilizzate di memoria, come illustrato nella figura 5. I piani you e V devono iniziare sui limiti di memoria che sono più di 16 righe. La figura 5 mostra l'origine di te e V per un fotogramma video 352 x 240. L'indirizzo iniziale dei piani you e V viene calcolato 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.

figure 5. imc1 memory layout (example)

IMC3

Questo formato è identico a IMC1, ad eccezione dei piani you e V, viene scambiato, come illustrato nel diagramma seguente.

figure 6. imc3 memory layout

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, ad eccezione della differenza seguente: le linee V (Cr) e U (Cb) vengono interleavede ai limiti di mezzo stride. In altre parole, ogni linea full-stride nell'area cromatica inizia con una linea di campioni V, seguita da una riga di campioni U che inizia al limite mezzo-stride successivo (figura 7). Questo layout rende più efficiente l'uso dello spazio indirizzi rispetto a IMC1. Taglia lo spazio indirizzi cromatico in metà e quindi lo spazio indirizzi totale del 25%. Tra i formati 4:2:0, IMC2 è il secondo formato preferito, dopo NV12. L'immagine seguente illustra questo processo.

figure 7. imc2 memory layout

IMC4

Questo formato è identico a IMC2, ad eccezione delle righe U (Cb) e V (Cr), come illustrato nella figura seguente.

figure 8. imc4 memory layout

YV12

Tutti gli esempi Y vengono visualizzati per primi in memoria come matrice di valori char senza segno. Questa matrice viene 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 viene seguito immediatamente da tutti i campioni U (Cb), con lo stesso stride e il numero di linee del piano V, come illustrato nella figura seguente.

figure 9. yv12 memory layout

NV12

Tutti gli esempi Y vengono visualizzati per primi in memoria come matrice di valori char senza segno con un numero pari di righe. Il piano Y viene seguito immediatamente da una matrice di valori char senza segno che contiene campioni U (Cb) e V (Cr). Quando la matrice U-V combinata viene indirizzata come matrice di valori WORD little-endian, i database LSB contengono i valori U e i database MSB contengono i valori V. NV12 è il formato di pixel 4:2:0 preferito per DirectX VA. Si prevede che sia 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 esempi di esempio e V compressi.

figure 10. nv12 memory layout

Conversione della frequenza di campionamento cromatica e dello spazio dei colori

In questa sezione vengono fornite 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 a 8 bit, noti anche come RGB sRGB o "full-scale" RGB e video di studio, oppure "RGB con head room e toe-room". Questi sono definiti come segue:

  • Rgb del computer usa 8 bit per ogni campione di rosso, verde e blu. Il nero è rappresentato da R = G = B = 0 e il bianco è rappresentato da R = G = B = 255.
  • Il video RGB di Studio usa un certo numero di bit N per ogni campione di rosso, verde e blu, dove N è 8 o più. Il video RGB di Studio usa un fattore di ridimensionamento diverso rispetto a RGB del computer e presenta 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.

Rgb video studio è la definizione RGB preferita per il video in Windows, mentre il computer RGB è la definizione RGB preferita per le applicazioni non video. In entrambe le forme di RGB, le coordinate di 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 ciascuno 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 si basano sulla specifica nota come RACCOMANDAZIONE ITU-R BT.709. La prima conversione è il formato YUV precedente definito per l'uso a 50-Hz in BT.709. Corrisponde alla relazione specificata in ITU-R Recommendation 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 i video in 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 te e V sono da 16*2^(M-8) a 240*2^(M-8), con il valore 128*2^(M-8) che rappresenta il colore neutro. Tuttavia, i valori effettivi possono non rientrare in questi intervalli.

Per i dati di input sotto forma di RGB video studio, l'operazione di ritaglio è necessaria per mantenere i valori you 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 BT.601 a 8 bit, 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

Pertanto, dato:

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 ritaglio in un 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 richiedono 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 che seguono presentano alcuni metodi per la conversione dei formati 4:2:0 e 4:2:2 in 4:4:4.

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

La conversione da 4:2:0 YUV a 4:2:2 YUV richiede un'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 analisi progressive.

Nota

Il processo di conversione interlacciato da 4:2:0 a 4:2:2 presenta problemi atipici ed è difficile da implementare. Questo articolo non risolve il problema della conversione dell'analisi interlacciata da 4:2:0 a 4:2:2.

 

Lasciare che ogni riga verticale di campioni di cromatica di input sia una matrice Cin[] compresa tra 0 e N - 1. La linea 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 in posizioni a metà integer usando un metodo noto denominato interpolazione Catmull-Rom, noto anche come interpolazione di convoluzione cubica.

figure 11. diagram showing 4:2:0 to 4:2:2 upsampling

In termini di elaborazione del segnale, l'upconversione verticale dovrebbe includere idealmente una compensazione dello spostamento di fase per tenere conto dell'offset verticale di mezzo 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 linea di campionamento 4:2:2. Tuttavia, l'introduzione di questo offset aumenterebbe la quantità di elaborazione necessaria per generare i campioni e rendere impossibile ricostruire i campioni originali 4:2:0 dall'immagine upsampled 4:2:2. Sarebbe anche 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 il video 4:2:0 che usa la griglia di campionamento definita in H.261, Il video H.263 o MPEG-1, la fase degli esempi di cromatura 4:2:2 verrà spostata anche da un offset orizzontale di mezzo pixel rispetto alla spaziatura sulla griglia di campionamento luma (offset di un quarto pixel rispetto alla spaziatura della griglia di campionamento cromatica 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 immagine ragionevolmente elevate. Se si tenta di risolvere questo problema, si creerebbe lo stesso tipo di problemi descritti per l'offset di fase verticale.

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

La conversione da 4:2:2 YUV a 4:4:4 YUV richiede un'upconversione orizzontale per un fattore di due. Il metodo descritto in precedenza per l'upconversione verticale può essere applicato anche all'upconversion orizzontale. Per il video MPEG-2 e ITU-R 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 inversione, perché l'ordine dell'operazione non è veramente rilevante per la qualità visiva del risultato.

Altri formati YUV

Altri formati YUV meno comuni includono quanto segue:

  • AI44 è un formato YUV pallido 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 una matrice di voci di tavolozza YUV, che deve essere definita nel tipo di supporto per il formato. Questo formato viene usato principalmente per le immagini secondarie.
  • 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 WORD little-endian, gli esempi U sono contenuti nei LSB di ogni WORD e gli esempi V sono contenuti nei database MSB. Questo layout di memoria è simile a NV12 anche se il campionamento cromatico è diverso.
  • Y41P è un formato compresso 4:1:1, con te 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 dei campioni you e V che 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 valore letterale stringa semplicemente ripristinando l'ordine dei caratteri. Ad esempio:

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

L'inversione dell'ordine è necessaria 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 su YUV Video

Tipi di supporti video