一 Cabac
基于上下文的自适应二进制算数编码CABAC,是一种自适应的二进制算数编码与一个设计精良的上下文模型结合起来得到的方法。它很好的利用了语法元素数值之间的高阶信息,使编码效率得到了进一步提高,在编码中,每一个符号的编码都与以前编码的结果有关,根据符号流的统计特习惯来自适应的为每一个符号分配码字,CABAC允许非整数的码字位数分配的各个符号,尤其适合于出现概率较大的符号。
二 Cabac原理
Cabac采用了高效的算术编码思想,同时充分考虑了视频流相关统计特性,大大提高了编码效率,它的编码过程主要包括3个基本步骤。
(1)二进制化
(2)上下文建模
(3)二进制算数编码,如图8.2 所示。
二进制化是将一个给定的非二进制语法元映射成一个二进制序列,即一个二元流,若输入的语法元素就是一个二进制的语法元素,则二进制化的处理被省略掉,数据通过一条旁路直接送往下一步。即对二元数据进行编码。二元算术编码有常规编码模式和旁路编码模式两种以供选择。在常规编码模式Regular Coding Mode中,语法元素的二元位Bin顺序地进入上下文模型器。编码器根据先前编码过的语法元素或者二元位的值,为每一个输入的二元位分配合适的概率模型,该过程即为上下文建模。将该Bin和分配给它的概率模型一起送进二元算术编码器进行编码。此外编码器还需要根据Bin值更新上下文模型,这就是编码中的自适应。另一种模式是旁路编码模式(Bypass Coding Mode),它无须为每个二元位分配特定特定的概率模型,输入的bin直接用一个简单的旁路编码器进行编码,以加快整个编码以及解码的速度。
输入语法元素-->非二进制语法元素-->二进制化
输入语法元素-->二进制语法元素
二进制值 -->旁路编码器 --> 输出码流
二进制值 --> 上下文建模 -->规则编码器 -->输出码流
根据二进制值更新上下文模型
二进制值上下文模型。
1 二进制化
所有的二元算术编码技术都面临一个问题,那就是怎样在众多的可用二元方式中进行选择,如可以利用霍夫曼编码来实现二元化方法在效率上的最优化,霍夫曼编码为每个字符分配唯一的二元字符串,这与二元化的最终结果的表现形式是一样的,而且霍夫曼编码方法对多元字符生成的平均码长长最短。
霍夫曼二元化虽然能够达到高的效率,但实际应用中还存在着问题,霍夫曼编码的码字结构一般都不规则,这就需要对码表进行存储并且在二元算术解码 过程中不断进行查表运算,这都会在一定程度上引入实现上的复杂度,另外,码字结构的不规则一般会导致其所对应的二元概率模型的存储排布不规则,这就会使得二元概率模型的选择变得复杂,因此在实际的二元化方法设计过程中,一般采用码字结构比较简单的二元化的方法,例如一元码,定长码和指数哥伦布码等二元化方法。
2 上下文建模
一般情况下,不同的语法元素之间并不是完全独立的,且相同语法元素自身也具有一定的记忆性,因此,根据条件熵理论,利用其他已经编码的语法元素进行条件编码,相对于独立编码或者无记忆编码能够进一步提高编码性能,这些用来作为条件的已经编码符号信息称为上下文,如图8.3所示,C为当前待编码块
D | B | E | |
A | C |
A、B、C、D和E中的已经编码符号信息,均可以作为编码块C中符号的上下文,具体比如,对于编码C是否为跳过模式的符号skip_flagC,skip_flagA,skip_flagB,skip_flagD和skip_flagE中任何组合取值都可以作为编码skip_flagc时的上下文。
从理论来说,条件越多得到的条件熵就越小,因此提高上下文阶数就能获得更好的编码性能,但是随着上下文模型阶数的增加,对概率模型存储和更新的复杂度也会以惊人的速度增加,若减小概率模型的数目,会使得编码器不能对概率做出准确的估计,引起编码性能下降。因此在进行上下文模型设计时,既要考虑如何充分的利用上下文模型来提高熵编码效率,又要考虑引入上下文模型所增加的概率模型实现复杂度。
同时为了利用有限的概率模型资源实现尽可能高的编码性能,上下文模型的应用就要有所针对性,具体表现就是,对于那些高概率发生的对编码性能的影响起主导作用的事件,建立精致的上下文模型,可以增加上下文模型的阶数以达到更为精细的条件估计,而对于低概率发生的对编码性能影响不大的事件,可以建立比较简单的上下文模型,甚至可以存在不同的上下文模型,或者视其为等概率事件进行编码。