H.264中的文法元素符

編碼器
解碼器
1. 熵編碼(Entropy encoding)
熵(shang)編碼屬于無損編碼,它聽着很高大上,其實簡單來說,就是代表了一類編碼方法。熵編碼包括的編碼方法有:香農-範諾編碼、哈夫曼編碼、算術編碼、指數哥倫布編碼、CAVLC、CABAC等,這一類編碼方法的宗旨,就是找到一種編碼,使得碼字的平均碼長達到熵極限。
具體實施起來就是,對出現機率較大的符号,取較短的碼長,而對出現機率較小的符号取較大的碼長。這就是熵編碼的中心思想,隻要我們記住這一點,即使不了解“熵”是指啥,也能掌握上述幾種熵編碼。
不過我們還是簡單介紹一下,“熵”是指啥?
1.1 熵
熵在熱力學中,是表示分子狀态混亂程度的實體量,這時的熵稱為熱熵。後來資訊論之父香農(C. E. Shannon)把“熵”這一詞引入到資訊論中,稱為“資訊熵”,資訊越是随機,它的熵值越高。資訊熵也是我們在h264這樣的數字圖像編碼中使用的概念。因為我們待編碼的圖像像素資訊、碼流的各個句法元素值,其實都屬于資訊。
而資訊熵,就是為了解決資訊的量化度量問題,它描述了整個信源的平均資訊量。資訊熵在我們的熵編碼中,表示了信源無損編碼後平均碼長的下限。是以我們上面才說,熵編碼就是為了使編碼後,碼字的平均碼長盡量達到熵極限。而且平均碼長越接近熵,說明熵編碼的壓縮效率越高。
1.2 熵和熵編碼
如果第一次接觸熵,确實不好了解。因為它不僅涉及到資訊學的知識,還有機率論的知識。不過雖然熵不好了解,但是熵編碼很好掌握。熵其實就相當于内功,而熵編碼是招式。待我們學過熵編碼,再來了解熵,就容易多了。
1.3 熵編碼分類
為了便于了解,上述說的多個熵編碼方法,還可以分為以下兩類:
(1)變長編碼:香農範諾編碼、哈夫曼編碼、指數哥倫布編碼、CAVLC
(2)算術編碼、CABAC等算術編碼
而且這些熵編碼方法中,在H.264中應用的有:指數哥倫布編碼、CAVLC、算術編碼、CABAC。
2. 指數哥倫布編碼(編碼過程)
指數哥倫布編碼和哈夫曼編碼一樣,都屬于變長編碼的一種。
二者的顯著差別:
- 信源無關性:哈夫曼編碼依賴于信源的機率分布;指數哥倫布編碼與信源無關。
- 額外資訊:哈夫曼編碼的資料必須額外攜帶關于該信源比對的碼表;指數哥倫布編碼無需攜帶任何額外資訊。
H.264中定義的指數哥倫布編碼共分四類:其中ue(v)是其他變型算法的基礎,其他算法的結果由ue(v)的結果進一步處理得到。![]()
H.264(三)熵編碼和指數哥倫布編碼
ue(v)的碼字分為三個部分:
[prefix] + 1+ [surfix]
其中,[prefix]部分為連續n個0,[surfix]部分為表示實際數值的資訊位,其長度與[prefix]一樣。
[prefix] 和 [surfix]由碼元取值确定。
無符号指數哥倫布編碼:ue(v)編碼方法
計算公式:![]()
H.264(三)熵編碼和指數哥倫布編碼 LeadingZeroBits前面有多少個零。![]()
H.264(三)熵編碼和指數哥倫布編碼 ![]()
H.264(三)熵編碼和指數哥倫布編碼 有符号指數哥倫布編碼:se(v)編碼方法
有符号指數哥倫布編碼通過無符号指數哥倫布編碼換算得到,換算關系為
K = code_num ,ceil():表示向上取整![]()
H.264(三)熵編碼和指數哥倫布編碼 ![]()
H.264(三)熵編碼和指數哥倫布編碼 截斷(舍位)指數哥倫布編碼:te(v)
tel(v):截斷指數哥倫布編碼。解碼時首先判斷文法元素的取值範圍[0, x], x >= 1:
若x > 1,解析方法同ue(v)相同;
若x = 1,文法元素值等同于下一位bit值的取反。
也就是:
- 如果文法元素的值為0,則編碼為1,如果文法元素值為1,則編碼為0,此時占用1個比特位。
- 如果文法元素的值大于1,則使用ue(v)進行編碼。
映射指數哥倫布編碼:me(v)
适用于預測模式為Intra_4x4,Intra_8x8或inter的宏塊的coded_block_pattern
- 無指定的換算公式,通常查表的方式進行。
指數哥倫布編碼與哈夫曼編碼的比較
- 哈夫曼編碼依賴于信源的機率分布特性,不同信源的哈夫曼編碼碼表不同;指數哥倫布編碼對所有信源統一;
- 哈夫曼編碼在解碼前必須額外獲得一份目前信源的碼表;指數哥倫布編碼不需要任何額外資訊;
- 指數哥倫布編碼的壓縮率通常較低,甚至毫無壓縮效果;而在不考慮碼表的情況下,哈夫曼編碼壓縮效率更高。