《新一代视频压缩编码标准H.264》毕厚杰主编 6.8.3节
一、熵编码回顾
熵编码:
1、无损编码:解码后可无失真还原信源信息;
2、利用信源符号的概率特性,使编码后的信息尽可能接近信源的熵;
常见熵编码方法:
变长编码:哈夫曼编码、香农-费诺编码、指数哥伦布编码;
算数编码;
2. CAVLC的基本原理
我们知道,CAVLC的全称叫做“上下文自适应的变长编码Context-based Adaptive Variable Length Coding”。所谓“上下文自适应”,说明了CAVLC算法不是像指数哥伦布编码那样采用固定的码流-码字映射的编码,而是一种动态编码的算法,因而压缩比远远超过固定变长编码UVLC等算法。
在H.264标准中,CAVLC主要用于预测残差的编码。在博文中我们给出了H.264的编码流图,其中可知,熵编码的输入为帧内/帧间预测残差经过变换-量化后的系数矩阵。以4×4大小的系数矩阵为例,经过变换-量化后,矩阵通常呈现以下特性:
1、经过变换量化后的矩阵通常具有稀疏的特性,即矩阵中大多数的数据已0为主。CAVLC可以通过游程编码高效压缩连续的0系数串;
2、经过zig-zag扫描的系数矩阵的最高频非0系数通常是值为±1的数据串。CAVLC可以通过传递连续的+1或-1的长度来高效编码高频分量;
3、非零系数的幅值通常在靠近DC(即直流分量)部分较大,而在高频部分较小;
4、矩阵内非0系数的个数同相邻块相关;
鉴于上述的特性3和4,针对待编码的系数在系数矩阵中不同的位置,以及相邻块的有关信息,在编码时采用不同的码表进行编码。CAVLC的这种特性,体现了命名中的“上下文自适应”的方法。
3、CALVC编码涉及的相关概念
编码需要的重要元素:
一般都是以4X4的宏块(也支持8x8宏块)做编码,所以下面是0~16
1、非零系数的个数(TotalCoeffs):取值范围为[0, 16],即当前系数矩阵中包括多少个非0值的元素;
2、拖尾系数的个数(TrailingOnes):取值范围为[0, 3],表示最高频的几个值为±1的系数的个数,如果±1 的个数大于 3 个,
只有最后 3 个被视为拖尾系数,其余的被视为普通的非零系数。
3、拖尾系数的符号:以1 bit表示,0表示+,1表示