CABAC總結與補充討論


在之前的一篇文章CABAC中我們已經對算法中的大部分細節部分做了詳細分析,這里做一個總結與拾遺。

 

總結

CABAC的編碼可以分為以下四個部分:

  • 上下文變量的初始化
  • 待編碼語法元素二值化
  • 上下文建模(確定上下文索引)
  • 算術編碼

本文的主要目的就是闡明CABAC是如何把這四個部分串聯起來的。

 

在編碼一個slice的slice data之前,需要根據該slice的sliceQP對上下文變量進行初始化。

CABAC編碼的是語法元素中slice data部分,也就是一個碼流中的主體部分。在h.264語法結構當中,我們已得知一個slice是由slice頭部、數據、尾部組成的。那么在進行CABAC編碼時,slice data中的所有語法元素全部都會被進行二值化處理,得到二進制串,這些二進制串就是進行二進制算術編碼的原料。

image

 

二進制算術編碼會對該slice data中的所有語法元素的二進制串的每一個bit進行編碼,按照算術編碼的原理,編碼得到的結果是一個小數,而該小數就代表了碼流中的slice data的數據。

image

由於CABAC是自適應編碼,也就是概率會隨着0、1的出現而調整。具體來說,語法元素在二值化轉換成二進制串后,一個位置的bit為0或者1將會影響之后該位置出現的0、1的概率。

cabac_summary

 

如上圖,第一個prev_intra4x4_pred_mode_flag的bit為1,這將影響ctxIdx=68的上下文(概率),在編碼下一個prev_intra4x4_pred_mode_flag時的將會采用已被改變的ctxIdx=68的上下文;rem_intra4x4_pred_mode的三個bit共用一個ctxIdx=69的上下文,這表明在該語法元素的第一個bit將會影響其后面的bit的概率。

 

 

CABAC的算術編碼補充討論

重歸一化

我們在之前的文章中討論過CABAC在算術編碼一個符號之后是如何輸出其編碼結果的,如下圖。

image

 

這張圖能很好地概括重歸一化流程,不過僅僅執行重歸一化流程並不能得到算術編碼的結果。以上述的0.0x為例,算術編碼的結果應該是得到一個位於區間R內的小數,而上述流程僅會輸出”.0”,這顯然還不是最終結果。

如果把最終結果的小數分為已確定部分未確定部分,那么重歸一化之后輸出的就是已確定部分。舉個例子來說就是:如果確定了R處於區間[0.010,0.011),那么0.01就是已確定部分,后來輸入的符號無法修改到這部分。隨着編碼更多的符號,輸出的bit會增多,也就是已確定部分會越來越多,越來越接近算術編碼的最終結果。那么在編碼完最后一個符號之后,執行重歸一化,剩下的未確定部分該怎么確定?

image

 

EncodeFlush

剩下的未確定部分由EncodeFlush來確定。EncodeFlush有如下流程:

image

 

當編碼mb_type的binIdx=1的bin或者end_of_slice_flag時ctxIdx = 276,此時會調用EncodeTerminate。如果mb_type的binIdx=1的bin為1,表明此時mb_type=I_PCM;如果end_of_slice_flag=1,表明此時處於slice的末尾。這兩種情況下會進入Yes分支,並且進入EncodeFlush。

首先更新L:

$L = L + R$

此時$R=2$,只有$L$或者$L+1$是在區間$R$之內,也就是說只要把這兩個值的其中一個寫入碼流內即可得到最終結果。最終的這次編碼需要輸出十個bit。

image

 

不過我們按照標准中的流程來分析,在選取$R=2$以及更新$L$后,執行了重歸一化。重歸一化使得$R = R<<7 = 2^8$。按照重歸一化的流程,每次對$R$進行左移都會確定一個bit的輸出,$R$左移了7次,因此輸出了7個bit,剩下3個bit。

image

 

隨着$R$的左移,$L$也左移了7次:$L << 7 $,只是$L$在重歸一化過程中可能會進行$-2^8$或$-2^9$的操作。這意味着在重歸一化之后,$L$肯定落在$2^7$的倍數點上。

image

按照EncodeFlush的流程,剩下的三個bit輸出如上圖。EncodeFlush首先調用PutBit輸出第一個bit,PutBit可以把之前的累積的bitsOutStanding進行輸出。然后調用WriteBits輸出第二、三個bit。WriteBits會把第三個bit固定寫1,在編碼end_of_slice_flag時,該bit會被當作rbsp_stop_one_bit,關於rbsp_stop_one_bit請查看h.264語法結構分析


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM