1. 程式人生 > >H.264---CABAC---第三步----確定上下文索引

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就代表了不同的殘差塊型別的索引偏移,具體偏移值可以檢視標準中的相關表格。