1. 程式人生 > >H.264---指數哥倫布編碼

H.264---指數哥倫布編碼

轉自:http://www.cnblogs.com/DwyaneTalk/p/4035206.html

 

一、哥倫布碼

  哥倫布碼就是將編碼物件分能成等間隔的若干區間(Group),每個Group有一個索引值:Group Id。

  》對於Group Id採用二元碼編碼;

  》對於Group內的編碼物件採用定長碼。

  如下圖:

  

 

  對於編碼物件n:  n = q * m + r = low(n/m) * m + r。其中q = low(n/m),表示取下整,對應是Group Id; 餘數r對應是Group內編碼物件。

  例如:對於m=5的哥倫布編碼如下表

  

二、指數哥倫布碼

  對於哥倫布碼,編碼物件分成等間隔區間。而對於指數,編碼區間長度是按照指數增長的,如下圖:同樣

  》組號採用二元碼編碼

  》組內編碼物件採用定長碼編碼

  

  編碼結果如下:

三、K階指數哥倫布碼

  在H.264中,使用CABAC需要進行二值化處理,而指數哥倫布編碼就是CABAC的一種二值化處理的方法。k階指數哥倫布編解碼具體過程如下:

A、編碼過程:假設待編碼數字為CodeNum(必須非負整數)

  指數哥倫布編碼後的形式為[MZeors][1][Info],MZero表示M個0。

    1、將CodeNum以二進位制形式表示(若不足k位,前面補0),去掉後面k位(若剛好是k位,去掉k位後得0),將結果(數值)加1,得到二進位制數T1;

    2、M為二進位制數T1的二進位制位數減一;

    3、然後將第一步中捨去的k位接到T1結尾,就得到[1][Info]。

  設[Info]的二進位制位數為I,編碼過程也可以如下描述:

    [1 Info] 是CodeNum+2^k的二進位制表示,MZeros中0的個數M = I - k。

    於是就有總的編碼長度CodeLen = M + 1 + I =2M+k+1。 

B、解碼過程:

  1、讀入連續0,連續0的個數就是M;

  2、計算CodeLen = 2M+k+1,得到[1 Info]的位數是 I=CodeLen - M =M+K+1;

  3、讀入I位二進位制碼字,轉換成10進位制,假設為W。由W = CodeNum + 2^k,得CodeNum = W-2^K。

C、示例:

  對於 k =0時:CodeNum=3。編碼如下:

    二進位制表示為11,去掉k=0位後加1得100;

    所以M=2;

    所以編碼後結果為[MZeros][1][Info] = [MZeros][1 Info] = 00100

  解碼如下:

    讀入連續2個0,所以M=2;CodeLen=2M+1+k=5;所以需要再讀入3個碼流100,[1 Info]就是100,轉成十進位制結果W為4,所以CodeNum = W-2^K=4-1=3;

  同樣對於k=0,CodeNum=6時,編碼為:00111;

  同樣對於k=3,CodeNum=3時,編碼為:1011;

  同樣對於k=3,CodeNum=6時,編碼為:1110;

  同樣對於k=3,CodeNum=10時,編碼為:010010;