H.264---CABAC---第三步----确定上下文索引

在前面初始化的时候就出现了上下文这个概念,那么上下文所指的是什么?

以JM中的上下文结构体为例

1
2
3
4
5
6
7
//! struct for context management
struct  bi_context_type  
{
    unsigned long   count; 
    byte state; //uint16 state;         // index into state-table CP
    unsigned char   MPS;           // Least Probable Symbol 0/1 CP 
};

上下文包含两个变量:MPSpStateIdx(count只是用于计数)。在CABAC编码的过程中会碰到需要修改这两个值的情况(如上面的状态变换),这些修改都是以上下文为单位的。

语法元素在经过二值化后形成二进制串,二进制串中不同binIdx位置上的MPS(出现频率高的符号)可能会有所不同,并且概率也可能会不同,因此需要用一个概念来表示特定语法元素的二进制串中特定binIdx的MPS与pStateIdx,上下文就是这样的概念。

在h.264标准中,用一个上下文索引ctxIdx来代表上下文,ctxIdx的取值为0~1023,就是说h.264的上下文一共有1024个。

ctxIdx的计算方式分为两种:

如果语法元素为coded_block_flag、significant_coeff_flag、last_significant_coeff_flag、coeff_abs_level_minus1,即残差系数部分的语法元素,则

ctxIdx = ctxIdxOffset + BlockCatOffset(ctxBlockCat) + ctxIdxInc(ctxBlockCat)

否则

ctxIdx = ctxIdxOffset + ctxIdxInc

其中的变量有

  • ctxIdxOffset  每个语法元素都有一个ctxIdxOffset,甚至一些语法元素在二值化后分为前后缀会,这种语法元素可能会有两个ctxIdxOffset,如下表格部分摘自h.264标准9.3.2的第一个表格
Syntax Element ctxIdxOffset
mb_type 
(SI slices only)
prefix: 0
suffix: 3
mb_type (I slices only) 3
mb_skip_flag 
(P,SP slices only)
11
mb_type 
(P, SP slices only)
prefix: 14
suffix: 17
sub_mb_type[] 
(P, SP slices only)
21
    • ctxIdxInc   在特定的语法元素二值化后,会形成以binIdx为索引的二进制串,尽管是同一个二进制串,但是不同的binIdx上的上下文(MPS,pStateIdx)可能会有所不同,ctxIdxInc就是在这种情况下产生的一个值,它用于划分二进制串上不同的上下文。如下面一项表格摘自h.264标准9.3.3.1的第一个表格
      ctxIdxOffset b0 b1 b2 b3 b4 b5 >=b6
      40 0,1,2 3 4 5 6 6 6
      ctxIdxOffset=40代表mvd的横向分量,上述表格描述了这个语法元素各个binIdx所对应的ctxIdxInc。也就是说mvd横向分量按照binIdx得到的ctxIdx如下表
      binIdx b0 b1 b2 b3 b4 b5 >=b6
      ctxIdx 40,41,42 43 44 45 46 46 46
      像上面表格的这种binIdx=0中出现三个ctxIdx的情况,意思就是会根据编码的具体情况选择0、1或者2作为ctxIdxInc,需要另外分析。ctxIdxInc的确定方法具体请参考标准9.3.3.1小节
    • BlockCatOffset(ctxBlockCat)  其中ctxBlockCat的范围为0~13,分别代表不同残差块类型,如下表
      Block description maxNumCoeff ctxBlockCat
      block of luma DC transform coefficient levels 16 0
      block of luma AC transform coefficient levels 15 1
      block of 16 luma transform coefficient levels 16 2
      block of chroma DC transform coefficient levels when ChromaArrayType is equal to 1 or 2 4*2/4*4 3
      block of chroma AC transform coefficient levels when ChromaArrayType is equal to 1 or 2 15 4
      block of 64 luma transform coefficient levels 64 5
      block of Cb DC transform coefficient levels when ChromaArrayType is equal to 3 16 6
      block of Cb AC transform coefficient levels when ChromaArrayType is equal to 3 15 7
      block of 16 Cb transform coefficient levels when ChromaArrayType is equal to 3 16 8
      block of 64 Cb transform coefficient levels when ChromaArrayType is equal to 3 64 9
      block of Cr DC transform coefficient levels when ChromaArrayType is equal to 3 16 10
      block of Cr AC transform coefficient levels when ChromaArrayType is equal to 3 15 11
      block of 16 Cr transform coefficient levels when ChromaArrayType is equal to 3 16 12
      block of 64 Cr transform coefficient levels when ChromaArrayType is equal to 3 64 13

      在残差系数部分,上下文是会根据不同的残差块类型做出不同选择的,BlockCatOffset就代表了不同的残差块类型的索引偏移,具体偏移值可以查看标准中的相关表格。

猜你喜欢

转载自www.cnblogs.com/qing1991/p/10106286.html
今日推荐