Format YUV 8-Bit yang Direkomendasikan untuk Penyajian Video

Gary Sullivan dan Stephen Estrop

Microsoft Corporation

April 2002, diperbarui November 2008

Topik ini menjelaskan format warna YUV 8-bit yang direkomendasikan untuk penyajian video dalam sistem operasi Windows. Artikel ini menyajikan teknik untuk mengonversi antara format YUV dan RGB, dan juga menyediakan teknik untuk upsampling format YUV. Artikel ini ditujukan untuk siapa saja yang bekerja dengan pendekodean atau penyajian video YUV di Windows.

Pengantar

Banyak format YUV didefinisikan di seluruh industri video. Artikel ini mengidentifikasi format YUV 8-bit yang direkomendasikan untuk penyajian video di Windows. Vendor decoder dan vendor tampilan didorong untuk mendukung format yang dijelaskan dalam artikel ini. Artikel ini tidak membahas kegunaan lain dari warna YUV, seperti fotografi diam.

Format yang dijelaskan dalam artikel ini semuanya menggunakan lokasi 8 bit per piksel untuk mengodekan saluran Y (juga disebut saluran luma), dan menggunakan 8 bit per sampel untuk mengodekan setiap sampel klorma U atau V. Namun, sebagian besar format YUV rata-rata menggunakan kurang dari 24 bit per piksel, karena berisi lebih sedikit sampel Anda dan V daripada Y. Artikel ini tidak mencakup format YUV dengan saluran Y 10-bit atau lebih tinggi.

Catatan

Untuk tujuan artikel ini, istilah U setara dengan Cb, dan istilah V setara dengan Cr.

 

Artikel ini membahas topik berikut ini:

Pengambilan Sampel YUV

Saluran kroma dapat memiliki tingkat pengambilan sampel yang lebih rendah daripada saluran luma, tanpa kehilangan kualitas persepsi yang dramatis. Notasi yang disebut notasi "A:B:C" digunakan untuk menjelaskan seberapa sering Anda dan V diambil sampelnya relatif terhadap Y:

  • 4:4:4 berarti tidak ada downsampling saluran chroma.
  • 4:2:2 berarti downsampling horizontal 2:1, tanpa downsampling vertikal. Setiap baris pemindaian berisi empat sampel Y untuk setiap dua sampel U atau V.
  • 4:2:0 berarti downsampling horizontal 2:1, dengan downsampling vertikal 2:1.
  • 4:1:1 berarti 4:1 downsampling horizontal, tanpa downsampling vertikal. Setiap baris pemindaian berisi empat sampel Y untuk setiap sampel Anda dan V. Pengambilan sampel 4:1:1 kurang umum daripada format lain, dan tidak dibahas secara rinci dalam artikel ini.

Diagram berikut menunjukkan bagaimana klorma diambil sampelnya untuk setiap laju downsampling. Sampel Luma diwakili oleh salib, dan sampel klorma diwakili oleh lingkaran.

gambar 1. pengambilan sampel klorma

Bentuk dominan pengambilan sampel 4:2:2 didefinisikan dalam Rekomendasi ITU-R BT.601. Ada dua varian umum pengambilan sampel 4:2:0. Salah satunya digunakan dalam video MPEG-2, dan yang lainnya digunakan dalam MPEG-1 dan dalam Rekomendasi ITU-T H.261 dan H.263.

Dibandingkan dengan skema MPEG-1, lebih mudah untuk mengonversi antara skema MPEG-2 dan kisi pengambilan sampel yang ditentukan untuk format 4:2:2 dan 4:4:4. Untuk alasan ini, skema MPEG-2 lebih disukai di Windows, dan harus dianggap sebagai interpretasi default format 4:2:0.

Definisi Permukaan

Bagian ini menjelaskan format YUV 8-bit yang direkomendasikan untuk penyajian video. Ini termasuk dalam beberapa kategori:

Pertama, Anda harus mengetahui konsep berikut untuk memahami hal-hal berikut:

  • Asal permukaan. Untuk format YUV yang dijelaskan dalam artikel ini, asal (0,0) selalu merupakan sudut kiri atas permukaan.
  • Stride. Langkah-langkah permukaan, kadang-kadang disebut pitch, adalah lebar permukaan dalam byte. Mengingat asal permukaan di sudut kiri atas, langkahnya selalu positif.
  • Perataan. Perataan permukaan adalah atas kebijakan driver tampilan grafis. Permukaan harus selalu diselaraskan DWORD; artinya, garis individu di dalam permukaan dijamin berasal dari batas 32-bit (DWORD). Penyelarasannya bisa lebih besar dari 32 bit, namun, tergantung pada kebutuhan perangkat keras.
  • Format yang dikemas versus format planar. Format YUV dibagi menjadi format yang dikemas dan format planar . Dalam format yang dikemas, komponen Y, U, dan V disimpan dalam satu array. Piksel diatur ke dalam grup makropiksel, yang tata letaknya bergantung pada format. Dalam format planar, komponen Y, U, dan V disimpan sebagai tiga bidang terpisah.

Masing-masing format YUV yang dijelaskan dalam artikel ini memiliki kode FOURCC yang ditetapkan. Kode FOURCC adalah bilangan bulat tidak bertanda 32-bit yang dibuat dengan menggabungkan empat karakter ASCII.

Format 4:4:4, 32 Bit per Piksel

AYUV

Format 4:4:4 tunggal direkomendasikan, dengan kode FOURCC AYUV. Ini adalah format yang dikemas, di mana setiap piksel dikodekan sebagai empat byte berturut-turut, disusun dalam urutan yang ditunjukkan dalam ilustrasi berikut.

gambar 2. tata letak memori ayuv

Byte yang ditandai A berisi nilai untuk alfa.

Format 4:2:2, 16 Bit per Piksel

Dua format 4:2:2 direkomendasikan, dengan kode FOURCC berikut:

  • YUY2
  • UYVY

Keduanya adalah format yang dikemas, di mana setiap makropiksel adalah dua piksel yang dikodekan sebagai empat byte berturut-turut. Ini menghasilkan downsampling horizontal dari klorma dengan faktor dua.

YUY2

Dalam format YUY2, data dapat diperlakukan sebagai array nilai karakter yang tidak ditandatangani, di mana byte pertama berisi sampel Y pertama, byte kedua berisi sampel U (Cb) pertama, byte ketiga berisi sampel Y kedua, dan byte keempat berisi sampel V (Cr) pertama, seperti yang ditunjukkan dalam diagram berikut.

gambar 3. tata letak memori yuy2

Jika gambar ditujukan sebagai array nilai WORD little-endian, WORD pertama berisi sampel Y pertama dalam bit (LSB) yang paling tidak signifikan dan sampel U (Cb) pertama di bit (MSB) yang paling signifikan. WORD kedua berisi sampel Y kedua di LSB dan sampel V (Cr) pertama di MSB.

YUY2 adalah format piksel 4:2:2 pilihan untuk Microsoft DirectX Video Acceleration (DirectX VA). Hal ini diharapkan menjadi persyaratan jangka menengah untuk akselerator DirectX VA yang mendukung video 4:2:2.

UYVY

Format ini sama dengan format YUY2 kecuali urutan byte dibalik—yaitu, byte klorma dan luma dibalik (Gambar 4). Jika gambar ditujukan sebagai array dari dua nilai WORD little-endian, WORD pertama berisi U di LSB dan Y0 di MSB, dan WORD kedua berisi V di LSB dan Y1 di MSB.

gambar 4. tata letak memori uyvy

Format 4:2:0, 16 Bit per Piksel

Dua format 4:2:0 16-bit per piksel (bpp) direkomendasikan, dengan kode FOURCC berikut:

  • IMC1
  • IMC3

Kedua format YUV ini adalah format planar. Saluran klorma disubsampel oleh faktor dua dalam dimensi horizontal dan vertikal.

IMC1

Semua sampel Y muncul terlebih dahulu dalam memori sebagai array nilai karakter yang tidak ditandatangani. Ini diikuti oleh semua sampel V (Cr), dan kemudian semua sampel U (Cb). Bidang V dan U memiliki langkah yang sama dengan bidang Y, menghasilkan area memori yang tidak digunakan, seperti yang ditunjukkan pada Gambar 5. Bidang Anda dan V harus dimulai pada batas memori yang merupakan kelipatan 16 baris. Gambar 5 menunjukkan asal-usul Anda dan V untuk bingkai video 352 x 240. Alamat awal sarana Anda dan V dihitung sebagai berikut:

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

di mana pY adalah penunjuk byte ke awal array memori, seperti yang ditunjukkan dalam diagram berikut.

gambar 5. tata letak memori imc1 (contoh)

IMC3

Format ini identik dengan IMC1, kecuali bidang Anda dan V ditukar, seperti yang ditunjukkan dalam diagram berikut.

gambar 6. tata letak memori imc3

Format 4:2:0, 12 Bit per Piksel

Empat format 4:2:0 12-bpp direkomendasikan, dengan kode FOURCC berikut:

  • IMC2
  • IMC4
  • YV12
  • NV12

Dalam semua format ini, saluran chroma disubsampel oleh faktor dua dalam dimensi horizontal dan vertikal.

IMC2

Format ini sama dengan IMC1 kecuali untuk perbedaan berikut: Garis V (Cr) dan U (Cb) diselingi pada batas setengah langkah. Dengan kata lain, setiap baris langkah penuh di area klorma dimulai dengan baris sampel V, diikuti oleh baris sampel U yang dimulai pada batas setengah langkah berikutnya (Gambar 7). Tata letak ini membuat penggunaan ruang alamat lebih efisien daripada IMC1. Ini memotong ruang alamat klorma menjadi dua, dan dengan demikian total ruang alamat sebesar 25 persen. Di antara format 4:2:0, IMC2 adalah format kedua yang paling disukai, setelah NV12. Gambar berikut mengilustrasikan proses ini.

gambar 7. tata letak memori imc2

IMC4

Format ini identik dengan IMC2, kecuali garis U (Cb) dan V (Cr) ditukar, seperti yang ditunjukkan dalam ilustrasi berikut.

gambar 8. tata letak memori imc4

YV12

Semua sampel Y muncul terlebih dahulu dalam memori sebagai array nilai karakter yang tidak ditandatangani. Array ini segera diikuti oleh semua sampel V (Cr). Langkah-langkah pesawat V adalah setengah dari langkah pesawat Y; dan bidang V berisi setengah garis sebanyak bidang Y. Bidang V diikuti segera oleh semua sampel U (Cb), dengan langkah dan jumlah baris yang sama dengan bidang V, seperti yang ditunjukkan dalam ilustrasi berikut.

gambar 9. Tata letak memori yv12

NV12

Semua sampel Y muncul terlebih dahulu dalam memori sebagai array nilai karakter yang tidak ditandatangani dengan jumlah baris yang merata. Bidang Y segera diikuti oleh array nilai karakter yang tidak ditandatangani yang berisi sampel U (Cb) dan V (Cr) yang dikemas. Ketika gabungan array U-V ditujukan sebagai array nilai WORD little-endian, LSB berisi nilai U, dan MSB berisi nilai V. NV12 adalah format piksel 4:2:0 pilihan untuk DirectX VA. Hal ini diharapkan menjadi persyaratan jangka menengah untuk akselerator DirectX VA yang mendukung video 4:2:0. Ilustrasi berikut menunjukkan bidang Y dan array yang berisi sampel V dan Anda yang dikemas.

gambar 10. tata letak memori nv12

Konversi Ruang Warna dan Laju Pengambilan Sampel Chroma

Bagian ini menyediakan panduan untuk mengonversi antara YUV dan RGB, dan untuk mengonversi antara beberapa format YUV yang berbeda. Kami mempertimbangkan dua skema pengodean RGB di bagian ini: RGB komputer 8-bit, juga dikenal sebagai RGB sRGB atau "skala penuh", dan RGB video studio, atau "RGB dengan head-room dan toe-room." Ini didefinisikan sebagai berikut:

  • Komputer RGB menggunakan 8 bit untuk setiap sampel merah, hijau, dan biru. Hitam diwakili oleh R = G = B = 0, dan putih diwakili oleh R = G = B = 255.
  • Studio video RGB menggunakan beberapa jumlah bit N untuk setiap sampel merah, hijau, dan biru, di mana N adalah 8 atau lebih. RGB video studio menggunakan faktor penskalakan yang berbeda dari RGB komputer, dan memiliki offset. Hitam diwakili oleh R = G = B = 16*2^(N-8), dan putih diwakili oleh R = G = B = 235*2^(N-8). Namun, nilai aktual mungkin berada di luar rentang ini.

Studio video RGB adalah definisi RGB pilihan untuk video di Windows, sementara RGB komputer adalah definisi RGB pilihan untuk aplikasi non-video. Dalam kedua bentuk RGB, koordinat kromatikitas seperti yang ditentukan dalam ITU-R BT.709 untuk definisi utama warna RGB. Koordinat (x,y) R, G, dan B masing-masing adalah (0,64, 0,33), (0,30, 0,60), dan (0,15, 0,06). Referensi putih adalah D65 dengan koordinat (0,3127, 0,3290). Gamma nominal adalah 1/0,45 (sekitar 2,2), dengan gamma yang tepat didefinisikan secara rinci dalam ITU-R BT.709.

Konversi antara RGB dan 4:4:4 YUV

Kami pertama kali menjelaskan konversi antara RGB dan 4:4:4 YUV. Untuk mengonversi 4:2:0 atau 4:2:2 YUV ke RGB, sebaiknya konversikan data YUV ke 4:4:4 YUV, lalu konversi dari 4:4:4 YUV ke RGB. Format AYUV, yang merupakan format 4:4:4, menggunakan masing-masing 8 bit untuk sampel Y, U, dan V. YUV juga dapat didefinisikan menggunakan lebih dari 8 bit per sampel untuk beberapa aplikasi.

Dua konversi YUV dominan dari RGB telah didefinisikan untuk video digital. Keduanya didasarkan pada spesifikasi yang dikenal sebagai REKOMENDASI ITU-R BT.709. Konversi pertama adalah formulir YUV yang lebih lama yang ditentukan untuk penggunaan 50-Hz dalam BT.709. Ini sama dengan hubungan yang ditentukan dalam Rekomendasi ITU-R BT.601, juga dikenal dengan nama lamanya, CCIR 601. Ini harus dianggap sebagai format YUV pilihan untuk resolusi TV definisi standar (720 x 576) dan video resolusi lebih rendah. Ini ditandai dengan nilai dua konstanta Kr dan Kb:

Kr = 0.299
Kb = 0.114

Konversi kedua adalah formulir YUV yang lebih baru yang ditentukan untuk penggunaan 60-Hz dalam BT.709, dan harus dianggap sebagai format yang lebih disukai untuk resolusi video di atas SDTV. Ini ditandai dengan nilai yang berbeda untuk dua konstanta ini:

Kr = 0.2126
Kb = 0.0722

Konversi dari RGB ke YUV ditentukan dengan memulai dengan yang berikut:

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

Nilai YUV kemudian diperoleh sebagai berikut:

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

Di mana

  • M adalah jumlah bit per sampel YUV (M >= 8).
  • Z adalah variabel tingkat hitam. Untuk komputer RGB, Z sama dengan 0. Untuk RGB video studio, Z sama dengan 16*2^(N-8), di mana N adalah jumlah bit per sampel RGB (N >= 8).
  • S adalah variabel penskalakan. Untuk komputer RGB, S sama dengan 255. Untuk studio video RGB, S sama dengan 219*2^(N-8).

Lantai fungsi(x) mengembalikan bilangan bulat terbesar kurang dari atau sama dengan x. Fungsi clip3(x, y, z) didefinisikan sebagai berikut:

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

Catatan

clip3 harus diimplementasikan sebagai fungsi daripada makro praprosesor; jika tidak, beberapa evaluasi argumen akan terjadi.

 

Sampel Y mewakili kecerahan, dan sampel Anda dan V mewakili simpangan warna masing-masing terhadap biru dan merah. Rentang nominal untuk Y adalah 16*2^(M-8) hingga 235*2^(M-8). Hitam direpresentasikan sebagai 16*2^(M-8), dan putih direpresentasikan sebagai 235*2^(M-8). Rentang nominal untuk Anda dan V adalah 16*2^(M-8) hingga 240*2^(M-8), dengan nilai 128*2^(M-8) mewakili chroma netral. Namun, nilai aktual mungkin berada di luar rentang ini.

Untuk data input dalam bentuk RGB video studio, operasi klip diperlukan untuk menyimpan nilai Anda dan V dalam rentang 0 hingga (2^M)-1. Jika input adalah RGB komputer, operasi klip tidak diperlukan, karena rumus konversi tidak dapat menghasilkan nilai di luar rentang ini.

Ini adalah rumus yang tepat tanpa perkiraan. Semua yang mengikuti dalam dokumen ini berasal dari rumus ini. Bagian ini menjelaskan konversi berikut:

Mengonversi RGB888 ke YUV 4:4:4

Dalam kasus input RGB komputer dan output 8-bit BT.601 YUV, kami percaya bahwa rumus yang diberikan di bagian sebelumnya dapat diperkirakan secara wajar dengan yang berikut:

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

Rumus ini menghasilkan hasil 8-bit menggunakan koefisien yang tidak memerlukan lebih dari 8 bit presisi (tidak ditandatangani). Hasil menengah akan membutuhkan presisi hingga 16 bit.

Mengonversi YUV 8-bit ke RGB888

Dari rumus RGB-ke-YUV asli, seseorang dapat memperoleh hubungan berikut untuk 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

Oleh karena itu, diberikan:

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

rumus untuk mengonversi YUV ke RGB dapat diturunkan sebagai berikut:

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

di mana clip() menunjukkan kliping ke rentang [0..255]. Kami percaya rumus-rumus ini dapat dieseksikan secara wajar dengan yang berikut ini:

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)

Rumus-rumus ini menggunakan beberapa koefisien yang membutuhkan lebih dari 8 bit presisi untuk menghasilkan setiap hasil 8-bit, dan hasil menengah akan membutuhkan lebih dari 16 bit presisi.

Untuk mengonversi 4:2:0 atau 4:2:2 YUV ke RGB, sebaiknya konversikan data YUV ke 4:4:4 YUV, lalu konversi dari 4:4:4 YUV ke RGB. Bagian yang mengikuti menyajikan beberapa metode untuk mengonversi format 4:2:0 dan 4:2:2 ke 4:4:4.

Mengonversi 4:2:0 YUV ke 4:2:2 YUV

Mengonversi 4:2:0 YUV ke 4:2:2 YUV memerlukan upconversion vertikal dengan faktor dua. Bagian ini menjelaskan contoh metode untuk melakukan upconversion. Metode ini mengasumsikan bahwa gambar video adalah pemindaian progresif.

Catatan

Proses konversi pemindaian interlaced 4:2:0 hingga 4:2:2 menghadirkan masalah atipikal dan sulit diterapkan. Artikel ini tidak mengatasi masalah konversi pemindaian terjajar dari 4:2:0 ke 4:2:2.

 

Biarkan setiap baris vertikal sampel klorma input menjadi array Cin[] yang berkisar antara 0 hingga N - 1. Garis vertikal yang sesuai pada gambar output akan menjadi array Cout[] yang berkisar antara 0 hingga 2N - 1. Untuk mengonversi setiap garis vertikal, lakukan proses berikut:

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

where clip() menunjukkan kliping ke rentang [0..255].

Catatan

Persamaan untuk menangani tepi dapat disederhanakan secara matematis. Mereka ditunjukkan dalam bentuk ini untuk mengilustrasikan efek penjepitan di tepi gambar.

 

Akibatnya, metode ini menghitung setiap nilai yang hilang dengan menginterpolasi kurva di atas empat piksel yang berdekatan, ditimbang terhadap nilai dua piksel terdekat (Gambar 11). Metode interpolasi khusus yang digunakan dalam contoh ini menghasilkan sampel yang hilang pada posisi setengah bilangan bulat menggunakan metode terkenal yang disebut interpolasi Catmull-Rom, juga dikenal sebagai interpolasi konvolusi kubik.

gambar 11. diagram memperlihatkan 4:2:0 hingga 4:2:2 upsampling

Dalam istilah pemrosesan sinyal, upconversion vertikal idealnya harus menyertakan kompensasi pergeseran fase ke akun offset vertikal setengah piksel (relatif terhadap output kisi pengambilan sampel 4:2:2) antara lokasi baris sampel 4:2:0 dan lokasi setiap baris sampel 4:2:2 lainnya. Namun, memperkenalkan offset ini akan meningkatkan jumlah pemrosesan yang diperlukan untuk menghasilkan sampel, dan membuatnya tidak mungkin untuk merekonstruksi sampel 4:2:0 asli dari gambar 4:2:2 yang di-upsampel. Ini juga akan membuat tidak mungkin untuk mendekode video langsung ke permukaan 4:2:2 dan kemudian menggunakan permukaan tersebut sebagai gambar referensi untuk mendekode gambar berikutnya di aliran. Oleh karena itu, metode yang disediakan di sini tidak mempertimbangkan keselarasan vertikal sampel yang tepat. Melakukannya mungkin tidak berbahaya secara visual pada resolusi gambar yang cukup tinggi.

Jika Anda mulai dengan video 4:2:0 yang menggunakan kisi pengambilan sampel yang ditentukan dalam H.261, Video H.263, atau MPEG-1, fase sampel klorma output 4:2:2 juga akan digeser oleh offset horizontal setengah piksel relatif terhadap spasi pada kisi pengambilan sampel luma (offset seperempat piksel relatif terhadap spasi kisi pengambilan sampel klorma 4:2:2). Namun, bentuk MPEG-2 dari video 4:2:0 mungkin lebih umum digunakan pada PC dan tidak menderita masalah ini. Selain itu, perbedaannya mungkin tidak berbahaya secara visual pada resolusi gambar yang cukup tinggi. Mencoba memperbaiki masalah ini akan membuat semacam masalah yang sama yang dibahas untuk offset fase vertikal.

Mengonversi 4:2:2 YUV ke 4:4:4 YUV

Mengonversi 4:2:2 YUV ke 4:4:4 YUV membutuhkan upconversion horizontal dengan faktor dua. Metode yang dijelaskan sebelumnya untuk upconversion vertikal juga dapat diterapkan pada upconversion horizontal. Untuk video MPEG-2 dan ITU-R BT.601, metode ini akan menghasilkan sampel dengan penyelarasan fase yang benar.

Mengonversi 4:2:0 YUV ke 4:4:4 YUV

Untuk mengonversi 4:2:0 YUV ke 4:4:4 YUV, Anda cukup mengikuti dua metode yang dijelaskan sebelumnya. Konversikan gambar 4:2:0 menjadi 4:2:2, lalu konversi gambar 4:2:2 menjadi 4:4:4. Anda juga dapat mengalihkan urutan dua proses upconversion, karena urutan operasi tidak terlalu penting untuk kualitas visual hasil.

Format YUV Lainnya

Beberapa format YUV lain yang kurang umum meliputi yang berikut ini:

  • AI44 adalah format YUV palettized dengan 8 bit per sampel. Setiap sampel berisi indeks dalam 4 bit paling signifikan (MSB) dan nilai alfa dalam 4 bit paling sedikit signifikan (LSB). Indeks mengacu pada array entri palet YUV, yang harus didefinisikan dalam jenis media untuk format. Format ini terutama digunakan untuk gambar subgambar.
  • NV11 adalah format planar 4:1:1 dengan 12 bit per piksel. Sampel Y muncul pertama kali dalam memori. Bidang Y diikuti oleh array sampel U (Cb) dan V (Cr) yang dikemas. Ketika gabungan array U-V ditujukan sebagai array nilai WORD little-endian, sampel U terkandung dalam LSB setiap WORD, dan sampel V terkandung dalam MSB. (Tata letak memori ini mirip dengan NV12 meskipun pengambilan sampel chroma berbeda.)
  • Y41P adalah format kemasan 4:1:1, dengan Anda dan V diambil sampelnya setiap piksel keempat secara horizontal. Setiap makropiksel berisi 8 piksel dalam tiga byte, dengan tata letak byte berikut: U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
  • Y41T identik dengan Y41P, kecuali bit yang paling tidak signifikan dari setiap sampel Y menentukan kunci kroma (0 = transparan, 1 = buram).
  • Y42T identik dengan UYVY, kecuali bit yang paling tidak signifikan dari setiap sampel Y menentukan kunci klorma (0 = transparan, 1 = buram).
  • YVYU setara dengan YUYV kecuali sampel Anda dan V ditukar.

Mengidentifikasi Format YUV di Media Foundation

Setiap format YUV yang dijelaskan dalam artikel ini memiliki kode FOURCC yang ditetapkan. Kode FOURCC adalah bilangan bulat tidak bertanda 32-bit yang dibuat dengan menggabungkan empat karakter ASCII.

Ada berbagai makro C/C++ yang memudahkan untuk mendeklarasikan nilai FOURCC dalam kode sumber. Misalnya, makro MAKEFOURCC dideklarasikan dalam Mmsystem.h, dan makro FCC dideklarasikan dalam Aviriff.h. Gunakan sebagai berikut:

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

Anda juga dapat mendeklarasikan kode FOURCC secara langsung sebagai string literal hanya dengan mengembalikan urutan karakter. Contohnya:

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

Membalik urutan diperlukan karena sistem operasi Windows menggunakan arsitektur little-endian. 'Y' = 0x59, 'U' = 0x55, dan '2' = 0x32, jadi '2YUY' 0x32595559.

Di Media Foundation, format diidentifikasi oleh GUID jenis utama dan GUID subjenis. Jenis utama untuk format video komputer selalu MFMediaType_Video . Subjenis dapat dibangun dengan memetakan kode FOURCC ke GUID, sebagai berikut:

XXXXXXXX-0000-0010-8000-00AA00389B71 

di mana XXXXXXXX adalah kode FOURCC. Dengan demikian, guid subjenis untuk YUY2 adalah:

32595559-0000-0010-8000-00AA00389B71 

Konstanta untuk GUID format YUV yang paling umum didefinisikan dalam file header mfapi.h. Untuk daftar konstanta ini, lihat GuID Subjenis Video.

Tentang YUV Video

Tipe Media Video