Empfohlene 8-Bit-YUV-Formate für das Videorendering
Gary Sullivan und Stephen Estrop
Microsoft Corporation
April 2002, aktualisiert november 2008
In diesem Thema werden die 8-Bit-YUV-Farbformate beschrieben, die für das Videorendering im Windows-Betriebssystem empfohlen werden. In diesem Artikel werden Techniken zum Konvertieren zwischen YUV- und RGB-Formaten sowie Techniken zum Upsampling von YUV-Formaten vorgestellt. Dieser Artikel richtet sich an alle Benutzer, die mit der YUV-Videodecodierung oder dem Rendern in Windows arbeiten.
Einführung
Zahlreiche YUV-Formate sind in der gesamten Videobranche definiert. In diesem Artikel werden die 8-Bit-YUV-Formate beschrieben, die für das Videorendering in Windows empfohlen werden. Decoderhersteller und Anzeigeanbieter werden aufgefordert, die in diesem Artikel beschriebenen Formate zu unterstützen. In diesem Artikel werden keine anderen Verwendungen von YUV-Farben behandelt, z. B. Die Fotografie.
Die in diesem Artikel beschriebenen Formate verwenden alle 8 Bits pro Pixelposition zum Codieren des Y-Kanals (auch als Lumakanal bezeichnet) und verwenden 8 Bit pro Beispiel, um jedes U- oder V-Chroma-Beispiel zu codieren. Die meisten YUV-Formate verwenden jedoch im Durchschnitt weniger als 24 Bits pro Pixel, da sie weniger Beispiele von Ihnen und V als Y enthalten. Dieser Artikel behandelt keine YUV-Formate mit 10-Bit- oder höher Y-Kanälen.
Hinweis
Für die Zwecke dieses Artikels ist der Begriff U äquivalent zu Cb, und der Begriff V entspricht Cr.
In diesem Artikel werden die folgenden Themen behandelt:
- YUV-Stichprobenentnahme. Beschreibt die am häufigsten verwendeten YUV-Samplingverfahren.
- Surface-Definitionen. Beschreibt die empfohlenen YUV-Formate.
- Farbraum- und Chroma-Samplingrate-Konvertierungen. Enthält einige Richtlinien für die Konvertierung zwischen YUV- und RGB-Formaten und für die Konvertierung zwischen verschiedenen YUV-Formaten.
- Identifizieren von YUV-Formaten in Media Foundation. Erläutert, wie YUV-Formattypen in Media Foundation beschrieben werden.
YUV-Stichprobenentnahme
Chroma-Kanäle können eine niedrigere Abtastrate als der Luma-Kanal haben, ohne dramatischen Verlust der Wahrnehmungsqualität. Eine Notation namens "A:B:C" wird verwendet, um zu beschreiben, wie oft Sie und V relativ zu Y stichprobenweise erfasst werden:
- 4:4:4 bedeutet keine Downsampling der Chromakanäle.
- 4:2:2 bedeutet horizontales Heruntersampling von 2:1 ohne vertikales Downsampling. Jede Scanzeile enthält vier Y-Beispiele für zwei U- oder V-Beispiele.
- 4:2:0 bedeutet 2:1 horizontales Downsampling mit 2:1 vertikaler Downsampling.
- 4:1:1 bedeutet horizontales Heruntersampling von 4:1 ohne vertikales Downsampling. Jede Scanzeile enthält vier Y-Beispiele für jedes You- und V-Beispiel. Die 4:1:1-Stichprobenerstellung ist weniger üblich als andere Formate und wird in diesem Artikel nicht ausführlich erläutert.
Die folgenden Diagramme zeigen, wie die Chroma für jede der Downsamplingraten stichprobeniert wird. Lumabeispiele werden durch ein Kreuz dargestellt, und Chromabeispiele werden durch einen Kreis dargestellt.
Die dominante Form der 4:2:2-Stichprobenentnahme ist in der ITU-R-Empfehlung BT.601 definiert. Es gibt zwei gängige Varianten der 4:2:0-Stichprobenerstellung. Eine davon wird in MPEG-2-Videos verwendet, die andere in MPEG-1 und in ITU-T-Empfehlungen H.261 und H.263.
Im Vergleich zum MPEG-1-Schema ist es einfacher, zwischen dem MPEG-2-Schema und den Samplingrastern zu konvertieren, die für die Formate 4:2:2 und 4:4:4 definiert sind. Aus diesem Grund wird das MPEG-2-Schema in Windows bevorzugt und sollte als Standardinterpretation von 4:2:0-Formaten betrachtet werden.
Surface-Definitionen
In diesem Abschnitt werden die 8-Bit-YUV-Formate beschrieben, die für das Videorendering empfohlen werden. Diese fallen in mehrere Kategorien:
- 4:4:4 Formate, 32 Bits pro Pixel
- 4:2:2 Formate, 16 Bit pro Pixel
- 4:2:0 Formate, 16 Bit pro Pixel
- 4:2:0 Formate, 12 Bit pro Pixel
Zunächst sollten Sie die folgenden Konzepte kennen, um zu verstehen, was folgt:
- Surface-Ursprung. Für die in diesem Artikel beschriebenen YUV-Formate ist der Ursprung (0,0) immer die obere linke Ecke der Oberfläche.
- Stride. Der Schritt einer Oberfläche, manchmal auch als Pitch bezeichnet, ist die Breite der Oberfläche in Bytes. Bei einem Oberflächenursprung in der oberen linken Ecke ist der Schritt immer positiv.
- Ausrichtung. Die Ausrichtung einer Oberfläche liegt im Ermessen des Grafikanzeigetreibers. Die Oberfläche muss immer DWORD ausgerichtet sein. Das heißt, einzelne Linien innerhalb der Oberfläche entstehen garantiert an einer 32-Bit-Grenze (DWORD). Die Ausrichtung kann jedoch je nach Den Anforderungen der Hardware größer als 32 Bit sein.
- Gepacktes Format im Vergleich zum planaren Format. YUV-Formate sind in gepackte Formate und planare Formate unterteilt. In einem gepackten Format werden die Y-, U- und V-Komponenten in einem einzigen Array gespeichert. Pixel sind in Gruppen von Makropixeln organisiert, deren Layout vom Format abhängt. In einem planaren Format werden die Y-, U- und V-Komponenten als drei separate Ebenen gespeichert.
Jedem der in diesem Artikel beschriebenen YUV-Formate ist ein FOURCC-Code zugewiesen. Ein FOURCC-Code ist eine 32-Bit-Ganzzahl ohne Vorzeichen, die durch Verkettung von vier ASCII-Zeichen erstellt wird.
- 4:4:4 (32 bpp)
- 4:2:2 (16 bpp)
- 4:2:0 (16 bpp)
- 4:2:0 (12 bpp)
4:4:4 Formate, 32 Bits pro Pixel
AYUV
Es wird ein einzelnes 4:4:4-Format mit dem FOURCC-Code AYUV empfohlen. Dies ist ein gepacktes Format, bei dem jedes Pixel als vier aufeinanderfolgende Bytes codiert ist, die in der in der folgenden Abbildung dargestellten Sequenz angeordnet sind.
Die mit A markierten Bytes enthalten Werte für Alpha.
4:2:2 Formate, 16 Bit pro Pixel
Es werden zwei 4:2:2-Formate mit den folgenden FOURCC-Codes empfohlen:
- YUY2
- UYVY
Beide sind gepackte Formate, wobei jedes Makropixel zwei Pixel ist, die als vier aufeinanderfolgende Bytes codiert sind. Dies führt zu einer horizontalen Herabstempelung der Chroma um den Faktor zwei.
YUY2
Im YUY2-Format können die Daten als Array von Zeichenwerten ohne Vorzeichen behandelt werden, wobei das erste Byte das erste Y-Beispiel, das zweite Byte das erste U -Beispiel (Cb) enthält, das dritte Byte das zweite Y-Beispiel und das vierte Byte das erste V -Beispiel (Cr), wie im folgenden Diagramm dargestellt.
Wenn das Bild als Array von Little-Endian-WORD-Werten behandelt wird, enthält das erste WORD das erste Y-Beispiel in den geringsten signifikanten Bits (LSBs) und das erste U -Beispiel (Cb) in den wichtigsten Bits (MSBs). Das zweite WORD enthält das zweite Y-Beispiel in den LSBs und das erste V(Cr)-Beispiel in den MSBs.
YUY2 ist das bevorzugte 4:2:2-Pixelformat für Microsoft DirectX Video Acceleration (DirectX VA). Es wird erwartet, dass es sich um eine mittelfristige Anforderung für DirectX VA-Beschleuniger handelt, die 4:2:2-Video unterstützen.
UYVY
Dieses Format ist identisch mit dem YUY2-Format, mit der Ausnahme, dass die Bytereihenfolge umgekehrt wird. Das heißt, die Chroma- und Lumabytes werden umgedreht (Abbildung 4). Wenn das Bild als Array von zwei Little-Endian-WORD-Werten adressiert wird, enthält das erste WORD U in den LSBs und Y0 in den MSBs, und das zweite WORD enthält V in den LSBs und Y1 in den MSBs.
4:2:0 Formate, 16 Bits pro Pixel
Zwei 4:2:0 16-Bit-Formate pro Pixel (bpp) mit den folgenden FOURCC-Codes werden empfohlen:
- IMC1
- IMC3
Beide YUV-Formate sind planare Formate. Die Chromakanäle werden sowohl in der horizontalen als auch in der vertikalen Dimension um den Faktor zwei untersampelt.
IMC1
Alle Y-Beispiele werden zuerst im Arbeitsspeicher als Array von Zeichenwerten ohne Vorzeichen angezeigt. Darauf folgen alle V(Cr)-Beispiele und dann alle U-Beispiele (Cb). Die V- und U-Ebenen weisen denselben Schritt wie die Y-Ebene auf, was zu ungenutzten Speicherbereichen führt, wie in Abbildung 5 dargestellt. Die U- und V-Ebenen müssen an Speichergrenzen beginnen, die ein Vielfaches von 16 Zeilen sind. Abbildung 5 zeigt den Ursprung von Ihnen und V für einen 352 x 240-Videoframe. Die Startadresse der U- und V-Ebenen wird wie folgt berechnet:
BYTE* pV = pY + (((Height + 15) & ~15) * Stride);
BYTE* pU = pY + (((((Height * 3) / 2) + 15) & ~15) * Stride);
Dabei ist pY ein Bytezeiger auf den Anfang des Speicherarrays, wie im folgenden Diagramm dargestellt.
IMC3
Dieses Format ist mit IMC1 identisch, mit der Ausnahme, dass die Ebenen "Sie" und "V" getauscht werden, wie im folgenden Diagramm dargestellt.
4:2:0 Formate, 12 Bits pro Pixel
Vier 4:2:0 12-bpp-Formate werden mit den folgenden FOURCC-Codes empfohlen:
- IMC2
- IMC4
- YV12
- NV12
In all diesen Formaten werden die Chromakanäle sowohl in der horizontalen als auch in der vertikalen Dimension um den Faktor 2 unterstempelt.
IMC2
Dieses Format ist identisch mit IMC1, mit Ausnahme des folgenden Unterschieds: Die Zeilen V (Cr) und U (Cb) sind an halbstrenigen Grenzen verschachtelt. Anders ausgedrückt: Jede Vollschrittlinie im Chroma-Bereich beginnt mit einer Zeile von V-Proben, gefolgt von einer Linie von U-Beispielen, die an der nächsten Halbschrittgrenze beginnt (Abbildung 7). Dieses Layout ermöglicht eine effizientere Nutzung des Adressraums als IMC1. Sie halbiert den Chroma-Adressraum und damit den Gesamtadressraum um 25 Prozent. Unter den Formaten 4:2:0 ist IMC2 nach NV12 das zweithäufigste bevorzugte Format. Die folgende Abbildung veranschaulicht diesen Vorgang.
IMC4
Dieses Format ist identisch mit IMC2, mit der Ausnahme, dass die Zeilen U (Cb) und V (Cr) getauscht werden, wie in der folgenden Abbildung dargestellt.
YV12
Alle Y-Beispiele werden zuerst im Arbeitsspeicher als Array von Zeichenwerten ohne Vorzeichen angezeigt. Auf dieses Array folgen sofort alle V(Cr)-Beispiele. Der Schritt der V-Ebene ist die Hälfte des Schritts der Y-Ebene; und die V-Ebene enthält halb so viele Zeilen wie die Y-Ebene. Auf die V-Ebene folgen sofort alle U-Stichproben (Cb) mit der gleichen Schritt- und Zeilenanzahl wie die V-Ebene, wie in der folgenden Abbildung dargestellt.
NV12
Alle Y-Beispiele werden zuerst im Arbeitsspeicher als Array von Zeichenwerten ohne Vorzeichen mit einer geraden Anzahl von Zeilen angezeigt. Auf die Y-Ebene folgt sofort ein Array von Zeichenwerten ohne Vorzeichen, das gepackte U-Beispiele (Cb) und V (Cr) enthält. Wenn das kombinierte U-V-Array als Array von Little-Endian-WORD-Werten adressiert wird, enthalten die LSBs die U-Werte, und die MSBs enthalten die V-Werte. NV12 ist das bevorzugte 4:2:0-Pixelformat für DirectX VA. Es wird erwartet, dass es sich um eine mittelfristige Anforderung für DirectX VA-Beschleuniger handelt, die 4:2:0-Video unterstützen. Die folgende Abbildung zeigt die Y-Ebene und das Array, das gepackte Beispiele für Sie und V enthält.
Farbraum- und Chroma-Samplingrate-Konvertierungen
Dieser Abschnitt enthält Richtlinien für die Konvertierung zwischen YUV und RGB sowie für die Konvertierung zwischen einigen verschiedenen YUV-Formaten. Wir betrachten zwei RGB-Codierungsschemas in diesem Abschnitt: 8-Bit-Computer RGB, auch bekannt als sRGB oder "full-scale" RGB, und Studio-Video-RGB oder "RGB mit Kopfraum und Toe-Room". Diese werden wie folgt definiert:
- Computer RGB verwendet 8 Bits für jede Stichprobe von Rot, Grün und Blau. Schwarz wird durch R = G = B = 0 und Weiß durch R = G = B = 255 dargestellt.
- Studio-Video RGB verwendet für jedes Beispiel von Rot, Grün und Blau eine bestimmte Anzahl von Bits N, wobei N 8 oder mehr ist. Studio Video RGB verwendet einen anderen Skalierungsfaktor als die Computer-RGB und verfügt über einen Offset. Schwarz wird durch R = G = B = 16*2^(N-8) dargestellt, und Weiß wird durch R = G = B = 235*2^(N-8) dargestellt. Tatsächliche Werte können jedoch außerhalb dieses Bereichs liegen.
Studio-Video-RGB ist die bevorzugte RGB-Definition für Video in Windows, während computer-RGB die bevorzugte RGB-Definition für Nicht-Video-Anwendungen ist. In beiden RGB-Formen sind die Chromitätskoordinaten gemäß ITU-R BT.709 für die Definition der RGB-Farbprimierungen angegeben. Die (x,y)-Koordinaten von R, G und B sind (0,64, 0,33), (0,30, 0,60) und (0,15, 0,06). Referenz weiß ist D65 mit Koordinaten (0,3127, 0,3290). Nominales Gamma ist 1/0,45 (ca. 2,2), wobei genaues Gamma im Detail in ITU-R BT.709 definiert ist.
Konvertierung zwischen RGB und 4:4:4 YUV
Zunächst wird die Konvertierung zwischen RGB und 4:4:4 YUV beschrieben. Zum Konvertieren von 4:2:0 oder 4:2:2 YUV in RGB wird empfohlen, die YUV-Daten in 4:4:4 YUV zu konvertieren und dann von 4:4:4 YUV in RGB zu konvertieren. Das AYUV-Format, das ein 4:4:4-Format ist, verwendet jeweils 8 Bits für die Y-, U- und V-Beispiele. YUV kann auch mit mehr als 8 Bit pro Beispiel für einige Anwendungen definiert werden.
Für digitales Video wurden zwei dominante YUV-Konvertierungen von RGB definiert. Beide basieren auf der Spezifikation, die als ITU-R Recommendation BT.709 bekannt ist. Die erste Konvertierung ist die ältere YUV-Form, die für die Verwendung von 50 Hz in BT.709 definiert ist. Es entspricht der Beziehung, die in der ITU-R-Empfehlung BT.601 angegeben ist, die auch unter dem älteren Namen CCIR 601 bekannt ist. Es sollte als das bevorzugte YUV-Format für Standard-Definition-TV-Auflösung (720 x 576) und Video mit niedrigerer Auflösung betrachtet werden. Es zeichnet sich durch die Werte der beiden Konstanten Kr und Kb aus:
Kr = 0.299
Kb = 0.114
Die zweite Konvertierung ist die neuere YUV-Form, die für die Verwendung von 60 Hz in BT.709 definiert ist, und sollte als das bevorzugte Format für Videoauflösungen oberhalb von SDTV betrachtet werden. Es zeichnet sich durch unterschiedliche Werte für diese beiden Konstanten aus:
Kr = 0.2126
Kb = 0.0722
Die Konvertierung von RGB zu YUV wird definiert, indem sie mit Folgendem beginnen:
L = Kr * R + Kb * B + (1 - Kr - Kb) * G
Die YUV-Werte werden dann wie folgt abgerufen:
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))
where
- M ist die Anzahl der Bits pro YUV-Beispiel (M >= 8).
- Z ist die Schwarzebenenvariable. Für den RGB-Computer ist Z gleich 0. Bei Studio-Video-RGB entspricht Z 16*2^(N-8), wobei N die Anzahl der Bits pro RGB-Beispiel (N >= 8) ist.
- S ist die Skalierungsvariable. Für den RGB-Computer entspricht S 255. Für Studio-Video RGB entspricht S 219*2^(N-8).
Die Funktion floor(x) gibt die größte ganze Zahl zurück, die kleiner oder gleich x ist. Die Funktion clip3(x, y, z) ist wie folgt definiert:
clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))
Hinweis
clip3 sollte als Funktion und nicht als Präprozessormakro implementiert werden. Andernfalls werden mehrere Auswertungen der Argumente durchgeführt.
Das Y-Beispiel stellt die Helligkeit dar, und die You- und V-Beispiele stellen die Farbabweichungen zu Blau bzw. Rot dar. Der Nominalbereich für Y beträgt 16*2^(M-8) bis 235*2^(M-8). Schwarz wird als 16*2^(M-8) und weiß als 235*2^(M-8) dargestellt. Der Nominalbereich für Sie und V beträgt 16*2^(M-8) bis 240*2^(M-8), wobei der Wert 128*2^(M-8) neutrales Chroma darstellt. Tatsächliche Werte können jedoch außerhalb dieser Bereiche liegen.
Für Eingabedaten in Form von Studio Video RGB ist der Clipvorgang erforderlich, um die Werte von u und V im Bereich von 0 bis (2^M)-1 zu halten. Wenn die Eingabe computer RGB ist, ist der Clipvorgang nicht erforderlich, da die Konvertierungsformel keine Werte außerhalb dieses Bereichs erzeugen kann.
Dies sind die genauen Formeln ohne Näherung. Alles, was in diesem Dokument folgt, wird von diesen Formeln abgeleitet. In diesem Abschnitt werden die folgenden Konvertierungen beschrieben:
- Konvertieren von RGB888 in YUV 4:4:4
- Konvertieren von 8-Bit-YUV in RGB888
- Konvertieren von 4:2:0 YUV in 4:2:2 YUV
- Konvertieren von 4:2:2 YUV in 4:4:4 YUV
- Konvertieren von 4:2:0 YUV in 4:4:4 YUV
Konvertieren von RGB888 in YUV 4:4:4
Im Fall der RGB-Eingabe des Computers und der 8-Bit-BT.601-YUV-Ausgabe sind wir der Ansicht, dass die im vorherigen Abschnitt angegebenen Formeln wie folgt in angemessener Weise angenähert werden können:
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
Diese Formeln erzeugen 8-Bit-Ergebnisse unter Verwendung von Koeffizienten, die nicht mehr als 8 Bit (ohne Vorzeichen) Genauigkeit erfordern. Zwischenergebnisse erfordern bis zu 16 Bit Genauigkeit.
Konvertieren von 8-Bit-YUV in RGB888
Aus den ursprünglichen RGB-zu-YUV-Formeln können die folgenden Beziehungen für BT.601 abgeleitet werden.
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
Aus diesem Grund:
C = Y - 16
D = U - 128
E = V - 128
Die Formeln zum Konvertieren von YUV in RGB können wie folgt abgeleitet werden:
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 ) )
wobei clip()
das Abschneiden in einen Bereich von [0..255] bezeichnet. Wir sind der Meinung, dass diese Formeln durch Folgendes angemessen angenähert werden können:
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)
Diese Formeln verwenden einige Koeffizienten, die mehr als 8 Bit Genauigkeit erfordern, um jedes 8-Bit-Ergebnis zu erzeugen, und Zwischenergebnisse erfordern mehr als 16 Bit Genauigkeit.
Um 4:2:0 oder 4:2:2 YUV in RGB zu konvertieren, empfehlen wir, die YUV-Daten in 4:4:4 YUV zu konvertieren und dann von 4:4:4 YUV in RGB zu konvertieren. In den folgenden Abschnitten werden einige Methoden zum Konvertieren der Formate 4:2:0 und 4:2:2:2 in 4:4:4 beschrieben.
Konvertieren von 4:2:0 YUV in 4:2:2 YUV
Das Konvertieren von 4:2:0 YUV in 4:2:2 YUV erfordert eine vertikale Hochkonversion um den Faktor zwei. In diesem Abschnitt wird eine Beispielmethode zum Ausführen der Upconversion beschrieben. Die Methode setzt voraus, dass die Videobilder progressive Überprüfung sind.
Hinweis
Der Konvertierungsprozess für interlaced Scan von 4:2:0 auf 4:2:2 stellt atypische Probleme dar und ist schwer zu implementieren. In diesem Artikel wird das Problem der Konvertierung von Interlaced Scan von 4:2:0 in 4:2:2:2 nicht behandelt.
Lassen Sie jede vertikale Linie von Eingabechromatproben ein Array Cin[]
sein, das von 0 bis N bis 1 reicht. Die entsprechende vertikale Linie auf dem Ausgabebild ist ein Array Cout[]
, das von 0 bis 2N - 1 reicht. Führen Sie den folgenden Prozess aus, um jede vertikale Linie zu konvertieren:
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);
wobei clip() das Ausschneiden in einen Bereich von [0..255] angibt.
Hinweis
Die Formeln für den Umgang mit den Kanten können mathematisch vereinfacht werden. Sie werden in dieser Form dargestellt, um den Klemmeffekt an den Bildrändern zu veranschaulichen.
Tatsächlich berechnet diese Methode jeden fehlenden Wert, indem die Kurve über die vier benachbarten Pixel interpoliert wird, die auf die Werte der beiden nächstgelegenen Pixel gewichtet werden (Abbildung 11). Die spezifische Interpolationsmethode, die in diesem Beispiel verwendet wird, generiert fehlende Stichproben an halbzahligen Positionen mithilfe einer bekannten Methode namens Catmull-Rom Interpolation, die auch als kubische Konvolutionsinterpolation bezeichnet wird.
Bei der Signalverarbeitung sollte die vertikale Aufkonversion idealerweise eine Phasenverschiebungskompensation enthalten, um den vertikalen Halbpixeloffset (relativ zum Ausgaberaster 4:2:2:2) zwischen den Positionen der 4:2:0-Beispiellinien und der Position jeder anderen 4:2:2-Beispiellinie zu berücksichtigen. Die Einführung dieses Offsets würde jedoch den Verarbeitungsaufwand erhöhen, der zum Generieren der Proben erforderlich ist, und es unmöglich machen, die ursprünglichen 4:2:0-Samples aus dem upampled 4:2:2-Bild zu rekonstruieren. Es würde auch unmöglich machen, Videos direkt in 4:2:2-Oberflächen zu decodieren und diese Oberflächen dann als Referenzbilder zum Decodieren nachfolgender Bilder im Stream zu verwenden. Daher berücksichtigt die hier angegebene Methode nicht die präzise vertikale Ausrichtung der Proben. Dies ist bei relativ hohen Bildauflösungen wahrscheinlich nicht visuell schädlich.
Wenn Sie mit einem 4:2:0-Video beginnen, das das in H.261, H.263 oder MPEG-1-Video definierte Samplingraster verwendet, wird die Phase der 4:2:2-Chroma-Samples auch um einen horizontalen Halbpixelversatz relativ zum Abstand des Luma-Samplingrasters verschoben (ein Viertelpixeloffset relativ zum Abstand des Chroma-Sampling-Rasters von 4:2:2). Die MPEG-2-Form des 4:2:0-Videos wird jedoch wahrscheinlich häufiger auf PCs verwendet und leidet nicht unter diesem Problem. Darüber hinaus ist die Unterscheidung bei relativ hohen Bildauflösungen wahrscheinlich nicht visuell schädlich. Der Versuch, dieses Problem zu beheben, würde die gleiche Art von Problemen verursachen, die für den vertikalen Phasenoffset behandelt werden.
Konvertieren von 4:2:2 YUV in 4:4:4 YUV
Das Konvertieren von 4:2:2 YUV in 4:4:4 YUV erfordert eine horizontale Hochkonversion um den Faktor zwei. Die zuvor für vertikale Hochkonversion beschriebene Methode kann auch auf horizontale Upconversion angewendet werden. Für MPEG-2- und ITU-R BT.601-Videos erzeugt diese Methode Beispiele mit der richtigen Phasenausrichtung.
Konvertieren von 4:2:0 YUV in 4:4:4 YUV
Um 4:2:0 YUV in 4:4:4 YUV zu konvertieren, können Sie einfach die beiden zuvor beschriebenen Methoden befolgen. Konvertieren Sie das Bild 4:2:0 in 4:2:2, und konvertieren Sie dann das Bild 4:2:2 in 4:4:4. Sie können auch die Reihenfolge der beiden Upconversionsprozesse ändern, da die Reihenfolge des Vorgangs für die visuelle Qualität des Ergebnisses nicht wirklich von Bedeutung ist.
Andere YUV-Formate
Einige andere, weniger gebräuchliche YUV-Formate umfassen Folgendes:
- AI44 ist ein palettisiertes YUV-Format mit 8 Bits pro Beispiel. Jedes Beispiel enthält einen Index in den 4 wichtigsten Bits (MSBs) und einen Alphawert in den 4 geringsten signifikanten Bits (LSBs). Der Index verweist auf ein Array von YUV-Paletteneinträgen, die im Medientyp für das Format definiert werden müssen. Dieses Format wird hauptsächlich für Unterpicture-Bilder verwendet.
- NV11 ist ein planares 4:1:1-Format mit 12 Bits pro Pixel. Die Y-Beispiele werden zuerst im Arbeitsspeicher angezeigt. Auf die Y-Ebene folgt ein Array von gepackten Proben U (Cb) und V (Cr). Wenn das kombinierte U-V-Array als Array von Little-Endian WORD-Werten behandelt wird, sind die U-Beispiele in den LSBs jedes WORD enthalten, und die V-Beispiele sind in den MSBs enthalten. (Dieses Speicherlayout ähnelt NV12, obwohl sich die Chroma-Sampling unterscheidet.)
- Y41P ist ein gepacktes 4:1:1-Format, wobei Sie und V jedes vierte Pixel horizontal abgetastet werden. Jedes Makropixel enthält 8 Pixel in drei Bytes mit dem folgenden Bytelayout:
U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
- Y41T ist identisch mit Y41P, mit dem Unterschied, dass das kleinste Bit jeder Y-Stichprobe die Chroma-Taste angibt (0 = transparent, 1 = undurchsichtig).
- Y42T ist mit UYVY identisch, mit dem Unterschied, dass das kleinste Bit jeder Y-Stichprobe die Chroma-Taste angibt (0 = transparent, 1 = undurchsichtig).
- YVYU entspricht YUYV, mit der Ausnahme, dass die Beispiele "You" und "V" ausgetauscht werden.
Identifizieren von YUV-Formaten in Media Foundation
Jedem der in diesem Artikel beschriebenen YUV-Formate ist ein FOURCC-Code zugewiesen. Ein FOURCC-Code ist eine 32-Bit-Ganzzahl ohne Vorzeichen, die durch Verkettung von vier ASCII-Zeichen erstellt wird.
Es gibt verschiedene C/C++-Makros, die das Deklarieren von FOURCC-Werten im Quellcode erleichtern. Beispielsweise wird das MAKEFOURCC-Makro in Mmsystem.h deklariert, und das FCC-Makro wird in Aviriff.h deklariert. Verwenden Sie sie wie folgt:
DWORD fccYUY2 = MAKEFOURCC('Y','U','Y','2');
DWORD fccYUY2 = FCC('YUY2');
Sie können einen FOURCC-Code auch direkt als Zeichenfolgenliteral deklarieren, indem Sie einfach die Reihenfolge der Zeichen umkehren. Beispiel:
DWORD fccYUY2 = '2YUY'; // Declares the FOURCC 'YUY2'
Das Umkehren der Reihenfolge ist erforderlich, da das Windows-Betriebssystem eine Little-Endian-Architektur verwendet. "Y" = 0x59, "U" = 0x55 und "2" = 0x32, sodass "2YUY" 0x32595559 ist.
In Media Foundation werden Formate durch eine Haupttyp-GUID und eine Untertyp-GUID identifiziert. Der Haupttyp für Computervideoformate ist immer MFMediaType_Video . Der Untertyp kann wie folgt erstellt werden, indem der FOURCC-Code einer GUID zugeordnet wird:
XXXXXXXX-0000-0010-8000-00AA00389B71
wobei XXXXXXXX
der FOURCC-Code ist. Daher lautet die Untertyp-GUID für YUY2:
32595559-0000-0010-8000-00AA00389B71
Konstanten für die gängigsten YUV-Format-GUIDs werden in der Headerdatei mfapi.h definiert. Eine Liste dieser Konstanten finden Sie unter Video-Subtyp-GUIDs.
Zugehörige Themen