【视频编解码·学习笔记】8. 熵编码算法:基本算法列举 & 指数哥伦布编码
一、H.264中的熵编码基本方法:
- 熵编码具有消除数据之间统计冗余的功能,在编码端作为最后一道工序,将语法元素写入输出码流
- 熵解码作为解码过程的第一步,将码流解析出语法元素供后续步骤重建图像使用
在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)的一种
二者显著区别:
- 信源相关性:哈夫曼编码依赖于心愿的概率分布;指数哥伦布编码与信源无关
- 额外信息:哈弗曼编码的数据必须额外携带与该信源匹配的码表;指数哥伦布编码不需额外信息
1. 指数哥伦布编码的分类
常用的指数哥伦布编码通常可以分为四类:
| 语法元素描述符 | 编码方法 |
|---|---|
| ue(v) | 使用无符号指数哥伦布编码 |
| se(v) | 使用有符号指数哥伦布编码 |
| te(v) | 使用截断指数哥伦布编码 |
| me(v) | 使用映射指数哥伦布编码 |
其中无符号指数哥伦布编码ue(v)是其他编码方式的基础,其余几种方法基本可以由ue(v)推导得出。
2. 0阶(零阶)无符号指数哥伦布编码 ue(v)
ue(v)的码字可以分为三个部分:
[prefix] 1 [surfix]
其中前缀码为n个bit长度的0,后缀码为表示实际数值的信息位,信息位的长度等于前缀码中0的个数。
指数哥伦布编码中前缀和后缀部分的长度根据码元数值来确定:
| 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 |
| …… | …… |
编码模板的后缀部分,xx以二进制的形式表示解码后的数值
前缀0的长度以LeadingZeroBits表示,那么解码后数值为:\(codeNum = 2^{LeadingZeroBits} - 1 + (xxx)\)。(xxx)为二进制数值xxx的10进制表示。举例如下:
| 指数哥伦布编码码字 | 码元数值 |
|---|---|
| 1 | 0 |
| 0 1 0 | 1 |
| 0 0 1 0 1 | 4 |
| 0 0 0 1 0 0 0 | 7 |
编解码过程:
- 编码:
codeNum = 13,
前缀0的个数:\(prefixLen = floor[log_2(codeNum+1)] = 3\);
后缀部分的二进制:\(codeNum+1-2^{prefixLen} = 14-8 = 6 = b(1 1 0)\)
因此13的指数哥伦布编码码字为0 0 0 1 1 1 0。 - 解码:
指数哥伦布码 0 0 0 0 1 0 1 0 1
解码后的数值为 \(2^4-1+5 = 20\)
3. 有符号指数哥伦布编码 se(v)
“有符号的指数哥伦布编码值”是通过“无符号的指数哥伦布编码的值”通过换算得到的
其换算关系为:\(n = (-1)^{(k+1)} \times Ceil(k / 2)\)
就是说:先按无符号方式解码,得到的十进制数字两个一组,绝对值相同,第一个是正的,第二个是负的。
下表为有符号和无符号指数哥伦布编码之间的换算关系:
| 指数哥伦布编码码字 | 无符号解码结果 | 有符号解码结果 |
|---|---|---|
| 1 | 0 | 0 |
| 0 1 0 | 1 | 1 |
| 0 1 1 | 2 | -1 |
| 0 0 1 0 0 | 3 | 2 |
| 0 0 1 0 1 | 4 | -2 |
| k | \((-1)^{(k+1)} \times Ceil(k / 2)\) |
4. 截断指数哥伦布编码 te(v)
解码时,首先需要判断的是语法元素的取值范围,假定为\([0, x], x≥1\)。根据x的取值情况,语法元素根据下面不同情况进行解析:
- 若x>1,解析方法同ue(v)相同
- 若x=1,语法元素值等同于下一位bit值的取反
5. 映射指数哥伦布编码 me(v)
适用于预测模式为Intra_4x4, Intra_8x8或Inter的宏块的coded_block_pattern的编码。me(v)的映射方式并无指定的换算公式,通常由查表的方式进行。
三、指数哥伦布编码同哈夫曼编码的比较:
- 哈夫曼编码在编码过程中考虑了信源各个符号的概率分布特性,根据符号的概率分布进行编码,不同的信源的哈夫曼编码的结果不同;指数哥伦布编码对所有信源统一
- 哈夫曼编码在解码前必须额外获得一份当前信源的码表;指数哥伦布编码不需要
- 指数哥伦布编码的压缩比率通常比较低,对于有些信息甚至完全没有压缩效果;在不考虑码表的情况下,哈夫曼编码压缩率更高
但是,实际上对于视频压缩而言,类似于哈夫曼编码所提供的压缩比率的优势远远不够,而且还需额外码表。因此在实际的视频编码方法中使用的是指数哥伦布编码,但是由于压缩率低,只作为少数的辅助语法元素的编码以及多数语法元素的二值化方法。
真正贡献了高压缩比的为CAVLC和CABAC编码等,将在后续学习笔记中进行介绍。
【视频编解码·学习笔记】8. 熵编码算法:基本算法列举 & 指数哥伦布编码的更多相关文章
- 【视频编解码·学习笔记】11. 提取SPS信息程序
一.准备工作: 回到之前SimpleH264Analyzer程序,找到SPS信息,并对其做解析 调整项目目录结构: 修改Global.h文件中代码,添加新数据类型UINT16,之前编写的工程中,UIN ...
- 【视频编解码·学习笔记】12. 图像参数集(PPS)介绍
一.PPS相关概念: 除了序列参数集SPS之外,H.264中另一重要的参数集合为图像参数集Picture Paramater Set(PPS). 通常情况下,PPS类似于SPS,在H.264的裸码流中 ...
- 【视频编解码·学习笔记】2. H.264简介
一.H.264视频编码标准 H.264视频编码标准是ITU-T与MPEG合作产生的又一巨大成果,自颁布之日起就在业界产生了巨大影响.严格地讲,H.264标准是属于MPEG-4家族的一部分,即MPEG- ...
- 【视频编解码·学习笔记】13. 提取PPS信息程序
PPS结构解析 与之前解析SPS方式类似 一.定义PPS类: 在3.NAL Unit目录下,新建PicParamSet.cpp和PicParamSet.h,在这两个文件中写入类的定义和函数实现. 类定 ...
- 【视频编解码·学习笔记】6. H.264码流分析工程创建
一.准备工作: 新建一个VS工程SimpleH264Analyzer, 修改工程属性参数-> 输出目录:$(SolutionDir)bin\$(Configuration)\,工作目录:$(So ...
- 【视频编解码·学习笔记】3. H.264视频编解码工程JM的下载与编解码
一.下载JM工程: JM是H.264标准制定团队所认可的官方参考软件.网址如下 http://iphome.hhi.de/suehring/tml/ 从页面中可找到相应的工程源码,本次选择JM 8.6 ...
- 【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码
一.熵编码概念: 熵越大越混乱 信息学中的熵: 用于度量消息的平均信息量,和信息的不确定性 越是随机的.前后不相关的信息,其熵越高 信源编码定理: 说明了香农熵越信源符号概率之间的关系 信息的熵为信源 ...
- 【视频编解码·学习笔记】5. NAL Unit 结构分析
在上篇笔记中通过一个小程序,可以提取NAL Unit所包含的的字节数据.H.264码流中的每一个NAL Unit的作用并不是相同的,而是根据不同的类型起不同的作用.下面将对NAL Unit中的数据进行 ...
- 【视频编解码·学习笔记】10. 序列参数集(SPS)介绍
一.SPS 相关概念: SPS即 "Sequence Paramater Set",又称作序列参数集. SPS中保存了一组编码视频序列(Coded video sequence)的 ...
随机推荐
- 浅谈Java Virtual Machine
Java Virtual Machine 就是指Java虚拟器,以下简称VM.关于VM的概念,最早出自CPU模拟器,众所周知的PC上的游戏机模拟器采用的便是和Java VM类似的技术.ja ...
- python爬虫之小说爬取
废话不多说,直接进入正题. 今天我要爬取的网站是起点中文网,内容是一部小说. 首先是引入库 from urllib.request import urlopen from bs4 import Bea ...
- 用户 'IIS APPPOOL\.NET v4.5 Classic' 登录失败。
我在win8.1系统下用vs2013+SqlServer08编写完项目后,挪到另一台win8.1系统(安装了Vs2010+SqlServer08)中,把网址挂到IIs中时,出现如下错误 : 解决方案: ...
- kali初探:root用户打开wireshark打开失败
启动wireshark后,报错: 该界面提示在init.lua文件中使用dofile函数禁用了使用超级用户运行wireshark.这是因为wireshark工具是使用Lua语言编写的,并且在kali ...
- React原理探索- @providesModule 模块系统
@providesModule是什么 react抛出组件化的概念后,对于开发者而言,为了提高代码的可读性与结构性,通过文件目录结构去阐述组件嵌套关系无疑是一个很好的办法,但是目录级别的加深,同时让re ...
- 01 Java 搭建环境
刚接触 Java 语言,为了方便以后查阅,将学习过程中遇到的知识点记录下来,作为学习笔记使用.在学习过程中 JDK 使用版本为 1.8.0_73,操作系统为 macOS Sierra 10.12.6. ...
- .Neter玩转Linux系列之三:Linux下的分区讲解
基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...
- Java版网络爬虫基础
网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广 ...
- 使用exe4j工具制作简单的java应用程序
首先需要下载exe4j工具并进行安装,下面是利用exe4j工具制作应用程序的步骤. 1.首先将工程导出为可运行的jar包,选择extract required libralies into gener ...
- BZOJ 3731 3731: Gty的超级妹子树 [树上size分块 !]
传送门 题意:一棵树,询问子树中权值大于k的节点个数,修改点权值,插入新点,断开边:强制在线 该死该死该死!!!!!! MD我想早睡觉你知不知道 该死该死沙比提 断开边只会影响一个块,重构这个块就行了 ...