八、 熵编码算法(2):H.264中的熵编码基本方法、指数哥伦布编码
由于种种问题,哈夫曼编码并没有作为一种实际应用的技术使用到实际编码算法中;本节看下H.264中实际使用的熵编码算法:指数哥伦布编码
在H264官方标准文档的第九章由说明
一、H.264中熵编码基本方法
- 熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流
- 之前我们成功从NAL Unit中获取到语法元素的码流之后,接下来就是对语法元素的码流进行解析。熵编码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用
- 在H.264的标准协议中,不同的语法元素指定了不同的熵编码方法。在协议文档中共指定了10种语法元素的描述符,这些描述符表达了码流解析为语法元素值的方法,其中包含了H.264标准所支持的所有熵编码方法:
语法元素描述符 | 编码方法 |
---|---|
b(8) | 8位二进制比特位串,用于描述rbsp_byte() |
f(n) | n位固定模式比特位串,从最左bit开始计算 |
u(n) | 使用n位无符号整数表示,由n位bit换算得到 |
i(n) | 使用n位有符号整数表示,由n位bit换算得到 |
ue(v) | 使用无符号指数哥伦布编码 |
se(v) | 使用有符号指数哥伦布编码 |
te(v) | 使用截断指数哥伦布编码 |
me(v) | 使用映射指数哥伦布编码 |
ce(v) | 上下文自适应的变长编码cavlc |
ae(v) | 上下文自适应的二进制算术编码cabac |
最常用的为变长编码和算术编码,提供更好的压缩效率,远比指数哥伦布算法复杂的多
二、指数哥伦布编码
- 同哈夫曼编码一样,指数哥伦布编码同样属于变长编码(VLC)的一种,也就是说针对不同的码源分配了bit位长度不同的码字
指数哥伦布编码和哈夫曼编码的区别:
- 信源相关性:哈夫曼编码依赖于信源的概率分布;指数哥伦布编码与信源无关;因此对于不同的信源,即使是相同的符号的哈夫曼编码的结果也是不同的;指数哥伦布编码针对不同的信源采用的编码是统一的,因此无论是什么样的输入,输出的编码后的数据都是一致的。
- 额外信息: 哈夫曼编码的数据必须额外携带与该信源匹配的码表;指数哥伦布编码无需携带任何额外信息
- 由于未考虑信源的实际特性,指数哥伦布编码的压缩比率通常比较低,对于有些信息甚至完全没有压缩效果,输出数据比原始数据更大,在这一点上哈夫曼编码作为“最优编码”在效率上更高;然而由于哈夫曼编码运算较指数哥伦布编码更为复杂,且必须保存码表信息增加了传输负荷,也对压缩比率造成了不利影响
实际上,对于视频压缩这样的需求而言,类似于哈夫曼编码所提供的压缩比率的优势远远不够,而且像H.264等编码标准都不会指望靠这样的方式来提高压缩比率。因此在实际的视频编码方法中使用的是指数哥伦布编码,但是只作为少数的辅助语法元素的编码以及多数语法元素的二值化方法。真正贡献了高压缩比还需要后面详述的CAVLC和CABAC等。
三、指数哥伦布编码的分类
- H.264中定义的指数哥伦布编码共分四类:
- 其中ue(v)是其他变型算法的基础,其他算法的结果由ue(v)的结果进一步处理得到
1、0阶无符号指数哥伦布编码ue
- 如果不考虑视频编码的话,只是哥伦布编码是分为很多阶的,实际视频编码中使用0阶
- ue(v)的码字分为三部分:
- [prefix] + 1 + [surfix]
- 其中,[prefix]部分为连续n个0,[surfix]部分为表示实际数值的信息位,其长度与[prefix]一致;
- [prefix]和[surfix]的长度由码元取值确定
0阶指数哥伦布编码模板 | 适用码元值 |
---|---|
1 | 0 |
0 1 x | 1, 2 |
0 0 1 x x | 3~6 |
0 0 0 1 x x x | 7~14 |
0 0 0 0 1 x x x x | 15~30 |
0 0 0 0 0 1 x x x x x | 31~62 |
…… | …… |
计算公式: codeNum = 2^LeadingZeroBits - 1 + (xxx)
前缀0的长度以LeadingZeroBits表示,(xxx)为二进制数值xxx的10进制表示,因此,指数哥伦布编码的码字与码元值的对应关系如下表:
指数哥伦布编码码字 | 码元数值 |
---|---|
1 | 0 |
0 1 0 | 1 |
0 1 1 | 2 |
0 0 1 0 0 | 3 |
0 0 1 0 1 | 4 |
0 0 1 1 0 | 5 |
0 0 1 1 1 | 6 |
0 0 0 1 0 0 0 | 7 |
…… | …… |
无符号指数哥伦布编码是其余多种变形算法的基础,其余的比如有符号指数哥伦布编码、映射指数哥伦布编码、截断指数哥伦布编码都是由无符号指数哥伦布编码进一步处理得到的。
2、有符号指数哥伦布编码se
- 有符号指数哥伦布编码通过无符号指数哥伦布编码换算得到,换算个关系为:
n = (-1)^(k+1) * Ceil(k/2) //n表示se对应的值,k表示无符号的码元,ceil向上取整
- se和ue的相互关系可以表示为下表:
codeNum | syntax element value |
---|---|
0 | 0 |
1 | 1 |
2 | -1 |
3 | 2 |
4 | -2 |
5 | 3 |
6 | -3 |
k | (-1)^(k+1)*Ceil(k/2) |
3、截断指数哥伦布编码te
截断指数哥伦布编码的语法元素描述符为te(v)。当语法元素以te(v)解码时,首先需要判断的是语法元素的取值范围,假定为[0, x], x≥1。根据x的取值情况,语法元素根据下面不同情况进行解析:
- 若x>1,解析方法同ue(v)相同;
- 若x=1,语法元素值等同于下一位bit值的取反。
4、映射指数哥伦布编码me
映射指数哥伦布编码的描述符为me(v),适用于预测模式为Intra_4x4, Intra_8x8或Inter的宏块的coded_block_pattern的编码。me(v)的映射方式并无指定的换算公式,通常由查表的方式进行:
四. 0阶无符号指数哥伦布编码的实现Demo
八、 熵编码算法(2):H.264中的熵编码基本方法、指数哥伦布编码相关推荐
- 【H.264/AVC视频编解码技术详解】八、 熵编码算法(2):H.264中的熵编码基本方法、指数哥伦布编码
<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...
- 八、H.264中的熵编码基本方法、指数哥伦布编码
GitHub代码地址:点击这里 本节视频免费 1. H.264中的熵编码基本方法 在成功从NAL Unit中获取到语法元素的码流之后,接下来就是对语法元素的码流进行解析.根据我们在前面的博文中所讲述的 ...
- H.264中的熵编码算法(主讲指数哥伦布编码)
以下文章参考于殷文杰的博客. https://yinwenjie.blog.csdn.net/article/details/52301584 1 熵编码基本概念 1)"熵"这一概 ...
- 【H.264/AVC视频编解码技术详解】十九:熵编码算法(5)——H.264的CABAC(上):语法元素的二值化方法...
<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...
- H.264协议CABAC熵编码学习(二)
目录: H.264协议CABAC熵编码学习(一) H.264协议CABAC熵编码学习(二) H.264协议CABAC熵编码学习(三) H.264协议CABAC熵编码学习(四) H.264协议CABAC ...
- H.264协议CABAC熵编码学习(三)
目录: H.264协议CABAC熵编码学习(一) H.264协议CABAC熵编码学习(二) H.264协议CABAC熵编码学习(三) H.264协议CABAC熵编码学习(四) H.264协议CABAC ...
- 【编解码】从零开始写H264解码器(4) 熵编码之指数哥伦布编码
1. 引言 经过上一章的学习,我们学会看描述子.这时候我们就会发现,在语法中,除了简单的 u(n),i(n) 这种读取固定长度的二进制解析方法之外,用的更多的还有ue(v),se(v)这些. 只有学会 ...
- H.264中的SPamp;amp;SI帧技术简述
H.264中的SP&SI帧技术简述 1 应用背景(详细可见文献[1,2]) 流间切换.随机接入.错误恢复.快进快退.拼接 2 SP/SI帧 ...
- H.264 中很有用的一些概念
Q:PSNR 峰值信噪比 是根据它来取qp是不是? A:不是 和QP没有直接关系但是QP的选择会影响到PSNR Q: 如果不用率失真最优化,为什么选择SATD+delta×r(mv,mode)作为模式 ...
最新文章
- vue右键自定义菜单_一款小巧的开源右键菜单管理软件
- Oracle单机版开机自启动
- bash 脚本_Bash技巧:可以左右下移动和旋转俄罗斯方块的Shell脚本
- linux下挂载移动硬盘
- 飞桨第六课 2020.4.5
- ERP和C4C中的function location
- 常量与变量的区别(详细说明)(学习笔记3--变量与常量)
- 火狐浏览器jtopo节点切换tab后消失报错NS_ERROR_FAILURE的解决
- mysql 空值处理
- (WCF)阅读WCF分布式开发步步为赢(2)自定义托管宿主WCF解决方案开发配置过程详解的一点心得...
- 健康管理平台设计与实现
- ISTQB FL初级认证考试资料(中文)
- 关于idea中的maven索引异常问题(在idea中创建maven项目时,在pom.xml文件中加入依赖,提示出现的很慢)
- 星际争霸2 AI开发(持续更新)
- MySQL数据仓库基础
- 高德地图自定义地图样式
- 记录微信公众号迁移的过程(使用微擎)
- 3个方法提高电脑运行速度,亲测有效!
- 监控100台RouterOS路由器的各个pppoe拨号失败的数目并钉钉通知
- Windows网络活跃点决定使用的优先权