專利名稱:基于零前綴碼的變長碼解碼方法
技術(shù)領(lǐng)域:
本發(fā)明屬于數(shù)字視頻編解碼技術(shù)領(lǐng)域,具體來說,是關(guān)于快速參照H.264/AVC標(biāo)準(zhǔn)中規(guī)定的CAVLC表格進行解碼的方法。
背景技術(shù):
H.264/AVC是新一代數(shù)字視頻編碼標(biāo)準(zhǔn),它是由國際電聯(lián)(ITU)和MPEG標(biāo)準(zhǔn)組織ISO組成的合作開發(fā)組(JVT)共同開發(fā)的。H.264/AVC作為視頻技術(shù)標(biāo)準(zhǔn),能夠適應(yīng)于視頻應(yīng)用的各個領(lǐng)域,包括低碼率的無線應(yīng)用,網(wǎng)絡(luò)視頻應(yīng)用,高清晰度的電視廣播應(yīng)用和DVD應(yīng)用。
H.264/AVC和以前的編碼標(biāo)準(zhǔn)H.263,MPEG-4類似,都是采用基于預(yù)測變換的混合編碼模式,同時吸收了以前的標(biāo)準(zhǔn)的優(yōu)勢,在編碼性能上較H.263,MPEG-4有了較大的提高,在同等質(zhì)量的情況下能夠節(jié)約40%的碼率。H.264/AVC的碼流分為兩個層次,視頻編碼層(VideoCoding Layer,VLC)和網(wǎng)絡(luò)抽象層(Network Abstract Layer,NAL)。視頻編碼層主要記錄對視頻內(nèi)容進行壓縮后的核心數(shù)據(jù),網(wǎng)絡(luò)抽象層主要記錄描述特定網(wǎng)絡(luò)環(huán)境的信息,通過這樣的層次劃分,有利于視頻數(shù)據(jù)的封裝和數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸控制。
H.264/AVC的編碼過程主要分為以下幾個部分(1)幀內(nèi)預(yù)測,以消除空間冗余度;(2)通過運動搜索進行幀間預(yù)測,以消除時間冗余度;(3)對原始圖像塊和預(yù)測塊之間的差別形成的殘差塊進行變換和量化;(4)對量化后得到的系數(shù)殘差進行重排和熵編碼。
解碼過程主要分為以下幾個部分(1)熵解碼,對解碼后的系數(shù)進行重排;(2)對重排后的系數(shù)進行反量化和反變換;(3)通過幀內(nèi)預(yù)測或幀間預(yù)測得到預(yù)測塊;(4)通過預(yù)測塊和殘差塊得到解碼圖像。
在H.264/AVC編碼中,熵編碼分為兩種上下文自適應(yīng)的可變長度編碼(CAVLC,簡稱變長碼)和上下文自適應(yīng)的二進制算術(shù)編碼(CABAC)。CAVLC熵編碼是一種可變長編碼,可變長編碼是利用不同的語法元素在碼流中出現(xiàn)的概率,利用不同比特長度的碼字對語法元素進行編碼,出現(xiàn)概率高的語法元素對應(yīng)于比特長度較短的碼字,概率較低的語法元素對應(yīng)于比特長度較長的碼字。在編碼的過程中,通過碼表的形式記錄著不同的語法元素信息所對應(yīng)的碼字。由于在不同的視頻幀中,語法元素信息的概率分布不相同,采用統(tǒng)一的碼表不能夠達到很高的壓縮效率,在CAVLC熵編碼過程中,采用已編碼的鄰近的圖像塊對應(yīng)的語法元素的信息來動態(tài)的調(diào)整編碼所參照的碼表,使編碼所選擇的碼表中碼字的概率分布同實際的語法元素信息的概率分布更接近,以達到較高的壓縮效率。采用CAVLC編碼對H.264/AVC中的系數(shù)殘差進行熵編碼,需要編碼的語法元素有TotalCoeff(重排序列中非0系數(shù)的個數(shù)),TrailingOnes(重排序列末尾的1或者-1的個數(shù)),total_zeros(重排序列中最后一個非0系數(shù)前0的個數(shù)),run_before(重排序列中每個非0系數(shù)前0的個數(shù))。每個的語法元素對應(yīng)著不同的碼表,但是TotalCoeff和TrailingOnes是采用組合編碼的方式,通過對兩個匹配的語法元素聯(lián)合編碼并合并成一個碼字以提高壓縮效率,由于兩種語法元素信息編碼后合并在一個碼字中,相應(yīng)的碼表長度就比一個語法元素進行編碼時有所增加。
在解碼過程中,為了從碼流中的碼字得到具體的語法元素的值,需要按照碼表中出現(xiàn)的碼字的長度從碼流存儲器中讀取相同長度的碼字,然后同碼表中的碼字進行匹配,如果匹配不成功,則切換到碼表中出現(xiàn)的下一個碼字,進行相同的操作。采用這樣的方式進行解碼需要頻繁的訪問碼流存儲器,而且在最差的情況下需要對整個碼表進行遍歷后才能夠找到正確的碼字,完成解碼過程。這種處理方法效率低下,不適于應(yīng)用在實時的編解碼系統(tǒng)中。
發(fā)明內(nèi)容
本發(fā)明的目的是為克服已有技術(shù)的不足之處,提出一種基于零前綴碼的變長碼解碼方法,本發(fā)明根據(jù)CAVLC碼表生成多叉樹。即變換CAVLC碼表的形式,該方法面向H.264/AVC在實時性要求較高的系統(tǒng)的應(yīng)用,為使用者提供了在符合H.264/AVC標(biāo)準(zhǔn)所規(guī)定的碼流中,對殘差塊參照CAVCL碼表進行解碼;這種方法具有較高的效率,能夠滿足在實時編解碼系統(tǒng)中的應(yīng)用。
本發(fā)明提出的基于零前綴碼的變長碼解碼方法,其特征在于,該方法包括生成多個基于0前綴碼的多叉樹,根據(jù)該多叉樹對碼流進行變長碼解碼;所述的基于0前綴碼的多叉樹的結(jié)構(gòu)包括由一個根節(jié)點及其多級節(jié)點構(gòu)成的0前綴碼字比特序列,下級節(jié)點是其上級節(jié)點的子節(jié)點;其中,根節(jié)點只記錄其子節(jié)點的個數(shù),其它各級節(jié)點除記錄其子節(jié)點的個數(shù)外,還記錄所述碼字序列的比特位,所述子節(jié)點記錄的比特位是其上級節(jié)點記錄的比特位及后續(xù)的比特位,每個節(jié)點最多存在4個子節(jié)點,各子節(jié)點分別記錄后續(xù)的非零比特位及其前的0的0-3個0的比特位;如果該節(jié)點的子節(jié)點個數(shù)為0,該節(jié)點為葉子節(jié)點,葉子節(jié)點同時記錄和碼字對應(yīng)的語法元素值。
本發(fā)明的原理本發(fā)明基于可變長編碼的原理。由于編碼系統(tǒng)進行的是可變長編碼,在同一個碼表列中不存在一個碼字是另一個碼字的前綴,把CAVLC碼表轉(zhuǎn)換為樹來表示。由于在CAVLC碼表中,碼字中值為0的比特位占有較大的比例,采用0前綴樹來對CAVLC進行轉(zhuǎn)換,能夠提高整體的解碼效率。
本發(fā)明具有以下特點1.由于碼字按樹結(jié)構(gòu)進行存儲,只需按順序讀取比特流數(shù)據(jù),減少對存儲器的訪問。
2.解碼時只需訪問對應(yīng)的多叉樹,不必對碼表進行搜索,提高了解碼效率。
3.基于0前綴碼的多叉樹中一個節(jié)點可對應(yīng)多個比特位,對于大部分的碼字,能夠遍歷較少的節(jié)點,就找到對應(yīng)的語法元素信息。
將本發(fā)明應(yīng)用在實時系統(tǒng)中,能夠簡化解碼器,提高處理速度。
圖1為本發(fā)明的基于0前綴碼的多叉樹的節(jié)點結(jié)構(gòu)。
圖2為本實施例解碼中語法元素total_zeros所參照的CAVLC碼表。
圖3為本實施例根據(jù)CAVLC碼表所生成的基于0前綴碼的多叉樹結(jié)構(gòu)。
具體實施例方式
下面結(jié)合附圖及實施例對本發(fā)明進行詳細的說明。
本發(fā)明提出的基于零前綴碼的變長碼解碼方法,其特征在于,該方法包括生成多個基于0前綴碼的多叉樹,根據(jù)該多叉樹對碼流進行變長碼解碼;其中,基于0前綴碼的多叉樹的結(jié)構(gòu)包括由一個根節(jié)點及其多級節(jié)點構(gòu)成的0前綴碼字比特序列,下級節(jié)點是其上級節(jié)點的子節(jié)點;其中,根節(jié)點只記錄其子節(jié)點的個數(shù),其它各級節(jié)點除記錄其子節(jié)點的個數(shù)外,還記錄所述碼字序列的比特位,所述子節(jié)點記錄的比特位是其上級節(jié)點記錄的比特位及后續(xù)的比特位,每個節(jié)點最多存在4個子節(jié)點,各子節(jié)點分別記錄后續(xù)的非零比特位及其前的0的0-3個0的比特位;如果該節(jié)點的子節(jié)點個數(shù)為0,該節(jié)點為葉子節(jié)點(則表示碼字結(jié)束),葉子節(jié)點同時記錄和碼字對應(yīng)的語法元素值。
該多叉樹中一個節(jié)點的內(nèi)容,如圖1所示,包括其子節(jié)點個數(shù),子節(jié)點指針或語法元素值(如果是葉子節(jié)點,則沒有子節(jié)點指針,如果不是葉子節(jié)點,則沒有語法元素值);上述基于0前綴碼的多叉樹是利用H.264/AVC標(biāo)準(zhǔn)中所規(guī)定的碼表來生成的,其具體生成方法包括首先對多叉樹進行初始化(即初始化為僅含一個子節(jié)點個數(shù)為0的根節(jié)點的樹),并設(shè)置變量E,其值為1或0;再利用該樹來生成基于0前綴碼的多叉樹,具體包括以下步驟1)置樹的根節(jié)點為當(dāng)前節(jié)點,讀取碼表中的一個碼字,設(shè)置比特位指針P指向碼字的第一個比特位,如碼表結(jié)束則轉(zhuǎn)到5);2)指針P所指的位置讀取該碼字的N個比特位,直到讀取到的比特位值為1或者N=3或者碼字結(jié)束,移動指針P到下一個將要讀取得比特位,并判斷指針P是否到了碼字的結(jié)束,如果碼字已結(jié)束,則變量E置1,否則置0;如果讀取到的比特位串中有1,則轉(zhuǎn)到3);如果讀取到的比特位串中沒有1,則轉(zhuǎn)到4);
3)判斷當(dāng)前節(jié)點的第N個子節(jié)點是否存在,如不存在,則建立相應(yīng)子節(jié)點,判斷當(dāng)前節(jié)點的字節(jié)點個數(shù)是否小于N,如小于N,則修改當(dāng)前節(jié)點的子節(jié)點個數(shù)為N,并移動當(dāng)前節(jié)點到它的第N個子節(jié)點。如果E=1,則設(shè)置當(dāng)前節(jié)點為葉子節(jié)點,將對應(yīng)得視頻語法元素信息存儲在該節(jié)點中,結(jié)束當(dāng)前碼字的轉(zhuǎn)換,轉(zhuǎn)到1);如果E=0,則轉(zhuǎn)到2);4)斷當(dāng)前節(jié)點的第N+1個子節(jié)點是否存在,如不存在,則建立相應(yīng)得子節(jié)點,判斷當(dāng)前節(jié)點的子節(jié)點個數(shù)是否小于N+1,如小于N+1,則修改當(dāng)前節(jié)點的子節(jié)點個數(shù)為N+1,并移動當(dāng)前節(jié)點到它的第N+1個子節(jié)點。如果則設(shè)置當(dāng)前節(jié)點為葉子節(jié)點,并將對應(yīng)得視頻語法元素信息存儲在該節(jié)點中,結(jié)束當(dāng)前碼字的轉(zhuǎn)換,轉(zhuǎn)到1);如果E=0,則轉(zhuǎn)到2)。
5)基于0前綴碼的多叉樹的構(gòu)造結(jié)束。
基于0前綴碼的多叉樹構(gòu)造完成后,在以后的解碼過程中,就不需要參照H.264/AVC標(biāo)準(zhǔn)中的碼表進行解碼,只需要參照基于0前綴碼的多叉樹即可解碼,這樣可以避免復(fù)雜的匹配過程。
根據(jù)上述生成的基于0前綴碼的多叉樹對碼流進行變長碼解碼,具體包括以下步驟1)設(shè)置所述多叉樹的根節(jié)點為當(dāng)前節(jié)點,設(shè)置比特位指針P指向下一個將要讀取的碼流比特位,如果碼流結(jié)束,則轉(zhuǎn)到6);2)取當(dāng)前節(jié)點的子節(jié)點數(shù)N,令N=N-1,設(shè)置子節(jié)點計數(shù)K,且K=0;3)果碼流結(jié)束,則表示碼流錯誤,轉(zhuǎn)到6);否則,讀取該指針P指向的碼流比特位,令K=K+1,指針P移到下一個將要讀取得比特位,讀取的碼流比特位如果值為1,則轉(zhuǎn)到4);如果值為0,則轉(zhuǎn)到5);4)設(shè)置當(dāng)前節(jié)點的第K個子節(jié)點為當(dāng)前節(jié)點,判斷當(dāng)前節(jié)點是否為葉節(jié)點,如果是,則讀取存儲在該節(jié)點中的視頻語法元素信息,并轉(zhuǎn)到1);如果不是葉節(jié)點,則轉(zhuǎn)到2);5)令N=N-1,如果N=0,則令K=K+1,并轉(zhuǎn)到4);否則轉(zhuǎn)到3);6)結(jié)束當(dāng)前碼流的解碼。
這樣就完成了參照基于0前綴碼的多叉樹對H.264/AVC的殘差塊碼流的解碼。
以下通過實施例對本發(fā)明所提出的一種根據(jù)CAVLC碼表的基于0前綴碼的多叉樹解碼方法進行詳細說明。
本實施例采用的基于0前綴碼的多叉樹,在每個節(jié)點中采用一個域來存儲該節(jié)點的子節(jié)點數(shù),子節(jié)點的取值范圍為0-4,其中0代表葉子節(jié)點。
圖2是本實施例解碼中語法元素total_zeros(重排序列中最后一個非0系數(shù)前0的個數(shù))所參照的CAVLC碼表,其中碼表第一列表示解碼得到的語法元素total_zeros的值,碼表的第二列到第八列表示碼流中可能存在的碼字,同一行中的碼字和該行第一列中的語法元素值對應(yīng),根據(jù)已經(jīng)解碼得到的不同的TotalCoeff(重排序列中非0系數(shù)的個數(shù))值從不同的列中選取碼字進行解碼。
本實施例對圖2中CAVLC碼表的第一列轉(zhuǎn)換得到的基于0前綴碼的多叉樹,如圖3所示。圖中包括一個根節(jié)點及四級節(jié)點,其中,最上層的節(jié)點表示根節(jié)點,其中記錄其子節(jié)點為4。每級的一個節(jié)點的子節(jié)點(如果存在)按從左到右的順序依次為該節(jié)點的第一個子節(jié)點,第二個子節(jié)點,第三個子節(jié)點和第四個子節(jié)點。每個節(jié)點旁邊的比特串表示該節(jié)點記錄的某個碼字中的一段比特位串,葉子節(jié)點旁邊的比特串對應(yīng)于其記錄的一個完整的碼字。本實施例對一段比特流為000011的碼字進行解碼,是參照圖3中的基于0前綴碼的多叉樹中相應(yīng)部分,如圖3所示。其解碼方法包括讀取根節(jié)點中的子節(jié)點個數(shù),值為4,讀取比特流,由于前三位都沒有值為1的比特位,所以讀取子節(jié)點數(shù)減一位比特,即3比特,并把當(dāng)前節(jié)點移動到根節(jié)點的第4個子節(jié)點;讀取當(dāng)前節(jié)點中的子節(jié)點個數(shù),值為4,讀取比特流,由于第二位為值為1的比特位,所以讀取2比特,并設(shè)置當(dāng)前節(jié)點的第2個子節(jié)點為當(dāng)前節(jié)點;讀取當(dāng)前節(jié)點中的子節(jié)點個數(shù),值為4,讀取比特流,由于第一位為值為1的比特位,所以只讀取1比特,并設(shè)置當(dāng)前節(jié)點的第1個子節(jié)點為當(dāng)前節(jié)點;讀取當(dāng)前節(jié)點中的子節(jié)點個數(shù),值為0,故該碼字解碼結(jié)束,得到total_zeros值為7。
該碼字參照基于0前綴碼的多叉樹進行解碼的過程中,只遍歷了該多叉樹中一支具有3級數(shù)節(jié)點的部分??梢姡捎帽景l(fā)明的方法能夠較快的得到碼字對應(yīng)得語法元素信息。
權(quán)利要求
1.一種基于零前綴碼的變長碼解碼方法,其特征在于,該方法包括生成多個基于0前綴碼的多叉樹,根據(jù)該多叉樹對碼流進行變長碼解碼;所述的基于0前綴碼的多叉樹的結(jié)構(gòu)包括由一個根節(jié)點及其多級節(jié)點構(gòu)成的0前綴碼字比特序列,下級節(jié)點是其上級節(jié)點的子節(jié)點;其中,根節(jié)點只記錄其子節(jié)點的個數(shù),其它各級節(jié)點除記錄其子節(jié)點的個數(shù)外,還記錄所述碼字序列的比特位,所述子節(jié)點記錄的比特位是其上級節(jié)點記錄的比特位及后續(xù)的比特位,每個節(jié)點最多存在4個子節(jié)點,各子節(jié)點分別記錄后續(xù)的非零比特位及其前的0的0-3個0的比特位;如果該節(jié)點的子節(jié)點個數(shù)為0,該節(jié)點為葉子節(jié)點,葉子節(jié)點同時記錄和碼字對應(yīng)的語法元素值。
2.如權(quán)利要求1所述的方法,其特征在于,所述基于0前綴碼的多叉樹的生成方法,該方法首先對多叉樹初始化為僅含一個子節(jié)點個數(shù)為0的根節(jié)點的初始化樹,并設(shè)置變量E,其值為1或0;再利用該初始化樹來生成基于0前綴碼的多叉樹,具體包括以下步驟1)設(shè)置樹的根節(jié)點為當(dāng)前節(jié)點,讀取碼表中的一個碼字,設(shè)置比特位指針P指向碼字的第一個比特位,如碼表結(jié)束則轉(zhuǎn)到5);2)從指針P所指的位置讀取該碼字的N個比特位,直到讀取到的比特位值為1或者N=3或者碼字結(jié)束,移動指針P到下一個將要讀取得比特位,并判斷指針P是否到了碼字的結(jié)束,如果碼字已結(jié)束,則變量E置1,否則置0;如果讀取到的比特位串中有1,則轉(zhuǎn)到3);如果讀取到的比特位串中沒有1,則轉(zhuǎn)到4);3)判斷當(dāng)前節(jié)點的第N個子節(jié)點是否存在,如不存在,則建立相應(yīng)子節(jié)點,判斷當(dāng)前節(jié)點的字節(jié)點個數(shù)是否小于N,如小于N,則修改當(dāng)前節(jié)點的子節(jié)點個數(shù)為N,并移動當(dāng)前節(jié)點到它的第N個子節(jié)點。如果E=1,則設(shè)置當(dāng)前節(jié)點為葉子節(jié)點,將對應(yīng)得視頻語法元素信息存儲在該節(jié)點中,結(jié)束當(dāng)前碼字的轉(zhuǎn)換,轉(zhuǎn)到1);如果E=0,則轉(zhuǎn)到2);4)判斷當(dāng)前節(jié)點的第N+1個子節(jié)點是否存在,如不存在,則建立相應(yīng)得子節(jié)點,判斷當(dāng)前節(jié)點的子節(jié)點個數(shù)是否小于N+1,如小于N+1,則修改當(dāng)前節(jié)點的子節(jié)點個數(shù)為N+1,并移動當(dāng)前節(jié)點到它的第N+1個子節(jié)點。如果則設(shè)置當(dāng)前節(jié)點為葉子節(jié)點,并將對應(yīng)得視頻語法元素信息存儲在該節(jié)點中,結(jié)束當(dāng)前碼字的轉(zhuǎn)換,轉(zhuǎn)到1);如果E=0,則轉(zhuǎn)到2);5)基于0前綴碼的多叉樹的構(gòu)造結(jié)束。
3.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)生成的基于0前綴碼的多叉樹對碼流進行變長碼解碼,具體包括以下步驟1)設(shè)置所述多叉樹的根節(jié)點為當(dāng)前節(jié)點,設(shè)置比特位指針P指向下一個將要讀取的碼流比特位,如果碼流結(jié)束,則轉(zhuǎn)到6);2)讀取當(dāng)前節(jié)點的子節(jié)點數(shù)N,令N=N-1,設(shè)置子節(jié)點計數(shù)K,且K=0;3)如果碼流結(jié)束,則表示碼流錯誤,轉(zhuǎn)到6);否則,讀取該指針P指向的碼流比特位,令K=K+1,指針P移到下一個將要讀取得比特位,讀取的碼流比特位如果值為1,則轉(zhuǎn)到4);如果值為0,則轉(zhuǎn)到5);4)設(shè)置當(dāng)前節(jié)點的第K個子節(jié)點為當(dāng)前節(jié)點,判斷當(dāng)前節(jié)點是否為葉節(jié)點,如果是,則讀取存儲在該節(jié)點中的視頻語法元素信息,并轉(zhuǎn)到1);如果不是葉節(jié)點,則轉(zhuǎn)到2);5)令N=N-1,如果N=0,則令K=K+1,并轉(zhuǎn)到4);否則轉(zhuǎn)到3);結(jié)束當(dāng)前碼流的解碼。
全文摘要
本發(fā)明涉及基于零前綴碼的變長碼解碼方法,屬于數(shù)字視頻編解碼技術(shù)領(lǐng)域。該方法包括生成多個基于0前綴碼的多叉樹,根據(jù)該多叉樹對碼流進行變長碼解碼;該樹的結(jié)構(gòu)包括由一個根節(jié)點及其多級節(jié)點構(gòu)成的0前綴碼字比特序列,根節(jié)點只記錄其子節(jié)點的個數(shù),其它各級節(jié)點還記錄所述碼字序列的比特位,每個節(jié)點最多存在4個子節(jié)點,如果該節(jié)點的子節(jié)點個數(shù)為0,該節(jié)點為葉子節(jié)點,葉子節(jié)點同時記錄和碼字對應(yīng)的語法元素值。本發(fā)明具有較高的效率,能夠滿足在實時編解碼系統(tǒng)中的應(yīng)用。
文檔編號H04N7/26GK101022554SQ20071006444
公開日2007年8月22日 申請日期2007年3月16日 優(yōu)先權(quán)日2007年3月16日
發(fā)明者戴瓊海, 施一平, 爾桂花 申請人:清華大學(xué)