專利名稱:一種基于上下文的多碼表變長(zhǎng)編解碼方法及編解碼裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明屬于數(shù)字音視頻編解碼技術(shù)領(lǐng)域,涉及一種用于視頻預(yù)測(cè)殘差系數(shù)編解碼的熵編解碼方法,具體地說是一種一種基于上下文的多碼表變長(zhǎng)編解碼方法及編解碼裝置。
背景技術(shù):
視頻編解碼技術(shù)是數(shù)字媒體存儲(chǔ)與傳輸?shù)葢?yīng)用的關(guān)鍵技術(shù)。視頻編碼系統(tǒng)中的核心技術(shù)包括預(yù)測(cè)編碼、變換編碼、熵編碼。其中,熵編碼技術(shù)是對(duì)編碼過程中產(chǎn)生的語法元素,如運(yùn)動(dòng)矢量mv、塊預(yù)測(cè)殘差系數(shù)等進(jìn)行信息熵編碼,其作用是去除數(shù)據(jù)的統(tǒng)計(jì)冗余。
以往視頻編碼標(biāo)準(zhǔn)對(duì)塊預(yù)測(cè)殘差系數(shù)的編碼方法有國際視頻編碼標(biāo)準(zhǔn)H.261和運(yùn)動(dòng)圖象專家組MPEG-2(Motion Picture ExpertsGroup)標(biāo)準(zhǔn)的熵編碼器二維變長(zhǎng)編碼2D-VLC(2 Dimension VariableLength Coding),H.263和MPEG-4標(biāo)準(zhǔn)的3D-VLC熵編碼器,國際電信協(xié)會(huì)ITU-T的H.264視頻編碼建議或ISO/IEC的國際標(biāo)準(zhǔn)14496-10即MPEG-4標(biāo)準(zhǔn)第10部分的視頻編碼標(biāo)準(zhǔn)H.264/AVC的基于上下文變長(zhǎng)編碼(CAVLC,Context-based Adaptive Variable LengthCoding)熵編碼器和基于上下文二進(jìn)制算術(shù)編碼(CABAC,Contex-based Adaptive Binary Arithmetic Coding)熵編碼器。
2D-VLC熵編碼器對(duì)塊殘差系數(shù)的編碼采用(level,run)+EOB的編碼方式,level表示經(jīng)過離散余弦變換DCT變換和量化后的殘差圖像塊的非零系數(shù),而run表示按傳統(tǒng)之字形zig-zag掃描順序該非零系數(shù)到其前第一個(gè)非零系數(shù)間的值為0的系數(shù)個(gè)數(shù),EOB(End of Block)為塊結(jié)束標(biāo)志,EOB在碼表中獨(dú)占一個(gè)位置,即EOB單獨(dú)分配一個(gè)碼字。3D-VLC熵編碼器將EOB結(jié)合在(level,run)數(shù)對(duì)中,形成三維量(level,run,last),last表示當(dāng)前非零系數(shù)是否為塊內(nèi)最后一個(gè)非零系數(shù),這樣騰出了碼表中EOB占據(jù)的較短碼字,并且利用了level、run及EOB的聯(lián)合概率,因此編碼效率有所提高。H.264/AVC視頻編碼標(biāo)準(zhǔn)的CAVLC熵編碼器將level、run分開編碼,該編碼器充分利用了上、下文信息,并針對(duì)4×4塊大小進(jìn)行了很好的優(yōu)化,因此取得了較高的編碼效率。以上的各種熵編碼器屬于變長(zhǎng)編碼器,其編碼基本原理是哈夫曼(Huffman)編碼,即將大概率的符號(hào)用短碼字編碼,而出現(xiàn)概率小的符號(hào)用長(zhǎng)碼字編碼,從而最終達(dá)到平均碼長(zhǎng)最短的目的。H.264/AVC視頻編碼標(biāo)準(zhǔn)的CABAC熵編碼器屬于算術(shù)編碼器,算術(shù)編碼器的性能高于變長(zhǎng)編碼器,而且由于CABAC能夠很好地對(duì)上下文進(jìn)行建模,對(duì)信源符號(hào)的出現(xiàn)概率有更準(zhǔn)確的估計(jì),因此編碼效率很高。但相比于變長(zhǎng)編碼器,算術(shù)編碼器的計(jì)算復(fù)雜度高,同時(shí)硬件實(shí)現(xiàn)復(fù)雜,相當(dāng)于以軟、硬件的高復(fù)雜度換取編碼效率的提高。
因此,從編碼效率及算法的軟硬件實(shí)現(xiàn)復(fù)雜度兩方面來考慮,變長(zhǎng)編碼是一種性價(jià)比更高的熵編碼方案。在變長(zhǎng)編碼器中,2D-VLC熵編碼器利用了level及run的聯(lián)合概率,道理上效率高于CAVLC熵編碼器將level及run分開編碼的方式,而且相比于3D-VLC編碼器,2D-VLC碼表的體積更小,所以2D-VLC熵編碼器兼顧了編碼性能和硬件的實(shí)現(xiàn)復(fù)雜度。但是傳統(tǒng)的2D-VLC熵編碼器采用通過全局統(tǒng)計(jì)而得到的單一碼表進(jìn)行編碼,其缺點(diǎn)是,單一碼表不能很好地適應(yīng)局部概率分布的變化,造成編碼效率不高。
發(fā)明內(nèi)容
為了克服上述現(xiàn)有技術(shù)的不足,本發(fā)明的目的在于提供一種基于上下文的多碼表變長(zhǎng)編解碼方法及編解碼裝置,以提高編碼效率,降低編解碼的復(fù)雜度。
本發(fā)明的另一個(gè)目的在于提供一種基于上下文的多碼表變長(zhǎng)編解碼方法及編解碼裝置,以降低多碼表的內(nèi)存需求。
為了完成上述發(fā)明任務(wù),本發(fā)明采用的總體技術(shù)方案是一種基于上下文的多碼表變長(zhǎng)編碼方法,包括以下步驟步驟1之字形掃描模塊對(duì)圖像塊預(yù)測(cè)殘差系數(shù)進(jìn)行之字形掃描,形成圖像塊的非零系數(shù)和按之字形掃描順序該非零系數(shù)到其前第一個(gè)非零系數(shù)間值為0的系數(shù)個(gè)數(shù)的數(shù)對(duì)序列并將數(shù)對(duì)序列存入存儲(chǔ)緩沖區(qū)中;步驟2碼表選擇模塊根據(jù)殘差系數(shù)的類型經(jīng)與二維變長(zhǎng)編碼碼表存儲(chǔ)模塊中的碼表比較確定編碼當(dāng)前系數(shù)塊的碼表類型;步驟3碼表選擇模塊根據(jù)殘差系數(shù)的圖像塊所在宏塊采用的量化參數(shù)及所在宏塊或子塊的編碼模式,從所選類型的多個(gè)碼表中選擇一個(gè)碼表送入變長(zhǎng)編碼模塊;步驟4變長(zhǎng)編碼模塊根據(jù)所選定的碼表將存儲(chǔ)緩沖區(qū)中數(shù)對(duì)序列的每個(gè)數(shù)對(duì)及塊結(jié)束標(biāo)志映射為變長(zhǎng)碼,并將編碼后的變長(zhǎng)碼寫進(jìn)碼流中。
所述步驟1中的圖像塊預(yù)測(cè)殘差系數(shù)的類型包括幀內(nèi)預(yù)測(cè)所得到的亮度分量殘差系數(shù)類型、幀間預(yù)測(cè)得到的亮度分量殘差系數(shù)類型和幀內(nèi)幀間預(yù)測(cè)得到的色度分量殘差系數(shù)類型。
所述步驟3中的碼表是包括幀內(nèi)預(yù)測(cè)得到的亮度分量殘差系數(shù)類型、幀間預(yù)測(cè)得到的亮度分量殘差系數(shù)類型及幀內(nèi)幀間預(yù)測(cè)色度分量殘差系數(shù)類型的一個(gè)或一個(gè)以上碼表。
所述步驟3中的宏塊或子塊編碼模式包括幀內(nèi)預(yù)測(cè)宏塊模式和幀間預(yù)測(cè)宏塊模式,幀內(nèi)預(yù)測(cè)宏塊模式為幀內(nèi)預(yù)測(cè)的方向,幀間預(yù)測(cè)宏塊模式為宏塊的幀間預(yù)測(cè)方式,預(yù)測(cè)方向包括前向預(yù)測(cè)、后向預(yù)測(cè)、雙向預(yù)測(cè),預(yù)測(cè)方式為把宏塊分割為不同塊大小所對(duì)應(yīng)的預(yù)測(cè)方式。
所述步驟3中的從多個(gè)碼表中選擇一個(gè)碼表的方法包括根據(jù)殘差系數(shù)的圖像塊所在宏塊采用的量化參數(shù)選擇碼表、根據(jù)殘差系數(shù)圖像塊所在宏塊或子塊編碼模式選擇碼表和同時(shí)根據(jù)量化參數(shù)與編碼模式選擇碼表三種方法。
所述步驟4進(jìn)一步包括下述步驟步驟41、判斷數(shù)對(duì)序列中的數(shù)對(duì)是否包含在碼表中,如果是則直接從碼表中查表得到用于其編碼的碼字編號(hào),否則計(jì)算得到用于其編碼的碼字編號(hào);步驟42、根據(jù)當(dāng)前碼表采用的碼字類型及其階數(shù),按碼字編號(hào)計(jì)算得到數(shù)對(duì)的變長(zhǎng)碼,寫進(jìn)碼流;步驟43、判斷是否編完數(shù)對(duì)序列中的所有數(shù)對(duì),是則采用當(dāng)前碼表編碼塊結(jié)束標(biāo)志,完成此塊的編碼,否則轉(zhuǎn)步驟41。
所述步驟41中的計(jì)算具體為按公式碼字編號(hào)=(abs(level)-LEVRUN[run])*32+8+run*2計(jì)算碼字編號(hào)并判斷數(shù)對(duì)序列經(jīng)變換和量化后的殘差圖像塊的非零系數(shù)是否小于0,不是則將碼字編號(hào)遞減1,是則保持碼字編號(hào)的原值,其中,level為經(jīng)過離散余弦變換和量化后的殘差系數(shù)的圖像塊的非零系數(shù),run為按之字形掃描順序該非零系數(shù)到其前第一個(gè)非零系數(shù)間值為0的系數(shù)個(gè)數(shù),LEVRUN[]為當(dāng)前碼表中所包含的(level,run)數(shù)對(duì)的最大abs(level)值。
所述步驟42中的碼字類型是指數(shù)型哥倫布碼。
所述步驟42中的碼字類型是混合型哥倫布碼。
實(shí)施所述的基于上下文的多碼表變長(zhǎng)編碼方法的編碼裝置,包括用于對(duì)圖像塊預(yù)測(cè)殘差系數(shù)進(jìn)行掃描的之字形掃描模塊、用于存儲(chǔ)數(shù)對(duì)序列的存儲(chǔ)緩沖區(qū)、變長(zhǎng)編碼模塊,用于存儲(chǔ)二維碼表的二維變長(zhǎng)編碼碼表存儲(chǔ)模塊,還包括用于選擇圖像塊預(yù)測(cè)殘差系數(shù)類型、宏塊量化參數(shù)、宏塊或子塊編碼模式的多個(gè)碼表的碼表選擇模塊,該模塊輸入端連接殘差系數(shù)類型、宏塊量化參數(shù)、宏塊或子塊編碼模式輸入信號(hào)線,其碼表編號(hào)輸出端連接變長(zhǎng)編碼模塊,其碼表類型比較端與二維變長(zhǎng)編碼碼表存儲(chǔ)模塊連接。
一種基于上下文的多碼表變長(zhǎng)解碼方法,包括以下步驟步驟一、碼表選擇模塊根據(jù)圖像塊預(yù)測(cè)殘差系數(shù)類型選擇解碼當(dāng)前殘差系數(shù)塊的碼表類型;步驟二、碼表選擇模塊根據(jù)預(yù)測(cè)殘差系數(shù)的圖像塊在宏塊所采用的量化參數(shù)及所在宏塊或子塊的編碼模式從所選類型的多個(gè)碼表中選擇一個(gè)碼表進(jìn)行解碼;步驟三、變長(zhǎng)解碼模塊根據(jù)當(dāng)前碼表從變長(zhǎng)碼碼流中解碼出當(dāng)前預(yù)測(cè)殘差系數(shù)塊的所有數(shù)對(duì)序列,并存入存儲(chǔ)緩沖區(qū)中;步驟四、之字形掃描模塊按反之字形掃描順序?qū)⒁呀獯a的上述數(shù)對(duì)序列還原為圖像塊預(yù)測(cè)殘差系數(shù)。
實(shí)施所述的基于上下文的多碼表變長(zhǎng)解碼方法的解碼裝置,包括用于對(duì)解碼的數(shù)對(duì)序列進(jìn)行反之字掃描的之字形掃描模塊、用于存儲(chǔ)數(shù)對(duì)序列的存儲(chǔ)緩沖區(qū)、變長(zhǎng)解碼模塊,用于存儲(chǔ)二維碼表的二維變長(zhǎng)編碼碼表存儲(chǔ)模塊,還包括用于選擇圖像塊預(yù)測(cè)殘差系數(shù)類型、宏塊量化參數(shù)、宏塊或子塊編碼模式的多個(gè)碼表的碼表選擇模塊,該模塊輸入端連接殘差系數(shù)塊類型、宏塊量化參數(shù)、宏塊或子塊編碼模式輸入信號(hào)線,其碼表編號(hào)輸出端連接變長(zhǎng)解碼模塊,其碼表類型比較端與二維變長(zhǎng)編碼碼表存儲(chǔ)模塊連接。
本發(fā)明具有明顯的優(yōu)點(diǎn)和積極效果。本發(fā)明設(shè)計(jì)了不同上下文情況下的多個(gè)碼表,編碼時(shí)通過碼表的選擇來更好地匹配不同上下文情況下信源符號(hào)的概率分布,將變長(zhǎng)編碼器中2D-VLC熵編碼器利用了level及run的聯(lián)合概率技術(shù)與多個(gè)碼表技術(shù)相結(jié)合,提高了編解碼的效率,降低了編解碼的復(fù)雜度。
圖1是本發(fā)明的編碼主流程圖;圖2是本發(fā)明的編碼裝置構(gòu)成框圖;圖3是宏塊幀間編碼模式圖;圖4是對(duì)塊系數(shù)進(jìn)行之字形掃描形成數(shù)對(duì)序列過程示意圖;圖5是本發(fā)明4×4殘差系數(shù)塊編碼流程圖;圖6是本發(fā)明解碼裝置構(gòu)成框圖;圖7是本發(fā)明4×4殘差系數(shù)塊解碼流程圖。
具體實(shí)施例方式
下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說明。
為提高編碼效率,必須使編碼時(shí)信源符號(hào)的碼長(zhǎng)或碼字分配要更好地匹配信源符號(hào)的出現(xiàn)概率。因此本發(fā)明設(shè)計(jì)多個(gè)碼表來匹配不同上下文情況下的不同殘差系數(shù)分布,即針對(duì)殘差系數(shù)的一個(gè)典型分布將設(shè)計(jì)一個(gè)碼表用于此種分布下的殘差系數(shù)的編碼。
請(qǐng)參閱圖1、圖2,本發(fā)明編碼的主流程圖和裝置構(gòu)成框圖。本發(fā)明的基于上下文的多碼表變長(zhǎng)編碼方法的編碼裝置,包括用于對(duì)圖像塊預(yù)測(cè)殘差系數(shù)進(jìn)行掃描的之字形掃描模塊、用于存儲(chǔ)數(shù)對(duì)序列的存儲(chǔ)緩沖區(qū)、變長(zhǎng)編碼模塊,用于存儲(chǔ)二維碼表的二維變長(zhǎng)碼表存儲(chǔ)模塊,該裝置還包括用于選擇殘差系數(shù)塊類型、宏塊量化參數(shù)、宏塊或子塊編碼模式的多個(gè)碼表的碼表選擇模塊,該模塊輸入端連接殘差系數(shù)塊類型、宏塊量化參數(shù)、宏塊或子塊編碼模式輸入信號(hào)線,其碼表編號(hào)輸出端連接變長(zhǎng)編碼模塊,其碼表類型比較端與二維變長(zhǎng)碼表存儲(chǔ)模塊連接。首先編碼器的之字形掃描模塊對(duì)圖像塊預(yù)測(cè)殘差系數(shù)進(jìn)行傳統(tǒng)的之字形zig-zag掃描,形成圖像殘差系數(shù)塊的非零系數(shù)level和按之字形掃描順序該非零系數(shù)到其前第一個(gè)非零系數(shù)間值為0的系數(shù)個(gè)數(shù)run的數(shù)對(duì)序列(level,run),并存入編碼器的存儲(chǔ)緩沖區(qū)中。
然后,碼表選擇模塊根據(jù)塊殘差系數(shù)的類型經(jīng)與二維變長(zhǎng)編碼碼表存儲(chǔ)模塊中的碼表比較確定編碼當(dāng)前系數(shù)塊的碼表類型。碼表選擇模塊根據(jù)上下文信息從所選類型的多個(gè)碼表中選擇一個(gè)碼表送入變長(zhǎng)編碼模塊進(jìn)行編碼;本發(fā)明中碼表選擇模塊用來選擇碼表的上下文信息包括1、預(yù)測(cè)殘差系數(shù)類型本發(fā)明將預(yù)測(cè)殘差系數(shù)分為3類,采用幀內(nèi)預(yù)測(cè)所得到的亮度分量殘差系數(shù)luma_intra、采用幀間預(yù)測(cè)所得到的亮度分量殘差系數(shù)luma_inter和采用幀內(nèi)幀間預(yù)測(cè)所得到的色度分量的殘差系數(shù)chroma。針對(duì)以上3類殘差系數(shù),本發(fā)明有3類碼表,即幀內(nèi)預(yù)測(cè)亮度分量殘差系數(shù)碼表、幀間預(yù)測(cè)亮度分量殘差系數(shù)碼表和幀內(nèi)幀間預(yù)測(cè)色度分量殘差系數(shù)碼表分別用于其編碼。
2、量化參數(shù)量化參數(shù)的不同會(huì)導(dǎo)致量化后的殘差系數(shù)具有不同的分布,例如殘差系數(shù)經(jīng)大的量化參數(shù)量化后,非零系數(shù)個(gè)數(shù)減少很多,非零系數(shù)的值也變得很小,這樣經(jīng)之字形掃描形成的(level,run)數(shù)對(duì),level值較小,run值較大;而經(jīng)小的量化參數(shù)量化后,殘差系數(shù)非零系數(shù)個(gè)數(shù)減少的幅度小一些,其值也減小的少一些,這樣經(jīng)之字形掃描形成的(level,run)數(shù)對(duì),level值較大,run值較小。因此殘差系數(shù)經(jīng)不同的量化參數(shù)量化后其分布是不同的,所以量化參數(shù)是一種有效的上下文信息,可用來進(jìn)行碼表選擇。
3、宏塊編碼模式先進(jìn)的視頻編碼標(biāo)準(zhǔn)如H.264及AVS-M對(duì)宏塊進(jìn)行編碼時(shí)都采用了多模式擇優(yōu)編碼的策略。在I幀編碼時(shí)采用多方向預(yù)測(cè)技術(shù),多個(gè)預(yù)測(cè)方向即對(duì)應(yīng)著多個(gè)編碼模式;在P幀編碼時(shí)采用可變塊大小的幀間運(yùn)動(dòng)估計(jì)技術(shù),塊大小的不同也對(duì)應(yīng)著多種模式;B幀編碼時(shí),在P幀可變塊大小幀間運(yùn)動(dòng)估計(jì)技術(shù)的基礎(chǔ)上,又增加了前向預(yù)測(cè)、后向預(yù)測(cè)、雙向預(yù)測(cè)的情況,因此又衍生出更多的編碼模式。編碼模式也是一種上下文信息,編碼模式的不同也會(huì)造成殘差系數(shù)的分布不同,而碼表正是針對(duì)不同分布設(shè)計(jì)的,因此可利用以上這些編碼模式信息作為熵編碼器進(jìn)行碼表選擇的依據(jù)。本發(fā)明便利用這些編碼模式信息進(jìn)行熵編碼器的碼表選擇。
如圖3宏塊幀間編碼模式圖所示。P幀宏塊像素大小為16×16,其幀間編碼模式包括inter16×16、inter16×8、inter8×16、P8×8,對(duì)于P8×8模式下的8×8子塊,還有inter8×8、inter8×4、inter4×8、inter4×4四種模式,這些編碼模式都對(duì)應(yīng)著,對(duì)宏塊進(jìn)行幀間運(yùn)動(dòng)估計(jì)時(shí),宏塊被分割成若干部分,每個(gè)部分進(jìn)行單獨(dú)的運(yùn)動(dòng)估計(jì)并有單獨(dú)的運(yùn)動(dòng)矢量。最終選擇最佳的模式對(duì)當(dāng)前宏塊進(jìn)行編碼。
最后,判斷數(shù)對(duì)序列是否包含在碼表中,如果是則直接從碼表中查表得到用于其編碼的碼字編號(hào),否則計(jì)算得到用于其編碼的碼字編號(hào),根據(jù)當(dāng)前碼表采用的碼字類型及其階數(shù),按碼字編號(hào)計(jì)算得到數(shù)對(duì)序列的編碼碼字,寫進(jìn)碼流,判斷是否編完所有數(shù)對(duì)序列,不是則繼續(xù)判斷數(shù)對(duì)序列是否包含在碼表和編碼,否則則采用當(dāng)前碼表編碼塊結(jié)束標(biāo)志,完成此塊的編碼,為保持較低的計(jì)算復(fù)雜度,本發(fā)明采用變長(zhǎng)編碼方法,采用包括數(shù)對(duì)序列(level,run)和塊結(jié)束標(biāo)志的EOB的2D-VLC技術(shù)。同時(shí),為保持多碼表較低的內(nèi)存需求,本發(fā)明采用具有規(guī)則結(jié)構(gòu)的指數(shù)型哥倫布(Golomb)碼及混合型哥倫布(Golomb)碼。由于指數(shù)型Golomb碼及混合型Golomb碼具有規(guī)則結(jié)構(gòu),碼字由若干個(gè)0、一個(gè)1加上若干信息比特位構(gòu)成,而信息比特位的值與碼字編號(hào)的值有較直接的可用公式描述的關(guān)系,因此由碼字編號(hào)計(jì)算生成碼字不會(huì)有高的復(fù)雜度,碼字可以在較低計(jì)算復(fù)雜度的前提下實(shí)時(shí)生成,這使得碼表存儲(chǔ)的是從信源符號(hào)到編碼碼字之間的映射關(guān)系,而非真實(shí)的變長(zhǎng)碼字如MPEG-2標(biāo)準(zhǔn)熵編碼器的哈夫曼(Huffman)碼,因此,碼表內(nèi)存需求低,即使采用多碼表也保持了較低的碼表存儲(chǔ)空間。
本發(fā)明采用4個(gè)luma_intra型碼表(VLCx_intra,x=0~3)、9個(gè)luma_inter型碼表(VLCx_inter,x=0~8)分別編碼幀內(nèi)型及幀間型宏塊的亮度殘差系數(shù),采用另1個(gè)碼表(VLC_chroma)編碼色度殘差系數(shù),這些碼表都為2D-VLC碼表,其形式如表1所示。
表1 VLC_chroma碼表
每個(gè)碼表定義了(level,run)及EOB與碼字之間的映射關(guān)系,即碼字編號(hào)CodeNumber,如表1中深色部分?jǐn)?shù)字。表1中只列出level>0情況下(level,run)的CodeNumber的分配情況,level<0時(shí)的(level,run)的CodeNumber分配方法如下CodeNumber(-abs(level),run)=Code_Number(abs(level),run)+1。
可以看到2D-VLC碼表中所含CodeNumber范圍為0~38,這是一個(gè)經(jīng)驗(yàn)值,也可以是更大或更小的范圍,對(duì)于超出碼表范圍的(level,run)采用特定的規(guī)則為其分配CodeNumber。
每個(gè)碼表采用指數(shù)型Exp-Golomb碼或混合型Hybrid-Golomb碼。
表2列出了部分Exp-Golomb碼的碼字結(jié)構(gòu),CodeNumber與碼字的對(duì)應(yīng)關(guān)系,以及采用此結(jié)構(gòu)碼的2D-VLC碼表。
表2 用于2D-VLC碼表的Exp-Golomb碼
表3列出了部分Hybrid-Golomb碼的碼字結(jié)構(gòu),CodeNumber與碼字的對(duì)應(yīng)關(guān)系,以及采用此結(jié)構(gòu)的2D-VLC碼表。
表3 用于2D-VLC碼表的Hybrid-Golomb碼
在表2和表3中INFO的值由下式計(jì)算INFO=Σi=0nxi·2i,]]>其中INFO為一個(gè)變量,其值由上式計(jì)算,用來確定一個(gè)變長(zhǎng)碼的碼字編號(hào),xi為表2和表3中碼字結(jié)構(gòu)欄的符號(hào),其取值為0或1,如表3中碼字結(jié)構(gòu)欄的第一行的碼字1x1x0,用xi,i=0,1來表示x1x0,而此時(shí)n的取值為1。
對(duì)于采用幀內(nèi)預(yù)測(cè)得到的亮度殘差系數(shù)(luma_intra),用量化參數(shù)QP(Quantization Parameter)選擇碼表,對(duì)于幀間預(yù)測(cè)得到的亮度殘差系數(shù)(luma_inter)用量化參數(shù)和幀間預(yù)測(cè)模式選擇碼表,幀間預(yù)測(cè)模式包括inter16×16、inter16×8、inter8×16、inter8×8、inter8×4、inter4×8、inter4×4。對(duì)于色度系數(shù)(chroma),采用1個(gè)單獨(dú)的碼表編解碼。
對(duì)于chroma系數(shù)的編解碼,在所有QP范圍內(nèi),在各種編碼模式下,用碼表VLC_chroma編解碼。對(duì)于luma_intra系數(shù)的編解碼,當(dāng)QP<=29時(shí),選擇碼表VLC0_intra編解碼;當(dāng)30<=QP<=33時(shí),選擇碼表VLC1_intra編解碼;當(dāng)34<=QP<=37時(shí),選擇碼表VLC2_intra編解碼;當(dāng)38<=QP時(shí),選擇碼表VLC3_intra編解碼。對(duì)于luma_inter系數(shù)的編解碼,根據(jù)當(dāng)前宏塊的QP值和4×4塊所在宏塊或8×8子塊的預(yù)測(cè)模式選擇碼表,選擇規(guī)則如表4所示。
表4 幀間預(yù)測(cè)殘差系數(shù)的碼表選擇
對(duì)編碼端來說,當(dāng)(level,run)超出碼表范圍時(shí),表示不能從碼表中直接查表得到當(dāng)前(level,run)所對(duì)應(yīng)的CodeNumber值。這時(shí)須用特定的規(guī)則計(jì)算當(dāng)前(level,run)的CodeNumber,其規(guī)則如下按下述公式計(jì)算碼字編號(hào)碼字編號(hào)=(abs(level)-LEVRUN[run])*32+8+run*2并判斷數(shù)對(duì)序列的經(jīng)變換和量化后的殘差圖像塊的非零系數(shù)是否小于0,不是則將碼字編號(hào)遞減1,是則保持碼字編號(hào)的原值。其中,level為經(jīng)過離散余弦變換和量化后的殘差圖像塊的非零系數(shù),run為按之字形掃描順序該非零系數(shù)到其前第一個(gè)非零系數(shù)間值為0的系數(shù)個(gè)數(shù),LEVRUN[]為當(dāng)前碼表中所包含的(level,run)數(shù)對(duì)的最大abs(level)值。對(duì)于表1中所示的2D-VLC碼表,數(shù)組LEVRUN
的取值為L(zhǎng)EVRUN[16]={9,3,2,2,1,1,1,0,0,0,0,0,0,0,0,0};參閱圖5,本發(fā)明一個(gè)實(shí)施例4×4殘差系數(shù)塊的編碼方法圖。
步驟1、對(duì)4×4圖像塊殘差系數(shù)zig-zag掃描形成(level,run)數(shù)對(duì)序列;步驟2、根據(jù)系數(shù)塊類型(inter_luma,intra_luma,chroma)選擇編碼當(dāng)前系數(shù)塊的碼表類型;步驟3、根據(jù)4×4殘差塊所在宏塊所采用的量化參數(shù)及所在宏塊或8×8子塊的編碼模式選擇編碼碼表;步驟4、采用當(dāng)前碼表,按zig-zag掃描形成(level,run)數(shù)對(duì)的先后順序,對(duì)掃描形成的(level,run)數(shù)對(duì)序列編碼,如果(level,run)包含在碼表當(dāng)中,則直接從碼表中查表得到用于其編碼的碼字編號(hào)CodeNumber,如果(level,run)超出碼表范圍,則根據(jù)特定規(guī)則計(jì)算得到用于其編碼的碼字編號(hào)CodeNumber,根據(jù)當(dāng)前碼表采用的碼字類型及其階數(shù),按CodeNumber計(jì)算得到(level,run)的編碼碼字,寫進(jìn)碼流;步驟5、重復(fù)步驟1、2、3,直到編碼完所有(level,run)數(shù)對(duì),否則采用當(dāng)前碼表編碼塊結(jié)束標(biāo)志EOB,完成此塊的編碼。
請(qǐng)參閱圖6、圖7,本發(fā)明基于上下文的多碼表解碼裝置構(gòu)成框圖及解碼方法流程圖。
本發(fā)明基于上下文的多碼表變長(zhǎng)解碼裝置與編碼裝置構(gòu)成是相同的,只不過是數(shù)據(jù)流的方向不一樣,變長(zhǎng)編碼器改為變長(zhǎng)解碼器,包括用于將解碼的數(shù)對(duì)序列進(jìn)行反之字形掃描并還原為圖像塊預(yù)測(cè)殘差系數(shù)的之字形掃描模塊、用于存儲(chǔ)數(shù)對(duì)序列的存儲(chǔ)緩沖區(qū)、變長(zhǎng)解碼模塊,用于存儲(chǔ)二維碼表的二維變長(zhǎng)編碼碼表存儲(chǔ)模塊,該裝置還包括用于選擇殘差系數(shù)塊類型、宏塊量化參數(shù)、宏塊或子塊編碼模式的多個(gè)碼表的碼表選擇模塊,該模塊輸入端連接殘差系數(shù)塊類型、宏塊量化參數(shù)、宏塊或子塊編碼模式輸入信號(hào)線,其碼表編號(hào)輸出端連接變長(zhǎng)解碼模塊,其碼表類型比較端與二維變長(zhǎng)編碼碼表存儲(chǔ)模塊連接。
解碼與編碼是互逆的過程。以4×4殘差系數(shù)塊為例,具體的解碼方法如下步驟1、根據(jù)系數(shù)塊類型(inter_luma,intra_luma,chroma)選擇解碼當(dāng)前系數(shù)塊的碼表類型;步驟2、根據(jù)4×4殘差塊所在宏塊所采用的量化參數(shù)及所在宏塊或8×8子塊的編碼模式選擇解碼碼表;步驟3、根據(jù)當(dāng)前碼表的碼字類型Exp-Golomb碼或Hybrid-Golomb碼及其階數(shù),從碼流中解析出CodeNumber,如果CodeNumber>=39,用特定規(guī)則解碼CodeNumber得到(level,run),如果CodeNumber<39,查當(dāng)前碼表解碼CodeNumber,得到一個(gè)語法元素,如果語法元素為EOB,則當(dāng)前塊系數(shù)解碼完畢結(jié)束解碼,如果語法元素為(level,run)數(shù)對(duì),將當(dāng)前(level,run)數(shù)對(duì)存入緩沖區(qū),從碼流中解析下一個(gè)CodeNumber;步驟4、用zig-zag掃描的方法將已解碼的(level,run)還原為塊殘差系數(shù)。
如果從碼流中解析出的CodeNumber>=39,表示不能從當(dāng)前碼表中直接查表得到CodeNumber所對(duì)應(yīng)的(level,run)。這時(shí),需用特定的規(guī)則計(jì)算得到(level,run)。其過程如下如果碼字編號(hào)的二進(jìn)制表示其末尾比特為1,則置標(biāo)志變量sign為0,并將碼字編號(hào)增1,否則標(biāo)志變量sign為1,按下列方法求得run和level。
run=((CodeNumber-8)%32)/2;level=((CodeNumber-8)/32)+LEVRUN[run]。
如果標(biāo)志變量為1,將由上式得到的level值取反。
以上實(shí)施例僅用以說明而非限制本發(fā)明的技術(shù)方案,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解可以對(duì)本發(fā)明進(jìn)行修改或者等同替換,而不脫離本發(fā)明的精神和范圍的任何修改或局部替換,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
1.一種基于上下文的多碼表變長(zhǎng)編碼方法,其特征在于,該方法包括以下步驟步驟1之字形掃描模塊對(duì)圖像塊預(yù)測(cè)殘差系數(shù)進(jìn)行之字形掃描,形成圖像塊的非零系數(shù)和按之字形掃描順序該非零系數(shù)到其前第一個(gè)非零系數(shù)間值為0的系數(shù)個(gè)數(shù)的數(shù)對(duì)序列并將數(shù)對(duì)序列存入存儲(chǔ)緩沖區(qū)中;步驟2碼表選擇模塊根據(jù)殘差系數(shù)的類型經(jīng)與二維變長(zhǎng)編碼碼表存儲(chǔ)模塊中的碼表比較確定編碼當(dāng)前系數(shù)塊的碼表類型;步驟3碼表選擇模塊根據(jù)殘差系數(shù)的圖像塊所在宏塊采用的量化參數(shù)及所在宏塊或子塊的編碼模式,從所選類型的多個(gè)碼表中選擇一個(gè)碼表送入變長(zhǎng)編碼模塊;步驟4變長(zhǎng)編碼模塊根據(jù)所選定的碼表將存儲(chǔ)緩沖區(qū)中數(shù)對(duì)序列的每個(gè)數(shù)對(duì)及塊結(jié)束標(biāo)志映射為變長(zhǎng)碼,并將編碼后的變長(zhǎng)碼寫進(jìn)碼流中。
2.根據(jù)權(quán)利要求1所述的基于上下文的多碼表變長(zhǎng)編碼方法,其特征在于,所述步驟1中的圖像塊預(yù)測(cè)殘差系數(shù)的類型包括幀內(nèi)預(yù)測(cè)所得到的亮度分量殘差系數(shù)類型、幀間預(yù)測(cè)得到的亮度分量殘差系數(shù)類型和幀內(nèi)幀間預(yù)測(cè)得到的色度分量殘差系數(shù)類型。
3.根據(jù)權(quán)利要求1所述的基于上下文的多碼表變長(zhǎng)編碼方法,其特征在于,所述步驟3中的碼表是包括幀內(nèi)預(yù)測(cè)得到的亮度分量殘差系數(shù)類型、幀間預(yù)測(cè)得到的亮度分量殘差系數(shù)類型及幀內(nèi)幀間預(yù)測(cè)色度分量殘差系數(shù)類型的一個(gè)或一個(gè)以上碼表。
4.根據(jù)權(quán)利要求1所述的基于上下文的多碼表變長(zhǎng)編碼方法,其特征在于,所述步驟3中的宏塊或子塊編碼模式包括幀內(nèi)預(yù)測(cè)宏塊模式和幀間預(yù)測(cè)宏塊模式,幀內(nèi)預(yù)測(cè)宏塊模式為幀內(nèi)預(yù)測(cè)的方向,幀間預(yù)測(cè)宏塊模式為宏塊的幀間預(yù)測(cè)方式,預(yù)測(cè)方向包括前向預(yù)測(cè)、后向預(yù)測(cè)、雙向預(yù)測(cè),預(yù)測(cè)方式為把宏塊分割為不同塊大小所對(duì)應(yīng)的預(yù)測(cè)方式。
5.根據(jù)權(quán)利要求1所述的基于上下文的多碼表變長(zhǎng)編碼方法,其特征在于,所述步驟3中的從多個(gè)碼表中選擇一個(gè)碼表的方法包括根據(jù)殘差系數(shù)的圖像塊所在宏塊采用的量化參數(shù)選擇碼表、根據(jù)殘差系數(shù)圖像塊所在宏塊或子塊編碼模式選擇碼表和同時(shí)根據(jù)量化參數(shù)與編碼模式選擇碼表三種方法。
6.根據(jù)權(quán)利要求1所述的基于上下文的多碼表變長(zhǎng)編碼方法,其特征在于,所述步驟4進(jìn)一步包括下述步驟步驟41、判斷數(shù)對(duì)序列中的數(shù)對(duì)是否包含在碼表中,如果是則直接從碼表中查表得到用于其編碼的碼字編號(hào),否則計(jì)算得到用于其編碼的碼字編號(hào);步驟42、根據(jù)當(dāng)前碼表采用的碼字類型及其階數(shù),按碼字編號(hào)計(jì)算得到數(shù)對(duì)的變長(zhǎng)碼,寫進(jìn)碼流;步驟43、判斷是否編完數(shù)對(duì)序列中的所有數(shù)對(duì),是則采用當(dāng)前碼表編碼塊結(jié)束標(biāo)志,完成此塊的編碼,否則轉(zhuǎn)步驟41。
7.根據(jù)權(quán)利要求6所述的多碼表上下文變長(zhǎng)編碼方法,其特征在于,所述步驟41中的計(jì)算具體為按公式碼字編號(hào)=(abs(level)-LEVRUN[run])*32+8+run*2計(jì)算碼字編號(hào)并判斷數(shù)對(duì)序列經(jīng)變換和量化后的殘差圖像塊的非零系數(shù)是否小于0,不是則將碼字編號(hào)遞減1,是則保持碼字編號(hào)的原值,其中,level為經(jīng)過離散余弦變換和量化后的殘差系數(shù)的圖像塊的非零系數(shù),run為按之字形掃描順序該非零系數(shù)到其前第一個(gè)非零系數(shù)間值為0的系數(shù)個(gè)數(shù),LEVRUN[]為當(dāng)前碼表中所包含的(level,run)數(shù)對(duì)的最大abs(level)值。
8.根據(jù)權(quán)利要求6所述的多碼表上下文變長(zhǎng)編碼方法,其特征在于,所述步驟42中的碼字類型是指數(shù)型哥倫布碼。
9.根據(jù)權(quán)利要求7所述的多碼表上下文變長(zhǎng)編碼方法,其特征在于,所述步驟42中的碼字類型是混合型哥倫布碼。
10.實(shí)施權(quán)利要求1所述的基于上下文的多碼表變長(zhǎng)編碼方法的編碼裝置,包括用于對(duì)圖像塊預(yù)測(cè)殘差系數(shù)進(jìn)行掃描的之字形掃描模塊、用于存儲(chǔ)數(shù)對(duì)序列的存儲(chǔ)緩沖區(qū)、變長(zhǎng)編碼模塊,用于存儲(chǔ)二維碼表的二維變長(zhǎng)編碼碼表存儲(chǔ)模塊,其特征在于,該裝置還包括用于選擇圖像塊預(yù)測(cè)殘差系數(shù)類型、宏塊量化參數(shù)、宏塊或子塊編碼模式的多個(gè)碼表的碼表選擇模塊,該模塊輸入端連接殘差系數(shù)類型、宏塊量化參數(shù)、宏塊或子塊編碼模式輸入信號(hào)線,其碼表編號(hào)輸出端連接變長(zhǎng)編碼模塊,其碼表類型比較端與二維變長(zhǎng)編碼碼表存儲(chǔ)模塊連接。
11.一種基于上下文的多碼表變長(zhǎng)解碼方法,其特征在于,該方法包括以下步驟步驟一、碼表選擇模塊根據(jù)圖像塊預(yù)測(cè)殘差系數(shù)類型選擇解碼當(dāng)前殘差系數(shù)塊的碼表類型;步驟二、碼表選擇模塊根據(jù)預(yù)測(cè)殘差系數(shù)的圖像塊在宏塊所采用的量化參數(shù)及所在宏塊或子塊的編碼模式從所選類型的多個(gè)碼表中選擇一個(gè)碼表進(jìn)行解碼;步驟三、變長(zhǎng)解碼模塊根據(jù)當(dāng)前碼表從變長(zhǎng)碼碼流中解碼出當(dāng)前預(yù)測(cè)殘差系數(shù)塊的所有數(shù)對(duì)序列,并存入存儲(chǔ)緩沖區(qū)中;步驟四、之字形掃描模塊按反之字形掃描順序?qū)⒁呀獯a的上述數(shù)對(duì)序列還原為圖像塊預(yù)測(cè)殘差系數(shù)。
12.實(shí)施權(quán)利要求11所述的基于上下文的多碼表變長(zhǎng)解碼方法的解碼裝置,包括用于對(duì)解碼的數(shù)對(duì)序列進(jìn)行反之字掃描的之字形掃描模塊、用于存儲(chǔ)數(shù)對(duì)序列的存儲(chǔ)緩沖區(qū)、變長(zhǎng)解碼模塊,用于存儲(chǔ)二維碼表的二維變長(zhǎng)編碼碼表存儲(chǔ)模塊,其特征在于,該裝置還包括用于選擇圖像塊預(yù)測(cè)殘差系數(shù)類型、宏塊量化參數(shù)、宏塊或子塊編碼模式的多個(gè)碼表的碼表選擇模塊,該模塊輸入端連接殘差系數(shù)塊類型、宏塊量化參數(shù)、宏塊或子塊編碼模式輸入信號(hào)線,其碼表編號(hào)輸出端連接變長(zhǎng)解碼模塊,其碼表類型比較端與二維變長(zhǎng)編碼碼表存儲(chǔ)模塊連接。
全文摘要
本發(fā)明是一種基于上下文的多碼表變長(zhǎng)編解碼方法及編解碼裝置。編碼方法包括對(duì)塊殘差系數(shù)進(jìn)行之字形掃描形成數(shù)對(duì)序列并將其存入存儲(chǔ)緩沖區(qū)中;碼表選擇模塊根據(jù)塊殘差系數(shù)的類型經(jīng)與二維變長(zhǎng)編碼碼表存儲(chǔ)模塊中的碼表比較確定編碼當(dāng)前系數(shù)塊的碼表類型;并根據(jù)其所在宏塊采用的量化參數(shù)及宏塊或子塊的編碼模式從該類型的多個(gè)碼表中選擇一個(gè)碼表送入變長(zhǎng)編碼模塊;變長(zhǎng)編碼模塊根據(jù)所選定的碼表將存儲(chǔ)緩沖區(qū)中數(shù)對(duì)序列的每個(gè)數(shù)對(duì)及塊結(jié)束標(biāo)志映射為變長(zhǎng)碼并寫進(jìn)碼流中。解碼器解碼方法是編碼過程的逆過程。本發(fā)明有多個(gè)碼表,提高了編解碼的效率,采用指數(shù)型與混合型哥倫布碼,降低了碼表存儲(chǔ)空間及編解碼計(jì)算復(fù)雜度。
文檔編號(hào)H04N7/32GK1589023SQ20041005840
公開日2005年3月2日 申請(qǐng)日期2004年8月6日 優(yōu)先權(quán)日2004年8月6日
發(fā)明者高文, 趙德斌, 王強(qiáng), 馬思偉 申請(qǐng)人:聯(lián)合信源數(shù)字音視頻技術(shù)(北京)有限公司