熵编码即编码过程中按熵原理不丢失任何信息的编码。信息熵为信源的平均信息量(不确定性的度量)。常见的熵编码有:香农(Shannon)编码、哈夫曼(Huffman)编码和算术编码(arithmetic coding)。在视频编码中,熵编码把一系列用来表示视频序列的元素符号转变为一个用来传输或是存储的压缩码流。输入的符号可能包括量化后的变换系数,运动向量,头信息(宏块头,图象头,序列的头等)以及附加信息(对于正确解码来说重要的标记位信息)。
H264标准采用了两种熵编码模式:基于上下文的二进制算数编码CABAC和可变长编码VLC。在slice层之上(picture和sequence)使用定长或变长的二进制编码,slice层及其以下使用VLC或CABAC。
H264的语法中有一个熵编码模式选项(entropy_coding_mode),当entropy_coding_mode的值是0,对经变换和量化后的残差块数据使用基于上下文的自适应可变长编码(CAVLC context-adaptive varbile length coding)方式进行编码,其他的可变长编码使用统一码本(Exp-Golomb编码)编码。
当使用统一码本(Exp-Golomb编码)编码时,对于出现概率高的符号使用短码字,出现概率低的符号使用长码字,Exp-Golomb编码设计结构非常有规则,编解码方式简单快速,在发生比特错误时能够快速同步。CAVLC用于对之字型读出的4x4(和2x2)残差块的变换系数进行熵编码,使用CAVLC的目的是发挥4x4块的技术优势:
(1)经过预测、变换和量化后,系数块是包含大量0的稀疏矩阵。CAVLC使用游程码对长0串压缩。
(2)通过之字型扫描的最大的非0系数通常是一个+1或-1的序列,CAVLC将+1或-1的数量压缩输出。
(3)相邻块之间的非0的变换系数的数量是相互关联的,当前块的系数的编码使用查找表,查找表的选择依赖于相邻块的非0系数的数目。
(4)非0系数的数量在重排序数组的开始部分比较多,高频部分少。CAVLC利用这个特点,查找表的选择依赖于已编码传输的数据内容的统计规律。
CAVLC使得经DCT整数变换和量化后的4x4块的系数获得更高的编码效率。
H.264的另一个熵编码模式是基于上下文的二进制算数编码CABAC。算数编码从全序列出发,采用递推形式的连续编码,其平均码长能够逼近信源的熵。
当entropy_coding_mode的值是1,H.264使用CABAC算数编码系统对语法元素编解码。CABAC根据元素的内容选择适合语法元素的概率模型以达到好的压缩效果。CABAC的编码过程步骤:
(1)二进制化:CABAC对二进制数进行编码。非二进制数(例如:一个变换系数或运动矢量)必须二进制化或在算数编码前转换成二进制数。这个过程类似于转换数据符号为可变长编码,二进制码在变换前由算数编码器进行编码。
对已二进制化的符号的每一个比特重复(2),(3)和(4)步。
(2)上下文模型选择:上下文模型(context mode)是对已二进制化的符号的一个或多个比特数的概率模型。基于最近编码过的数据符号的统计规律,从可用的模型中选择上下文模型。上下文模型存储了每个比特数是0或1的概率。
(3)算数编码:算数编码器根据选择的概率模型进行编码。注意对于比特数(可取0或1<)只有两个子区间。
(4)概率修正:已选择的上下文模型根据实际编码数据进行修正,例如,如果比特数是1,1的概率就增高。
H264中有267个不同的上下文模型,相应于不同的语法元素,根据slice的类型某些模型的用途会不一样。在slice的开始,上下文模型根据量化系数的初值进行初始化。
CABAC根据过去的观测内容,选择适当的上下文模型提供数据符号的条件概率的估计,并根据编码时数据符号的比特数出现的频率动态地修改概率模型,数据符号可以近似熵率进
行编码,提高编码效率。在相同图像质量下,使用CABAC编码电视信号将会比CAVLC比
特率减少10%~~15%。
CABAC 的算法复杂度高于 CAVLC , CABAC 对编码效率的提高是建立在牺牲复杂度的基础之上。