Udostępnij za pośrednictwem


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

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.

Rysunek 1. próbkowanie chrominancji

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:

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.

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.

rysunek 2. układ pamięci ayuv

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.

rysunek 3. 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.

rysunek 4. układ pamięci uyvy

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.

rysunek 5. układ pamięci imc1 (przykład)

IMC3

Ten format jest identyczny jak IMC1, z wyjątkiem zamiany miejscami płaszczyzn U i V, jak pokazano na poniższym diagramie.

rysunek 6. imc3 układu pamięci

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.

rysunek 7. 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.

rysunek 8. 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.

rysunek 9. Układ pamięci yv12

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”.

rysunek 10. układ pamięci nv12

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

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.

rysunek 11. diagram przedstawiający upsampling od 4:2:0 do 4:2:2

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.

Informacje o wideo YUV

typy multimediów wideo