概述:
我们知道,CAVLC的全称叫做“上下文自适应的变长编码Context-based Adaptive Variable Length Coding”。所谓“上下文自适应”,说明了CAVLC算法不是像指数哥伦布编码那样采用固定的码流-码字映射的编码,而是一种动态编码的算法,因而压缩比远远超过固定变长编码UVLC等算法。
在H.264标准中,CAVLC主要用于预测残差的编码。在本系列第二篇博文中我们给出了H.264的编码流图,其中可知,熵编码的输入为帧内/帧间预测残差经过变换-量化后的系数矩阵。以4×4大小的系数矩阵为例,经过变换-量化后,矩阵通常呈现以下特性:
- 经过变换量化后的矩阵通常具有稀疏的特性,即矩阵中大多数的数据已0为主。CAVLC可以通过游程编码高效压缩连续的0系数串;
- 经过zig-zag扫描的系数矩阵的最高频非0系数通常是值为±1的数据串。CAVLC可以通过传递连续的+1或-1的长度来高效编码高频分量;
- 非零系数的幅值通常在靠近DC(即直流分量)部分较大,而在高频部分较小;
- 矩阵内非0系数的个数同相邻块相关;
鉴于上述的特性3和4,针对待编码的系数在系数矩阵中不同的位置,以及相邻块的有关信息,在编码时采用不同的码表进行编码。CAVLC的这种特性,体现了命名中的“上下文自适应”的方法。
参考:
https://www.cnblogs.com/TaigaCon/p/5255018.html
https://www.cnblogs.com/TaigaCon/p/7018251.html
一、熵编码回顾
熵编码:
- 无损编码:解码后可无失真还原信源信息;
- 利用信源符号的概率特性,使编码后的信息尽可能接近信源的熵;
常见熵编码方法:
- 变长编码:哈夫曼编码、香农-费诺编码、指数哥伦布编码;
- 算数编码;
二、CAVLC
上下文自适应的变长编码:
用于亮度和色度预测残差的编码,以量化后的变换系数的形式;
变换系数矩阵的特征:
- 稀疏:矩阵元素以0为主;
- 非零系数集中于低频;
- 高频部分的非零系数大部分为±1;
- 非零系数个数同相邻块有关;
CAVLC的上下文模型:
- 编码非零系数的表格索引;
- 更新编码非零系数时的后缀长度
三、CALVC的编码过程
编码需要的重要元素:
一般都是以4X4的宏块做编码,所以下面是0~16
- 非零系数的个数(TotalCoeffs):取值范围为[0, 16],即当前系数矩阵中包括多少个非0值的元素;
- 拖尾系数的个数(TrailingOnes):取值范围为[0, 3],表示最高频的几个值为±1的系数的个数,如果±1 的个数大于 3 个,
只有最后 3 个被视为拖尾系数,其余的被视为普通的非零系数。 - 拖尾系数的符号:以1 bit表示,0表示+,1表示-;
- 当前块值(numberCurrent):用于选择编码码表,由上方和左侧的相邻块的非零系数个数计算得到。普通非0系数的幅值(level):幅值的编码分为prefix和suffix两个部分进行编码。编码过程按照反序编码,即从最高频率非零系数开始。
- 最后一个非0系数之前的0的个数(TotalZeros);
- 每个非0系数之前0的个数(RunBefore):按照反序编码,即从最高频非零系数开始;对于最后一个非零系数(即最低频的非零系数)前的0的个数,以及没有剩余的0系数需要编码时,不需要再继续进行编码。
四、系数矩阵Z形扫描
CAVLC对一个固定大小的系数矩阵进行编码,例如:
{
3, 2, -1, 0,
1, 0, 1, 0,
-1, 0, 0, 0,
0, 0, 0, 0,
}
扫描:
扫描重排之后得到一维数组:[3, 2, 1, -1, 0, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
五 编码过程
- 确定当前块值nC,选择coeff_token的码表;
- 根据非零系数个数TotalCoeffs和拖尾系数个数TrailingOnes,编码coeff_token;
- 编码拖尾系数的符号;
- 编码拖尾系数之外的普通非零系数;
- 编码最末非零系数之前0的总个数;
- 编码每个非零系数之前的0的个数;
六 CAVLC解析残差过程
在编码残差时对宏块的分割:
- cbp:表示一个8×8像素块是否进行编码;
- block:CAVLC编码的基本单元为4×4,在一个cbp表示的块中进一步分割
使用CAVLC解析宏块残差语法元素的顺序:
- numCoeff, trailingOnes;
- levels;
- totalZeros;
- runBefore;
七、编码上下文的确定与相邻块的有效性
在解析coeffToken时,码表的选择依赖于上下文信息;
决定上下文的信息由相邻块获取,主要是块中非0系数的个数;
块的有效和无效:
- Slice上边沿宏块的0、1、2、3号块,其上邻块无效;
- Slice左边沿宏块的0、4、8、12号块,其左邻块无效;
- Slice左上宏块的0号块,其左、上邻块均无效;
八、色度块、Intra16x16模式的解析
色度块、Intra16x16模式块的解析思想类似4x4亮度块:
- 依次解析numCoeff、trailingOnes、trailingSigns、levels、totalZeros、runBefore;
不同之处:
- 每个单元内系数数量最大值;
- AC/DC是否分别解析;
- nC值的计算方法;
九、不同分割模式的比较