專利名稱::一種并行類熵編碼方法及其裝置的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及一種類熵編碼方法及其裝置,尤其涉及一種并行類熵編碼方法及其裝置,屬于視頻編解碼領(lǐng)域。
背景技術(shù):
:在傳統(tǒng)的圖像、視頻壓縮里,熵編碼器作為不可或缺的一個組成部分處于編碼最后一個環(huán)節(jié),用于把已經(jīng)處理過的圖像數(shù)據(jù)用最短的Ol比特串表示。AVS標(biāo)準(zhǔn)是擁有獨(dú)立產(chǎn)權(quán)和自主創(chuàng)新技術(shù)的新型視頻編碼技術(shù),目前視頻部分(AVS-P2)已經(jīng)正式成為國家標(biāo)準(zhǔn)。AVS視頻編碼面向高清廣播電視和音響視頻,在實(shí)時編碼中,單位時間里要處理大量的數(shù)據(jù)信息,純軟件的編碼實(shí)現(xiàn)幾乎不可能,因此,編碼器的硬件加速必不可少。本發(fā)明是AVS編碼器硬件加速實(shí)現(xiàn)中的一個環(huán)節(jié),在編碼器中,熵編碼部分的復(fù)雜度大約占整個編碼復(fù)雜度的30%,這個過程主要是對每個系數(shù)串行的之字形(zig-zag)掃描來求得編碼每個系數(shù)的(run,level),根據(jù)系數(shù)的(run,level)再查相應(yīng)的Golomb碼表得到相應(yīng)表示的比特?cái)?shù)。AVS熵編碼采用自適應(yīng)變長編碼技術(shù)。在AVS熵編碼過程中,所有的語法元素和殘差數(shù)據(jù)都是以指數(shù)哥倫布碼的形式映射成二進(jìn)制比特流。對預(yù)測殘差的塊變換系數(shù),經(jīng)掃描形成(run、level)對串,level、run不是獨(dú)立事件,而存在著很強(qiáng)的相關(guān)性,在AVS中l(wèi)evel、run采用二維聯(lián)合編碼,并根據(jù)當(dāng)前l(fā)evel、run的不同概率分布趨勢,自適應(yīng)改變指數(shù)哥倫布碼的階數(shù)。通過觀察殘差系數(shù)的(run,level)對,發(fā)現(xiàn)level幅值具有遞增的趨勢,而run的值有遞減的趨勢,并且一個有較大level值的(run,level)數(shù)對其run值通常較小,這也就是說在序列編碼的不同階段(run,level)的局部概率分布是不一樣的。基于這些統(tǒng)計(jì)規(guī)律,采用多個2D-VLC碼表匹配(run,level)的局部概率分布,并且,level幅值的遞增可以識別局部概率分布的變化,即利用level幅值進(jìn)行碼表的自動切換。在AVS-P2標(biāo)準(zhǔn)里,熵編碼總共用到19張2D-VLC表,每個碼表都采用指數(shù)哥倫布(Exp-Golomb)碼,不同類型的變換塊(包括幀內(nèi),幀間和色度塊)分別使用不同的碼表,7個幀內(nèi)(intra)碼表、7個幀間(inter)碼表和5個色度(chroma)碼表分別用于編碼幀內(nèi)、幀間和色度塊的變換系數(shù)。這些碼表都為2D-VLC碼表,每個碼表定義了(level,歷)及EOB(endofblock)與code誦ber之間的映射關(guān)系,code醒ber范圍為059,59表示escape—code(溢出碼),圖1給出了現(xiàn)有方法中熵編碼器的流程圖。
發(fā)明內(nèi)容本發(fā)明針對AVS熵編碼器,提供了一種高效的硬件加速實(shí)現(xiàn)。本發(fā)明的目的在于提供一種并行類熵編碼方法及其基于硬件加速的AVS類熵編碼裝置,以提高編碼器的速度,從而達(dá)到實(shí)現(xiàn)高清編碼的實(shí)時。本發(fā)明的技術(shù)方案為一種并行類熵編碼方法,其步驟為-1)將每個變換塊的量化系數(shù)分組并行輸入輸出于兩寄存器組;2)同一時鐘內(nèi)計(jì)算每組量化系數(shù)的編碼系數(shù)(run,level);3)將編碼系數(shù)(run,level)進(jìn)行倒序輸出;4)根據(jù)輸出的已編碼系數(shù)中的level最大值選擇當(dāng)前量化系數(shù)的碼表;5)根據(jù)該變換塊中所有編碼系數(shù)的level最大值選擇該變換塊EOB的碼表;6)將上述選擇的碼表轉(zhuǎn)換為位寬表,并計(jì)算該變換塊編碼比特?cái)?shù)。所述變換塊為8x8塊,所述8x8塊的量化系數(shù)以行為單位分為8組數(shù)據(jù)。所述量化系數(shù)分組并行輸入輸出于兩寄存器組的方法為a)在一個時鐘內(nèi)將一組量化系數(shù)存入一寄存器組;b)將該變換塊按組全部輸入到該寄存器組后,在下一時鐘從該寄存器組按照zig-zag的順序按組輸出量化系數(shù),同時從該時鐘開始將后續(xù)分組量化系數(shù)輸入另一寄存器組;c)重復(fù)上述步驟a)和b),實(shí)現(xiàn)兩寄存器組的乒乓操作。所述方法中采用游程編碼的方法計(jì)算所述每組量化系數(shù)的編碼系數(shù)(run,level),同時在該變換塊的第一個非零量化系數(shù)上標(biāo)識EOB符號。所述編碼系數(shù)的level值為量化系數(shù)的絕對值;所述編碼系數(shù)的run值計(jì)算方法為設(shè)定一變量baseO用于給run值賦值、一變量basel用于記錄每組量化系數(shù)末尾相鄰0的個數(shù),和一計(jì)數(shù)器counter用于記錄該變換塊的行數(shù);counter=0,base0=0;counter!=0時,如果baseh8,下一組量化系數(shù)的baseO=baseO+basel,如果basel!=8,下一組量化系數(shù)的baseO二basel。一種并行類熵編碼裝置,其包括依次連接的數(shù)據(jù)輸入轉(zhuǎn)存模塊、游程編碼模塊、倒序矩陣模塊、碼表選擇模塊、查表模塊、哥倫布編碼模塊、加和變換塊的比特?cái)?shù)模塊;所述數(shù)據(jù)輸入轉(zhuǎn)存模塊用于處理每組并行輸入的量化系數(shù),其包括兩存儲矩陣用來實(shí)現(xiàn)數(shù)據(jù)輸入輸出的乒乓操作;所述游程編碼模塊用于在同一時鐘內(nèi)計(jì)算寄存器組中輸入的每組量化系數(shù)的編碼系數(shù)(run,level),所述倒序矩陣模塊用于完成變換塊的編碼系數(shù)(run,level)倒序輸出;所述碼表選擇模塊用于根據(jù)當(dāng)前倒序輸出的編碼系數(shù)(run,level)確定當(dāng)前量化系數(shù)的碼表和該變換塊EOB的碼表;所述査表模塊用于將得到的碼表映射為對應(yīng)的碼字;所述哥倫布編碼模塊用于將碼字轉(zhuǎn)換為位寬,得到碼表對應(yīng)的位寬表;所述加和變換塊的比特?cái)?shù)模塊用于根據(jù)位寬表計(jì)算當(dāng)前變換塊所有量化系數(shù)的編碼比特?cái)?shù)。所述游程編碼模塊包括一符號位比較器、一計(jì)數(shù)器和若干輸入數(shù)據(jù)比較器用于將每組輸入數(shù)據(jù)與零在同一時鐘內(nèi)進(jìn)行比較,所述輸入數(shù)據(jù)比較器分別與EOB比較器和該組末尾相鄰零個數(shù)比較器相連;所述EOB比較器與一選擇器連接,所述該組末尾相鄰零個數(shù)比較器經(jīng)一選擇器與run值比較器連接;所述計(jì)數(shù)器分別與所述的兩個選擇器連接。所述碼表選擇模塊的電路連接關(guān)系為用于比較變換塊輸入數(shù)據(jù)的若干輸入數(shù)據(jù)大小比較器分別與一確定系數(shù)前最大值比較電路、一選擇器;所述選擇器的輸出端分別與一EOB多路選擇器和所述確定系數(shù)前最大值比較電路連接;所述確定系數(shù)前最大值比較電路與若干并行的單級多路選擇器連接;所述選擇器和所述EOB多路選擇器分別與同一計(jì)數(shù)器的輸出端連接;與所述選擇器連接的若干輸入數(shù)據(jù)大小比較器輸出端與所述EOB多路選擇器連接,且所述EOB多路選擇器的輸出端與一碼表選定比較器連接。所述査表模塊的電路連接關(guān)系為碼表類型選通開關(guān)分別與碼表選通開關(guān)連接,所述碼表選通開關(guān)分別經(jīng)一比較器與另一碼表類型選通開關(guān)連接后再與一多路選擇器連接;所述碼表選通開關(guān)和所述多路選擇器分別與一碼表號輸入線連接;所述比較器和所述多路選擇器分別與輸入數(shù)據(jù)連接;所述多路選擇器對碼表inter—VLCO、inter_VLCl、inter_VLC2、inter—VLC3、intra—VLCO、intra—VLCl、intra—VLC2、intra—VLC3、chroma—VLCO、chroma_VLCl、chroma_VLC2的選擇信號參考每張碼表所對應(yīng)的所述level值,對碼表inter一VLC4、inter_VLC5、inter—VLC6、intra_VLC4、intra—VLC5、intra—VLC6、chroma_VLC3、chroma_VLC4的選擇信號參考每張碼表所對應(yīng)的所述run值。所述哥倫布編碼模塊的電路連接關(guān)系為輸入碼表號和碼表類型的級聯(lián)比較器經(jīng)移位器l與一加法器連接,且該加法器輸入端與level絕對值的輸出端連接,其輸出端與按位比較器l連接;所述級聯(lián)比較器經(jīng)另一移位器2與一加法器連接,且該加法器輸入端經(jīng)一選擇器l與level符號位的輸出端連接、經(jīng)一移位器3與run值輸出端連接,同時其輸出端與按位比較器2連接;所述按位比較器1和所述按位比較器2經(jīng)一加法器與一移位器4連接,所述移位器4和所述級聯(lián)比較器的兩輸出端經(jīng)一減法器與一選擇器2的輸入端連接;與所述移位器2連接的級聯(lián)比較器輸出端同時與一減法器連接,且該減法器的輸入端經(jīng)一移位器5與碼字的輸出端連接,同時該減法器的輸出端與所述選擇器2的輸入端連接;所述選擇器2輸入端與所述碼字輸出端連接。本發(fā)明所述并行AVS類熵編碼方法,包括1)量化數(shù)據(jù)的8并行輸入輸出為了進(jìn)一步提高硬件設(shè)計(jì)的速度,對于量化后的8x8塊的系數(shù)分8個時鐘載入寄存器,每個時鐘載入8個系數(shù),這8個按照自然順序輸入的系數(shù)按照Zig-Zag掃描的順序寄存在當(dāng)前寄存器組的相應(yīng)位置;2)兩組寄存器組的乒乓操作一個8x8塊的數(shù)據(jù)在8個時鐘載入一個寄存器組,這樣從第9個時鐘開始后續(xù)的操作陸續(xù)完成,并且每次輸出8個系數(shù)的處理結(jié)果,為了確保流水線的順利進(jìn)行,在第9個時鐘,另一個8x8塊的數(shù)據(jù)開始載入另一個結(jié)構(gòu)完全相同的寄存器組,這樣,從第9個時鐘開始,每次輸出前一個8x8塊的系數(shù)和載入當(dāng)前8x8塊的系數(shù)同時執(zhí)行,這樣,數(shù)據(jù)的輸入輸出連續(xù)不斷,并且以乒乓操作選擇在兩個寄存器組之間轉(zhuǎn)換;3)游程編碼的Zig-Zag掃描以及(run,level)的獲取,輸入8x8塊系數(shù)已經(jīng)按照Zig-Zag掃描的順序依次存儲在一個寄存器組里,游程編碼直接按順序計(jì)算每個系數(shù)的(run,level),但是,這里數(shù)據(jù)的輸入輸出是8并行的,即每次處理8個系數(shù),而run的確定不僅僅涉及當(dāng)前8個系數(shù),而且與前8個系數(shù)中的最后一個非零系數(shù)有關(guān),處理完當(dāng)前8個系數(shù)的(run,level)信息,需要記錄當(dāng)前8個系數(shù)中最后一個非零系數(shù)的run(即后面零的個數(shù)),作為后面相鄰8個系數(shù)計(jì)算nm值的基礎(chǔ);4)根據(jù)已經(jīng)編碼系數(shù)的最大值進(jìn)行碼表選擇熵編碼器軟件實(shí)現(xiàn)的碼表切換都是以前一個編碼系數(shù)的level值作為依據(jù),即當(dāng)前碼表的選擇必須要等到其前.一個系數(shù)的碼表確定后才能執(zhí)行,而本發(fā)明所述類熵編碼器的硬件設(shè)計(jì)方法是以8系數(shù)并行處理為基礎(chǔ)的,如果按照軟件實(shí)現(xiàn)的方法,那么需要8個時鐘才能處理完一組8并行系數(shù)。因此,基于軟件方法的功能,本發(fā)明修改了碼表切換的規(guī)則,即以當(dāng)前系數(shù)前已編碼系數(shù)的最大值作為碼表切換的依據(jù),這樣一個時鐘8個比較器就可以實(shí)現(xiàn)8個系數(shù)的碼表。而本發(fā)明所述類熵編碼器硬件功能完全與軟件實(shí)現(xiàn)一致。5)根據(jù)所有8x8塊系數(shù)的最大值確定編碼E0B選擇的碼表對于每個8x8塊,第一個非零系數(shù)前要加EOB,E0B與碼表一一對應(yīng)。在AVS熵編碼器中,系數(shù)的編碼從后往前倒序依次編碼,每個系數(shù)選擇的碼表都由其后面相鄰的非零系數(shù)決定,EOB碼表的確定跟系數(shù)相同,它選擇的碼表由第一個非零系數(shù)決定。但實(shí)質(zhì)上,根據(jù)方法4),EOB碼表的選擇由8x8塊所有系數(shù)的最大值確定。6)建立8x8塊系數(shù)的最大值與編碼EOB的比特?cái)?shù)之間的直接關(guān)系根據(jù)碼表與EOB之間一一映射的關(guān)系,本發(fā)明所述類熵編碼器硬件設(shè)計(jì)方法建立8x8塊系數(shù)最大值與EOB比特?cái)?shù)之間的直接關(guān)系,而不需通過相應(yīng)的碼表來確定E0B。7)碼表與位寬表之間的轉(zhuǎn)換通過邏輯判斷實(shí)現(xiàn)熵編碼器的位寬計(jì)算,由于每個系數(shù)編碼選擇的碼表,并不需要得到其精確的碼字,而是只要得到其位寬即可,故本發(fā)明在每張碼表跟位寬表之間作一轉(zhuǎn)換,直接把碼表中的codenumber映射為編碼該codenumber的比特?cái)?shù)。8)碼表中特殊情況的處理依照AVS標(biāo)準(zhǔn),在原始附錄碼表中查到的codenumber值還要做后續(xù)處理,即如果原始level為負(fù)數(shù),codenumber=codenumber+l,這樣碼表中查到的codenumber所需要的比特?cái)?shù)對于正、負(fù)數(shù)就有所不同,但大部分所對應(yīng)的位寬相同,除了個別幾個。這樣通過逐個分析每張碼表就可以對這些特殊的情況加以處理,從而得到每張碼表的位寬表。本發(fā)明所述AVS類熵編碼器硬件裝置,包括數(shù)據(jù)輸入轉(zhuǎn)儲模塊、游程編碼模塊、倒序矩陣模塊、碼表選擇模塊、査表模塊和Golomb編碼模塊、加和變換塊的比特?cái)?shù)模塊。1)數(shù)據(jù)輸入轉(zhuǎn)儲模塊用于處理并行輸入的系數(shù),按照Zig-Zag的掃描順序存儲輸入的系數(shù),使得轉(zhuǎn)儲以后的系數(shù)按逐行掃描的順序排列。2)本發(fā)明所述數(shù)據(jù)輸入轉(zhuǎn)儲模塊在硬件設(shè)計(jì)上使用了2個相同結(jié)構(gòu)的寄存器組,來達(dá)到乒乓操作的效果,如此達(dá)到對8x8塊的流水操作。3)本發(fā)明所述游程編碼模塊處理l)中并行輸入的數(shù)據(jù),得到每個系數(shù)的(run,level),由于輸入8x8塊系數(shù)的(run,level)之間的關(guān)聯(lián)性,當(dāng)前輸入的系數(shù)需要用到前面已經(jīng)處理系數(shù)run的信息,在硬件設(shè)計(jì)上需要增加一個記錄上一個8并行輸入系數(shù)的run,作為當(dāng)前8并行輸入數(shù)據(jù)計(jì)算run的基準(zhǔn)。4)本發(fā)明所述碼表選擇模塊根據(jù)硬件設(shè)計(jì)的需要,修改了標(biāo)準(zhǔn)所述根據(jù)上一個編碼系數(shù)的level值選擇當(dāng)前編碼系數(shù)的碼表,而是根據(jù)當(dāng)前8x8塊中當(dāng)前編碼系數(shù)前的系數(shù)的最大值來確定當(dāng)前系數(shù)的碼表,這樣,實(shí)質(zhì)上每個系數(shù)碼表的選擇彼此之間沒有依賴性,從而一個時鐘就可以處理完8個并行輸入的系數(shù)。5)本發(fā)明碼表選擇模塊4)同樣對于EOB碼表的選擇也不必等到第一個非零處理完才能確定,實(shí)質(zhì)上只需要計(jì)算所有系數(shù)的最大值就可以確定E0B的碼表了。6)本發(fā)明的倒敘模塊功能是根據(jù)AVS標(biāo)準(zhǔn)規(guī)定,完成變換塊的編碼系數(shù)倒序.基本方法就是利用一個8狀態(tài)的計(jì)數(shù)器counter,來控制數(shù)據(jù)的輸入和倒序輸出(如圖12所示)。7)本發(fā)明所述查表模塊根據(jù)"碼表選擇"模塊所確定的碼表,得到當(dāng)前系數(shù)的碼字,只是在預(yù)編碼階段,并不需要實(shí)際得到每個系數(shù)的真正碼字,而是只需要碼字的位寬,根據(jù)Golomb碼字的特點(diǎn)很容易得到每張碼表所對應(yīng)的位寬表,但需要處理一些特殊點(diǎn)的處理(如在一些設(shè)定的位置,由于數(shù)據(jù)的正負(fù)會影響碼字的位寬,我們需要用符號位做標(biāo)示)。8)根據(jù)6)所述,碼表轉(zhuǎn)化為位寬表中的特殊點(diǎn)為正負(fù)數(shù)不同的處理方法引起。9)本發(fā)明所述AVS類熵編碼器硬件裝置使用于預(yù)編碼時,碼表簡化為位寬表,而硬件設(shè)計(jì)上可以完全采用邏輯判斷實(shí)現(xiàn)査位寬表的功能。10)本發(fā)明所述Golomb編碼模塊,主要是將7)所得的位寬按照Golomb的不同階數(shù)進(jìn)行編碼,同時對于escape事件也計(jì)算所需要編碼的比特?cái)?shù)。11)本發(fā)明的數(shù)據(jù)加和變換塊的比特?cái)?shù)模塊的主要功能就是將變換塊的所有系數(shù)的編碼比特?cái)?shù)和E0B的編碼比特?cái)?shù)都加起來。本發(fā)明的積極效果傳統(tǒng)的熵編碼,需要完成整個熵編碼的各個部件,而且只能串行執(zhí)行,效率低下,這樣在高清視頻處理中很難做到實(shí)時編碼.采用本發(fā)明的并行類熵編碼裝置進(jìn)行熵編碼時,處理速度是傳統(tǒng)方法的8倍,大大改善了整個編碼器的性能.同時本發(fā)明在具體硬件實(shí)現(xiàn)上,優(yōu)化了最占資源的VLC表格,面積大量減??;并用邏輯判斷加以實(shí)現(xiàn),節(jié)省了大量硬件資源。圖l.AVS-P2二維變長編碼流程圖2.本發(fā)明的原理圖3.本發(fā)明的類熵編碼器裝置框圖;圖4.寄存器存儲分配;(a)正常之字形掃描順序,(b)輸出時對應(yīng)寄存器存儲地址圖5.游程編碼算法流程圖;圖6.游程編碼模塊的硬件流水線結(jié)構(gòu)圖;圖7.碼表選擇的算法流程圖;圖8.碼表選擇模塊的硬件流水線結(jié)構(gòu)圖;圖9.碼表R0M存儲;圖IO.查表模塊的硬件流水線結(jié)構(gòu)圖ll.Golomb編碼模塊的硬件流水線結(jié)構(gòu)圖;圖12.倒序原理圖。具體實(shí)施例方式下面結(jié)合附圖和具體實(shí)施方式對本發(fā)明作進(jìn)一步詳細(xì)的說明。為了實(shí)現(xiàn)硬件并行處理的優(yōu)勢,并最大限度地節(jié)約硬件設(shè)計(jì)的成本和解決硬件設(shè)計(jì)上預(yù)算法設(shè)計(jì)上的沖突,本發(fā)明提出了若干算法的等價(jià)方案,這些方案包括并行zig-zag掃描,游程編碼中系數(shù)的并行處理,消除碼表選擇系數(shù)間的依賴性,EOB碼表選擇的依據(jù),預(yù)編碼模塊查表運(yùn)算的簡化和硬件設(shè)計(jì)上查表運(yùn)算的邏輯實(shí)現(xiàn)。本發(fā)明的原理如圖2所示。本發(fā)明基于硬件實(shí)現(xiàn)的類熵編碼方法和裝置,包括用于圖像殘差數(shù)據(jù)并行輸入的倆寄存器組的乒乓操作,對圖像殘差系數(shù)進(jìn)行之字形掃描的游程編碼模塊,對于每個編碼系數(shù)選擇編碼所用的碼表的碼表選擇模塊,對于選定碼表后的編碼系數(shù)(run,level)映射為碼字的査表模塊,和把查表得到的codenum(碼字)映射為位寬(比特?cái)?shù))的Golomb編碼模塊。首先熵編碼前的模塊(包括運(yùn)動估計(jì)補(bǔ)償,變換量化)產(chǎn)生編碼的殘差系數(shù)以并行輸入并按照預(yù)定的次序寄存在兩個寄存器中的一個寄存器內(nèi),這個預(yù)定的次序就是按照將要進(jìn)行的之字形掃描的順序把各個系數(shù)安放在對應(yīng)的位置,這樣后面的游程編碼就可以按照自然順序依次每行從寄存器中取數(shù)并游程編碼,游程編碼的結(jié)果產(chǎn)生每個系數(shù)的(level,run),接著,對這些(level,run)根據(jù)level的值選擇碼表,這里AVS2D-VLC有19張用于系數(shù)編碼的碼表,每個系數(shù)的碼表由其level和已經(jīng)編碼的系數(shù)的level決定,然后,從每個碼表中取得的碼字再按照Golomb碼字的結(jié)構(gòu)和階數(shù)得到將要寫入碼流的位寬。這個過程涉及到的各個模塊將在下面詳細(xì)敘述。如圖3為本發(fā)明類熵編碼器的流水框圖,它包含以下子模塊1.數(shù)據(jù)的存儲分配變換量化后的數(shù)據(jù)位寬為12位,每個8x8塊的數(shù)據(jù)每次以一行進(jìn)入寄存器,按照zigzag掃描的結(jié)構(gòu)存儲在如圖4的寄存器組里。為了保證8并行流水線的順利進(jìn)行,該模塊采用了兩個8x8的寄存器組,每8個時鐘轉(zhuǎn)換一次。下面說明存儲矩陣內(nèi)部的轉(zhuǎn)換結(jié)構(gòu)。由于數(shù)據(jù)是8并行輸入,所以為了避免在進(jìn)行游程編碼上順序的沖突,我們在存儲時就將數(shù)據(jù)按照zig-zag的順序存入寄存器組,這種重新編排數(shù)據(jù)方式很好地解決了數(shù)據(jù)的并行處理。如圖4所示,zig-zag順序?yàn)?,1,8,16,9,2,3,10,17,24,分別對應(yīng)寄存器矩陣位置為O,1,2,3,4,5,6,7,8,9。以其中的一個矩陣為例,來說明數(shù)據(jù)流的時鐘安排第一個時鐘,將input的8個數(shù)據(jù)存到地址0,1,8,16,9,2,3,10;第二個時鐘,將input的數(shù)據(jù)存到17,24,32,25,18,11,4,5......;第8個時鐘,將input的數(shù)據(jù)存到53,60,61,54,47,55,62,63;到第9個時鐘,輸入的數(shù)據(jù)已經(jīng)轉(zhuǎn)到另外一個矩陣上了,并且當(dāng)前矩陣開始輸出數(shù)據(jù),0,1,8,16,9,2,3,10;第IO個時鐘,輸出17,24,32,25,18,11,4,5;第16個時鐘,輸出53,60,61,54,47,55,62,63。2.游程編碼游程編碼算法結(jié)構(gòu)如圖5所示,這個模塊的主要功能就是將寄存器組里的數(shù)進(jìn)行游程編碼,掃描矩陣的每個數(shù),對每個非零的系數(shù),分別產(chǎn)生一個(run,level)對,同時在第一個非零的系數(shù)上標(biāo)示EOB符號,所以對于每一個不全為零的block(cbp不為零)中都有一個E0B符號。level為輸入系數(shù)的絕對值,可以直接對輸入的系數(shù)求絕對值得到。關(guān)鍵是求nm,由于數(shù)據(jù)是并行輸入的,所以要構(gòu)造一個run的基準(zhǔn)變量,設(shè)為base0,假設(shè)數(shù)據(jù)是8并行輸入的,記為(a0,al,a2,a3,a4,a5,a6,a7},base0用來表示a0前相鄰0的個數(shù),這樣如果aO不等于0,a0的run等于base0;知道了a0的run,同一行里的a0,al,a2,a3,a4,a5,a6和a7的run就可以求得,如此,數(shù)據(jù)的并行處理就可以實(shí)現(xiàn),一個時鐘內(nèi)就可以處理完一行的數(shù)據(jù)。base0的計(jì)算按照如下方式進(jìn)行以8并行輸入為例,首先要有一個計(jì)數(shù)器counter從0到7,用來表示這段時鐘內(nèi)輸入的是同一個block的數(shù)據(jù)。很明顯,在counter=0時,base0=0(在輸入第一組8個數(shù)據(jù)時counte產(chǎn)O,也對應(yīng)第一個時鐘,counter等于幾就對應(yīng)第幾個時鐘);其他時候base0則是一個變化的量,為此,可以定義另外一個變量basel,basel表示輸入的該行8個數(shù)據(jù)中,最末尾的相鄰的零的個數(shù)。對于輸入的8個數(shù),例如對于0,12,3,0,0,4.,0,0;basel=2。對于l,0,3,0,0,0,3,7;basel=0。對于0,0,0,0,0,0,0,0;basel=8。綜上所述base0可以這樣確定,counter=0,base0=0;counter!=0時(即counter不等于0時,!=表示不等于),如果basel-8,下一行的base0=base0+basel,如果basel!=8,下一行的base0=basel如圖6所示,整個模塊的硬件結(jié)構(gòu)大致可以分為4級流水線,以8并行輸入為例說明4級流水過程第一級,主要若干并行的比較器和一個計(jì)數(shù)器控制。使用8個比較器分別產(chǎn)生每個輸入的系數(shù)是否為零的標(biāo)示符,記為sign—zero,比如所產(chǎn)生的8個標(biāo)識符分別為0、1、0、1、0、0、1、1,則記為sign—zero(sign_zero=01010011);計(jì)數(shù)為輸入有效數(shù)據(jù)的拍數(shù),每8拍為同一個block8x8的數(shù)據(jù)。第二級,主要包括兩個并行的找1邏輯。通過從sign—zero[7]到sign—zero[O]找1邏輯可以得到每一行中第一個非零的系數(shù),并標(biāo)示為l,其他為零。這樣每一行的E0B[7:0]就得到了。很明顯每行的EOB[7:0]中最多只有1個1,或者都是零。從sign—zero到sign—zero[7]找1邏輯可以得到該行最后一個非零系數(shù)后零的個數(shù),記為basel。第三級,主要包括兩個選擇器。利用counter選擇器對E0B加以控制,在同一個塊內(nèi),一旦出現(xiàn)了第一個非零系數(shù)后,就將以后的系數(shù)都標(biāo)示為O,保證每個變換快最多只出現(xiàn)1個E0B等于1的情況;另外一個選擇器是用來構(gòu)造每行第一個系數(shù)的run值,記為base0[5:0];在counter=0時,base0=0,其他時候如果basel!=8,base0〈=basel,如果basel=8,base0=8+baseO。第四級,主要包括8個比較器,用來得到每個系數(shù)的(run,level),這里要說明的是傳統(tǒng)的zig-zag,只編碼非零的系數(shù),由于我們這里采用的是8并行的結(jié)構(gòu),所以在輸入的系數(shù)等于零時,記(run=0,level=0),也參與編碼,只不過編碼需要的比特?cái)?shù)等于0。在第3級已經(jīng)知道了每行第一個系數(shù)前的run值base0,結(jié)合sign一zero[7:0],通過比較器很容易得到該行每個系數(shù)的(nm,level)。3.碼表選擇根據(jù)AVS標(biāo)準(zhǔn),初始變量maxAbsLevel(表示絕對值最大的level)為0,并且第一個非零系數(shù)選擇碼表VLC0。然后比較每個系數(shù)絕對值(abslevel)與maxAbsLevel的大小,如果abslevel大于maxAbsLevel,則發(fā)生碼表切換,否則碼表不變,切換碼表后將abslevel的值賦給maxAbsLevel,這樣循環(huán)往復(fù)地將每個系數(shù)解碼完成。就編碼器而言,編碼的下一個系數(shù)的碼表,取決于上一個系數(shù)選擇的碼表,以及上一個碼表的maxAbsLevel。由于我們現(xiàn)在采用的是并行的結(jié)構(gòu),顯然這樣的算法很難用硬件實(shí)現(xiàn)。我們通過分析得到這樣一個重要結(jié)論當(dāng)前系數(shù)選擇的碼表,僅由己編碼系數(shù)的最大值確定,所以只要我們能求得該系數(shù)前的最大值,即可得到該系數(shù)的碼表。根據(jù)以上結(jié)論碼表選擇的算法流程如圖7所示。算法步驟如下(以8并行輸入為例)第一步依次比較8個系數(shù)level值(level[(T7])得到8個最大值(記為max和maxlevell},此8個最大值分別定義為max(^maxUevel(H,maxl=max{levelO,levell},max2=max{levelO,levell,level2},......,max6=max{level06},maxlevell=max{level07},這里maxlevell表示輸入的該行中最大的數(shù)值;第二步確定8x8塊中已經(jīng)輸入數(shù)據(jù)的最大值,記為maxleve10。很顯然,counter=0時,maxlevelO=0;在counter!=0時,比較maxlevelO與maxlevell,取較大者為maxlevelO;第三步確定選擇碼表的參數(shù)值,記為tab—value07。根據(jù)我們的結(jié)論當(dāng)前系數(shù)選擇的碼表,僅由己編碼系數(shù)的最大值確定。很顯然,對輸入的8個系數(shù)level07,level0的碼表由tab—valueO=maxlevelO的大小確定;levell的碼表由tab—valuel=max{maxlevelO,raaxO)確定,......,level7的碼表由tab—value7=max{maxlevelO,max6}確定;第四步依據(jù)AVS標(biāo)準(zhǔn)選擇相應(yīng)的碼表。另外,EOB碼表的選擇按照標(biāo)準(zhǔn)是由最后一個編碼非零系數(shù)的level決定,但實(shí)質(zhì)上按照以上的分析,EOB碼表的選擇由8x8塊中最大的數(shù)來確定。整個模塊的硬件流水線結(jié)構(gòu)如圖8所示,分為4級完成第一級,主要包括56個比較器和計(jì)數(shù)器counter[2:0]。為了保證在一個時鐘內(nèi),求得max07[ll:0]。每個輸入的數(shù)據(jù)分別與其他7個數(shù)據(jù)比較,共需要56個比較器。Counter[2:0]用來表示輸入數(shù)據(jù)的拍數(shù),每8拍為一個8x8塊。第二級,包括一個依據(jù)counter[2:0]的選擇器。在輸入的是第一行數(shù)據(jù)時,maxlevelO[ll:0]等于0,其他時候則等于maxlevelO與maxlevell的較大者。第三級,確定每個系數(shù)前的最大值比較電路包括7個并行的比較器。Max06[ll:0]分別與maxlevelO[ll:0]比較,得到每個系數(shù)的査表參數(shù)tab—valuel7;而第一個系數(shù)的査表參數(shù)則僅由maxlevelO[ll:0]確定,即:Tab_valueO[ll:0]=maxleve10[11:0]。第四級,包括8個并行的單級多路選擇器,E0B多路選擇器和E0B碼表選取比較器。4.查表該模塊的主要作用是査詢碼表來確定碼字(codenumber)值。在硬件實(shí)現(xiàn)的時候最常見的方法是將碼表存在ROM中,然后根據(jù)地址進(jìn)行査詢,碼表ROM存儲如圖9所示。在第3部分得到了每個(run,level)需要査詢的碼表;接著,基于碼表選擇的多路選擇器尋址ROM到相應(yīng)的碼表;然后,根據(jù)level選擇對應(yīng)表中的codenumber值。2D—VLC熵編碼與preceding預(yù)編碼最大的區(qū)別就是前者需要將codenumber生成碼流,而后者只需要codenumber碼流的比特?cái)?shù)。根據(jù)碼表中codenumber和Golomb碼字的位寬,可以得到每個碼表對應(yīng)的位寬表,以intra—VLC4為例說明碼表和位寬表的映射關(guān)系。表1.<table>tableseeoriginaldocumentpage15</column></row><table>對于escape事件,我們可以讓信息位的比特?cái)?shù)等于7來做標(biāo)示。表2中兩個特殊情況(run=l,level=2)和(run=0,level=6)會出現(xiàn)兩個變動的值,這是因?yàn)橐勒諛?biāo)準(zhǔn),在原始附錄碼表中査到的codenumber值還要做如下處理如果原始level為負(fù)數(shù),codenumber=codenumber+l。上邊兩組特殊的數(shù)據(jù)對應(yīng)的codenumber分別為11,27,如果level為正數(shù),編碼信息位分別為3,4,如果level為負(fù)數(shù),編碼信息位則分別為4,5。按照上面的方法,轉(zhuǎn)換其他碼表。通過觀察發(fā)現(xiàn),對于碼表中的信息位比特?cái)?shù),只有16和7,這樣便可以用簡單邏輯設(shè)計(jì)代替rom來實(shí)現(xiàn)precoding。圖10是以intra_VLC4為例說明了怎樣得到(run,level)的信息位比特?cái)?shù),輸入的是某個系數(shù)的(run,level)、表類型和對應(yīng)的碼表,通過一系列的邏輯判斷最終得到這個系數(shù)的信息位比特?cái)?shù)。在以上分析基礎(chǔ)上,查表硬件結(jié)構(gòu)如圖10所示可以分為3級流水線第一級,由碼表類型的選通開關(guān)和碼表選通開關(guān)級聯(lián)構(gòu)成,用它來定位到唯一的特定碼表。也就是說在任意時刻,只有一張碼表是選通的第二級,由若干并行的比較器構(gòu)成,根據(jù)每個系數(shù)的(run,level)確定碼字。在硬件設(shè)計(jì)上,查表使用比較器實(shí)現(xiàn),值得說明的是,在這里的比較對象會根據(jù)碼表不同而有所變化。例如inter_VLC0可使用run為比較對象,inter—VLC6可使用level為比較對象,總之目的為了盡量減小比較器的數(shù)量。第三級,主要由一個選通開關(guān)和多路選擇器構(gòu)成。選通開關(guān)于前面的選通邏輯相同,用來選擇3條通路中的其中一條;多路選擇器的選擇信號與第二級的比較信號要交替,即inter—VLCO,inter_VLCl,inter_VLC2,inter—VLC3,intra—VLCO,intra_VLCl,intra—VLC2,intra一VLC3,chroma—VLCO,chroma—VLC1,chroma一VLC2這11張表選擇器的選擇信號sel信號參考level值;其他表的選擇信號sel信號參考run值。通過以上三步便可以得到每對(run,level)的信息位的比特?cái)?shù),當(dāng)比特?cái)?shù)等于7時,即為溢出(escape)事件。5.哥倫布編碼該模塊的主要功能是得到每對(run,level)的比特?cái)?shù)。Golomb碼的信息位有如下規(guī)律M=y/oorlog2(coc/ew訓(xùn)+2*),其中,k表示Golomb碼的編碼階數(shù),codenumber表示要編碼的數(shù)值,M表示編碼得到的信息位位寬。從而每個系數(shù)的編碼codenumber所需要的比特?cái)?shù)為M—欲e鎖=2M+1—A:對于escape事件,run的編碼仍然使用當(dāng)前碼表所對應(yīng)的Golomb階數(shù)編碼,而level則按照標(biāo)準(zhǔn)所規(guī)定的哥倫布碼的階數(shù)編碼。整個模塊的硬件實(shí)現(xiàn)如圖11分如下幾步完成第一步包括一個級聯(lián)比較器,3個移位器和一個選擇器。根據(jù)AVS標(biāo)準(zhǔn),級聯(lián)比較器由輸入信號table—type[1:0]和table_num[2:0],得到編碼run和escape事件的Golomb階數(shù)。其中的兩個移位器是對run和level的Golomb階數(shù)移位。另外一個移位器則是對run[5:0]移位。選擇器則是用來選者esc鄰e事件中編碼run時所加的常數(shù),sign為正時加60,否則加59。第二步包括兩個加法器。完成C_level=level+K<esc—rank,和C—run=2*run+59/60+lrank0第三步包括兩個并行的比較器。用來求得編碼level和run的信息位位寬,由于硬件實(shí)現(xiàn)不能直接取對數(shù),所以可以由一個從高位到低位的找一邏輯來完成該功能。第四步包括一個加法器。即M—level[3:0]+M_run[3:0]。第五步包括兩個移位器和兩個加法器(減法)。分別求得escape事件和非escape事件的編碼比特?cái)?shù)。第六步包括一個選擇器。當(dāng)value[2:0]等于7時,表示為escape事件則輸出bits—esc[5:0];否則輸出bits[3:0]。權(quán)利要求1.一種并行類熵編碼方法,其步驟為1)將每個變換塊的量化系數(shù)分組并行輸入輸出于兩寄存器組;2)同一時鐘內(nèi)計(jì)算每組量化系數(shù)的編碼系數(shù)(run,level);3)將編碼系數(shù)(run,level)進(jìn)行倒序輸出;4)根據(jù)輸出的已編碼系數(shù)中的level最大值選擇當(dāng)前量化系數(shù)的碼表;5)根據(jù)該變換塊中所有編碼系數(shù)的level最大值選擇該變換塊EOB的碼表;6)將上述選擇的碼表轉(zhuǎn)換為位寬表,并計(jì)算該變換塊編碼比特?cái)?shù)。2.如權(quán)利要求1所述的方法,其特征在于所述變換塊為8x8塊,所述8x8塊的量化系數(shù)以行為單位分為8組數(shù)據(jù)。3.如權(quán)利要求2所述的方法,其特征在于所述量化系數(shù)分組并行輸入輸出于兩寄存器組的方法為-a)在一個時鐘內(nèi)將一組量化系數(shù)存入一寄存器組;b)將該變換塊按組全部輸入到該寄存器組后,在下一時鐘從該寄存器組按照zig-zag的順序按組輸出量化系數(shù),同時從該時鐘開始將后續(xù)分組量化系數(shù)輸入另一寄存器組;c)重復(fù)上述步驟a)和b),實(shí)現(xiàn)兩寄存器組的乒乓操作。4.如權(quán)利要求1所述的方法,其特征在于采用游程編碼的方法計(jì)算所述每組量化系數(shù)的編碼系數(shù)(run,level),同時在該變換塊的第一個非零量化系數(shù)上標(biāo)識EOB符號。5.如權(quán)利要求1或4所述的方法,其特征在于所述編碼系數(shù)的level值為量化系數(shù)的絕對值;所述編碼系數(shù)的run值計(jì)算方法為設(shè)定一變量base0用于給run值賦值、一變量basel用于記錄每組量化系數(shù)末尾相鄰0的個數(shù),和一計(jì)數(shù)器counter用于記錄該變換塊的行數(shù);counter=0,baseO=0;counter!=0時,如果basel-8,下一組量化系數(shù)的&&360=&&360+basel,如果basel!=8,下一組量化系數(shù)的baseO=basel。6.—種并行類熵編碼裝置,其包括依次連接的數(shù)據(jù)輸入轉(zhuǎn)存模塊、游程編碼模塊、倒序矩陣模塊、碼表選擇模塊、查表模塊、哥倫布編碼模塊、加和變換塊的比特?cái)?shù)模塊;所述數(shù)據(jù)輸入轉(zhuǎn)存模塊用于處理每組并行輸入的量化系數(shù),其包括兩存儲矩陣用來實(shí)現(xiàn)數(shù)據(jù)輸入輸出的乒乓操作;所述游程編碼模塊用于在同一時鐘內(nèi)計(jì)算寄存器組中輸入的每組量化系數(shù)的編碼系數(shù)(腦,level),所述倒序矩陣模塊用于完成變換塊的編碼系數(shù)(run,level)倒序輸出;所述碼表選擇模塊用于根據(jù)當(dāng)前倒序輸出的編碼系數(shù)(run,level)確定當(dāng)前量化系數(shù)的碼表和該變換塊EOB的碼表;所述査表模塊用于將得到的碼表映射為對應(yīng)的碼字;所述哥倫布編碼模塊用于將碼字轉(zhuǎn)換為位寬,得到碼表對應(yīng)的位寬表;所述加和變換塊的比特?cái)?shù)模塊用于根據(jù)位寬表計(jì)算當(dāng)前變換塊所有量化系數(shù)的編碼比特?cái)?shù)。7.如權(quán)利要求6所述的裝置,其特征在于所述游程編碼模塊包括一符號位比較器、一計(jì)數(shù)器和若干輸入數(shù)據(jù)比較器用于將每組輸入數(shù)據(jù)與零在同一時鐘內(nèi)進(jìn)行比較,所述輸入數(shù)據(jù)比較器分別與EOB比較器和該組末尾相鄰零個數(shù)比較器相連;所述EOB比較器與一選擇器連接,所述該組末尾相鄰零個數(shù)比較器經(jīng)一選擇器與run值比較器連接;所述計(jì)數(shù)器分別與所述的兩個選擇器連接。8.如權(quán)利要求6所述的裝置,其特征在于所述碼表選擇模塊的電路連接關(guān)系為用于比較變換塊輸入數(shù)據(jù)的若干輸入數(shù)據(jù)大小比較器分別與一確定系數(shù)前最大值比較電路、一選擇器;所述選擇器的輸出端分別與一EOB多路選擇器和所述確定系數(shù)前最大值比較電路連接;所述確定系數(shù)前最大值比較電路與若干并行的單級多路選擇器連接;所述選擇器和所述EOB多路選擇器分別與同一計(jì)數(shù)器的輸出端連接;與所述選擇器連接的若干輸入數(shù)據(jù)大小比較器輸出端與所述EOB多路選擇器連接,且所述EOB多路選擇器的輸出端與一碼表選定比較器連接。9.如權(quán)利要求6所述的裝置,其特征在于所述査表模塊的電路連接關(guān)系為碼表類型選通開關(guān)分別與碼表選通開關(guān)連接,所述碼表選通開關(guān)分別經(jīng)一比較器與另一碼表類型選通開關(guān)連接后再與一多路選擇器連接;所述碼表選通開關(guān)和所述多路選擇器分別與一碼表號輸入線連接;所述比較器和所述多路選擇器分別與輸入數(shù)據(jù)連接;所述多路選擇器對碼表inter—VLCO、inter—VLC1、inter_VLC2、inter—VLC3、intra—VLCO、intra一V!Xl、intra—VIX2、intra—V1X3、chroma_VLC0、chroma一VLCl、chroma_VIX2的選擇信號參考每張碼表所對應(yīng)的所述level值,對碼表inter一VLC4、inter_VLC5、inter_VLC6、intra—V1X4、intra—V!X5、intra—VLC6、chroma一V!X3、chroma_V!X4的選擇信號參考每張碼表所對應(yīng)的所述rim值。10.如權(quán)利要求6所述的裝置,其特征在于所述哥倫布編碼模塊的電路連接關(guān)系為輸入碼表號和碼表類型的級聯(lián)比較器經(jīng)移位器1與一加法器連接,且該加法器輸入端與level絕對值的輸出端連接,其輸出端與按位比較器1連接;所述級聯(lián)比較器經(jīng)另一移位器2與一加法器連接,且該加法器輸入端經(jīng)一選擇器l與level符號位的輸出端連接、經(jīng)一移位器3與run值輸出端連接,同時其輸出端與按位比較器2連接;所述按位比較器1和所述按位比較器2經(jīng)一加法器與一移位器4連接,所述移位器4和所述級聯(lián)比較器的兩輸出端經(jīng)一減法器與一選擇器2的輸入端連接;與所述移位器2連接的級聯(lián)比較器輸出端同時與一減法器連接,且該減法器的輸入端經(jīng)一移位器5與碼字的輸出端連接,同時該減法器的輸出端與所述選擇器2的輸入端連接;所述選擇器2輸入端與所述碼字輸出端連接。全文摘要本發(fā)明公開了一種并行類熵編碼方法及其裝置,屬于視頻編解碼領(lǐng)域。本發(fā)明的方法為首先將每個變換塊的量化系數(shù)分組并行輸入輸出于兩寄存器組;然后掃描每組量化系數(shù)的編碼系數(shù)(run,level);根據(jù)已編碼系數(shù)中的level最大值選擇當(dāng)前量化系數(shù)的碼表,以及根據(jù)所有編碼系數(shù)的level最大值選擇該變換塊EOB的碼表;最后將所選的碼表轉(zhuǎn)換為位寬表,計(jì)算該變換塊編碼比特?cái)?shù)。本發(fā)明的裝置包括數(shù)據(jù)輸入轉(zhuǎn)存模塊、游程編碼模塊、倒序矩陣模塊、碼表選擇模塊、查表模塊、哥倫布編碼模塊、加和變換塊的比特?cái)?shù)模塊。本發(fā)明大大提高了數(shù)據(jù)處理速度,優(yōu)化了表格,同時節(jié)省了硬件資源。文檔編號H04N7/26GK101355700SQ200810119769公開日2009年1月28日申請日期2008年9月9日優(yōu)先權(quán)日2008年9月9日發(fā)明者興張,彭小明,曹喜信申請人:北京大學(xué)軟件與微電子學(xué)院