Dela via


Rekommenderade 8-bitars YUV-format för videorendering

Gary Sullivan och Stephen Estrop

Microsoft Corporation

April 2002, uppdaterad november 2008

Det här avsnittet beskriver de 8-bitars YUV-färgformat som rekommenderas för videorendering i Windows-operativsystemet. Den här artikeln beskriver tekniker för att konvertera mellan YUV- och RGB-format och innehåller även tekniker för att uppsampla YUV-format. Den här artikeln är avsedd för alla som arbetar med YUV-video avkodning eller rendering i Windows.

Introduktion

Många YUV-format definieras i hela videoindustrin. Den här artikeln identifierar de 8-bitars YUV-format som rekommenderas för videorendering i Windows. Avkodarleverantörer och visningsleverantörer uppmuntras att stödja de format som beskrivs i den här artikeln. Den här artikeln behandlar inte andra användningsområden för YUV-färg, till exempel stillbildsfotografering.

De format som beskrivs i den här artikeln använder alla 8 bitar per pixelplats för att koda Y-kanalen (kallas även lumakanalen) och använder 8 bitar per exempel för att koda varje U- eller V-kromaexempel. De flesta YUV-format använder men färre än 24 bitar per pixel i genomsnitt, eftersom de innehåller färre prover av U och V än Y. Den här artikeln beskriver inte YUV-format med 10-bitars eller högre kanaler för Y.

Not

I den här artikeln motsvarar termen U cb och termen V motsvarar Cr.

 

Den här artikeln beskriver följande avsnitt:

YUV-sampling

Chroma-kanaler kan ha en lägre samplingsfrekvens än lumakanalen, utan någon dramatisk förlust av perceptuell kvalitet. En notation som kallas "A:B:C"-notationen används för att beskriva hur ofta U och V samplas i förhållande till Y.

  • 4:4:4 innebär ingen nedsampling av kromakanalerna.
  • 4:2:2 betyder 2:1 horisontell nedsampling, utan lodrätt nedsampling. Varje genomsökningsrad innehåller fyra Y-exempel för vartannat U- eller V-exempel.
  • 4:2:0 betyder 2:1 vågrät nedsampling, med 2:1 lodrät nedsampling.
  • 4:1:1 betyder 4:1 horisontell nedsampling, utan vertikal nedsampling. Varje genomsökningsrad innehåller fyra Y-prover för varje U- och V-prov. 4:1:1 sampling är mindre vanligt än andra format och beskrivs inte i detalj i den här artikeln.

Följande diagram visar hur krom samplas för var och en av nedsamplingsfrekvensen. Luma-exempel representeras av ett kors och kromaexempel representeras av en cirkel.

bild 1. kromatisk sampling

Den dominerande formen av 4:2:2-sampling definieras i ITU-R rekommendation BT.601. Det finns två vanliga varianter av 4:2:0-sampling. En av dessa används i MPEG-2 video, och den andra används i MPEG-1 och i ITU-T Rekommendationerna H.261 och H.263.

Jämfört med MPEG-1-schemat är det enklare att konvertera mellan MPEG-2-schemat och de samplingsrutnät som definierats för formaten 4:2:2 och 4:4:4. Därför föredras MPEG-2-schemat i Windows och bör betraktas som standardtolkning av 4:2:0-format.

Ytdefinitioner

I det här avsnittet beskrivs de 8-bitars YUV-format som rekommenderas för videorendering. Dessa delas in i flera kategorier:

Först bör du vara medveten om följande begrepp för att förstå vad som följer:

  • Surface-ursprung. För YUV-format som beskrivs i den här artikeln är ursprunget (0,0) alltid det övre vänstra hörnet på ytan.
  • Stride. Steglängden på en yta, som ibland kallas pitch, är ytans bredd i byte. Med tanke på ett ytursprung i det övre vänstra hörnet är steglängden alltid positiv.
  • Justering. Justeringen av en yta är enligt grafikvisningsdrivrutinens gottfinnande. Ytan måste alltid vara DWORD-justerad. Dvs. enskilda linjer inom ytan garanteras komma från en 32-bitars (DWORD) gräns. Justeringen kan dock vara större än 32 bitar, beroende på maskinvarans behov.
  • Packat format jämfört med planärt format. YUV-formaten delas in i packade format och plana format. I ett packat format lagras komponenterna Y, U och V i en enda matris. Bildpunkter ordnas i grupper av makropixlar, vars layout är beroende av formatet. I planarformat lagras komponenterna Y, U och V som tre separata plan.

Vart och ett av DE YUV-format som beskrivs i den här artikeln har en tilldelad FOURCC-kod. En FOURCC-kod är ett 32-bitars osignerat heltal som skapas genom att sammanfoga fyra ASCII-tecken.

4:4:4-format, 32 bitar per pixel

AYUV

Ett enskilt 4:4:4-format rekommenderas med FOURCC-koden AYUV. Det här är ett packat format där varje pixel kodas som fyra på varandra följande byte, ordnat i sekvensen som visas i följande bild.

bild 2. ayuv-minneslayout

Byte markerade A innehåller värden för alfa.

4:2:2 Format, 16 bitar per pixel

Två 4:2:2-format rekommenderas med följande FOURCC-koder:

  • YUY2
  • UYVY

Båda är packade format, där varje makropixel är två pixlar kodade som fyra på varandra följande byte. Detta resulterar i horisontell nedsampling av krom med en faktor på två.

YUY2

I YUY2-format kan data behandlas som en matris med osignerade tecken värden, där den första byte innehåller det första Y-exemplet, den andra byte innehåller det första U-exemplet (Cb), den tredje byte innehåller det andra Y-exemplet och det fjärde bytet innehåller det första V-exemplet (Cr) som visas i följande diagram.

bild 3. yuy2 minneslayout

Om avbildningen adresseras som en matris med små endianska WORD- värden innehåller den första WORD- det första Y-exemplet i de minst signifikanta bitarna (LSB) och det första U-exemplet (Cb) i de viktigaste bitarna (MSB). Den andra WORD- innehåller det andra Y-exemplet i LSB:erna och det första V-exemplet (Cr) i MSB:erna.

YUY2 är det föredragna formatet 4:2:2 pixel för Microsoft DirectX Video Acceleration (DirectX VA). Det förväntas vara ett krav på mellantid för DirectX VA-acceleratorer som stöder 4:2:2-video.

UYVY

Det här formatet är samma som YUY2-formatet förutom att byteordningen är omvänd, det vill sa att krom- och luma-byte vänds (bild 4). Om avbildningen adresseras som en matris med två små endianska WORD- värden innehåller den första WORD- U i LSB:erna och Y0 i MSB:erna och den andra WORD- innehåller V i LSB:erna och Y1 i MSB:erna.

bild 4. uyvy minneslayout

4:2:0 Format, 16 bitar per pixel

Två 4:2:0-format med 16 bitar per pixel (bpp) rekommenderas, med följande FOURCC-koder:

  • IMC1
  • IMC3

Båda dessa YUV-format är planarformat. Kromkanalerna undersamplas av en faktor på två i både de vågräta och lodräta dimensionerna.

IMC1

Alla Y-exempel visas först i minnet som en matris med osignerade tecken värden. Detta följs av alla V-exempel (Cr) och sedan alla U-exempel (Cb). V- och U-planen har samma steg som Y-planet, vilket resulterar i oanvända minnesområden, som visas i bild 5. Du- och V-planen måste starta på minnesgränser som är en multipel av 16 rader. Bild 5 visar ursprunget för U och V för en videobild med storleken 352 x 240. Startadressen för U- och V-planen beräknas på följande sätt:

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

där pY är en bytepekare till början av minnesmatrisen, enligt följande diagram.

Bild 5. IMC1-minneslayout (exempel)

IMC3

Det här formatet är identiskt med IMC1, förutom att U- och V-planen är utbytta enligt följande diagram.

bild 6. imc3-minneslayout

4:2:0 Format, 12 bitar per pixel

Fyra 4:2:0 12-bpp-format rekommenderas med följande FOURCC-koder:

  • IMC2
  • IMC4
  • YV12
  • NV12

I alla dessa format undersamplas kromakanalerna av en faktor på två i både de vågräta och lodräta dimensionerna.

IMC2

Det här formatet är samma som IMC1 förutom följande skillnad: Linjerna V (Cr) och U (Cb) interfolieras vid halvstegsgränser. Med andra ord börjar varje fullstegslinje i kromaområdet med en rad V-exempel, följt av en rad U-exempel som börjar vid nästa halvstegsgräns (bild 7). Den här layouten använder adressutrymmet effektivare än IMC1. Det halverar kromadressutrymmet och medför att det totala adressutrymmet minskar med 25 procent. Bland 4:2:0-format är IMC2 det näst mest föredragna formatet, efter NV12. Följande bild illustrerar den här processen.

bild 7. imc2-minneslayout

IMC4

Det här formatet är identiskt med IMC2, förutom att linjerna U (Cb) och V (Cr) växlas, enligt följande bild.

bild 8. imc4-minneslayout

YV12

Alla Y-exempel visas först i minnet som en matris med osignerade tecken värden. Den här matrisen följs av omedelbart alla V-prov (Cr). V-planets steg är halva Y-planets steg; och V-planet innehåller hälften så många rader som Y-planet. V-planet följs omedelbart av alla U-prover (Cb), med samma steg och antal linjer som V-planet, som visas i följande bild.

bild 9. yv12-minneslayout

NV12

Alla Y-exempel visas först i minnet som en matris med osignerade tecken värden med ett jämnt antal rader. Y-planet följs omedelbart av en matris med osignerade tecken värden som innehåller paketerade U-exempel (Cb) och V (Cr). När den kombinerade U-V-matrisen adresseras som en matris med lite endianska WORD- värden innehåller LSB:erna U-värdena och MSB:erna innehåller V-värdena. NV12 är det föredragna formatet 4:2:0 pixel för DirectX VA. Det förväntas vara ett krav på mellantid för DirectX VA-acceleratorer som stöder 4:2:0-video. Följande illustration visar Y-planet och matrisen som innehåller packade U- och V-prover.

bild 10. nv12-minneslayout

Konvertering av färgutrymme och Chroma-samplingshastighet

Det här avsnittet innehåller riktlinjer för konvertering mellan YUV och RGB och för konvertering mellan vissa olika YUV-format. Vi överväger två RGB-kodningsscheman i det här avsnittet: 8-bitars dator-RGB, även känd som sRGB eller "fullskalig" RGB, och studio video RGB, eller "RGB med head-room och tåutrymme". Dessa definieras på följande sätt:

  • Datorns RGB använder 8 bitar för varje urval av rött, grönt och blått. Svart representeras av R = G = B = 0, och vit representeras av R = G = B = 255.
  • Studio video RGB använder ett antal bitar N för varje urval av rött, grönt och blått, där N är 8 eller mer. Studio Video RGB använder en annan skalningsfaktor än datorns RGB och har en förskjutning. Svart representeras av R = G = B = 16*2^(N-8) och vit representeras av R = G = B = 235*2^(N-8). Faktiska värden kan dock ligga utanför det här intervallet.

Studio video RGB är den föredragna RGB-definitionen för video i Windows, medan RGB för datorer är den RGB-definition som föredras för program som inte är video. I båda formerna av RGB, specificeras kromaticitetkoordinaterna enligt ITU-R BT.709 för definitionen av RGB-färgprimärerna. Koordinaterna (x,y) för R, G och B är (0,64, 0,33), (0,30, 0,60) respektive (0,15, 0,06). Referensvit är D65 med koordinater (0,3127, 0,3290). Nominell gamma är 1/0,45 (cirka 2,2), med exakt gamma definierad i detalj i ITU-R BT.709.

konvertering mellan RGB och 4:4:4 YUV

Vi beskriver först konverteringen mellan RGB och 4:4:4 YUV. Om du vill konvertera 4:2:0 eller 4:2:2 YUV till RGB rekommenderar vi att du konverterar YUV-data till 4:4:4 YUV och sedan konverterar från 4:4:4 YUV till RGB. AYUV-formatet, som är ett 4:4:4-format, använder 8 bitar vardera för Y-, U- och V-exemplen. YUV kan också definieras med mer än 8 bitar per exempel för vissa program.

Två dominerande YUV-konverteringar från RGB har definierats för digital video. Båda baseras på specifikationen som kallas ITU-R rekommendation BT.709. Den första konverteringen är det äldre YUV-formuläret som definierats för 50-Hz-användning i BT.709. Det är samma som den relation som anges i ITU-R rekommendation BT.601, även känd under sitt äldre namn, CCIR 601. Det bör betraktas som det föredragna YUV-formatet för tv-upplösning med standarddefinition (720 x 576) och video med lägre upplösning. Det kännetecknas av värdena för två konstanter Kr och Kb:

Kr = 0.299
Kb = 0.114

Den andra konverteringen är det nyare YUV-formuläret som definierats för 60-Hz-användning i BT.709 och bör anses vara det föredragna formatet för videoupplösningar ovanför SDTV. Det kännetecknas av olika värden för dessa två konstanter:

Kr = 0.2126
Kb = 0.0722

Konvertering från RGB till YUV definieras genom att börja med följande:

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

YUV-värdena hämtas sedan på följande sätt:

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

var

  • M är antalet bitar per YUV-exempel (M >= 8).
  • Z är variabeln på svart nivå. För dator-RGB är Z lika med 0. För Studio Video RGB är Z lika med 16*2^(N-8), där N är antalet bitar per RGB-exempel (N >= 8).
  • S är skalningsvariabeln. För datorns RGB är S lika med 255. För Studio Video RGB är S lika med 219*2^(N-8).

Funktionen floor(x) returnerar det största heltalet mindre än eller lika med x. Funktionsklippet3(x, y, z) definieras på följande sätt:

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

Anteckning

clip3 bör implementeras som en funktion i stället för ett makro med förprocessor. annars sker flera utvärderingar av argumenten.

 

Y-exemplet representerar ljusstyrka och du- och V-exemplen representerar färgavvikelserna mot blått respektive rött. Det nominella intervallet för Y är 16*2^(M-8) till 235*2^(M-8). Svart representeras som 16*2^(M-8) och vitt representeras som 235*2^(M-8). Det nominella intervallet för U och V är 16*2^(M-8) till 240*2^(M-8), med värdet 128*2^(M-8) som representerar neutral kroma. Faktiska värden kan dock ligga utanför dessa intervall.

För indata med studiovideo-RGB är klippningen nödvändig för att hålla U och V-värdena inom intervallet 0 till (2^M)-1. Om indata är dator-RGB, krävs inte klippning, eftersom konverteringsformeln inte kan generera värden utanför det här intervallet.

Det här är de exakta formler utan uppskattning. Allt som följer i det här dokumentet härleds från dessa formler. I det här avsnittet beskrivs följande konverteringar:

Konvertera RGB888 till YUV 4:4:4

När det gäller RGB-indata och 8-bitars BT.601 YUV-utdata tror vi att de formler som angavs i föregående avsnitt rimligen kan approximeras med följande:

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

Dessa formler ger 8-bitarsresultat med hjälp av koefficienter som inte kräver mer än 8 bitar (osignerad) precision. Mellanliggande resultat kräver upp till 16 bitars precision.

Konvertera 8-bitars YUV till RGB888

Från de ursprungliga RGB-till-YUV-formlerna kan man härleda följande relationer för 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

Därför, med tanke på:

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

formlerna för att konvertera YUV till RGB kan härledas på följande sätt:

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

där clip() anger begränsning till ett värdeområde på [0..255]. Vi tror att dessa formler kan vara någorlunda ungefärliga med följande:

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)

Dessa formler använder vissa koefficienter som kräver mer än 8 bitars precision för att producera varje 8-bitars resultat, och mellanliggande resultat kräver mer än 16 bitar precision.

Om du vill konvertera 4:2:0 eller 4:2:2 YUV till RGB rekommenderar vi att du konverterar YUV-data till 4:4:4 YUV och sedan konverterar från 4:4:4 YUV till RGB. Avsnitten som följer innehåller några metoder för att konvertera formaten 4:2:0 och 4:2:2 till 4:4:4.

Konverterar 4:2:0 YUV till 4:2:2 YUV

Konvertering av 4:2:0 YUV till 4:2:2 YUV kräver vertikal uppkonvertering med en faktor av två. I det här avsnittet beskrivs en exempelmetod för att utföra upconversion. Metoden förutsätter att videobilderna är progressiv skanning.

Not

Konverteringsprocessen av interlaced scanning från 4:2:0 till 4:2:2 medför atypiska problem och är svår att implementera. Den här artikeln tar inte upp problemet med att konvertera interlaced scanning från 4:2:0 till 4:2:2.

 

Låt varje lodrät linje med indatakromexempel vara en matris Cin[] som sträcker sig från 0 till N – 1. Motsvarande lodräta linje på utdatabilden är en matris Cout[] som sträcker sig från 0 till 2N –1. Utför följande process för att konvertera varje lodrät linje:

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

där clip() anger urklipp till ett intervall på [0..255].

Notera

Ekvationerna för att hantera kanterna kan förenklas matematiskt. De visas i den här formen för att illustrera klämeffekten vid bildens kanter.

 

I själva verket beräknar den här metoden varje värde som saknas genom att interpolera kurvan över de fyra intilliggande bildpunkterna, viktade mot värdena för de två närmaste bildpunkterna (bild 11). Den specifika interpoleringsmetod som används i det här exemplet genererar saknade exempel vid halv heltalspositioner med hjälp av en välkänd metod som kallas Catmull-Rom interpolation, även kallad kubisk involutionsinterpolation.

bild 11. diagram som visar uppsampling från 4:2:0 till 4:2:2

När det gäller signalbearbetning bör den lodräta uppkonverteringen helst innehålla en fasförskjutningskompensation för att ta hänsyn till den lodräta halvpunktsförskjutningen (i förhållande till utdata 4:2:2:2 samplingsrutnätet) mellan platserna för 4:2:0-exempellinjerna och platsen för varannan 4:2:2-exempellinje. Att införa den här förskjutningen skulle dock öka mängden bearbetning som krävs för att generera proverna och göra det omöjligt att rekonstruera de ursprungliga 4:2:0-proverna från den uppskalade 4:2:2-bilden. Det skulle också göra det omöjligt att avkoda video direkt till 4:2:2-ytor och sedan använda dessa ytor som referensbilder för avkodning av efterföljande bilder i strömmen. Därför tar den metod som anges här inte hänsyn till den exakta lodräta justeringen av exemplen. Att göra det är förmodligen inte visuellt skadligt med någorlunda höga bildupplösningar.

Om du börjar med en 4:2:0-video som använder samplingsrutnätet som definieras i H.261, H.263- eller MPEG-1-video, kommer fasen för utdata 4:2:2-kromaprover också att flyttas med en vågrät förskjutning med en halv pixel i förhållande till avstånden i lumasamplingsrutnätet (en förskjutning med en kvarts pixel i förhållande till avstånden i 4:2:2-kromasamlingsrutnätet). MPEG-2-formen av 4:2:0-videon används dock förmodligen oftare på datorer och lider inte av det här problemet. Dessutom är skillnaden förmodligen inte visuellt skadlig vid någorlunda höga bildupplösningar. Om du försöker korrigera för det här problemet skulle det skapa samma typ av problem som beskrivs för den lodräta fasförskjutningen.

Konverterar 4:2:2 YUV till 4:4:4 YUV

Konvertering av 4:2:2 YUV till 4:4:4 YUV kräver horisontell uppkonvertering med en faktor på två. Metoden som beskrevs tidigare för lodrät uppkonvertering kan också användas för horisontell uppkonvertering. För MPEG-2- och ITU-R BT.601-video kommer den här metoden att producera exempel med rätt fasjustering.

Konverterar 4:2:0 YUV till 4:4:4 YUV

Om du vill konvertera 4:2:0 YUV till 4:4:4 YUV kan du helt enkelt följa de två metoder som beskrevs tidigare. Konvertera 4:2:0-bilden till 4:2:2 och konvertera sedan 4:2:2-bilden till 4:4:4. Du kan också byta ordning på de två uppkonverteringsprocesserna, eftersom åtgärdsordningen egentligen inte spelar någon roll för resultatets visuella kvalitet.

Andra YUV-format

Några andra, mindre vanliga YUV-format är följande:

  • AI44 är ett palettiserat YUV-format med 8 bitar per exempel. Varje exempel innehåller ett index i de 4 viktigaste bitarna (MSB) och ett alfavärde i de 4 minst signifikanta bitarna (LSB). Indexet refererar till en matris med YUV-palettposter, som måste definieras i medietypen för formatet. Det här formatet används främst för underbildsbilder.
  • NV11 är ett planformat på 4:1:1 med 12 bitar per bildpunkt. Y-exemplen visas först i minnet. Y-planet följs av en matris med packade U-exempel (Cb) och V (Cr). När den kombinerade U-V-matrisen adresseras som en matris med lite endianska WORD--värden, finns U-exemplen i LSB:erna för varje WORD-och V-exemplen finns i MSB:erna. (Den här minneslayouten liknar NV12 även om chroma-samplingen skiljer sig.)
  • Y41P är ett 4:1:1-packat format, där U och V samplas var fjärde pixel horisontellt. Varje makropixel innehåller 8 bildpunkter i tre byte, med följande bytelayout: U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
  • Y41T är identiskt med Y41P, förutom att den minst signifikanta biten av varje Y-exempel anger kromnyckeln (0 = transparent, 1 = ogenomskinlig).
  • Y42T är identiskt med UYVY, förutom att den minst signifikanta biten av varje Y-exempel anger kromnyckeln (0 = transparent, 1 = ogenomskinlig).
  • YVYU motsvarar YUYV förutom att U- och V-exemplen omkastas.

Identifiera YUV-format i Media Foundation

Vart och ett av DE YUV-format som beskrivs i den här artikeln har en tilldelad FOURCC-kod. En FOURCC-kod är ett 32-bitars osignerat heltal som skapas genom att sammanfoga fyra ASCII-tecken.

Det finns olika C/C++-makron som gör det enklare att deklarera FOURCC-värden i källkoden. Makrot MAKEFOURCC deklareras till exempel i Mmsystem.h, och makrot FCC deklareras i Aviriff.h. Använd dem på följande sätt:

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

Du kan också deklarera en FOURCC-kod direkt som en strängliteral genom att helt enkelt återställa teckenordningen. Till exempel:

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

Det är nödvändigt att ändra ordningen eftersom Windows-operativsystemet använder en lite endiansk arkitektur. 'Y' = 0x59, 'U' = 0x55 och '2' = 0x32, så '2YUY' är 0x32595559.

I Media Foundation identifieras format av en huvudtyps-GUID och en undertyps-GUID. Huvudtypen för datorvideoformat är alltid MFMediaType_Video . Undertypen kan skapas genom att fourcc-koden mappas till ett GUID enligt följande:

XXXXXXXX-0000-0010-8000-00AA00389B71 

där XXXXXXXX är FOURCC-koden. Därför är undertypen GUID för YUY2:

32595559-0000-0010-8000-00AA00389B71 

Konstanter för de vanligaste GUID:erna i YUV-format definieras i huvudfilen mfapi.h. En lista över dessa konstanter finns i videoundertyps-GUID:er.

Om YUV Video

Videomediatyper