H264中的指数哥伦布编码

发布时间:2024年01月17日

接上篇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章节去查表即可

文章来源:https://blog.csdn.net/pietian1157/article/details/135609790
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。