在H.264的標準協議中,不一樣的語法元素指定了不一樣的熵編碼方法。在協議文檔中共指定了10種語法元素的描述符,這些描述符表達了碼流解析爲語法元素值的方法,其中包含了H.264標準所支持的全部熵編碼方法:學習
語法元素描述符 | 編碼方法 |
---|---|
b(8) | 8位二進制比特位串,用於描述rbsp_byte() |
f(n) | n位固定模式比特位串,從最左bit開始計算 |
u(n) | 使用n位無符號整數表示,由n位bit換算獲得 |
i(n) | 使用n位有符號整數表示,由n位bit換算獲得 |
ue(v) | 使用無符號指數哥倫布編碼 |
se(v) | 使用有符號指數哥倫布編碼 |
te(v) | 使用截斷指數哥倫布編碼 |
me(v) | 使用映射指數哥倫布編碼 |
ce(v) | 上下文自適應的變長編碼(CAVLC) |
ae(v) | 上下文自適應的二進制算術編碼(CABAC) |
同以前介紹的哈夫曼編碼同樣,指數哥倫布編碼一樣屬於變長編碼(VLC)的一種編碼
兩者顯著區別:spa
經常使用的指數哥倫布編碼一般能夠分爲四類:code
語法元素描述符 | 編碼方法 |
---|---|
ue(v) | 使用無符號指數哥倫布編碼 |
se(v) | 使用有符號指數哥倫布編碼 |
te(v) | 使用截斷指數哥倫布編碼 |
me(v) | 使用映射指數哥倫布編碼 |
其中無符號指數哥倫布編碼ue(v)是其餘編碼方式的基礎,其他幾種方法基本能夠由ue(v)推導得出。視頻
ue(v)的碼字能夠分爲三個部分: [prefix] 1 [surfix] 其中前綴碼爲n個bit長度的0,後綴碼爲表示實際數值的信息位,信息位的長度等於前綴碼中0的個數。 指數哥倫布編碼中前綴和後綴部分的長度根據碼元數值來肯定:文檔
0階指數哥倫布編碼模板 | 適用碼元值 |
---|---|
1 | 0 |
0 1 x | 1, 2 |
0 0 1 x x | 3~6 |
0 0 0 1 x x x | 7~14 |
0 0 0 0 1 x x x x | 15~30 |
0 0 0 0 0 1 x x x x x | 31~62 |
…… | …… |
編碼模板的後綴部分,xx以二進制的形式表示解碼後的數值 前綴0的長度以LeadingZeroBits表示,那麼解碼後數值爲:$codeNum = 2^{LeadingZeroBits} - 1 + (xxx)$。(xxx)爲二進制數值xxx的10進製表示。舉例以下:it
指數哥倫布編碼碼字 | 碼元數值 |
---|---|
1 | 0 |
0 1 0 | 1 |
0 0 1 0 1 | 4 |
0 0 0 1 0 0 0 | 7 |
編解碼過程:table
「有符號的指數哥倫布編碼值」是經過「無符號的指數哥倫布編碼的值」經過換算獲得的 其換算關係爲:$n = (-1)^{(k+1)} \times Ceil(k / 2)$ 就是說:先按無符號方式解碼,獲得的十進制數字兩個一組,絕對值相同,第一個是正的,第二個是負的。模板
下表爲有符號和無符號指數哥倫布編碼之間的換算關係:基礎
指數哥倫布編碼碼字 | 無符號解碼結果 | 有符號解碼結果 |
---|---|---|
1 | 0 | 0 |
0 1 0 | 1 | 1 |
0 1 1 | 2 | -1 |
0 0 1 0 0 | 3 | 2 |
0 0 1 0 1 | 4 | -2 |
k | $(-1)^{(k+1)} \times Ceil(k / 2)$ |
解碼時,首先須要判斷的是語法元素的取值範圍,假定爲$[0, x], x≥1$。根據x的取值狀況,語法元素根據下面不一樣狀況進行解析:
適用於預測模式爲Intra_4x4, Intra_8x8或Inter的宏塊的coded_block_pattern的編碼。me(v)的映射方式並沒有指定的換算公式,一般由查表的方式進行。
可是,實際上對於視頻壓縮而言,相似於哈夫曼編碼所提供的壓縮比率的優點遠遠不夠,並且還需額外碼錶。所以在實際的視頻編碼方法中使用的是指數哥倫布編碼,可是因爲壓縮率低,只做爲少數的輔助語法元素的編碼以及多數語法元素的二值化方法。
真正貢獻了高壓縮比的爲CAVLC和CABAC編碼等,將在後續學習筆記中進行介紹。