转自: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第一个表格。