1. 程式人生 > >H.264---CABAC---第一部分---上下文變數的初始化

H.264---CABAC---第一部分---上下文變數的初始化

 

 

初始化執行於slice開始之前,另外如果在編碼過程中某個巨集塊是PCM巨集塊(編碼器直接傳輸影象的畫素值,而不經過預測和變換),那麼在PCM巨集塊之後,編碼下一個巨集塊之前也需要進行初始化。

初始化主要工作就是確定所有上下文的初始MPS以及初始狀態pStateIdx。求解方法如下

1 2 3 4 5 6 7 8 9 preCtxState = Clip3( 1, 126, ( ( m ∗ Clip3( 0, 51, SliceQPY ) ) >> 4 ) + n )   if ( preCtxState <= 63 ) {      pStateIdx = 63 − preCtxState     
valMPS = 0                           ( 9-5) } else  {      pStateIdx = preCtxState − 64
     valMPS = 1 }

 

上面的計算依賴於SliceQPY,m,n三個變數,其中不同的上下文索引(contex Index)對應不同的m、n,具體的m、n的取值請參考標準9.3.1中的各個表格。上下文索引是基於語法元素以及二值化後的二進位制串的索引binIdx,我們將在下一小節進行闡述。

在CABAC的初始化過程的結果會得到所有上下文索引對應的MPS與pStateIdx的初始值。如果確定了MPS為“0”,那麼LPS為“1”,反之如果MPS為“1”,那麼LPS為“0”。狀態pStateIdx是什麼呢?

狀態pStateIdx是LPS出現的概率pLPS的索引。算術編碼中最重要的要素就是符號的概率,CABAC是自適應的算術編碼,也就是說符號的概率會隨著符號的輸入而改變,這種變化就是一種狀態機,如果輸入的是LPS的話,狀態(概率)會怎樣變化,如果輸入的是MPS的話,狀態(概率)又會怎麼變化。CABAC的狀態機轉換的規則由HOWARD與VITTER的"exponential aging"模型借鑑而來,轉換規則如下

 

在CABAC中規定了LPS的概率取值範圍是pLPS[0.01875,0.5],由於LPS是小概率符號,因此它的概率肯定是小於0.5的,如果某個小概率符號在狀態轉換的過程中超出了0.5,此時我們就需要把MPS與LPS進行交換。

CABAC的狀態機中共有64個狀態,pStateIdx = 0,1,2,…,63,分別代表64個不同的概率,除了pStateIdx = 63外,其他的63個狀態都滿足上述狀態轉換規則,其中

 

結合上述狀態機的轉換規則,我們可以得到狀態轉換引數

 

 

CABAC狀態機的狀態轉換如下圖(黑色實線代表輸入的是MPS,紅色虛線代表輸入的是LPS),具體的pStateIdx變換請參考標準的表9-45

stateMachine2