接上篇H264的熵编码和句法阅读,介绍了H264码流中使用到的几种熵编码,本章着重介绍其中4种指数哥伦布编码的编码方法
其中最重要的是无符号指数哥伦布编码,其他几种编码方式都是它的变种
在H264的码流描述符是ue(v)
无符号指数哥伦布编码分为三个部分 前缀,1和后缀
?????????????????????????????????????????????????????????????prefix + 1 + suffix
前缀由多个0构成,字符1作为中间分割,后缀的数量和前缀的0的数量保持一致
举一个例子:
0001011
这里首先找到第一个1,前面有3个0,所以其前缀为000
后缀为3个字符,所以后缀为011
无符号指数哥伦布获取码值CodeNum 的方法为
? ? ? ? ??
这里的LeadingZeroBits指的就是前缀的0的数量
read_bits(leadingZeroBits)指的是按二进制获取leadingZeroBits个bit位的码值
比如上面的例仔leadingZeroBits = 3
那么codeNum= 2^3 -1 + [011] = 8 - 1 + 3 = 10
上图表示了不同前缀数量,对应的codeNum的范围
语法元素编码舍位指数哥伦布编码te(v)和ue(v)非常相关,首先判断语法元素的范围,语法元素在[0,x]之间,x必须>=1,x就代表1前面的0的字符的数量就是LeadingZeroBits :
如果x>1, 那么te(v)=ue(v), 就直接使用无符号指数哥伦布编码的值
如果x=1, 那么codeNum就等于其下一位的取反, 就是后缀的取反
有符号指数哥伦布编码有描述符se(v)表示,se(v)必须先按照ue(v)的规则得到一个codeNum,然后将CodeNum输入如下公式得到se值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? se = (-1)^(k+1) Ceil(k/2)
举个例仔还是以上面0001011为例
得到ue值10, 那么k=10 代入公式 (-1)^(10+1) Ceil(10/2) = -5
如果ue值等于3,那么k=3代入公式(-1)^(3+1) Ceil(3/2) = 2
Ceil()为向上取整函数
映射指数哥伦布编码用描述符me(v)表示,me(v)是使用ue(v)的值去查表查到一个对应的me, 所以第一步还是计算出一个ue值得codeNum,然后根据ITU H64标准文档的 9.1.2章节去查表即可