Showing posts with label DCT. Show all posts
Showing posts with label DCT. Show all posts

Saturday, July 4, 2015

How MPEG Works

Kita sudah mengetahui bahwa standar codec video keluarga MPEG yang sering digunakan adalah:

MPEG-1 part 2 (disebut MPEG-1)
MPEG-2 part 2 (disebut MPEG-2)
MPEG-4 part 2 (disebut MPEG-4)
MPEG-4 part 10 (disebut H.264 atau AVC)

Bagaimana cara kerja codec video tsb secara basic?

Kita sudah membahas cara kerja kompresi JPEG menggunakan DCT (Discrete Courier Transform). Pada dasarnya kompresi MPEG juga menggunakan DCT.

MPEG mendefinisikan GOP (Group of Picture), biasanya 30 (atau bisa di set saat dilakukan kompresi) dalam satu GOP. Isi dari satu GOP itu terdiri dari gambar-gambar (ada 30 gambar). Dari 30 gambar (atau di sebut 30 frame) ada 3 jenis frame:

I-frame (Intra Frame, atau Key Frame)
P-frame (Predictive Frame)
B-frame (Bi directional Frame)

Gambar yang utuh hanya I-frame. Sedangkan P-frame dan B-frame hanya selisih gambar saja.

Misal ada video latar belakang gunung, dan ada mobil melintas. Maka I-frame akan terdiri dari gambar utuh gunung dan mobil, sedangkan P-Frame dan B-frame terdiri dari gambar mobilnya saja.

Sebagai contoh lain: video orang berlari.


I-frame adalah gambar utuh pohon dan orang. P-frame adalah gambar orang yang berlari.

I-frame 1 MB apabila di kompress pakai kompresi JPEG akan menjadi 40 kb.


Sedangkan P-frame karena hanya memuat selisih gambar, maka di kompress mejadi 5 KB.


Dan B-frame karena memuat selisih 2 gambar, maka apabila di kompress akan menjadi lebih kecil lagi yaitu 1 KB.

Dari hal ini dapat dibayangkan, apabila 1 file gambar raw di kompress menjadi JPEG maka bisa didapatkan rasio kompresi 1:20, sedangkan 1 file video raw apabila dikompres MPEG-4 part 10 (sering disebut H.264) maka bisa di dapatkan kompresi 1:200. (Lebih dalam pembahasan tentang I, P, dan B frame ini dapat di baca di artikel ini).

Profiles dan Level

Mengapa MPEG-1, MPEG-2, MPEG-4, dan H.264 sama-sama pakai DCT tapi kompresi H.264 menghasilkan kompresi dengan kualitas video terbaik?

Hal ini disebabkan selain ada teknik DCT, ada seperangkat "tools" yang terus ditambahkan sejak kelahiran MPEG-1. Sebagai contoh, pada MPEG-2 tools untuk motion compensation, dan variasi sampling Kroma dimana sudah tersedia 4:2:0, 4:2:2, dan 4:4:4. Pada MPEG-4 part 2 tersedia tools untu global motion compensation, sub-pixel motion compensation, shaped coding, dsb. Sedangkan pada H.264 tersedia tools untuk Logaritmic Quantization, De-blocking fillter, dsb.
 
Gambar konversi RGB ke YUV (atau YCbCr)

Sebagaimana disebutkan sebelumnya dengan berkembangkanya teknologi MPEG (walau basisnya tetap dari DCT) semakin banyak tools yang dimasukkan di masing-masing standard. Disebabkan banyaknya tools yang tersedia, perlu di set 2 hal: Profile dan Level. Profile mendefinisikan tools apa saja yang dipakai, sedangkan Level adalah resolusi yang akan di handle.

Pada MPEG-2 dan MPEG-4 part 2, Profiles nya banyak sekali. Kemudian pada MPEG-4 part 10 (atau H.264) profilenya disederhanakan menjadi 3 saja:
- Baseline
- Main
- Extended

Baseline menggunakan tools yang terbatas. HP dengan prosesor rendah (lowspeed) biasanya hanya bisa play profile Baseline saja. Saat kita melakukan encoding (misalkan dengan ffmpeg) kita perlu mendefinisikan output file kita menggunakan profile apa. Jika kita mensasar HP low-end, maka gunakan profile Baseline. Akan tetapi karena tools yang tersedia kurang, maka kompresi yang dilakukan juga terbatas, efeknya tingkat kompresi yang dihasilkan rendah. Untuk profile diatasnya spt Main dan Extended jumlah tools lebih banyak tersedia, sehingga kompresi dilakukan dalam beberapa tahap, dengan hasil akhirnya sebuah file dengan tingkat kompresi yang tinggi.

Dengan cara pendefinisian Profile dan Level tsb, pembuat player bisa fokus membuat player nya pada Profile dan Level tertentu saja. Sebagai contoh HP iPhone versi awal kelahiran, hanya support Profile Baseline. Akan tetapi perangkat iPhone dan iPad terkini support Profile Extended.


Motion Compensation

Motion compensation adalah teknik yang digunakan untuk mereduksi bit yang dikirim. Idenya adalah dengan menganggap sebuah block pixel 8x8 bergerak dari waktu ke waktu. Sehingga informasi yang dikirim tidak perlu informasi isi (value) dari pixel 8x8, tapi cukup kordinat perubahannya.

Perhatikan gambar berikut:

Gambar I-frame adalah latar belakang. Gambar P-frame adalah gambar akhir dari sebuah mobil yang melaju. Gambar B-frame adalah gambar diantara I dan P. Terlihat bahwa B-frame bisa di dapat dengan memundurkan gambar mobil yang ada di P frame. Dengan demikian tiap blok pixel 8x8 di P-frame bisa di buatkan vektor perubahannya. Sehingga praktis B-frame hanya berisi kordinat perubahan dari blok pixel 8x8 tsb. Cara seperti ini sangat memberikan kompresi yang tinggi.

 
Bitrate pada proses Encoding/Decoding

Bitrate pada video bisa VBR maupun CBR (bedakan dengan ABR). Variable Bit Rate (VBR) biasanya digunakan oleh jaringan Kontribusi (dari Studio ke Pemancar Pusat). Sedangkan Constant Bit Rate (CBR) biasanya diguakan oleh jaringan Distribusi (dari Pemancar Pusat ke Pemancar Daerah).

VBR menghasilkan kualitas yang bagus, tetapi bandwidth transmisi yang dibutuhkan besar. Video api unggun salah satu contoh video yang detik ke detik tidak ada frame yang sama bentuk gambar api nya. Beda dengan gambar mobil bergerak diatas. Efekya api unggun biasanya kompresi yang dihasilkan rendah. Bisa di katakan bahwa pada video api unggun semua frame nya adalah I-frame. Ingat bahwa I-frame kompresi nya tidak sebagus P-frame dan B-frame. Apabila video api unggun hendak di siarkan dari Studio ke Pemancar Pusat, dengan kualitas yang bagus, maka video tsb perlu disalurkan secara VBR, sehingga saluran transmisi nya harus besar (mungkin 20 Mbps). Padahal average video dengan kualitas SD, hanya perlu saluran transmisi 3 Mbps.

Apabila saluran transmisi hanya tersedia 3 Mbps, maka video tsb perlu di transmisikan dengan CBR 3 Mbps. Efeknya adalah pada saat video api unggun muncul terjadi pixelized. Hal ini disebabkan setelah proses DCT, dan masuk ke fase Quantization nilai Quality nya dibesarkan sehingga kompresi bisa tinggi (agar bisa muat di saluran transmisi 3 Mbps) tapi gambar pixelized (tentang Quantization baca "How JPEG Works (Part-4)"). Dengan cara tsb, video tetap bisa di transmisikan dengan 3 Mbps saja, tapi ada efek, pas pergerakan cepat (spt video balapan mobil), atau gambar sangat berubah cepat (spt video api unggun), akan terjadi adalah pixelized.

De-blocking pada H.264

Salah satu kelebihan H.264 adalah adanya filter de-blocking. Akibat quantisasi yang terlalu dalam (nilai quality terlalu besar) maka tidak jarang antara blok 8x8 terjadi perbedaan warna yang tajam. De-blocking membuat pergantian warna ini lebih smooth, dengan me-rata-ratakan value antara ke dua warna tsb.


Sehingga efek pixelized pada kompresi yang sangat tinggi menjadi tidak begitu terasa, seperti contoh berikut.


Gambar kiri adalah gambar tanpa de-blocking (dimana terdapat pixelized ataupun"dust" pada wajah). Sedangkan bagian kanan setelah penerapan filter de-blocking, dimana pixelized tidak begitu terasa.

Friday, June 12, 2015

How JPEG Works (Part-4)

Tahap ke 3 setelah dilakukan transformasi DCT adalah Quantization.

Kenapa perlu di kuantisasi?

Jawaban sederhananya adalah untuk membuang nilai-nilai "pixel" DCT yang rendah (nilai nilai yang mendekati 0).

Bagaimana caranya?

Tekniknya adalah dengan membagi "pixel" DCT dengan Quatization matrix.

Disini lah muncul paramater Quality.

Misalkan kita set parameter Quality bernilai 1 sampai 25. Quality 1 adalah top quality image, gambar tetap tajam seperti aslinya (akan tetapi ukuran file JPEG akan besar) . Quality 25 adalah bad quality image, gambar menjadi buram dan pixelized (akan tetapi ukuran file JPEG akan kecil).

Berikut ini adalah pseudo-code untuk membuat Quantization matrix.

for ( i = 0 ; i < N ; i++ )
 for ( j = 0 ; j < N ; j++ )
  Quantum[ i ][ j ] = 1 + ( ( 1 + i + j ) * quality );


Apabila quality = 2, maka Quntization matrix (Quantum[i][j]) menjadi:
3 5 7 9 11 13 15 17
5 7 9 11 13 15 17 19
7 9 11 13 15 17 19 21
9 11 13 15 17 19 21 23
11 13 15 17 19 21 23 25
13 15 17 19 21 23 25 27
15 17 19 21 23 25 27 29
17 19 21 23 25 27 29 31

Nilai dari Quantization matrix ini nanti menjadi pembagi untuk "pixel" DCT[i,j].

                         DCT(i,j)
Quantized Value(i,j) = -------------- Rounded integer
                        Quantum(i,j)

Kita ulangi dari hasil Part-3 sebagai berikut.


Pixel Asli





140 144 147 140 140 155 179 175
144 152 140 147 140 148 167 179
152 155 136 167 163 162 152 172
168 145 156 160 152 155 136 160
162 148 156 148 140 136 147 162
147 167 140 155 155 140 136 162
136 156 123 167 162 144 140 147
148 155 136 155 152 147 147 136


Pixel Normalisasi



12 16 19 12 12 27 51 47
16 24 12 19 12 20 39 51
24 27 8 39 35 34 24 44
40 17 28 32 24 27 8 32
34 20 28 20 12 8 19 34
19 39 12 27 27 12 8 34
8 28 -5 39 34 16 12 19
20 27 8 27 24 19 19 8


Hasil Transformasi DCT


186 -18 15 -9 23 -9 -14 19
21 -34 26 -9 -11 11 14 7
-10 -24 -2 6 -18 3 -20 -1
-8 -5 14 -15 -8 -3 -3 8
-3 10 8 1 -11 18 18 15
4 -2 -18 8 8 -4 1 -7
9 1 -3 4 -1 -7 -1 -2
0 -8 -2 2 1 4 -6 0

Hasil Transformasi DCT apabila dibagi dengan Quantization Matrix menjadi


DCT After Quantization


62 -4 2 -1 2 -1 -1 1
4 -5 3 -1 -1 1 1 0
-1 -3 0 0 -1 0 -1 0
-1 0 1 -1 0 0 0 0
0 1 1 0 -1 1 1 1
0 0 -1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

Terlihat bahwa pada frekuensi tinggi sudah banyak sekali "pixel" dengan value 0 yang mana ini sangat mudah untuk dilakukan kompresi.

Apabila Quality kita turunkan menjadi 10 atau 25 misalkan, maka jumlah "pixel" dengan value 0 akan bertambah jauh lebih banyak lagi, ukuran file semakin kecil, tapi gambar semakin buram (makin pixelized).

Berikut contoh Kompresi JPEG dengan berbagai Quality.

Gambar asli


Quality = 1


Quality = 2


Quality = 10


Quality = 25

Pada kondisi dimana gambar cukup mampu di kompresi, maka dengan kompresi sampai tingkat 60% dari ukuran file asli, gambar masih bisa terlihat tajam.

Contoh coding/programming JPEG dalam bahasa C disini