【H264/AVC 句法和语义详解】(五):Exp-Golomb指数哥伦布编码(理论篇)
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。?? ?https://blog.csdn.net/u011399342/article/details/80472399
本篇隸屬于文集:《H264/AVC 句法和語(yǔ)義詳解》,查看文集全部文章,請(qǐng)點(diǎn)擊文字鏈接。?
想看最新文章,可以直接關(guān)注微信公眾號(hào):金架構(gòu)
上篇我們說(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ò)程如下圖所示:?
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)如下:?
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舉例如下:
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ò)程。如下圖:
?
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ò)程為:
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ǔ)法元素的值。?
?
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表如下:
?
me(v) 表(a)部分?jǐn)?shù)據(jù)
注意輸入為codeNum,輸出為coded_block_pattern的值。
3.4 te(v)
te(v)也稱(chēng)截?cái)?#xff08;舍位)指數(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。
---------------------?
作者:金架構(gòu)?
來(lái)源:CSDN?
原文:https://blog.csdn.net/u011399342/article/details/80472399?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的【H264/AVC 句法和语义详解】(五):Exp-Golomb指数哥伦布编码(理论篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: AVC sequence header
- 下一篇: 认证鉴权与API权限控制在微服务架构中的