1 简介
H.264 高级视频编码标准规定了两种类型的墒编码:基于内容自适应二进制算数编码(CABAC)和可变长编码(VLC). 本文档简要介绍了CABAC。假设读者已经熟悉算数编码的概念。
2 内容自适应二进制编码(CABAC)
在H.264 编解码器中,当墒编码模式设置为1时,算数编码系统被用于对H.264语法元素进行编码和解码。为H.264选择的算数编码方案,基于上下文的自适应二进制算数编码或者CABAC,通过(a) 根据元素的上下文为每个语法元素选择概率模型,(b)基于局部统计自适应概率估计,以及© 使用算数编码,实现了良好的压缩性能。
对数据符号进行编码包括以下几个阶段。
二进制化:CABAC 使用二进制算数编码,这意味着只对二进制决策(1或者0)进行编码,非二进制符号(例如变换系数或者运动矢量)在算数编码之前被“二进制化”或者转换为二进制代码。该过程类似于将数据符号转换为可变长度代码的过程,但是二进制代码在传输之前被进一步编码(由算数编码器)
对于二进制化符号的每个比特(或“bin”)重复阶段2、3和4。
1 上下文模式选择:上下文模型是二值化符号的一个或者多个仓的概率模型。该模型可以根据最近编码的数据符号的统计从可用模型中选择,上下文模型存储每个bin为1或者0的概率。
2 算数编码:算数编码器根据选择的概率模型对每个bin进行编码。请注意,每个bin只有两个子范围(对应于“0”和1)。
3 概率更新:根据实际编码值更新选定的上下文模型(例如,如果bin的值为1,则增加1 s的概率)
3 编码过程
我们将举例说明编码过程,例如MVDx(x方向上运动矢量差异)
1 二值化MVD. 将MVDx二进制化。对于|MVDx| < 9,根据下表执行二值化(MVDx的较大值使用Exp-Golomb码字进行二值化)。
(注意:这些二进制码字中的每一个都是唯一可解码的)
二进制码字的第一个比特是bin1, 第二个比特是bin2, 等等。
1 为每个bin选择一个上下文,根据之前编码的MVD值,为bin 1,选择三个模型中的一个,计算两个先前变啊的值ek, 的L1 范数。
2 对每个bin进行编码,所选上下文模型提供两个概率估计,bin包含1的概率和bin包含0的概率。这些估计确定了算数编码器用来对bin进行编码的两个子范围。
3 更新上下文模型。例如,如果为bin1选择了上下文模型2,并且bin1的值为0,则频率统计0s将递增,这意味着下次选择此模型时,出现0的概率会略高。当模型的总出现次数超过阈值时,0和1的频率计数将按比例缩小,这实际上为最近的观测提供了更高的优先级。
4 上下文模型
标准中定义了每个语法元素的上下文模型和二进制化方案。总共有267个独立的上下文模型,0到266个用于各种语法元素。根据切片类型的不同,一些模型有不同的用途,例如,1切片中不允许跳过宏块,因此上下文模型0-2用于根据当前切片是否进行帧内编码来编码mb_skip或者mb_type的bin。
在每个编码切片的开始,上下文模型量化参数QP的初始值
5 算数编码引擎
算数解码器在标准中有一些详细的描述,有三个不同的特性:
1 概率估计是通过“最不可能符号”(LPS, 两个二进制决策0或者1中的最不可能)的64个独立概率状态之间的转换过程来执行的。
在每一步计算新范围之前,代表算数编码器当前状态的范围R被量化为一个小范围的预设值,这使得查找表计算新范围成为可能。
为具有近似均匀概率分布的数据符号定义了简化的编码和解码过程。
解码过程的定义被设计为便于算数编码和解码的低复杂度实现。总体而言,与VLC相比,CABAC以更大的计算复杂性为代价,提供了改进的编码效率。