Bagikan melalui


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 meningkatkan sampel format YUV. Artikel ini ditujukan untuk siapa saja yang bekerja dengan decoding atau penyajian video YUV di Windows.

Perkenalan

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 penggunaan lain 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 kroma U atau V. Namun, sebagian besar format YUV rata-rata menggunakan kurang dari 24 bit per piksel, karena berisi lebih sedikit sampel U dan V daripada Y. Artikel ini tidak mencakup format YUV dengan saluran Y 10-bit atau lebih tinggi.

Nota

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

 

Artikel ini membahas topik berikut:

Pengambilan Sampel YUV

Saluran Chroma 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 U dan V diambil sampelnya relatif terhadap Y:

  • 4:4:4 berarti tidak ada pengurangan kanal chroma.
  • 4:2:2 berarti penurunan sampel horizontal dua banding satu, tanpa penurunan sampel vertikal. Setiap baris pemindaian berisi empat sampel Y untuk setiap dua sampel U atau V.
  • 4:2:0 mengacu pada pensampelan turun secara horizontal 2:1, dengan pensampelan turun secara vertikal 2:1.
  • 4:1:1 berarti 4:1 downsampling horizontal, tanpa downsampling vertikal. Setiap baris pemindaian berisi empat sampel Y untuk setiap sampel U dan V. Pengambilan sampel 4:1:1 kurang umum daripada format lain, dan tidak dibahas secara rinci dalam artikel ini.

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

gambar 1. pengambilan sampel chroma

Bentuk dominan pengambilan sampel 4:2:2 ditentukan 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.
  • Melangsungkan. Langkah permukaan, kadang-kadang disebut pitch, adalah lebar permukaan yang diukur dalam byte. Mengingat asal permukaan di sudut kiri atas, langkahnya selalu positif.
  • Perataan. Penyesuaian permukaan berada di bawah kebijakan driver grafis. Permukaan harus selalu sejajar dengan DWORD; artinya, garis individu di dalam permukaan dijamin dimulai 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 tanpa tanda 32-bit yang dibuat dengan menggabungkan empat karakter ASCII.

Format 4:4:4, 32 Bit per Piksel

AYUV

Format tunggal 4:4:4 disarankan, 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 bertanda A berisi nilai untuk alfa.

Format 4:4:4, 24 Bit per Piksel

I444

Dalam format I444, semua sampel Y muncul terlebih dahulu dalam memori sebagai array nilai karakter yang tidak ditandatangani. Array ini langsung diikuti oleh semua sampel U (Cb). Langkah pesawat U adalah langkah yang sama dari bidang Y; dan bidang U berisi jumlah baris yang sama dengan bidang Y. Bidang U diikuti segera oleh semua sampel V (Cr), dengan langkah dan jumlah baris yang sama dengan bidang U. Tidak ada padding untuk pesawat Y/U/V.

Diagram yang mengilustrasikan tata letak memori I444.

4:2:2 Format, 16 Bit per Piksel

Dua format 4:2:2 disarankan, 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.

Diagram yang mengilustrasikan tata letak memori yuy2

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

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

UYVY

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

Diagram yang mengilustrasikan tata letak memori uyvy

I422

Dalam format I422, semua sampel Y muncul terlebih dahulu dalam memori sebagai array nilai karakter yang tidak ditandatangani. Array ini segera diikuti oleh sampel-sampel U (Cb) secara keseluruhan. Langkah pesawat U adalah setengah langkah dari bidang Y; dan bidang U berisi jumlah baris yang sama dengan bidang Y. Bidang U diikuti segera oleh semua sampel V (Cr), dengan langkah dan jumlah baris yang sama dengan bidang U, seperti yang ditunjukkan dalam ilustrasi berikut. Tidak ada padding untuk bidang Y/U/V.

Diagram yang mengilustrasikan tata letak memori I422.

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 kroma disubsampel dengan faktor dua dalam dimensi horizontal dan vertikal.

IMC1

Semua sampel Y muncul pertama kali dalam memori sebagai array karakter dengan nilai 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 U dan V harus dimulai pada batas memori yang merupakan kelipatan 16 baris. Gambar 5 menunjukkan titik asal U dan V untuk bingkai video 352 x 240. Alamat awal bidang U 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 pada diagram berikut.

Diagram yang mengilustrasikan tata letak memori imc1 (contoh)

IMC3

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

Diagram yang mengilustrasikan 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 klorma 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 jalur. Dengan kata lain, setiap baris langkah penuh di area kroma 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 yang lebih efisien daripada IMC1. Ini memotong ruang alamat kroma menjadi dua, yang mengakibatkan pengurangan 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.

Diagram yang mengilustrasikan tata letak memori imc2

IMC4

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

Diagram yang mengilustrasikan tata letak memori imc4

YV12

Semua sampel Y muncul pertama kali dalam memori sebagai array karakter dengan nilai yang tidak ditandatangani. Array ini langsung diikuti oleh semua sampel V (Cr). Langkah bidang V adalah setengah langkah bidang Y; dan bidang V mengandung setengah jumlah garis dari 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.

Diagram yang mengilustrasikan tata letak memori yv12

NV12

Semua sampel Y muncul terlebih dahulu dalam memori sebagai array dari nilai karakter tanpa tanda dengan jumlah baris genap. Bidang Y segera diikuti oleh array karakter dengan nilai tak bertanda yang berisi sampel U (Cb) dan V (Cr) yang telah dikemas. Ketika array U-V gabungan diperlakukan sebagai array elemen little-endian WORD, LSB berisi nilai U, dan MSB berisi nilai V. NV12 adalah format piksel 4:2:0 pilihan untuk DirectX VA. Ini diharapkan menjadi persyaratan jangka menengah untuk akselerator VA DirectX yang mendukung video 4:2:0. Ilustrasi berikut menunjukkan bidang Y dan array yang berisi sampel U dan V yang terkemas.

Diagram yang mengilustrasikan 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: komputer 8-bit RGB, juga dikenal sebagai sRGB atau "RGB skala penuh", dan video studio RGB, atau "RGB dengan ruang kepala dan ruang kaki." 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 warna RGB utama. Koordinat (x,y) R, G, dan B masing-masing (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-tama 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 keperluan video digital. Keduanya didasarkan pada spesifikasi yang dikenal sebagai rekomendasi ITU-R BT.709. Konversi pertama adalah format YUV yang lebih lama, ditentukan untuk digunakan pada 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 bentuk YUV yang lebih baru yang ditentukan untuk penggunaan 60 Hz dalam standar BT.709, dan harus dianggap sebagai format pilihan untuk resolusi video lebih tinggi dari SDTV. Ini dicirikan oleh nilai yang berbeda untuk dua konstanta ini:

Kr = 0.2126
Kb = 0.0722

Konversi dari RGB ke YUV didefinisikan 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 video studio RGB, S sama dengan 219*2^(N-8).

Fungsi floor(x) mengembalikan bilangan bulat terbesar yang 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))

Nota

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

 

Sampel Y mewakili kecerahan, dan sampel U dan V mewakili penyimpangan warna ke arah biru dan merah, masing-masing. Rentang nominal untuk Y adalah 16*2^(M-8) hingga 235*2^(M-8). Hitam dinyatakan sebagai 16*2^(M-8), dan putih dinyatakan sebagai 235*2^(M-8). Rentang nominal untuk U dan V adalah 16*2^(M-8) hingga 240*2^(M-8), dengan nilai 128*2^(M-8) yang mewakili kroma netral. Namun, nilai aktual mungkin berada di luar rentang ini.

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

Berikut adalah rumus-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 cara 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 dengan menggunakan koefisien yang membutuhkan presisi tidak lebih dari 8 bit (unsigned). 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

Maka dari itu, dengan asumsi:

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 pemotongan ke rentang [0..255]. Kami percaya rumus-rumus ini dapat didekati secara wajar dengan 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 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 menjadi 4:4:4.

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

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

Nota

Proses konversi pemindaian berselang dari 4:2:0 ke 4:2:2 menghadirkan masalah yang tidak biasa dan sulit untuk diimplementasikan. Artikel ini tidak membahas masalah konversi pemindaian interlaced dari 4:2:0 ke 4:2:2.

 

Biarkan setiap baris vertikal sampel chroma 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);

Di mana fungsi clip() menunjukkan pemotongan ke rentang [0..255].

Nota

Persamaan untuk menangani tepi dapat disederhanakan secara matematis. Mereka ditampilkan 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, tertimbang 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.

Diagram ini mengilustrasikan upsampling dari 4:2:0 ke 4:2:2

Dalam istilah pemrosesan sinyal, upkonversi vertikal idealnya harus menyertakan kompensasi pergeseran fase untuk memperhitungkan offset vertikal setengah piksel (relatif terhadap grid pengambilan sampel keluaran 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 tersebut, dan membuatnya tidak mungkin untuk merekonstruksi sampel 4:2:0 asli dari gambar 4:2:2 yang telah diupsample. 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 memperhitungkan 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, H.263, atau video MPEG-1, maka fase sampel kroma output 4:2:2 juga akan bergeser oleh offset horizontal setengah piksel relatif terhadap spasi pada kisi pengambilan sampel luma (offset seperempat piksel relatif terhadap spasi pada kisi pengambilan sampel kroma 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 masalah yang sama seperti 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 memerlukan peningkatan horizontal dengan faktor peningkatan dua kali lipat. Metode yang dijelaskan sebelumnya untuk konversi ke atas vertikal juga dapat diterapkan pada konversi ke atas 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 menukar urutan dua proses upconversion tersebut, karena urutan operasi tidak begitu berpengaruh terhadap kualitas visual hasilnya.

Mengonversi YUY2 ke I422

Untuk format warna 4:2:2, beberapa dekoder dapat menghasilkan MFVideoFormat_YUY2 secara default, yang merupakan format terkemas. Namun, banyak encoder mengharapkan input dalam format planar MFVideoFormat_I422. Dalam kasus seperti itu, Transcoding Video Processor Media Foundation Transform (biasanya disebut sebagai "XVP") dapat dimasukkan ke dalam alur untuk mengonversi MFVideoFormat_YUY2 ke MFVideoFormat_I422. Untuk informasi selengkapnya, lihat Transcoding Video Processor Media Foundation Transform. Contoh ini menunjukkan cara menggunakan XVP untuk melakukan konversi ini untuk mengodekan alur kerja.

#include <mfapi.h> 
#include <wmcodecdsp.h>  // CLSID_VideoProcessorMFT 

using Microsoft::WRL; 

HRESULT ConvertYUY2toI422WithXVP( 
    _In_ IMFSample* inputSample, 
    _In_ MFT_OUTPUT_DATA_BUFFER* outputBuffer, 
    UINT32 width, 
    UINT32 height)
{ 
    RETURN_HR_IF_NULL(E_INVALIDARG, inputSample);     
    RETURN_HR_IF_NULL(E_INVALIDARG, outputBuffer);     

    ComPtr<IMFTransform> xvp; 
    RETURN_IF_FAILED(CoCreateInstance( 
        CLSID_VideoProcessorMFT, 
        nullptr, 
        CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&xvp))); 

    // Set input type: MFVideoFormat_YUY2 
    ComPtr<IMFMediaType> inputType; 
    RETURN_IF_FAILED(MFCreateMediaType(&inputType)); 
    RETURN_IF_FAILED(inputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)); 
    RETURN_IF_FAILED(inputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_YUY2)); 
    RETURN_IF_FAILED(MFSetAttributeSize(inputType.Get(), MF_MT_FRAME_SIZE, width, height)); 
    RETURN_IF_FAILED(spXVP->SetInputType(0, inputType.Get(), 0)); 

    // Set output type: MFVideoFormat_I422 
    ComPtr<IMFMediaType> outputType; 
    RETURN_IF_FAILED(MFCreateMediaType(&outputType)); 
    RETURN_IF_FAILED(outputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)); 
    RETURN_IF_FAILED(outputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_I422)); 
    RETURN_IF_FAILED(MFSetAttributeSize(outputType.Get(), MF_MT_FRAME_SIZE, width, height)); 
    RETURN_IF_FAILED(xvp->SetOutputType(0, outputType.Get(), 0)); 

    // Submit input sample 
    RETURN_IF_FAILED(xvp->ProcessInput(0, inputSample, 0)); 

    // Request the converted output sample 
    DWORD status = 0; 
    return xvp->ProcessOutput(0, 1, outputBuffer, &status);
} 

Mengonversi AYUV ke I444

Untuk format warna 4:4:4, beberapa dekode dapat menghasilkan MFVideoFormat_AYUV secara default, yang merupakan format yang dikemas. Namun, banyak encoder mengharapkan input dalam format planar MFVideoFormat_I444. Dalam kasus seperti itu, Transcoding Video Processor Media Foundation Transform (XVP) dapat dimasukkan ke dalam alur untuk mengonversi MFVideoFormat_AYUV ke MFVideoFormat_I444. Contoh ini menunjukkan cara menggunakan XVP untuk melakukan konversi ini untuk mengodekan alur kerja.

#include <mfapi.h> 
#include <wmcodecdsp.h>  // CLSID_VideoProcessorMFT 

using Microsoft::WRL; 

HRESULT ConvertAYUVtoI444WithXVP( 
    _In_ IMFSample* inputSample, 
    _In_ MFT_OUTPUT_DATA_BUFFER* outputBuffer, 
    UINT32 width, 
    UINT32 height) 
{ 
    RETURN_HR_IF_NULL(E_INVALIDARG, inputSample);     
    RETURN_HR_IF_NULL(E_INVALIDARG, outputBuffer);     

    ComPtr<IMFTransform> xvp; 
    RETURN_IF_FAILED(CoCreateInstance( 
        CLSID_VideoProcessorMFT, 
        nullptr, 
        CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&xvp))); 

    // Set input type: MFVideoFormat_AYUV 
    ComPtr<IMFMediaType> inputType; 
    RETURN_IF_FAILED(MFCreateMediaType(&inputType)); 
    RETURN_IF_FAILED(inputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)); 
    RETURN_IF_FAILED(inputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_AYUV)); 
    RETURN_IF_FAILED(MFSetAttributeSize(inputType.Get(), MF_MT_FRAME_SIZE, width, height)); 
    RETURN_IF_FAILED(xvp->SetInputType(0, inputType.Get(), 0)); 

    // Set output type: MFVideoFormat_I444 
    ComPtr<IMFMediaType> outputType; 
    RETURN_IF_FAILED(MFCreateMediaType(&outputType)); 
    RETURN_IF_FAILED(outputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)); 
    RETURN_IF_FAILED(outputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_I444)); 
    RETURN_IF_FAILED(MFSetAttributeSize(outputType.Get(), MF_MT_FRAME_SIZE, width, height)); 
    RETURN_IF_FAILED(xvp->SetOutputType(0, outputType.Get(), 0)); 

    // Submit input sample 
    RETURN_IF_FAILED(xvp->ProcessInput(0, inputSample, 0)); 

    // Request the converted output sample 
    DWORD status = 0; 
    return xvp->ProcessOutput(0, 1, outputBuffer, &status); 
} 

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 tidak signifikan (LSB). Indeks mengacu pada array entri palet YUV, yang harus ditentukan dalam tipe media untuk format tersebut. 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 array U-V gabungan 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 kroma berbeda.)
  • Y41P adalah format kemasan 4:1:1, dengan U dan V diambil sampel 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 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 kroma (0 = transparan, 1 = buram).
  • YVYU setara dengan YUYV kecuali sampel U dan V dipertukarkan.

Mengidentifikasi Format YUV di Media Foundation

Masing-masing format YUV yang dijelaskan dalam artikel ini memiliki kode FOURCC yang ditetapkan. Kode FOURCC adalah bilangan bulat tanpa tanda 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 dinyatakan 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. Misalnya:

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

Membalikkan 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 ditentukan dalam file header mfapi.h. Untuk daftar konstanta ini, lihat GUID Subjenis Video .

Tentang Video YUV

Jenis Media Video