H.264---CABAC---第二步---待編碼語法元素二值化
轉自:https://www.cnblogs.com/TaigaCon/p/5304563.html
CABAC編碼的是slice data中的語法元素,在進行算術編碼前,需要把這些語法元素按照一定的方法轉換成適合進行二進位制算術編碼的二進位制串,這個轉換的過程被稱為二值化(binarization)。
二值化的方案共有7種
1. 一元碼(Unary)
對於一個非二進位制的無符號整數值符號x⩾0,在CABAC中的一元碼碼字由xx個“1”位外加一個結尾的“0”組成,見下表。例如,輸入的語法元素值為3,其二值化結果為1110
value of syntax element | Unary | |||||
0 | 0 | |||||
1 | 1 | 0 | ||||
2 | 1 | 1 | 0 | |||
3 | 1 | 1 | 1 | 0 | ||
4 | 1 | 1 | 1 | 1 | 0 | |
5 | 1 | 1 | 1 | 1 | 1 | 0 |
… | ||||||
binIdx | 0 | 1 | 2 | 3 | 4 | 5 |
2. 截斷一元碼(TU,Truncated Unary)
一元碼的變體,用在已知語法元素的最大值cMax的情況。對於0⩽x<cMax的範圍內的取值,使用一元碼進行二值化。對於x=cMaxx=cMax,其二值化的二進位制串全部由“1”組成,長度為cMax。例如,當cMax=5時,語法元素值為4的二進位制串為11110,語法元素值為5的二進位制串為11111。
3. k階指數哥倫布編碼(kth order Exp-Golomb,EGk)
指數哥倫布編碼由字首和字尾組成。其中字首部分由l(x)=⌈log2(x/2k+1)⌉l(x)=⌈log2(x/2k+1)⌉的值所對應的一元碼組成;字尾部分可通過使用長度為k+l(x)k+l(x)位的x+2k(1−2l(x))x+2k(1−2l(x))的二進位制值來計算。詳細的計算過程請參考指數哥倫布編碼,請注意兩者字首區別。
4. 定長編碼(FL,Fixed-Length)
用定長編碼二進位制的無符號語法元素, 語法元素的最大值cMax已知,那麼定長編碼的長度為fixlength=⌈log2(cMax+1)⌉fixlength=⌈log2(cMax+1)⌉,其中值就是語法元素的值的二進位制。定長編碼用於近似均勻分佈的語法元素的二值化。
5. mb_type與sub_mb_type特有的查表方式
詳情請檢視h.264標準中9.3.2.5小節
6. 4位FL與截斷值為2的TU聯合二值化方案
這種方案只用於對語法元素CBP的二值化。4位的FL(cMax=15)的字首用於編碼亮度CBP,2位的TU用於編碼色度CBP(當色彩格式為4:2:0或4:2:2時才會存在這個字尾)
7. TU與EGk的聯合二值化方案(UEGk,Unary/kth order Exp-Golomb)
這種方案的字首使用一元截斷碼,字尾使用k階哥倫布編碼。但是在取值較小的範圍內,只用一元碼錶示(即只有字首部分)。對於不同的語法元素,有不同的截斷值與階數。如下表為abs_level_minus1的二值化表(cMax=14的TU、0階哥倫布編碼)
* | Suffix (EG0) | ||||||||||||||||||
0 | 0 | ||||||||||||||||||
1 | 1 | 0 | |||||||||||||||||
2 | 1 | 1 | 0 | ||||||||||||||||
3 | 1 | 1 | 1 | 0 | |||||||||||||||
4 | 1 | 1 | 1 | 1 | 0 | ||||||||||||||
… | … | … | … | … | … | … | |||||||||||||
… | … | … | … | … | … | … | … | … | … | … | … | … | |||||||
12 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | ||||||
13 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | |||||
14 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | ||||
15 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | ||
16 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | ||
17 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
18 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
… | |||||||||||||||||||
binIdx | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
*:abs_level_minus1Prefix (TU)
具體哪個語法元素選擇哪種二值化方案,請檢視標準9.3.2中d第一個表格。