CABAC

CABAC

   CABAC(上下文自适应的二进制算术编码)基于算术编码,在HEVC中,除了参数集、SEI和slice头部之外,其余的所有数据都使用CABAC来进行熵编码。

1.4.1 原理

主要包括三个步骤:

二进制化;

上下文建模;

二进制算术编码;

其流程如下:

CABAC_第1张图片

二进制化就是将一个给定的非二进制元映射成一个二进制序列。

二元算术编码有常规编码模式和旁路编码模式两种。

常规编码模式(Regular Coding  Mode):语法元素的二元位(Bin)顺序进入上下文模型器。编码器根据之前编码过的值为 每一个输入的二元位分配合适的概率模型,这个过程叫做”上下文建模“,再将Bin和分配给它的概率模型一起送到二元算术编码器进行编码;编码器根据Bin值更新上下文模型,这个叫”编码中的自适应“

  旁路编码模式(Bypass Coding Mode):输入的Bin直接用一个旁路编码器进行编码即可。

上下文建模:

条件熵理论下,作为条件的已编码符号信息称为上下文——应用要有针对性

高概率发生的对编码性能影响起主导作用的事件,建立精致的上下文模型,增加上下文概率的阶数以达到精细的条件估计

低概率发生的对编码性能影响不大的事件,建立简单的上下文模型

1.4.2 HEVC中的CABAC

二进制化:

理论上,HEVC的二进制方法有:

1、一元码 

2、截断一元码 

3、K阶指数哥伦布二元化(EGK)

4、截断莱斯二元化(TR)

5、定长二元化(FL)

一元码

假设语法的元素值是x,那么它对应的一元码由前缀x个1和后缀一个0构成:11...10。假设x=5,那么它的一元码是111110

截断一元码

1、把语法元素之转换成一元码,假如语法元素值是x,那么它的一元码由起始的x个1和最后一个0组成。

2、给定一个最大的可能值cMax,bins的长度不能超过cMax,如果超过,那么就对bins的尾部进行截断

例如,给定一个语法元素的值是5,cMax是4

    (1)5对应的一元码是111110

    (2)由于一元码的长度大于cMax,因此需要对它进行截断

    (3)截断之后为1111,因此5对应的截断一元码是1111(当cMax等于4时)

截断莱斯二进制化(TR)——前缀+后缀

cMax——门限值

R——莱斯参数

V——语法元素值

前缀:

P=V>>R

P小于值(cMax>>R),前缀P个1和一个0组成

P大于值(cMax>>R),前缀(cMax>>R)个1组成

V

后缀值为S的二元化串

V>=cMax,无后缀码

定长二进制化

语法元素的值为x,且0<=x<=Max,十进制转换为二进制即可。

上下文模型

一般情况下,不同的语法元素之间并不是完全独立的,因此可以根据已经编码的语法元素进行条件编码,这就是所谓的上下文。这些上下文信息通常做成表格。

 ①在编码过程中,语法元素使用的上下文概率模型都被唯一的上下文索引号r标识,每一个r涉及两个概率模型变量:最大概率符号MPS和概率状态索引。MPS表示待编码的Bin很有可能出现的符号(0或1);与之对应的,待编码的Bin不可能出现的符号即为最小概率符号LPS。

 ②在CABAC中,为LPS的概率设置了64个代表值,每一个都与LPS一一对应。

 ③编码器会初始化上下文模型的符号变量MPS和δ

 ④在获取初始的概率模型变量后,即可对当前符号(或语法元素)进行二元算数编码和概率模型参数更新,实现上下文自适应的编码。

 ⑤更新的方法:如果编码的符号等于MPS,那么通过查表更新

= transIdxMps(

否则,如果

否则只更新

= transIdLps(

附上个人理解
CABAC_第2张图片

二进制

  • 算术编码

有两种模式:常规模式,旁路模式。

 1、常规模式。假设当前编码器的区间长度是R,区间下限是L。

      ①计算索引值=(R>>6)&3

      ②查表得到LPS对应的子区间=rangeTabLps[][],那么=R-

      ③如果当前的二进制符号Bin等于MPS,则作为下一个符号的编码区间R,下限L不变;如果Bin等于LPS,那么作为下一个符号的编码区间R,区间下限L要加上的长度。然后更加当前符号值更新上下文。

 2、旁路模式。这种模式无需对概率进行自适应更新,而是采用0和1概率各占0.5的固定概率进行编码。为了是区间划分更加简单,才用了保存编码区间长度不变,使下限L值加倍的方法来实现区间划分。

你可能感兴趣的:(CABAC)