一言以蔽之就是:前缀是一元码,后缀是定长码,后缀长度为cRiceParam. 但是注意最后有截断的情况。
输入参数:cRiceParam, cMax, 以及要二值化的 val
1) 将val 分成prefix and suffix as follows:
Prefix = val >>cRiceParam
Suffix = val – prefix<<cRiceParam
即:Val =prefix << cRiceParam + suffix.
有两种情况无suffix:
a. cRiceParam=0,
b. val=cMax.
2) Prefix 按一元码 (unarycode)来编 as follows:
prefixVal |
bin string |
0 |
0 |
1 |
10 |
2 |
110 |
3 |
1110 |
4 |
11110 |
… |
|
cMax>>cRiceParam |
cMax>>cRiceParam "1" |
3) Suffix 按定长码(fixed-length)binarization 位数为cRiceParam.
4) 举个例子:如下. HEVC中用到的cRiceParam!=0的情况下,cMax都等于 4<<cRiceParam.
cRiceParam=1, cMax=8 |
||
val |
bin string |
|
prefix |
suffix |
|
0 |
0 |
0 |
1 |
0 |
1 |
2 |
10 |
0 |
3 |
10 |
1 |
4 |
110 |
0 |
5 |
110 |
1 |
6 |
1110 |
0 |
7 |
1110 |
1 |
8 |
1111 |
|
9 |
1111 |
|
… |
|
|
另外,标准文档的 9.3.3.2 节对此的描述感觉有问题:
1. 它没有说明cRiceParam=0的时候无suffix. (只是在note中注目了,但没有正式写出来)
2. 没有说明的suffix具体的binarization 方法,应该是定长码且长度为cRiceParam.