【视频编解码·学习笔记】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)的映射方式并无指定的换算公式,通常由查表的方式进行。

三、指数哥伦布编码同哈夫曼编码的比较:

  1. 哈夫曼编码在编码过程中考虑了信源各个符号的概率分布特性,根据符号的概率分布进行编码,不同的信源的哈夫曼编码的结果不同;指数哥伦布编码对所有信源统一
  2. 哈夫曼编码在解码前必须额外获得一份当前信源的码表;指数哥伦布编码不需要
  3. 指数哥伦布编码的压缩比率通常比较低,对于有些信息甚至完全没有压缩效果;在不考虑码表的情况下,哈夫曼编码压缩率更高

但是,实际上对于视频压缩而言,类似于哈夫曼编码所提供的压缩比率的优势远远不够,而且还需额外码表。因此在实际的视频编码方法中使用的是指数哥伦布编码,但是由于压缩率低,只作为少数的辅助语法元素的编码以及多数语法元素的二值化方法。

真正贡献了高压缩比的为CAVLC和CABAC编码等,将在后续学习笔记中进行介绍。

原文地址:https://www.cnblogs.com/shuofxz/p/8507324.html

时间: 2024-08-25 06:12:04

【视频编解码·学习笔记】8. 熵编码算法:基本算法列举 & 指数哥伦布编码的相关文章

【视频编解码·学习笔记】11. 提取SPS信息程序

一.准备工作: 回到之前SimpleH264Analyzer程序,找到SPS信息,并对其做解析 调整项目目录结构: 修改Global.h文件中代码,添加新数据类型UINT16,之前编写的工程中,UINT8和UINT32都为小写表示,为了更符合编程规范,将其改为全大写(可使用ctrl+H在整个解决方案内进行替换). typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned int UINT32; 之后编

【视频编解码·学习笔记】6. H.264码流分析工程创建

一.准备工作: 新建一个VS工程SimpleH264Analyzer, 修改工程属性参数-> 输出目录:$(SolutionDir)bin\$(Configuration)\,工作目录:$(SolutionDir)bin\$(Configuration)\ 编译一下工程,工程目录下会生成bin文件夹,其中的debug文件夹中有刚才编译生成的exe文件.将一个.264视频文件拷贝到这个文件夹中(本次使用的仍是学习笔记3中生成的.264文件). 将这个文件作为输入参数传到工程中:属性 -> 调试

【视频编解码·学习笔记】3. H.264视频编解码工程JM的下载与编解码

一.下载JM工程: JM是H.264标准制定团队所认可的官方参考软件.网址如下 http://iphome.hhi.de/suehring/tml/ 从页面中可找到相应的工程源码,本次选择JM 8.6版本,此版本为经典版本: http://iphome.hhi.de/suehring/tml/download/old_jm/ 二.配置编码环境: 下载后打开工程目录中tml.sln文件,VS中会有三个工程,其中rtpdump没用,删掉.另外两个ldecod和lencod分别为解码和编码工程. 首先

【视频编解码·学习笔记】5. NAL Unit 结构分析

在上一节中通过一个小程序,可以提取NAL Unit所包含的的字节数据.H.264码流中的每一个NAL Unit的作用并不是相同的,而是根据不同的类型起不同的作用.下面将对NAL Unit中的数据进行解析. 一.NAL Unit结构 一个NAL Unit都是由一个NAL Header和一个NAL Body组成.对于基本版本的H.264标准(不考虑SVC和MVC扩展),一个NAL Header的长度固定为1,即8bit.这8bit的含义分别为: forbidden_zero_bit:每一个NAL H

【视频编解码·学习笔记】4. H.264的码流封装格式 & 提取NAL有效数据

一.码流封装格式简单介绍: H.264的语法元素进行编码后,生成的输出数据都封装为NAL Unit进行传递,多个NAL Unit的数据组合在一起形成总的输出码流.对于不同的应用场景,NAL规定了一种通用的格式适应不同的传输封装类型. 通常NAL Unit的传输格式分两大类:字节流格式和RTP包格式 字节流格式: 大部分编码器的默认输出格式 每个NAL Unit以规定格式的起始码分割 起始码:0x 00 00 00 01 或 0x 00 00 01 RTP数据包格式: NAL Unit按照RTP数

视频编解码学习之三:变换,量化与熵编码

第6章 变换编码 1. 变换编码 变换编码的目的 去除空间信号的相关性 将空间信号的能力集中到频域的一小部分低频系数上 能量小的系数可通过量化去除,而不会严重影响重构图像的质量 块变换和全局变换 块变换:离散余弦变换(Discrete Cosine Transform,DCT),4x4,8x8,16x16 全局变换:小波变换(Wavelet) 变换的能量集中特性 DCT编码 2. 变换类型 K-L变换 傅里叶变换 余弦变换 小波变换 3. KL变换 最优变换 基函数根据具体图像而确定 没有快速算

各种音视频编解码学习详解

各种音视频编解码学习详解 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等.最近因为项目的关系,需要理清媒体的codec,比较搞的是,在豆丁网上看运营商的规范 标准,同一运营商同样的业务在不同文档中不同的要求,而且有些要求就我看来应当是历史的延续,也就是现在已经很少采用了.所以豆丁上看不出所以然,从 wiki上查.中文的wiki信息量有限,很短,而wiki的英文内容内多,删减版

视频编解码学习之二:编解码框架

第四章 视频编码基础 1. 压缩码流 语法:码流中各个元素的位置关系 01001001… 图像编码类型(01),宏块类型(00),编码系数1001等 语义:每个语法元素所表达的意义. 例如:图像编码类型 2. 编码层次 序列(Sequence) 图像组(Group of Pictures,GOP) 图像(Picture) 条带(Slice) 宏块(Macroblock,MB) 块(Block) 3. 码流结构 3. PB帧编码 4. 序列编码对象 (1)IBBP序列 序列:一段连续编码的并具有相

视频编解码学习之四:视频处理及编码标准

1.视频处理 在视频压缩前后,对视频图像质量增强的操作 视频编解码系统输出的图像主观质量不仅与压缩算法的性能有关,还受视频处理的影响 压缩之前对视频的处理称作预处理(Pre-processing) 压缩之后对视频的处理称作后处理(Post-processing) 2. 预处理 预处理的目的 为了减少原图像受到的损害,保持原图像的重要特征,使原图像能被高效的压缩 噪声污染 光照差 抖动 为了进行视频格式转换 去隔行 空间缩放 帧率转换 去噪声处理 去隔行(Deinterlace) 隔行扫描的视频图