H.264中用到的指数哥伦布解码
标准中描述为ue(v)、te(v)、se(v)、me(v)时调用
哥伦布码字表前几行
码字 编码数字(Code_Num)
1 0
010 1 (10为2个比特,所以1前面要补的0的个数为:2-1=1,所以为:0 10)
011 2
00100 3
00101 4
00110 5
00111 6
0001000 7
前缀为M个0
后缀为M位的二进制数[info]
解码时:
读取1前面的0,计数得到M的值
读取1后M比特
Code_Num = 2^M -1 + [info]
编码时, 语法元素值Value按照映射ue、te、se、me得到Code_Num
解码是,根据映射类型逆运算,得到Value
①ue为无符号映射,Value = Code_Num
②se为有符号映射,如下表
Code_Num 0 1 2 3 4 5 …
Value 0 1 -1 2 -2 3 …
③te截断映射,根据Value的取值范围做不同的处理
如果Value范围是[0,K],K是大于1的一个数,那么te和ue一样
如果Value范围是[0,1]
那么不用上面的哥伦布码表取得Code_Num
直接从码流里读取1比特,设值为b,Code_Num = !b
④me映射是用Code_Num对应宏块预测模式,标准中表9-4给出了映射关系
from: https://blog.csdn.net/wh8_2011/article/details/53695975
-------------------------------------------------------------------------------------------------
无符号整数指数哥伦布码编码的算法如下:
M=floor(log2(codeNum+1));
INFO=codeNum+1–2^M; {[1],[INFO]} = codeNum+1;
编码格式如下:
[Mzeros][1][INFO]。其包括前缀码和信息位两部分,前缀码由M比特的0和一个比特1组成,信息INFO的编码长度为M比特。因此每个Exp_golomb码字的数据长度是(2M+1)。
例如:如果codeNum=7,则M=floor(log2(7+1))=3,INFO=codeNum+1–2^M=7+1-2^M=0.
前缀码为0001。信息INFO为0,因为是3比特,所以写为000.
最终码为:0001000.
将0~9的编码情况列举如下:
0=>1
1=>010
2=>011
3=>00100
4=>00101
5=>00110
6=>00111
7=>0001000
8=>0001001
9=>0001010
或 比特串格式为“前缀1后缀”。
1)1后缀=codeNum+1,如codeNum = 3,则1后缀=4,即为100,后缀为00;
2)前缀与后缀的比特数相同,且前缀的各位比特为0