精华内容
下载资源
问答
  • CABAC

    2020-08-13 14:07:47
    CABAC CABAC(上下文自适应的二进制算术编码)基于算术编码,在HEVC中,除了参数集、SEI和slice头部之外,其余的所有数据都使用CABAC来进行熵编码。 1.4.1 原理 主要包括三个步骤: 二进制化; 上下文建模; 二...

    CABAC

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

    1.4.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<cMax ,后缀值S=V-(P<<R)

    后缀值为S的二元化串

    V>=cMax,无后缀码

    定长二进制化

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

    上下文模型

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

     ①在编码过程中,语法元素使用的上下文概率模型都被唯一的上下文索引号r标识,每一个r涉及两个概率模型变量:最大概率符号MPS和概率状态索引。MPS表示待编码的Bin很有可能出现的符号(0或1);与之对应的,待编码的Bin不可能出现的符号即为最小概率符号LPS。
    
     ②在CABAC中,为LPS的概率设置了64个代表值,每一个都与LPS一一对应。
    
     ③编码器会初始化上下文模型的符号变量MPS和δ
    
     ④在获取初始的概率模型变量后,即可对当前符号(或语法元素)进行二元算数编码和概率模型参数更新,实现上下文自适应的编码。
    
     ⑤更新的方法:如果编码的符号等于MPS,那么通过查表更新
    

    = transIdxMps(

    否则,如果

    否则只更新

    = transIdLps(

    附上个人理解
    在这里插入图片描述

    二进制

    • 算术编码

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

     1、常规模式。假设当前编码器的区间长度是R,区间下限是L。
    
          ①计算索引值=(R>>6)&3
    
          ②查表得到LPS对应的子区间=rangeTabLps[][],那么=R-
    
          ③如果当前的二进制符号Bin等于MPS,则作为下一个符号的编码区间R,下限L不变;如果Bin等于LPS,那么作为下一个符号的编码区间R,区间下限L要加上的长度。然后更加当前符号值更新上下文。
    
     2、旁路模式。这种模式无需对概率进行自适应更新,而是采用0和1概率各占0.5的固定概率进行编码。为了是区间划分更加简单,才用了保存编码区间长度不变,使下限L值加倍的方法来实现区间划分。
    
    展开全文
  • Cabac

    千次阅读 2017-08-16 22:50:06
    CABAC Context-based Adaptive Binary Arithmetic Coding 基于自适应二元算术编码 算术编码是一种常用的变字长编码,对出现概率大的符号赋予短码,对概率小的符号赋予长码;它和 Huffman 编码最大的区别在于它不是...

    CABAC
    Context-based Adaptive Binary Arithmetic Coding 基于自适应二元算术编码


    算术编码是一种常用的变字长编码,对出现概率大的符号赋予短码,对概率小的符号赋予长码;它和 Huffman 编码最大的区别在于它不是使用整数码;
    算术编码是把各符号出现的概率表示在单位概率[0,1]区间之中,区间的宽度代表概率值的大小。符号出现的概率越大对应于区间愈宽,可用较短码字表示;符号出现概率越小对应于区间愈窄,需要较长码字表示;


    CABAC分为三个部份,Binarizer,ContextModeler和ArithmeticCodingEngine。
    CABAC的设计概念,对于发生机率>0.5的事件有效地编码,改进了传统霍夫曼编码法需要大量的乘法运算的问题,而在效能与压缩效率上取得相当大的改善空间。
    CABAC的生命周期是slice,CABAC与UVLC最大的不同点在于其编码方式具有适应性(adaptive),对于编码过程中各个符号(symbol)出现的机率会一直动态地去统计并更新。


    CABAC编码之所以能取得很高的压缩比,是因为:a)根据每一个语法元素的上下文来选取预测模型;b)使用本地的统计数据来估计概率;c)使用算术编码而不是变长编码


    编码一个符号需要经过下面几步
    1.CABAC使用的算术编码是基于二进制的算术编码,因此非二进制形式的编码首先要转化为二进制的形式表示
    2.“上下文模型”是指对二值化后的符号中的bit位进行编码时使用的概率模型,一种regular coding mode 另一种为 bypass coding mode.。概率模型与最近编码的符号相关,会有多个概率模型可供选择。对于每个bit,编码器选择一个合适的概率模型,并通过相邻元素的信息来优化这个概率模型
    3.算术编码。算术编码器根据第2步选择的概率模型对每个bit进行编码。需要注意的是每个bit的子范围只有两个数:0和1
    4.更新预测模型。根据实际编码的值来更新所选择的预测模型。例如,如果所编码的二进制bit为1,则预测模型中的1计数要增加。


    CABAC 不支持 Baseline 以及 Extended profiles.
    CABAC论文:http://iphome.hhi.de/marpe/download/cabac_ieee03.pdf


    展开全文
  • 熵编码CABAC

    2016-04-26 15:39:23
    CABAC是H.264/AVC标准中两种熵编码方法中的一种,是将自适应的二进制算术编码与一个设计精良的上下文模型结合起来得到的方法。新一代高效视讯编码HEVC采用CABAC的熵编码。
  • CABAC熵编码

    2014-06-17 20:52:44
    H264中熵编码CABAC经典论文,描述了cabac的Verilog硬件实现架构和方法,很好的文章。
  • CABAC_harware_implementation

    2018-06-07 09:10:04
    cabac 提高了熵编码的效率7%~15%,但是复杂度也有了很大的提高,由于有着天然的很强的数据依赖关系,在做视频编码ip设计与实现时,cabac的速度很容易成为瓶颈,文章给一种多个bin每cycle(3~5)的cabac编码的设计与...
  • 熵编码:CABAC

    万次阅读 2020-02-12 12:38:32
    基于上下文的二进制算术编码(Context-Based Adaptive Binary Arithmetic Coding,CABAC)将自适应二进制算术编码和上下文模型相结合。是H.265/HEVC的主要熵编码方案。 主要包括三个步骤: 二进制化; 上...

    基于上下文的二进制算术编码(Context-Based Adaptive Binary Arithmetic Coding,CABAC)将自适应二进制算术编码和上下文模型相结合。是H.265/HEVC的主要熵编码方案。

    主要包括三个步骤:

    1. 二进制化;

    2. 上下文建模;

    3. 二进制算术编码;

    其流程如下:

     

    二进制化

    二进制化就是将输入的语法元素转化为二进制形式,如果语法元素以及是二进制形式则跳过该步骤。

    H.265/HEVC中的二进制化方法有截断莱斯二元化(Truncated Rice binarization,TR),K阶指数哥伦布二元化(k-th order Exp-Golomb binarization,EGK)和定长二元化(Fixed-length binarization,FL)。K阶指数哥伦布编码前面已经介绍过。下面介绍TR和FL。

    (1)截断莱斯二元化TR

    设阈值为cMax,莱斯参数R,待二元化的语法元素为V。

    截断莱斯码由前缀串和后缀串拼接成,前缀值P由下式计算得到:P = V >> R

    则前缀串获取过程为:若P值小于(cMax >> R),则前缀串由P个1和一个0组成,长度为P+1;若P值大于等于(cMax >> R),则前缀串由(cMax >> R)个1组成,长度为(cMax >> R)。

    当语法元素V小于cMax时,后缀值S为:S = V - (P << R)

    后缀串为S的二元化串,长度为R。当语法元素V大于等于cMax时,无后缀串。

    (2)定长二元化FL

    当语法元素均匀分布时,可采用定长二元化。假设语法元素值为x,且x在[0,Max]间,则直接将x从十进制转为二进制得到二元化串。

    上下文建模

    一般情况下,不同语法元素间有一定相关性,且相同语法元素自身也具有一定记忆性。因此根据已编码元素进行条件编码可以提高编码性能。这些已编码元素就是当前待编码元素的上下文。

    语法元素使用的上下文模型包括两个概率模型变量:最大概率符号MPS和概率状态索引pStateIdx。

    MPS表示待编码的Bin最可能出现的符号,取值为1或0;与之对应,LPS为最小概率符号。在CABAC中,依据先验知识为LPS预设了64个概率值,如下表。

     

    在对第一个二元位编码前需要对概率模型参数进行初始化。在H.265/HEVC中,为每个概率模型分配一个初始值V,通过V计算上下文模型初始变量MPS和pStateIdx。

     

    HM中相关代码如下:

    /**
     - initialize context model with respect to QP and initialization value
     .
     \param  qp         input QP value
     \param  initValue  8 bit initialization value
     */
    Void ContextModel::init( Int qp, Int initValue )
    {
      qp = Clip3(0, 51, qp);
    ​
      Int  slope      = (initValue>>4)*5 - 45;
      Int  offset     = ((initValue&15)<<3)-16;
      Int  initState  =  min( max( 1, ( ( ( slope * qp ) >> 4 ) + offset ) ), 126 );
      UInt mpState    = (initState >= 64 );
        //!<m_ucState最后1位存放MPS值
      m_ucState       = ( (mpState? (initState - 64):(63 - initState)) <<1) + mpState;
    }

    获得上下文模型初始参数后即可对输入二元符号进行二元算术编码和模型参数更新,实现上下文自适应的编码。概率模型在每个二元位编码后都要更新。

    概率状态pStateIdx更新方法为:

    若编码的二元符号值等于MPS,则通过查上面的表更新pStateIdx_new=transIdxMps(pStateIdx)

    若编码的二元符号值等于LPS,如果pStateIdx为0则互换MPS和LPS,更新pStateIdx;否则不互换MPS和LPS,只更新pStateIdx;pStateIdx更新也是通过查表pStateIdx_new=transIdxLps(pStateIdx)

    HM16中相关代码如下:

      Void updateLPS ()
      {
        m_ucState = m_aucNextStateLPS[ m_ucState ];
      }
    ​
      Void updateMPS ()
      {
        m_ucState = m_aucNextStateMPS[ m_ucState ];
      }

    从概率模型更新过程可以看出:若当前编码Bin等于MPS,更新后的概率索引值变大,表示下一个符号是MPS的概率变大;若当前编码Bin等于LPS,更新后的概率索引值变小,表示下一个符号是LPS的概率变大;当概率索引值pStateIdx为0时,表示MPS和LPS的概率相同,若再出现LPS符号则MPS和LPS需要交换。

    二进制算术编码

    二进制算术编码也是算术编码的一种,只不过算术编码过程中的区间和编码输出等都用二进制表示。当前语法元素完成二进制化后,对每个Bin根据其概率模型进行二进制算术编码。二进制算术编码是基于递归区间划分方式,在递归过程中保存编码区间的长度和区间下限。包括两种编码方式:常规编码和旁路编码。常规编码利用自适应的概率模型进行编码。旁路编码以等概率方式进行,概率状态无需更新。

    常规编码

    编码器输入是上下文模型变量和待编码Bin,编码器的状态是当前编码区间长度ivlCurrRange和区间下限ivlLow。

    编码流程如下:

     

    算术编码首先需要估计每个符号概率然后进行区间划分。在CABAC中总是估计LPS的概率(P_lps<0.5),且LPS的概率通过64个离散值表示可以通过查表得到概率索引pStateIdx(见上一节)。

    区间划分通常需要多位乘法运算(区间长度x概率),CABAC为了降低其复杂度通过查表获得区间长度。

    首先计算索引:qRangeIdx=(ivlCurrRange >> 6) & 3

    通过查下表LPS对应的子区间长度为:ivlLpsRange = rangeTabLps[pStateIdx] [qRangeIdx]

    则MPS的子区间长度为:ivlCurrRange = ivlCurrRange - ivlLpsRange

    因为二进制编码只有两个符号0和1,所有区间总是被分为两个子区间,且MPS总是在左侧,LPS总是在右侧。

     

    如果当前Bin等于MPS,则MPS的区间长度R_mps作为下一个符号编码的区间长度R,区间下限L不变;如果当前Bin等于LPS,则LPS的区间长度R_lps作为下一个符号编码的区间长度R,区间下限L变为L+R_mps;编码完一个Bin后根据该Bin值更新上下文模型。

    区间重归一化

    上面区间划分后得到的新区间长度可能不在[256,512]间(HM中区间长度初始化为510),这就需要进行重归一化。

     

     

    当区间长度小于256时就需要进行重归一化。

    设归一化时用区间[0,102)表示[0,1);

    1、当R<256&L<256时,区间落在[0,512)间,即[0,0.5)间(0.5二进制表示为0.1)。此时输出0(PutBit(0)),因为此区间内的数都是0.0x(二进制)。

    2、当R<256&L>=512时,区间落在[512,1024)间,即[0.5,1)间。此时输出1(PutBit(1)),因为此区间内的数都是0.1x(二进制)。

    3、当R<256&L<512时,区间落在[0,512)间或同时跨越[0,512)和[512,1024)。此时既可能是0.01x也可能是0.10x。暂缓输出,保存这个比特进入下一个重归一化循环。

    4、当R>=256时,无法判断编码区间,需要通过输入下一个符号对R和L进行更新后继续判断,因此当前符号编码流程结束。由于这个原因,因此在一个符号编码结束后,另一个符号编码开始前,总是256<=R<512。

    PutBit(B)用来输出编码符号0或1,从重归一化可以看出:

    1、当满足条件1时执行PutBit(0),输出0;

    2、当满足条件2时执行PutBit(1),输出1;

    3、当满足条件3时,输出可能为“10”或者“01”,因此不能直接输出,走bitsOutstanding++的步骤。在下一次编码符号时,符合情况2,走PutBit(1),此时bitsOutstanding = 1,因此输出“10”。符合情况1,走PutBit(0),此时bitsOutstanding = 1,因此输出“01”;

    另外,PutBit(B)不会编码第一个bit。原因是CABAC在初始化的时候,会以[0,1024)表示区间[0,1),而在初始化区间时R=510,L=0,这意味着已经进行了第一次区间选择,区间为[0,0.5),需要输出“0”。PutBit(B)在此阻止这个“0”的输出,这样就能得到正确的算术编码结果了。

    WriteBits( B, N ) 表示将值B以N比特写入码流,然后将码流指针往前移动N个位置。

    旁路编码

    旁路编码不需要对概率模型进行更新,而是采用0和1概率各1/2的方式进行编码。当bypassFlag标志位为1时采用旁路编码。为了使区间划分更加简单,不采用直接对区间长度二等分的方法,而是采用保持编码区间长度不变使区间下限L加倍的方法实现区间划分。随后进行重归一化操作。旁路编码流程如下:

     

    参考

    新一代高效视频编码H.265/HEVC:原理、标准与实现

    ITU-T H.265 (V5)

    https://www.cnblogs.com/TaigaCon/p/5304563.html

    感兴趣的请关注微信公众号Video Coding

     

    展开全文
  • cabac编码

    2015-07-08 16:24:22
    CABAC 是H.264/AVC标准中两种熵编码方法中的一种,是将自适应的二进制算术编码与一个设计精良的上下文模型结合起来得到的方法。它很好地利用了语法元素数值之间的高阶信息,使得熵编码的效率得到了进一步提高。它的...

    CABAC 是H.264/AVC标准中两种熵编码方法中的一种,是将自适应的二进制算术编码与一个设计精良的上下文模型结合起来得到的方法。它很好地利用了语法元素数值之间的高阶信息,使得熵编码的效率得到了进一步提高。它的主要特点有:利用每个语法元素的上下文关系,根据已编码元素为待编码元素选择概率模型,即上 下文建模;根据当前的统计特性自适应地进行概率估计;使用算术编码。

    在CABAC中编码一个单独的句法元素的通用方框图。这个编码过程主要由三个基本步骤组成:

    1、二值化;

    2、上下文建模;

    3、基于表格的二进制算术编码。

     

    在第一步,一个给出的非二进制值的句法元素唯一地对应到一个二进制序列,叫二进制串。当给出一个二进制值的句法元素时,这一初始步骤将被跳过,如图1所示。对于每个元素的二进制串或每个二进制值的句法元素,后面会根据编码模式有一两个子步骤。

    接下来就是对二元数据进行编码,标准中有两种编码模式可供选择。在常规编码模式(regular coding mode)中,一个句法元素的每一个二进值(bin) 按其判决产生的顺序进入上下文模型器,在这里,模型器根据已经编码过的句法元素或二进值为每一个输入的二进值分配一个概率模型,这就是上下文模型化。然后该二进值和分配给它的概率模型一起被送进常规算术编码器进行编码,此外编码器还要根据该二元位的值反馈一个信息给上下文模型器,用以更新上下文模型,这就 是编码中的自适应;另一种模式是旁路编码模式(bypass coding mode),在该模式中,没有模型器为每个二进值分配一个特定的概率模型,输入的二元数据是直接用一个简单的旁路编码器进行编码的,这样做是为了加快整个编码(以及另一端解码)的速度,当然,该模式只用于某些特殊的二进值。

    后面将更加详细地讨论二值化,上下文建模与基于表格的二进制算术编码这三个主要步骤以及它们之间的相互联系。

    2.2二值化

    CABAC的二值化方案有四种基本类型:一元码,截断一元码,k阶指数哥伦布编码,与定长编码。此外,还有基于这些基本类型的联合的二值化方案与基于查表的二值化方案。
    2.2.1 一元码(Unary)

    对于一个非二进制的无符号整数值符号x≥0,在CABAC中的一元码码字由x个“1”位外加一个结尾的“0”位组成。例如,输入的句法元素值为4,其二值化结果为11110。
    2.2.2 截断一元码(Truncated Unary, TU)

    已 知截断值S。对于一个非二进制的无符号整数值符号0≤x<S,使用一元码进行二值化。对于等于一个非二进制的无符号整数值符号x=S,其二值化结果 全部由1组成,长度为S。例如,当截断值S=4时,句法元素值为3的二值化结果为1110,而句法元素值为4的二值化结果为1111。

    2.2.3 k阶指数哥伦布编码(kth order Exp-Golomb, EGk)

    指 数哥伦布编码是由一个前缀和一个后缀的码字连接组成的。EGk码字的前缀部分由l(x)=[log2x(x/2k+1)]的值所对应的一元码组成。EGk 码字的后缀部分可以通过使用长度为k+l(x)位的x+2k(1-2l(x))的二进值来计算。另外,EGk码字也可以通过下面的伪C代码推得。

    while(1)

    {

      if(x>=(1<<k))

    {

    put(1);

    x=x-(1<<k);

    k++;

    }//EGk的一元码前缀

      else

      {

       put(0);//前缀的截止位“0”

       while(k--)

     put((x>>k)&0x01);//EGk的后缀

      }

      break;

    }

    2.2.4 定长编码(Fixed-Length, FL)

    对用到定长编码二进化的句法元素值假设了一个有限的字母表 [0,1,2,…,Cmax],编码的二进制长度为  。其中,二进制1对应其中重要性最低的符号,随着重要性的增加,二进制数也会跟着增加。

    2.2.5  4位FL与截断值为2的TU联合二值化方案

    前缀使用长度为4位(Cmax=15)的定长编码,后缀使用截断值S=2的一元截断码。

    2.2.6  TU与EGk的联合二值化方案(Unary/kth order Exp-Golomb, UEGk)

    前缀使用一元截断码,后缀使用k阶哥伦布编码。对于不同的句法元素值,有不同的截断值与阶数。

    2.2.7 各种句法元素值的二值化

    宏 块跳过标记mb_skip_flag、4*4亮度块的帧内预测模式标记prev_intra4x4_pred_mode_ flag、8*8亮度块的帧内预测模式标记prev_intra8x8_pred_mode_ flag、当前宏块的帧/场模式标记mb_field_decoding_flag、已编码块标记coded_block_flag、重要系数标记 significant_ coeff_flag、最后一个重要系数标记last_significant_coeff_flag、系数符号位标记coeff_sign_ flag、片结束标记end_of_slice_flag、8*8转换系数块标记transform_size_8x8_flag均使用1位的定长编码。

    运动矢量差的绝对值使用截断值为9的UEG3二值化。

    色度帧内预测模式intra_chroma_pred_mode使用截断值为3的TU二值化。

    转换系数的绝对值减1一coeff_abs_level_minus1使用截断值为14的UEG0二值化。

    块 编码模式coded_block_pattern使用4位FL与截断值为2的TU联合二值化方案。该句法元素指定了6个块,其中4个用于亮度,2个用于色度,表示其中是否含有非零系数。coded_block_pattern=coded_block_patternY+16*nc,首先,亮度部分的 coded_block_patternY使用的是4位FL变换,而色度部分nc用的是截止值为2的TU二进制变换。

    宏块类型mb_type与子宏块类型sub_mb_type的二值化通过查表获得,详情参见标准。

    各句法元素的二值化方案可以参见标准中的表9-25。

    2.2.8 联合二值化方案编码实例

    输入的句法元素值为幅度的绝对值abs_level=20。则coeff_abs_level_minus1=19,对此使用截断值S=14,阶数k=0的UEG0二值化方案。

    先编码前缀部分,按照编码规则易得二进制序列为11 1111 1111 1111(14个1)。

    再编码后缀部分,下面分别按照伪C代码与编码规则进行编码:

    1、按照伪C代码进行编码

    x = 19 – S = 5。

    进行第一次循环:5>1(即1<<0),因此put(1), x=5-1=4, k+1=1;

    进行第二次循环:4>2(即1<<1),因此put(1), x=4-2=2, k+1=2;

    进行第三次循环:2<4(即1<<2),因此put(0);

    至此得到EG0的前缀一元码与截断位0。

    进行第一次循环:k-1=1,因为(x>>k)&0x01=(2>>1)&0x01=1,所以put(1);

    进行第二次循环:k-1=0,因为(x>>k)&0x01=(2>>0)&0x01=0,所以put(0);

    至此得到EG0的后缀序列10。

    2、按照编码规则进行编码

    由x=5得l(x)=[log2x(x/2k+1)]=2,对应的一元码110即为EG0前缀。

    又因为x+2k(1-2l(x))=5-3=2=(10)2,其中后缀码字长度为k+l(x)=2,则EG0后缀为10。

    可见,两种方法得到的联合二值化后缀码字相同,均为11010,则最终输出的二进制 

    序列为11 1111 1111 1111 11010。

    2.3上下文建模

    CABAC将片(Slice)作为算术编码的生命期。但对具体句法元素的编码却是发生在宏块级。实际上,在同一个宏块中,不同的句法元素是独立编码。但在不同的宏块中,相邻宏块的句法元素的上下文信息(包括概率状态state与最大概率符号MPS的值)可用于编码当前宏块的同一句法元素。
    2.3.1 上下文的初始化(包括m,n,pre_state,state,mps)

    在开始编码一个新的片时,都会对每个上下文模型指定相应的一对变量(m, n),并根据m, n的值计算出每个上下文模型对应的初始概率状态state与最大概率符号MPS的值。该初始化的过程有以下三个步骤:

    1、计算 pre_state=((m*(QP-12))>>4)+n;//qp由下面的式子产生

    PS:slice_qp_delta 表示用于条带中的所有宏块的的QPy的初始值,该值在宏块层将被mb_qp_delta的值修改,该条带初始QPy量化参数按下面的公式计 算:SliceQPy=26+pic_init_qp_minus26+slice_qp_delta

    slice_qp_delta应该受限,这样SliceQPy的值将在-QpBdOffsetY到+51之间;

    2、 对于P和B帧图像限制pre_state在[0,101]内,对于I帧图像,限制pre_state在[27,74]内,即pre_state= min(101, max(0, pre_state))(对P 和B帧),pre_state=min(74,max(27, pre_state))(对I帧);

    3、将pre_state按以下规则映射到数组{state, MPS}:如果pre_state<=50,{state=50- pre_state, MPS=0},否则{state=pre_state-51, MPS=1}

    对于不同上下文模型的(m, n)分配参看标准。
    2.3.2 上下文模型的分类

    上下文模型大概可以分成4种。

    第一种上下文模型包含当前要编码的句法元素的两个相邻块的已编码句法元素的信息,其中相邻块的具体位置就要看句法元素了,一般是根据左边与上边的相邻块。

    第二种上下文模型只对mb_typesub_mb_type的句法元素有定义。对于这种上下文模型,之前已编码的二进串的值(b0, b1, b2,…, bi-1)是用来为一个索引为i的二进制句法元素值选择模型的。

    第三与第四种上下文模型都是只应用在残差数据上。与其它上下文模型不同,这两种类型都是依赖于不同块种类的上下文范围,如下文所示。

    其中,第三种类型并不依赖于已编码数据,而是待编码数据在扫描路径上的位置。对于第四种类型,首先在前面已编码(已解码)的变换系数幅度中,统计出具有某个特定值的变换系数幅度出现的总次数,然后根据这个数值来为当前变换系数中的二进值确定上下文模型

    除了这些基于条件概率的上下文模型,还有固定的概率模型映射到为那些已在常规模式被编码的所有二进串的,以及先前没有指定范围的的上下文模型可以用到的二进值索引。

    2.3.3 上下文模型的分配与确定

    通常,每个句法元素的上下文模型根据上下文索引偏移量与上下文增量来确定。其中,上下文索引偏移量对于特定类型片中的特定句法元素是唯一确定的,可以在标准中通过查表获得。而上下文增量,则是根据相邻块的编码情况(也就是上下文信息)得出。

    对于不同的句法元素,所需相邻块的信息不同,但一般包括可用性(如当前块在片的边缘上,则相邻快可能由于不是在同一片中而不可用)与同一句法元素的编码值。

    通常用于计算上下文增量的上下文建模函数为ctx_var_spat=cond_term(A,B),A和B表示当前块的相邻块。其中cond_term()表示的是一种函数关系,有以下3种具体情况:

    ctx_var_spat1=cond_term(A) + cond_term(B);

    ctx_var_spat2=cond_term(A) + 2*cond_term(B);

    ctx_var_spat3=cond_term(A)

    另外,对于利用先前bin值(已编码值)的上下文建模函数为ctx_var_bin[k] = cond_term (b1, …, bk-1)

    各句法元素的上下文增量的具体推导过程参见标准。

    2.4二进制算术编码

    算术编码是基于区间划分的,CABAC的算术编码有以下3个明显性质:

    1、概率估计是对小概率符号LPS(Plps<0.5)的概率而言的,是通过基于表格中64个不同概率状态{Pk|0≤k<64}之间的相互转换而实现的。

    2、区间长度R通过一组预先量化的值{Q1,Q2,Q3,Q4}进行量化以计算新的间隔区间。通过储存一个二维表格TabRangeLPS来决定LPS的新的子间隔范围Rlps,表格包含所有64*4预计算值Qi * Pk,通过快速查表这样就可以免除算术编码中的乘法运算了。

    3、对近似均匀分布(Plps=0.5)的句法元素,在编码和译码时选择旁路方式,可以免除上下文建模,提高编码速度。

    2.4.1 概率估计

    在H.264/AVC中的免除乘法的二进制编码基本思想依赖于一个假设:每一个上下文模型估计的概率可以用一个有效的有限的特征值集合来表征。对于CABAC,对LPS有64个特征概率值 。

    伸缩因子 ,N=64

    一方面想要获得快速的自适应 N要小;另一方面,如果想获得更加稳定更加精确的估计,则需要更大的N。注意在MQ编码中,在CABAC方法中,不需要对LPS的概率值进行表格化。在算术编码中,每一个概率仅仅用其相关的索引作为地址。

    这样设计的结果导致,CABAC中的每一个上下文模型可以有两个参数完全决定:LPS概率当前估计值()和MPS的值 (0或者1)。这样,在CABAC的概率估计中有128个不同的状态,每一个状态用一个7位整型数来表达。

    实际上,有一个状态的索引()对应着LPS的最小概率值,但它并没有被纳入CABAC的概率估计和更新的范围,这个值被用作特殊的场合,传达特殊的信息。比如,当解码器检测到当前区间的划分依据是这个概率值时,认为这表示当前流的结束。因此只有126个有效概率状态。另外,有一个状态的索引()对应LPS的最小概率值,它对应的更新值是它自身,当MPS连续出现,LPS的概率持续减小,直到保持不变。

    概率估计指的是上下文的更新,因此只发生在编码不同块中同一句法元素或者其它上下文发生改变的时候,它是通过在LPS的64个概率状态之间互相转移而实现的。

    对于一个给定概率状态,概率的更新取决于状态索引和已经编码的符号值(MPS or LPS)。更新过程导致一个新的概率状态,潜在的LPS概率修正,如果有必要需要修改MPS的值。如果当state=0时,也就是LPS的概率已经达到了最大值0.5,输入的是一个小概率符号LPS,那么MPS和LPS就要互换,因为state=0时,Plps=0.5。

    在I片中,有:

    if(decision==MPS)

    state<-next_state_MPS_intra(state)

    else 

    state<-next_state_LPS(state)

    在其他片中,有:

    if(decision==MPS)

    state<-next_state_MPS (state)

    else              

    state<-next_state_LPS(state)

    2.4.2 算术编码器的总体描述

            CABAC编码器由两个子编码器组成,一个用于常规编码模式,另一个称为旁路编码器用于符号的快速编码。下面对常规编码器具体的编码过程进行描述,编码过程必须与后面介绍的译码过程相匹配(H.264标准文件中给出了译码流程,没给出具体的编码流程,下面给出的是可参考的编码流程,必须与译码流程匹配)

    1、首先是编码器的初始化

    该过程是发生在编码片的第一个宏块之前,在编码I_PCM宏块的数据元素pcm_alignment_zero_bit和所有pcm_byte数据之后的。此过程中,输出的是算术编码器中的相关参数,区间下限codILow设置为0,区间长度codIRange设置为0x01FE,另外的firstBitFlag设置为1,计数器(用于防止相关寄存器溢出)bitsOutstangding和symCnt都被设置为0。

    2、编码决定

    此过程输入的是Binval(语法元素经过二进制化后的值),context_id(上下文模型)和编码器的环境codirange,codilow和symCnt,输出的值是codirange,codilow和symCnt。如图2.2所示。

    该过程可以分为4个步骤

    (1)通过当前编码器区间范围codiRange计算Qi的索引值i,然后利用状态索引(由上下文模型得到)和i进行查表得出Rlps的概率。

    (2)根据要编码的符号是否MPS来更新算术编码中的概率区间下限和概率区间范围。

    (3)上下文模型概率状态的更新(参考前文)

    (4)重整化处理,具体操作在后文给出。 

    3、重整化处理

    在区间划分结束后,如果新的区间范围R不在合法范围[28   29]之内,那么就需要进行重整化操作,输出1位或多位。其中用到的PutBit程序。

    4、旁路编码模式

    首先,概率估计和更新过程的旁路被建立;

    其次间隔细分被执行 

    最后,编码完片内所有宏块的句法元素后,写入end_of_slice_flag的标志,然后进行字节压缩,在编码完一幅图像的所有元素后,所有输出的二进制位都会进行封装,成为适合NAL层的传输单位。


    展开全文
  • CABAC编码

    千次阅读 2014-02-18 15:17:04
    (转载)很久没看264了,前几天突发奇想,想把264的熵编码方式改成全精细渐进模式。虽然我知道有分级编码中也有了精细分级方式...较常规的CABAC方式,精细分级方式肯定会出现一定的性能下降,所以需要先看看CABAC利用了
  • CABAC算法解析

    2019-07-17 11:39:31
    CABAC CABAC 全称 Content-based Adaptive Binary coding 包含三部分 二进制化 上下文模型选择 算术编码并更新模型 1. 二进制化 是什么? 将一个非二进制语法元素映射成一个二进制序列 例如 10 —》0000 ...
  • CABAC编码解析

    万次阅读 2017-04-26 20:42:28
    CABAC(Context-based Adaptive Binary Arithmetic Coding),基于上下文的自适应二进制算术编码。CABAC是H.264/AVC标准中两种熵编码中的一种,它的编码核心算法就是算术编码(Arithmetic Coding)。   算术...
  • CABAC基础四-CABAC熵解码算法FFmpeg实现

    千次阅读 2016-11-06 13:37:41
    1. CABAC熵解码算法FFmpeg实现 本章主要讲解FFmpeg中对CABAC熵解码算法的实现和优化思路。由于算术编码算术在H264和H265中没有发生变化,所以FFmpeg中H265的熵解码仍然采用了H264中的实现方式,所以,在H265的CABAC...
  • HEVC Cabac解码

    千次阅读 2018-11-22 02:38:24
    Cabac解码说明 解码slice segment data过程中,每碰到1个syntax element需要解析时,需参考Table 9-48等表格组合解析,整理整个流程解码如下: 9.3.4.2 ctxTable, ctxIdx, bypassFlag解析过程 9.3.4.2.1 此过程的...
  • 基于上下文自适应二进制算术编码(CABAC)是HEVC中采用的一种高效熵编码,具有很高的压缩比,但实现结构复杂,且很难并行化。本文设计了一个高性能的CABAC解码器,并对单周期解码1bit的硬件结构进行了优化,同时采用...
  • HEVC中的CABAC

    千次阅读 2017-05-07 22:31:16
    HEVC中的CABAC  CABAC(上下文自适应的二进制算术编码)基于算术编码,在HEVC中,除了参数集、SEI和slice头部之外,其余的所有数据都使用CABAC来进行熵编码。  CABAC有三个步骤:  1、初始化,构建上下文概率...
  • Hevc cabac

    2020-12-25 20:44:45
    <div><p>该提问来源于开源项目:OpenHEVC/openHEVC</p></div>
  • 熵编码之CABAC

    千次阅读 2017-10-12 17:27:47
    CABAC(Context-based Adaptive Binary Arithmetic Coding),基于上下文的自适应二进制算术编码。CABAC是H.264/AVC标准中两种熵编码中的一种,它的编码核心算法就是算术编码(Arithmetic Coding)。   算术编码 ...
  • CAVLC和CABAC简介

    2019-03-10 20:30:59
    CABAC/CAVLCin H.264 什么是熵编码? 熵编码压缩是一种无损压缩,其实现原理是使用新的编码来表示输入的数据,从而达到压缩的效果。常用的熵编码有游程编码,哈夫曼编码和CAVLC编码等。 CAVLC CAVLC(Context ...
  • 关于CABAC的解析

    千次阅读 2017-05-11 15:56:23
    这是一篇论文:Context-based adaptive binary arithmetic coding in the H.264/AVC video compression standard ...除此之外,CABAC还包括一种低复杂度算法,可以较好地适应低功耗的软硬件实现方案
  • CABAC

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 519
精华内容 207
关键字:

cabac