Zalecane 8-bitowe formaty YUV na potrzeby renderowania wideo
Gary Sullivan i Stephen Estrop
Microsoft Corporation
Kwiecień 2002, zaktualizowano listopad 2008 r.
W tym temacie opisano 8-bitowe formaty kolorów YUV zalecane do renderowania wideo w systemie operacyjnym Windows. W tym artykule przedstawiono techniki konwertowania między formatami YUV i RGB, a także przedstawiono techniki rozbudowy formatów YUV. Ten artykuł jest przeznaczony dla każdego, kto pracuje z dekodowaniem wideo YUV lub renderowaniem w systemie Windows.
Wprowadzenie
W całej branży wideo zdefiniowano wiele formatów YUV. W tym artykule opisano 8-bitowe formaty YUV zalecane do renderowania wideo w systemie Windows. Dostawcy dekoderów i dostawcy wyświetlania są zachęcani do obsługi formatów opisanych w tym artykule. Ten artykuł nie dotyczy innych zastosowań koloru YUV, takich jak fotografia statyczna.
Formaty opisane w tym artykule używają 8 bitów na lokalizację pikseli do kodowania kanału Y (nazywanego również kanałem luma) i używają 8 bitów na próbkę, aby zakodować każdą próbkę chroma U lub V. Jednak większość formatów YUV używa średnio mniej niż 24 bitów na piksel, ponieważ zawierają mniej próbek U i V niż Y. Ten artykuł nie obejmuje formatów YUV z 10-bitowymi lub wyższymi kanałami Y.
Notatka
Na potrzeby tego artykułu termin U jest odpowiednikiem cba, a termin V jest odpowiednikiem cr.
W tym artykule opisano następujące tematy:
- próbkowanie YUV. Opisuje najbardziej typowe techniki próbkowania YUV.
- Definicje Powierzchni. Opisuje zalecane formaty YUV.
- przestrzeni kolorów i konwersji współczynnika próbkowania Chroma. Zawiera pewne wytyczne dotyczące konwertowania między formatami YUV i RGB oraz konwertowania między różnymi formatami YUV.
- Identyfikowanie formatów YUV w programie Media Foundation. W tym artykule wyjaśniono, jak opisać typy formatów YUV w programie Media Foundation.
Próbkowanie YUV
Kanały Chroma mogą mieć niższą częstotliwość próbkowania niż kanał luma, bez dramatycznej utraty jakości perceptualnej. Notacja nazywana notacją "A:B:C" służy do opisywania, jak często U i V są próbkowane w porównaniu do Y.
- 4:4:4 oznacza brak zmniejszania próbkowania kanałów chrominancji.
- 4:2:2 oznacza poziome próbkowanie w dół 2:1, bez pionowego próbkowania w dół. Każdy wiersz skanowania zawiera cztery próbki Y dla każdych dwóch próbek U lub V.
- 4:2:0 oznacza 2:1 poziome próbkowanie w dół, z próbkowaniem w dół 2:1 w pionie.
- 4:1:1 oznacza poziome próbkowanie w dół 4:1 bez pionowego próbkowania w dół. Każdy wiersz skanowania zawiera cztery próbki Y dla każdej próbki U i V. Próbkowanie 4:1:1 jest mniej powszechne niż inne formaty i nie zostało szczegółowo omówione w tym artykule.
Na poniższych diagramach pokazano, jak barwa jest próbkowana dla każdego współczynnika próbkowania. Próbki Luma są reprezentowane przez krzyż, a próbki chroma są reprezentowane przez okrąg.
Dominująca forma próbkowania 4:2:2 jest zdefiniowana w zaleceniu ITU-R BT.601. Istnieją dwa typowe warianty próbkowania 4:2:0. Jeden z nich jest używany w wideo MPEG-2, a drugi jest używany w MPEG-1 i w ITU-T Zalecenia H.261 i H.263.
W porównaniu z schematem MPEG-1 łatwiej jest przekonwertować między schematem MPEG-2 a siatkami próbkowania zdefiniowanymi dla formatów 4:2:2 i 4:4:4. Z tego powodu schemat MPEG-2 jest preferowany w systemie Windows i należy uznać za domyślną interpretację formatów 4:2:0.
Definicje powierzchni
W tej sekcji opisano 8-bitowe formaty YUV zalecane do renderowania wideo. Należą one do kilku kategorii:
- Formaty 4:4:4, 32 Bity na Piksel
- formaty 4:2:2, 16 bitów na piksel
- formaty 4:2:0, 16 bitów na piksel
- formaty 4:2:0, 12 bitów na piksel
Najpierw należy pamiętać o następujących pojęciach, aby zrozumieć, co następuje:
- źródła urządzenia Surface. W przypadku formatów YUV opisanych w tym artykule punkt początkowy (0,0) jest zawsze w lewym górnym rogu powierzchni.
- Stride. Krok powierzchni, czasami nazywany skokiem, jest szerokością powierzchni w bajtach. Biorąc pod uwagę początek powierzchni w lewym górnym rogu, przesunięcie jest zawsze dodatnie.
- Wyrównanie Wyrównanie powierzchni jest według uznania sterownika wyświetlania grafiki. Powierzchnia musi być zawsze wyrównana do DWORD; oznacza to, że poszczególne linie na powierzchni mają gwarancję rozpoczynania się na granicy 32-bitowej (DWORD). Wyrównanie może być większe niż 32 bity, w zależności od potrzeb sprzętu.
- Format spakowany a format planarny. Formaty YUV są podzielone na formaty pakowane oraz formaty planar . W zapakowanym formacie składniki Y, U i V są przechowywane w jednej tablicy. Piksele są zorganizowane w grupy makropixels, których układ zależy od formatu. W formacie planarnym składniki Y, U i V są przechowywane jako trzy oddzielne płaszczyzny.
Każdy z formatów YUV opisanych w tym artykule ma przypisany kod FOURCC. Kod FOURCC to 32-bitowa liczba całkowita bez znaku, która jest tworzona przez łączenie czterech znaków ASCII.
- 4:4:4 (32 bpp)
- 4:2:2 (16 bpp)
- 4:2:0 (16 bpp)
- 4:2:0 (12 bpp)
Formaty 4:4:4, 32 bity na piksel
AYUV
Zalecany jest pojedynczy format 4:4:4 z kodem FOURCC AYUV. Jest to zapakowany format, w którym każdy piksel jest zakodowany jako cztery kolejne bajty, rozmieszczony w sekwencji pokazanej na poniższej ilustracji.
Bajty oznaczone jako A zawierają wartości alfa.
Formaty 4:2:2, 16 bitów na piksel
Zalecane są dwa formaty 4:2:2 z następującymi kodami FOURCC:
- YUY2
- UYVY
Oba są formatami pakowanymi, w których każdy makropiksel to dwa piksele zakodowane jako cztery kolejne bajty. Powoduje to poziome próbkowanie w dół chrominancji o współczynnik dwa.
YUY2
W formacie YUY2 dane mogą być traktowane jako tablica niepodpisanych wartości char, gdzie pierwszy bajt zawiera pierwszą próbkę Y, drugi bajt zawiera pierwszą próbkę U (Cb), trzeci bajt zawiera drugą próbkę Y, a czwarty bajt zawiera pierwszą próbkę V (Cr), jak pokazano na poniższym diagramie.
układu pamięci yuy2
Jeśli obraz jest adresowany jako tablica małych endian wartości WORD, pierwszy WORD zawiera pierwszy przykład Y w najmniej znaczących bitach (LSB) i pierwszy przykład U (Cb) w najbardziej znaczących bitach (MSBs). Drugi word zawiera drugą próbkę Y w LSB i pierwszą próbkę V (Cr) w MSB.
YUY2 jest preferowanym formatem pikseli 4:2:2 dla przyspieszania wideo Microsoft DirectX (DirectX VA). Oczekuje się, że będzie to średnioterminowe wymaganie dla akceleratorów DirectX VA obsługujących wideo 4:2:2.
UYVY
Ten format jest taki sam jak format YUY2, z wyjątkiem tego, że kolejność bajtów jest odwrócona — czyli zamieniane są bajty chrominancji i luminancji (Rysunek 4). Jeśli obraz jest adresowany jako tablica dwóch małych endian wartości word, pierwszy WORD zawiera U w LSB i Y0 w MSBs, a drugi WORD zawiera V w LSB i Y1 w MSBs.
Formaty 4:2:0, 16 bitów na piksel
Zalecane są dwa formaty 4:2:0 16-bitowe na piksel (bpp), z następującymi kodami FOURCC:
- IMC1
- IMC3
Oba te formaty YUV są formatami planarnych. Kanały chroma są podprzykładowane przez współczynnik dwóch w wymiarach poziomych i pionowych.
IMC1
Wszystkie przykłady Y są wyświetlane najpierw w pamięci jako tablica niepodpisanych wartości znaków. Następują po nich wszystkie próbki V (Cr), a następnie wszystkie próbki U (Cb). Płaszczyzny V i U mają ten sam krok co płaszczyzna Y, co powoduje niewykorzystane obszary pamięci, jak pokazano na rysunku 5. Płaszczyzny U i V muszą zaczynać się na granicach pamięci, które są wielokrotnościami 16 wierszy. Rysunek 5 przedstawia pochodzenie U i V dla ramki wideo 352 x 240. Adresy początkowe płaszczyzn U i V są obliczane w następujący sposób:
BYTE* pV = pY + (((Height + 15) & ~15) * Stride);
BYTE* pU = pY + (((((Height * 3) / 2) + 15) & ~15) * Stride);
gdzie pY jest wskaźnikiem bajtowym na początku tablicy pamięci, jak pokazano na poniższym diagramie.
IMC3
Ten format jest identyczny jak IMC1, z wyjątkiem zamiany miejscami płaszczyzn U i V, jak pokazano na poniższym diagramie.
Formaty 4:2:0, 12 bitów na piksel
Zalecane są cztery formaty 4:2:0 12-bpp z następującymi kodami FOURCC:
- IMC2
- IMC4
- YV12
- NV12
We wszystkich tych formatach kanały chroma są podampowane przez współczynnik dwóch w wymiarach poziomych i pionowych.
IMC2
Ten format jest taki sam jak IMC1 z wyjątkiem następującej różnicy: linie V (Cr) i U (Cb) są przeplatane na granicach połowy kroku. Innymi słowy, każda linia pełnokrokowa w obszarze chroma zaczyna się od linii próbek V, a następnie od linii próbek U, które zaczynają się na następnej granicy półkroka (Rysunek 7). Ten układ bardziej wydajnie wykorzystuje przestrzeń adresową niż IMC1. Zmniejsza przestrzeń adresową chromatyczną o połowę, a tym samym łączną przestrzeń adresową o 25 procent. Wśród formatów 4:2:0 imC2 jest drugim najbardziej preferowanym formatem po NV12. Na poniższej ilustracji przedstawiono ten proces.
układu pamięci imc2
IMC4
Ten format jest identyczny z formatem IMC2, z wyjątkiem składowych U (Cb) i V (Cr), które są zamienione miejscami, jak pokazano na poniższej ilustracji.
układu pamięci imc4
YV12
Wszystkie próbki Y pojawiają się najpierw w pamięci jako tablica wartości typu bezznakowego char oznaczonych i. Ta tablica jest natychmiast następnie uzupełniona przez wszystkie próbki V (Cr). Krok samolotu V jest połowę kroku samolotu Y; a płaszczyzna V zawiera połowę tylu linii jak płaszczyzna Y. Płaszczyzna V jest natychmiast obserwowana przez wszystkie próbki U (Cb), z tym samym krokiem i liczbą linii co płaszczyzna V, jak pokazano na poniższej ilustracji.
NV12
Wszystkie przykłady Y pojawiają się najpierw w pamięci jako tablica niepodpisanych wartości znaków z parzystą liczbą wierszy. Po płaszczyźnie Y następuje natychmiast tablica niepodpisanych wartości char zawierająca pakowane próbki U (Cb) i V (Cr). Gdy połączona tablica U-V jest skierowana jako tablica małych endian wartości WORD, LSB zawierają wartości U, a MSB zawierają wartości V. Nv12 jest preferowanym formatem pikseli 4:2:0 dla funkcji DirectX VA. Oczekuje się, że będzie to średnioterminowe wymaganie dla akceleratorów VA DirectX obsługujących wideo 4:2:0. Poniższa ilustracja przedstawia płaszczyznę Y i tablicę zawierającą spakowane próbki „U” i „V”.
Konwersje przestrzeni kolorów i częstotliwości próbkowania chroma
Ta sekcja zawiera wskazówki dotyczące konwertowania między formatami YUV i RGB oraz konwertowania między różnymi formatami YUV. Rozważamy dwa schematy kodowania RGB w tej sekcji: 8-bitowy komputer RGB, znany również jako sRGB lub "full-scale" RGB, i studio wideo RGB, lub "RGB z pokojem głównym i toe-room". Są one zdefiniowane w następujący sposób:
- Komputer RGB używa 8 bitów dla każdej próbki czerwonej, zielonej i niebieskiej. Czarny jest reprezentowany przez R = G = B = 0, a biały jest reprezentowany przez R = G = B = 255.
- Studio wideo RGB używa pewnej liczby bitów N dla każdej próbki czerwonej, zielonej i niebieskiej, gdzie N wynosi 8 lub więcej. Studio wideo RGB używa innego współczynnika skalowania niż RGB komputera i ma offset. jest reprezentowany przez R = G = B = 16*2^(N-8), a biały jest reprezentowany przez R = G = B = 235*2^(N-8). Jednak rzeczywiste wartości mogą znajdować się poza tym zakresem.
Studio wideo RGB jest preferowaną definicją RGB dla wideo w systemie Windows, podczas gdy rgb komputera jest preferowaną definicją RGB dla aplikacji innych niż wideo. W każdej formie RGB współrzędne chromatyczności są określone w ITU-R BT.709 dla definicji podstawowych kolorów RGB. Współrzędne (x,y) R, G i B to odpowiednio (0,64, 0,33), (0,30, 0,60) i (0,15, 0,0,06). Biel wzorcowa to D65 ze współrzędnymi (0,3127, 0,3290). Nominalna gamma to 1/0,45 (około 2,2), przy czym dokładna gamma jest szczegółowo określona w ITU-R BT.709.
konwersja między RGB a 4:4:4 YUV
Najpierw opisujemy konwersję między RGB i 4:4:4 YUV. Aby przekonwertować 4:2:0 lub 4:2:2 YUV na RGB, zalecamy przekonwertowanie danych YUV na 4:4:4 YUV, a następnie przekonwertowanie z 4:4:4 YUV na RGB. Format AYUV, który jest formatem 4:4:4, używa 8 bitów dla przykładów Y, U i V. YuV można również zdefiniować przy użyciu więcej niż 8 bitów na próbkę dla niektórych aplikacji.
Dwie dominujące metody konwersji z RGB na YUV zostały zdefiniowane dla cyfrowego wideo. Oba są oparte na specyfikacji znanej jako ITU-R Zalecenie BT.709. Pierwsza konwersja to starsza forma YUV zdefiniowana do użycia przy 50 Hz w BT.709. Jest to takie samo jak związek określony w Zaleceniu ITU-R BT.601, znanym również jako jego starsza nazwa, CCIR 601. Należy go uznać za preferowany format YUV dla standardowej rozdzielczości tv (720 x 576) i wideo o niższej rozdzielczości. Charakteryzuje się ona wartościami dwóch stałych Kr i Kb:
Kr = 0.299
Kb = 0.114
Druga konwersja to nowsza forma YUV zdefiniowana specjalnie do użycia z częstotliwością 60 Hz w standardzie BT.709 i powinna być uważana za preferowany format dla rozdzielczości wideo wyższych niż SDTV. Charakteryzuje się ona różnymi wartościami dla tych dwóch stałych:
Kr = 0.2126
Kb = 0.0722
Konwersja z RGB na YUV jest definiowana, zaczynając od następującego:
L = Kr * R + Kb * B + (1 - Kr - Kb) * G
Następnie wartości YUV są uzyskiwane w następujący sposób:
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))
gdzie
- M to liczba bitów na próbkę YUV (M >= 8).
- Z jest zmienną czarno-poziomową. Dla komputera RGB, Z równa się 0. W przypadku studio wideo RGB, Z równa 16*2^(N-8), gdzie N jest liczbą bitów na próbkę RGB (N >= 8).
- S to zmienna skalowania. W przypadku komputera RGB S równa się 255. W przypadku formatu wideo RGB, S równa się 219*2^(N-8).
Funkcja floor(x) zwraca największą liczbę całkowitą mniejszą lub równą x. Funkcja clip3(x, y, z) jest definiowana w następujący sposób:
clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))
Notatka
clip3 należy zaimplementować jako funkcję, a nie makro preprocesora; w przeciwnym razie wystąpi wiele ocen argumentów.
Próbka Y reprezentuje jasność, a próbki ty i V reprezentują odpowiednio odchylenia kolorów w kierunku niebieskiego i czerwonego. Nominalny zakres wartości Y to 16*2^(M-8) do 235*2^(M-8). Czarny jest reprezentowany jako 16*2^(M-8), a biały jest reprezentowany jako 235*2^(M-8). Nominalny zakres dla U i V to 16*2^(M-8) do 240*2^(M-8), z wartością 128*2^(M-8) reprezentującą neutralną chrominancję. Jednak rzeczywiste wartości mogą znajdować się poza tymi zakresami.
W przypadku danych wejściowych w postaci studia wideo RGB operacja klipu jest niezbędna, aby zachować wartości U i V w zakresie od 0 do (2^M)-1. Jeśli dane wejściowe są komputerowe RGB, operacja przycięcia nie jest wymagana, ponieważ formuła konwersji nie może wytworzyć wartości poza tym zakresem.
Są to dokładne formuły bez przybliżenia. Wszystko, co następuje w tym dokumencie, pochodzi z tych formuł. W tej sekcji opisano następujące konwersje:
- Konwertowanie RGB888 na YUV 4:4:4
- Konwertowanie 8-bitowego YUV na RGB888
- Konwertowanie 4:2:0 YUV na 4:2:2 YUV
- konwertowanie 4:2:2 YUV na 4:4:4 YUV
- Konwertowanie 4:2:0 YUV na 4:4:4 YUV
Konwertowanie RGB888 na YUV 4:4:4
W przypadku wejścia RGB z komputera i 8-bitowego wyjścia BT.601 YUV uważamy, że formuły podane w poprzedniej sekcji mogą być dość dobrze przybliżone przez następujące formuły:
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
Te formuły generują 8-bitowe wyniki przy użyciu współczynników, które wymagają nie więcej niż 8 bitów precyzji (bez znaku). Wyniki pośrednie będą wymagały do 16 bitów precyzji.
Konwertowanie 8-bitowego yuV na RGB888
Z oryginalnych formuł RGB-to-YUV można uzyskać następujące relacje dla 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
W związku z tym, biorąc pod uwagę:
C = Y - 16
D = U - 128
E = V - 128
Formuły do konwersji YUV na RGB mogą być wyprowadzone następująco:
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 ) )
gdzie clip()
oznacza ograniczanie wartości w zakresie [0..255]. Uważamy, że te formuły mogą być prawdopodobnie przybliżone przez następujące:
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)
Te formuły używają niektórych współczynników, które wymagają więcej niż 8 bitów precyzji, aby uzyskać każdy wynik 8-bitowy, a wyniki pośrednie będą wymagały więcej niż 16 bitów precyzji.
Aby przekonwertować 4:2:0 lub 4:2:2 YUV na RGB, zalecamy przekonwertowanie danych YUV na 4:4:4 YUV, a następnie przekonwertowanie z 4:4:4 YUV na RGB. W poniższych sekcjach przedstawiono kilka metod konwertowania formatów 4:2:0 i 4:2:2 na formaty 4:4:4.
Konwertowanie 4:2:0 YUV na 4:2:2 YUV
Konwersja 4:2:0 YUV na 4:2:2 YUV wymaga pionowej konwersji przez współczynnik dwóch. W tej sekcji opisano przykładową metodę realizacji konwersji w górę. Metoda zakłada, że obrazy wideo są skanowane progresywnie.
Notatka
Proces konwersji skanowania międzyliniowego z 4:2:0 na 4:2:2 wiąże się z nietypowymi problemami i jest trudny do zaimplementowania. Ten artykuł nie rozwiązuje problemu z konwertowaniem przeplatanego skanowania z zakresu od 4:2:0 do 4:2:2.
Niech każda pionowa linia próbek chroma wejściowego będzie tablicą Cin[]
, która waha się od 0 do N -1. Odpowiedni pionowy wiersz na obrazie wyjściowym będzie tablicą Cout[]
, która waha się od 0 do 2N - 1. Aby przekonwertować każdą linię pionową, wykonaj następujący proces:
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);
gdzie clip() oznacza obcięcie do zakresu [0..255].
Notatka
Równania do obsługi krawędzi można uprościć matematycznie. Są one pokazane w tej formie, aby zilustrować efekt zaciskania na krawędziach obrazu.
W efekcie ta metoda oblicza każdą brakującą wartość, interpolując krzywą na czterech sąsiednich pikselach, ważoną wartościami dwóch najbliższych pikseli (Rysunek 11). Określona metoda interpolacji użyta w tym przykładzie generuje brakujące próbki na pozycjach połówkowych liczby całkowitej przy użyciu dobrze znanej metody o nazwie interpolacja Catmull-Rom, znanej również jako interpolacja splotu sześciennego.
W warunkach przetwarzania sygnału pionowa konwersja w górę powinna zawierać kompensację przesunięcia fazowego, aby uwzględnić przesunięcie pionowe w połowie piksela (w stosunku do siatki próbkowania 4:2:2) między lokalizacjami linii próbkowania 4:2:0 i lokalizacją każdej innej linii próbki 4:2:2. Jednak wprowadzenie tego przesunięcia zwiększyłoby wymaganą ilość przetwarzania do wygenerowania próbek i uniemożliwiłoby odtworzenie oryginalnych próbek 4:2:0 z obrazu powiększonego 4:2:2. Uniemożliwiłoby to również dekodowanie wideo bezpośrednio do powierzchni 4:2:2, a następnie użycie tych powierzchni jako obrazów referencyjnych do dekodowania kolejnych zdjęć w strumieniu. W związku z tym metoda podana w tym miejscu nie uwzględnia dokładnego wyrównania w pionie próbek. To prawdopodobnie nie jest wizualnie szkodliwe w rozsądnie wysokich rozdzielczościach obrazów.
Jeśli zaczniesz od wideo 4:2:0, które korzysta z siatki próbkowania zdefiniowanej w H.261, H.263 lub wideo MPEG-1, faza wyjściowych próbek chrominancji 4:2:2 również zostanie przesunięta o pół piksela w poziomie względem siatki próbkowania luminancji (przesunięcie o ćwierć piksela względem siatki próbkowania chrominancji 4:2:2). Jednak forma MPEG-2 4:2:0 jest prawdopodobnie częściej używana na komputerach i nie cierpi na ten problem. Co więcej, rozróżnienie prawdopodobnie nie jest wizualnie szkodliwe w rozsądnie wysokich rozdzielczościach obrazu. Próba skorygowania tego problemu spowoduje powstanie tego samego rodzaju problemów, które omówiono w przypadku przesunięcia fazy pionowej.
Konwertowanie 4:2:2 YUV na 4:4:4 YUV
Konwersja 4:2:2 YUV na 4:4:4 YUV wymaga poziomej konwersji przez współczynnik dwóch. Metoda opisana wcześniej dla pionowej konwersji sygnału może być również stosowana do poziomej konwersji sygnału. W przypadku wideo MPEG-2 i ITU-R BT.601 ta metoda będzie produkować próbki z poprawnym wyrównaniem fazy.
Konwertowanie 4:2:0 YUV na 4:4:4 YUV
Aby przekonwertować 4:2:0 YUV na 4:4:4 YUV, możesz po prostu wykonać dwie opisane wcześniej metody. Przekonwertuj obraz 4:2:0 na 4:2:2, a następnie przekonwertuj obraz 4:2:2 na 4:4:4. Można również zmienić kolejność dwóch procesów konwersji w górę, ponieważ kolejność operacji tak naprawdę nie wpływa na jakość wizualną wyniku.
Inne formaty YUV
Inne, mniej popularne formaty YUV obejmują następujące elementy:
- AI44 to paletyzowany format YUV z 8 bitami na próbkę. Każdy przykład zawiera indeks w 4 najbardziej znaczących bitach (MSB) i wartość alfa w 4 najmniej znaczących bitach (LSB). Indeks odwołuje się do tablicy wpisów palety YUV, które muszą być zdefiniowane w typie nośnika dla formatu. Ten format jest używany głównie do obrazów podrzędnych.
- NV11 to format planarny 4:1:1 z 12 bitami na piksel. Przykłady Y są wyświetlane jako pierwsze w pamięci. Po płaszczyźnie Y następuje tablica skompresowanych próbek U (Cb) i V (Cr). Gdy połączona tablica U-V jest traktowana jako tablica wartości little-endian WORD, próbki U są zawarte w najmniej znaczących bajtach (LSB) każdego WORD, a próbki V znajdują się w najbardziej znaczących bajtach (MSB). (Ten układ pamięci jest podobny do NV12, chociaż próbkowanie chroma jest inne).
- Y41P jest formatem pakowanym 4:1:1, z próbkowaniem składowych U i V co czwarty piksel w poziomie. Każdy makropixel zawiera 8 pikseli w trzech bajtach, z następującym układem bajtów:
U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
- Y41T jest identyczny z Y41P, z tą różnicą, że najmniej znaczące bity każdej próbki Y określają klucz chroma (0 = przezroczysty, 1 = nieprzezroczysty).
- Y42T jest identyczny z UYVY z tym wyjątkiem, że najmniej znaczący bit każdej próbki Y określa klucz chrominancji (0 = przezroczysty, 1 = nieprzezroczysty).
- YVYU jest odpowiednikiem YUYV, z wyjątkiem tego, że próbki U i V są zamienione.
Identyfikowanie formatów YUV w programie Media Foundation
Każdy z formatów YUV opisanych w tym artykule ma przypisany kod FOURCC. Kod FOURCC to 32-bitowa liczba całkowita bez znaku, która jest tworzona przez łączenie czterech znaków ASCII.
Istnieją różne makra języka C/C++, które ułatwiają deklarowanie wartości FOURCC w kodzie źródłowym. Na przykład makro MAKEFOURCC jest zadeklarowane w pliku Mmsystem.h, a makro FCC jest zadeklarowane w pliku Aviriff.h. Użyj ich w następujący sposób:
DWORD fccYUY2 = MAKEFOURCC('Y','U','Y','2');
DWORD fccYUY2 = FCC('YUY2');
Kod FOURCC można również zadeklarować bezpośrednio jako ciąg znaków, po prostu odwracając kolejność znaków. Na przykład:
DWORD fccYUY2 = '2YUY'; // Declares the FOURCC 'YUY2'
Odwrócenie kolejności jest konieczne, ponieważ system operacyjny Windows używa architektury little-endian. "Y" = 0x59, "U" = 0x55 i "2" = 0x32, więc wartość "2YUY" jest 0x32595559.
W programie Media Foundation formaty są identyfikowane przez identyfikator GUID typu głównego i identyfikator GUID podtypu. Głównym typem formatów wideo komputera jest zawsze MFMediaType_Video . Podtyp można utworzyć, mapując kod FOURCC na identyfikator GUID w następujący sposób:
XXXXXXXX-0000-0010-8000-00AA00389B71
gdzie XXXXXXXX
jest kodem FOURCC. W związku z tym identyfikator GUID podtypu dla YUY2 to:
32595559-0000-0010-8000-00AA00389B71
Stałe dla najczęściej używanych identyfikatorów GUID formatu YUV są definiowane w pliku nagłówka mfapi.h. Aby uzyskać listę tych stałych, zobacz identyfikatory GUID podtypu wideo.
Tematy pokrewne
-
Informacje o wideo YUV