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 il 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, ad esempio la fotografia.
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 U o V chroma. Tuttavia, la maggior parte dei formati YUV usa meno di 24 bit per pixel in media, perché contengono meno campioni di te e V rispetto a 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. Descrive le tecniche di campionamento YUV più comuni.
- Definizioni di superficie. Descrive i formati YUV consigliati.
- Conversione della frequenza di campionamento cromatica e dello spazio dei colori. Fornisce alcune linee guida per la conversione tra formati YUV e RGB e per la conversione tra formati YUV diversi.
- Identificazione dei formati YUV in Media Foundation. Viene illustrato come descrivere i tipi di formato YUV in Media Foundation.
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 denominata notazione "A:B:C" viene usata per descrivere la frequenza con cui vengono campionati l'utente e la V rispetto a Y:
- 4:4:4 significa che non viene eseguito alcun downcampionamento dei canali cromatici.
- 4:2:2 indica il sottocampionamento orizzontale 2:1, senza un downcampion verticale. Ogni riga di analisi contiene quattro campioni Y per ogni due campioni U o V.
- 4:2:0 indica il downcampling orizzontale 2:1, con un downcampionamento verticale 2:1.
- 4:1:1 indica il sottocampionamento orizzontale 4:1, senzacampionamento verticale. Ogni riga di analisi contiene quattro esempi Y per ogni esempio di utente e V. Il campionamento 4:1:1 è meno comune di altri formati e non è descritto in dettaglio in questo articolo.
I diagrammi seguenti illustrano come viene campionata la cromatica per ogni frequenza di downsampling. I campioni Luma sono rappresentati da una croce e i campioni cromatici sono rappresentati da un cerchio.
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 nelle raccomandazioni ITU-T 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 superficie
Questa sezione descrive i formati YUV a 8 bit consigliati per il rendering video. Questi rientrano in diverse categorie:
- Formati 4:4:4, 32 bit per pixel
- Formati 4:2:2, 16 bit per pixel
- Formati 4:2:0, 16 bit per pixel
- Formati 4:2:0, 12 bit per pixel
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 detta inclinazione, è la larghezza della superficie in byte. Data un'origine della superficie nell'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 a DWORD; ovvero, le singole linee all'interno della superficie hanno la garanzia di avere 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 e 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.
- 4:4:4 (32 bpp)
- 4:2:2 (16 bpp)
- 4:2:0 (16 bpp)
- 4:2:0 (12 bpp)
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.
I byte contrassegnati come 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 come quattro byte consecutivi. Ciò comporta un downcampionamento orizzontale del cromatico di un fattore di due.
YUY2
In formato YUY2, i dati possono essere considerati come una matrice di valori char senza segno, dove il primo byte contiene il primo campione Y, il secondo byte contiene il primo campione U (Cb), il terzo byte contiene il secondo campione Y e il quarto byte contiene il primo campione V (Cr), come illustrato nel diagramma seguente.
Se l'immagine viene indirizzata come matrice di valori WORD little-endian, il primo 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 esempio Y nei database di azure e il primo campione V (Cr) nei database MSB.
YUY2 è il formato preferito di 4:2:2 pixel per Microsoft DirectX Video Acceleration (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 WORD di tipo little-endian, la prima WORD contiene U nei database LSBs e Y0 nei database MSB e la seconda WORD contiene V nei database LSB e Y1 negli MSB.
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 chroma sono sottocampionati da un fattore di due nelle dimensioni orizzontali e verticali.
IMC1
Tutti gli esempi Y vengono visualizzati prima 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 dell'utente e della V per un frame 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.
IMC3
Questo formato è identico a IMC1, ad eccezione dei piani you e V vengono scambiati, come illustrato nel diagramma seguente.
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 chroma sono sottocampionati da un fattore di due nelle dimensioni orizzontali e verticali.
IMC2
Questo formato è uguale a IMC1, ad eccezione della differenza seguente: le righe V (Cr) e U (Cb) vengono interleavede a metà stride limiti. In altre parole, ogni linea full-stride nell'area chroma inizia con una linea di campioni V, seguita da una riga di esempi U che inizia al limite di metà stride successivo (Figura 7). Questo layout rende più efficiente l'uso dello spazio indirizzi rispetto a IMC1. Taglia lo spazio degli indirizzi del croma in metà e quindi lo spazio totale degli indirizzi del 25%. Tra i formati 4:2:0, IMC2 è il formato più preferito, dopo NV12. L'immagine seguente illustra questo processo.
IMC4
Questo formato è identico a IMC2, ad eccezione delle righe U (Cb) e V (Cr), come illustrato nella figura seguente.
YV12
Tutti gli esempi Y vengono visualizzati prima 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 è la metà dello stride del piano Y; e il piano V contiene metà delle righe del piano Y. Il piano V viene seguito immediatamente da tutti gli esempi U (Cb), con lo stesso stride e il numero di righe del piano V, come illustrato nella figura seguente.
NV12
Tutti gli esempi Y vengono visualizzati prima 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 contengono esempi U (Cb) e V (Cr). Quando la matrice U-V combinata viene indirizzata come matrice di valori WORD di tipo little-endian, i LSBS contengono i valori U e gli 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. Nella figura seguente viene illustrato il piano Y e la matrice che contiene esempi di y e V.
Conversione della frequenza di campionamento dello spazio dei colori e della frequenza di campionamento di Chroma
Questa sezione fornisce linee guida per la conversione tra YUV e RGB e per la conversione tra alcuni diversi formati YUV. Si considerano due schemi di codifica RGB in questa sezione: RGB a 8 bit, noto anche come sRGB o "full-scale" RGB, e studio video RGB o "RGB con head-room e toe-room". Questi sono definiti come segue:
- Il computer RGB usa 8 bit per ogni esempio di rosso, verde e blu. Il nero è rappresentato da R = G = B = 0 e bianco è rappresentato da R = G = 255.
- Studio video RGB usa alcuni bit N per ogni esempio di rosso, verde e blu, dove N è 8 o più. Studio video RGB usa un fattore di ridimensionamento diverso rispetto a RGB del computer e ha un offset. Il nero è rappresentato da R = G = B = 16*2^(N-8) e bianco è rappresentato da R = G = B = 235*2^(N-8). Tuttavia, i valori effettivi possono rientrare all'esterno di questo intervallo.
Il video RGB di 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 (rispettivamente 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. YUV può anche essere definito usando più di 8 bit per esempio per alcune applicazioni.
Sono state definite due conversioni YUV dominanti da RGB per il video digitale. Entrambi sono basati sulla specifica nota come RACCOMANDAZIONE ITU-R BT.709. La prima conversione è il modulo YUV precedente definito per l'uso da 50 a Hz in BT.709. È la stessa della relazione specificata nella raccomandazione ITU-R BT.601, nota anche dal suo nome precedente, CCIR 601. Deve essere considerato il formato YUV preferito per la risoluzione TV standard (720 x 576) e video a risoluzione inferiore. È caratterizzato dai valori di due costanti Kr e Kb:
Kr = 0.299
Kb = 0.114
La seconda conversione è il modulo 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 è definita a partire dalla seguente:
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 esempio YUV (M >= 8).
- Z è la variabile a livello nero. Per il computer RGB, Z è uguale a 0. Per il video RGB di studio, Z è uguale a 16*2^(N-8), dove N è il numero di bit per esempio RGB (N >= 8).
- S è la variabile di ridimensionamento. Per il computer RGB, S è uguale a 255. Per il video RGB di studio, S è uguale a 219*2^(N-8).
Il piano funzione(x) restituisce l'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é una macro del preprocessore; in caso contrario, si verificheranno più valutazioni degli argomenti.
L'esempio Y rappresenta rispettivamente la luminosità e gli esempi di tu e V rappresentano rispettivamente le deviazioni del colore verso blu e rosso. L'intervallo nominale per Y è 16*2^(M-8) a 235*2^(M-8). Il nero è rappresentato come 16*2^(M-8) e bianco è rappresentato come 235*2^(M-8). L'intervallo nominale per te e V è 16*2^(M-8) a 240*2^(M-8), con il valore 128*2^(M-8) che rappresenta il cromatico neutro. Tuttavia, i valori effettivi possono rientrare all'esterno di questi intervalli.
Per i dati di input sotto forma di RGB video studio, l'operazione clip è necessaria per mantenere i valori dell'utente e V all'interno dell'intervallo da 0 a (2^M)-1. Se l'input è RGB del computer, l'operazione clip non è necessaria, perché la formula di conversione non può produrre valori all'esterno 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
- Conversione di YUV a 8 bit in RGB888
- Conversione di YUV da 4:2:0 a 4:2:2 YUV
- Conversione di YUV da 4:2:2 a 4:4:4 YUV
- Conversione di YUV da 4:2:0 a 4:4:4 YUV
Conversione di RGB888 in YUV 4:4:4
Nel caso dell'input RGB del computer e dell'output YUV a 8 bit, si ritiene che le formule fornite nella sezione precedente possano essere ragionevolmente approssimative dal seguente:
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 non richiedono 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 dal seguente:
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 che seguono presentano alcuni metodi per la conversione di formati da 4:2:0 e 4:2:2 a 4:4:4.
Conversione di YUV da 4:2:0 a 4:2:2 YUV
La conversione di YUV da 4:2:0 a 4:2:2 YUV richiede un'upconversion 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 progressiva.
Nota
Il processo di conversione interlacciato da 4:2:0 a 4:2 presenta problemi atipici ed è difficile da implementare. Questo articolo non risolve il problema della conversione dell'analisi interlacciata dalle 4:2:0 alle 4:2:2.
Lasciare che ogni riga verticale di esempi di croma di input sia una matrice Cin[]
che varia da 0 a N - 1. La riga verticale corrispondente nell'immagine di output sarà una matrice Cout[]
che varia da 0 a 2N - 1. Per convertire ogni riga 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 esempi mancanti in posizioni di metà intero usando un metodo noto denominato interpolazione Catmull-Rom, noto anche come interpolazione cubo.
In termini di elaborazione dei segnali, la conversione verticale deve includere idealmente una compensazione dello spostamento in fase per tenere conto dell'offset verticale di 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 questa offset aumenterebbe la quantità di elaborazione necessaria per generare gli esempi e rendere impossibile ricostruire gli esempi originali 4:2:0 dall'immagine 4:2:2. Sarebbe anche impossibile decodificare il video direttamente in superfici 4:2:2 e quindi usare tali superfici come immagini di riferimento per decodificare le immagini successive nel flusso. Pertanto, il metodo fornito qui non tiene conto dell'allineamento verticale preciso degli esempi. 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, H.263 o video MPEG-1, la fase dell'output 4:2:2 campioni di croma verrà spostata anche da un offset orizzontale a metà pixel rispetto alla spaziatura sulla griglia di campionamento luma (offset di quarto 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 immagine ragionevolmente elevate. Il tentativo di correggere questo problema creerebbe lo stesso tipo di problemi descritti per l'offset della fase verticale.
Conversione di YUV da 4:2:2 a 4:4:4 YUV
La conversione di YUV da 4:2:2 a 4:4:4 YUV richiede un'upconversion orizzontale per un fattore di due. Il metodo descritto in precedenza per l'upconversion verticale può essere applicato anche all'upconversion orizzontale. Per il video MPEG-2 e ITU-R BT.601, questo metodo produrrà esempi con l'allineamento della fase corretto.
Conversione di YUV da 4:2:0 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 upconversion, in quanto l'ordine dell'operazione non è veramente importante per la qualità visiva del risultato.
Altri formati YUV
Alcuni altri formati YUV meno comuni includono quanto segue:
- AI44 è un formato YUV palttizzato con 8 bit per esempio. Ogni esempio contiene un indice nei 4 bit più significativi (MSB) e un valore alfa nei 4 bit meno significativi (LSBS). L'indice fa riferimento a una matrice di voci del tavolozza YUV, che devono essere definite nel tipo di supporto per il 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 prima in memoria. Il piano Y è seguito da una matrice di esempi 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 negli LSB di ogni WORD e gli esempi di V sono contenuti negli MSB. Questo layout di memoria è simile a NV12 anche se il campionamento di chroma è diverso.
- Y41P è un formato compresso 4:1:1, con l'utente e il V campione 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 esempio Y specifica la chiave chroma (0 = trasparente, 1 = opaca).
- Y42T è identico a UYVY, ad eccezione del bit meno significativo di ogni campione Y, specifica la chiave chroma (0 = trasparente, 1 = opaco).
- YVYU è equivalente a YUYV, ad eccezione degli esempi you 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 dei 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'
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 vengono 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.
Argomenti correlati