【H.264/AVC 句法和語(yǔ)義】Exp-Golomb指數(shù)哥倫布編碼

轉(zhuǎn)載自:http://www.reibang.com/p/f4f3b0764cec
上篇我們說(shuō)過(guò)漾稀,學(xué)習(xí)描述子是解析h264句法元素的第一步。而在描述子中腾节,除了順序讀取若干比特的b(8)、f(n)荤牍、i(n)案腺、u(n),指數(shù)哥倫布編碼也是使用頻率很高的編解碼方法康吵。

因?yàn)橹笖?shù)哥倫布編碼(Exponential-Golomb)屬于熵編碼(Entropy encoding)劈榨,所以我們先大致介紹一下熵編碼,然后再進(jìn)行細(xì)化晦嵌。

1 熵編碼(Entropy encoding)

熵(shang)編碼屬于無(wú)損編碼同辣,它聽(tīng)著很高大上,其實(shí)簡(jiǎn)單來(lái)說(shuō)惭载,就是代表了一類(lèi)編碼方法旱函。熵編碼包括的編碼方法有:香農(nóng)-范諾編碼、霍夫曼編碼描滔、算術(shù)編碼棒妨、指數(shù)哥倫布編碼、CAVLC含长、CABAC等券腔,這一類(lèi)編碼方法的宗旨伏穆,就是找到一種編碼,使得碼字的平均碼長(zhǎng)達(dá)到熵極限纷纫。

具體實(shí)施起來(lái)就是枕扫,對(duì)出現(xiàn)概率較大的符號(hào),取較短的碼長(zhǎng)辱魁,而對(duì)出現(xiàn)概率較小的符號(hào)取較大的碼長(zhǎng)铡原。這就是熵編碼的中心思想,只要我們記住這一點(diǎn)商叹,即使不了解“熵”是指啥燕刻,也能掌握上述幾種熵編碼。

不過(guò)我們還是簡(jiǎn)單介紹一下剖笙,“熵”是指啥卵洗?

1.1 熵

熵在熱力學(xué)中,是表示分子狀態(tài)混亂程度的物理量弥咪,這時(shí)的熵稱(chēng)為熱熵过蹂。后來(lái)信息論之父香農(nóng)(C. E. Shannon)把“熵”這一詞引入到信息論中,稱(chēng)為“信息熵”聚至,信息越是隨機(jī)酷勺,它的熵值越高。信息熵也是我們?cè)趆264這樣的數(shù)字圖像編碼中使用的概念扳躬。因?yàn)槲覀兇幋a的圖像像素信息脆诉、碼流的各個(gè)句法元素值,其實(shí)都屬于信息贷币。

而信息熵击胜,就是為了解決信息的量化度量問(wèn)題,它描述了整個(gè)信源的平均信息量役纹。信息熵在我們的熵編碼中偶摔,表示了信源無(wú)損編碼后平均碼長(zhǎng)的下限。所以我們上面才說(shuō)促脉,熵編碼就是為了使編碼后辰斋,碼字的平均碼長(zhǎng)盡量達(dá)到熵極限。而且平均碼長(zhǎng)越接近熵瘸味,說(shuō)明熵編碼的壓縮效率越高宫仗。

1.2 熵和熵編碼

如果第一次接觸熵,確實(shí)不好理解硫戈。因?yàn)樗粌H涉及到信息學(xué)的知識(shí)锰什,還有概率論的知識(shí)。不過(guò)雖然熵不好理解,但是熵編碼很好掌握汁胆。熵其實(shí)就相當(dāng)于內(nèi)功梭姓,而熵編碼是招式。待我們學(xué)過(guò)熵編碼嫩码,再來(lái)理解熵誉尖,就容易多了。

1.3 熵編碼分類(lèi)

為了便于理解铸题,上述說(shuō)的多個(gè)熵編碼方法铡恕,還可以分為以下兩類(lèi):

(1)變長(zhǎng)編碼:香農(nóng)范諾編碼、霍夫曼編碼丢间、指數(shù)哥倫布編碼探熔、CAVLC

(2)算術(shù)編碼、CABAC等算術(shù)編碼

而且這些熵編碼方法中烘挫,在H.264中應(yīng)用的有:指數(shù)哥倫布編碼诀艰、CAVLC、算術(shù)編碼饮六、CABAC其垄。

2 指數(shù)哥倫布編碼(編碼過(guò)程)

指數(shù)哥倫布編碼是一種較簡(jiǎn)單的編碼方法,正常來(lái)說(shuō)卤橄,它可以拓展至K階绿满,也即K階指數(shù)哥倫布編碼。而在H.264中使用的窟扑,是0階指數(shù)哥倫布編碼喇颁,也即K等于0。下面我們就重點(diǎn)介紹0階指數(shù)哥倫布編碼辜膝,理解了0階无牵,K階自然而然就懂了。

值得注意的是厂抖,在H.264中,0階指數(shù)哥倫布編碼克懊,對(duì)應(yīng)的描述子是ue(v)忱辅。只不過(guò)ue(v)代表的是解碼過(guò)程,而我們下面先從編碼開(kāi)始谭溉。

2.1 0階指數(shù)哥倫布編碼

這個(gè)編碼過(guò)程如下圖所示:

image

0階指數(shù)哥倫布編碼過(guò)程

圖中應(yīng)該寫(xiě)的很清楚墙懂,我們以待編碼碼號(hào)code_num = 3為例:

第一步:將code_num +1, 即3+1 = 4

第二步:將4寫(xiě)為二進(jìn)制的形式:100

第三步:計(jì)算100的比特個(gè)數(shù)為3,在100前面寫(xiě)(3-1)個(gè)0扮念,得到編碼碼字:00100

并且圖中背景為灰色區(qū)域损搬,表示連續(xù)的碼字長(zhǎng)度一樣,總結(jié)起來(lái)如下:

image

0階碼號(hào)與碼字總結(jié)

可以看到,碼字的結(jié)構(gòu)形式可以表示為巧勤,中間比特為1嵌灰,兩端比特個(gè)數(shù)對(duì)稱(chēng)的平衡結(jié)構(gòu):

[N個(gè)0][1][INFO] 或者 [Prefix 前綴][1][Suffix 后綴]

2.2 K階指數(shù)哥倫布編碼

由上述的0階,我們可以輕松拓展至K階颅悉,還是剛才那個(gè)步驟沽瞭,只不過(guò)將第一步稍微改變一下:

(1)K階的第一步:將code_num 加上2k

(2)將code_num + 2k 寫(xiě)為二進(jìn)制的形式

(3) 計(jì)算二進(jìn)制的比特個(gè)數(shù) M,并在前面加上M-1個(gè)0剩瓶,得到編碼碼字驹溃。

如果要驗(yàn)證一下,則將k=0代入上述步驟延曙,就可以得到0階編碼的碼字豌鹤。比如以K=0、K=1枝缔、K=2或K=3舉例如下:

image

K階指數(shù)哥倫布編碼舉例

表中x即為上述的待編碼碼號(hào)code_num布疙。

3 指數(shù)哥倫布編碼(解碼過(guò)程)

講過(guò)了編碼過(guò)程,我們就從解碼過(guò)程考慮考慮魂仍,這一過(guò)程描述在h264協(xié)議的9.1節(jié)拐辽,這也是我們今天的重點(diǎn)。因?yàn)镠.264中的描述子擦酌,代表了解碼過(guò)程俱诸。所以下面我們就以描述子為主線,依次介紹H.264中的4個(gè)指數(shù)哥倫布編碼描述子:ue(v)赊舶、se(v)睁搭、me(v)、te(v)笼平。

3.1 ue(v)

在h264中园骆,ue(v)就代表了0階指數(shù)哥倫布編碼,通常被稱(chēng)為無(wú)符號(hào)指數(shù)哥倫布編碼寓调。對(duì)比我們上述的0階編碼過(guò)程锌唾,我們可以反過(guò)來(lái)研究研究解碼過(guò)程。如下圖:

image

ue(v)解碼

如圖夺英,如果我們仔細(xì)觀察推理晌涕,就會(huì)發(fā)現(xiàn)碼字和code_num之間,有以下公式:

codeNum = 2leadingzerobits ? 1 + read_bits( leadingZeroBits )

其中l(wèi)eadingZeroBits為中間1前面痛悯,0的個(gè)數(shù)余黎。所以在解碼的時(shí)候,如果遇到描述子為ue(v)载萌,則可以先數(shù)0的個(gè)數(shù)惧财,數(shù)到1為止巡扇,其中0的個(gè)數(shù)即為leadingZeroBits。而公式中的read_bits( leadingZeroBits )垮衷,則為從中間1開(kāi)始厅翔,往后順序數(shù)leadingZeroBits個(gè)比特位。

利用上述公式帘靡,就可以計(jì)算出codeNum的值知给。

所以上表的解碼過(guò)程為:

image

ue(v)解碼過(guò)程

當(dāng)描述子為ue(v)時(shí),codeNum的值即為語(yǔ)法元素的值描姚。

3.2 se(v)

se(v)也稱(chēng)有符號(hào)指數(shù)哥倫布編碼涩赢,所以當(dāng)描述子為se(v)時(shí),它的輸出有可能為負(fù)轩勘。而且當(dāng)描述子為se(v)時(shí)筒扒,它的輸入為上述過(guò)程解析出來(lái)的codeNum。意思是什么呢绊寻?如果遇到se(v)花墩,需要先調(diào)用ue(v),得出codeNum的值澄步。然后調(diào)用se(v)的解析過(guò)程冰蘑,se(v)的輸出即為語(yǔ)法元素的值。

image

se(v)的計(jì)算過(guò)程

如上表所示村缸,表中第一列codeNum為輸入祠肥,第二列為輸出。計(jì)算公式則為:

語(yǔ)法元素值 = (?1)k+1 Ceil( k÷2 )

式中Ceil為向上取整梯皿,k為codeNum的值仇箱,代入即可計(jì)算出語(yǔ)法元素的值。

3.3 me(v)

me(v)也稱(chēng)映射指數(shù)哥倫布編碼东羹,聽(tīng)著很高大上剂桥,其實(shí)就是拿著codeNum的值去查表。而且在H.264中属提,只有語(yǔ)法元素coded_block_pattern的值权逗,是使用me(v)解析的。

而且當(dāng)句法元素ChromaArrayType的值為1或2時(shí)冤议,查表a旬迹。ChromaArrayType的值為0或3時(shí),查表b求类。當(dāng)宏塊預(yù)測(cè)模式為Intra_4x4(幀內(nèi)4x4)、Intra_8x8(幀內(nèi)8x8)或者Inter(幀間編碼)時(shí)屹耐,輸出的coded_block_pattern的值也不同尸疆。

部分a表如下:

image

me(v) 表(a)部分?jǐn)?shù)據(jù)

注意輸入為codeNum椿猎,輸出為coded_block_pattern的值。

3.4 te(v)

te(v)也稱(chēng)截?cái)啵ㄉ嵛唬┲笖?shù)哥倫布編碼寿弱,之所以這么說(shuō)呢犯眠,是因?yàn)樗木幋a分為兩段。在H.264協(xié)議中症革,只有7.3.5.1節(jié)的宏塊預(yù)測(cè)和7.3.5.2節(jié)的子宏塊預(yù)測(cè)中筐咧,使用這種模式編碼,我們先看看它的編碼過(guò)程噪矛。

3.4.1 te(v)編碼過(guò)程

編碼時(shí):

如果語(yǔ)法元素的值為0量蕊,則編碼為1,如果語(yǔ)法元素值為1艇挨,則編碼為0残炮,此時(shí)占用1個(gè)比特位。

如果語(yǔ)法元素的值大于1缩滨,則使用ue(v)進(jìn)行編碼势就。

3.4.2 te(v)解碼過(guò)程

知道了編碼過(guò)程,解碼過(guò)程就好理解了脉漏。解碼時(shí)苞冯,需要先判斷語(yǔ)法元素值的取值范圍的上限,其中取值范圍為[0侧巨,x]舅锄。

如果上限值x大于1,那么te(v)的輸出刃泡,也即語(yǔ)法元素的值巧娱,和ue(v)的輸出相同。

否則上限值x等于1烘贴,那么te(v)的輸出禁添,也即語(yǔ)法元素的值,等于讀入下一位比特值的取反桨踪,也即:

b = read_bits( 1 )

codeNum = !b

其中codeNum為te(v)輸出值老翘,也即語(yǔ)法元素值。

4 總結(jié)

其實(shí)由上面的分析锻离,就可以看出铺峭,指數(shù)哥倫布編碼的壓縮率其實(shí)是比較低的,有時(shí)候甚至沒(méi)有壓縮效果汽纠。所以指數(shù)哥倫布編碼在H.264中卫键,主要應(yīng)用在部分語(yǔ)法元素的編解碼和二值化(將語(yǔ)法元素的值轉(zhuǎn)為二進(jìn)制),而在h264中壓縮比比較高的熵編碼方法虱朵,是還未介紹的CAVLC和CABAC莉炉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钓账,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子絮宁,更是在濱河造成了極大的恐慌梆暮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绍昂,死亡現(xiàn)場(chǎng)離奇詭異啦粹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)窘游,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)唠椭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人张峰,你說(shuō)我怎么就攤上這事泪蔫。” “怎么了喘批?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵撩荣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我饶深,道長(zhǎng)餐曹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任敌厘,我火速辦了婚禮台猴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俱两。我一直安慰自己饱狂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布宪彩。 她就那樣靜靜地躺著休讳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尿孔。 梳的紋絲不亂的頭發(fā)上俊柔,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音活合,去河邊找鬼雏婶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛白指,可吹牛的內(nèi)容都是我干的留晚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼告嘲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼倔丈!你這毒婦竟也來(lái)了憨闰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤需五,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后轧坎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宏邮,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年缸血,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜜氨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捎泻,死狀恐怖飒炎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笆豁,我是刑警寧澤郎汪,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站闯狱,受9級(jí)特大地震影響煞赢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哄孤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一照筑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘦陈,春花似錦凝危、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至咏花,卻和暖如春趴生,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昏翰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工苍匆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棚菊。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓浸踩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親统求。 傳聞我的和親對(duì)象是個(gè)殘疾皇子检碗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容