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. Descrive le tecniche di campionamento YUV più comuni.
- Definizioni di Superficie. Descrive i formati YUV consigliati.
- Conversioni di spazio colore e frequenza di campionamento cromatico. 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 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.
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:
- Formati 4:4:4, 32 bit per pixel
- Formato 4:2:2, 16 Bit per Pixel
- Formati 4:2:0, 16 Bits 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 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.
- 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 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.
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.
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.
IMC3
Questo formato è identico a IMC1, ad eccezione dei piani U e V che 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 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.
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.
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.
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.
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 da RGB888 a YUV 4:4:4
- Conversione da YUV a 8-bit a RGB888
- Conversione da 4:2:0 YUV a 4:2:2 YUV
- Conversione da 4:2:2 YUV a 4:4:4 YUV
- Conversione da 4:2:0 YUV 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 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.
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.
Argomenti correlati