展鵬飛,魏曉君,張 剛
(太原理工大學(xué)信息工程學(xué)院,山西太原030024)
AVS(Audio and Video coding Standard)[1]音視頻編解碼標(biāo)準(zhǔn)具有我國(guó)自主知識(shí)產(chǎn)權(quán),編碼性能與H.264相當(dāng),效率高、復(fù)雜度低,更易于嵌入式實(shí)現(xiàn)。用DSP實(shí)現(xiàn)的AVS視頻編解碼器具有良好的可移植性,開(kāi)發(fā)周期短,能夠很好地滿足豐富AVS產(chǎn)業(yè)鏈、推廣AVS標(biāo)準(zhǔn)的要求。
OMAP(Open Multimedia Applications Platform)[2]是TI針對(duì)手持設(shè)備開(kāi)發(fā)的高性能處理器,具有高性能、低功耗的特點(diǎn)。它擁有一個(gè)TMS320C64X+系列的定點(diǎn)DSP處理器,最高工作頻率為430 MHz,有A、B兩交叉數(shù)據(jù)通道,每個(gè)數(shù)據(jù)通道各有M、S、D和L四個(gè)功能單元,采用超長(zhǎng)指令集(VLIW)[3],在一個(gè)時(shí)鐘周期內(nèi)最多可以并行執(zhí)行8條32位指令。熵解碼大約占了AVS視頻解碼的20% ~25%的運(yùn)算量,本文從傳統(tǒng)的AVS熵解碼入手,提出了一種新型的碼表結(jié)構(gòu)和一種分組查詢的查詢方法,最后用DSP指令對(duì)熵解碼進(jìn)行了匯編實(shí)現(xiàn)和優(yōu)化,在不影響解碼圖像質(zhì)量的前提下,提升了解碼速度。
熵解碼是熵編碼的逆過(guò)程,處于整個(gè)解碼器的第一級(jí)模塊。AVS熵解碼采用變長(zhǎng)碼解碼技術(shù)從壓縮后的碼流中解析信息,包括語(yǔ)法元素和殘差數(shù)據(jù)的解碼[4]。
AVS解碼器接收到碼流后,首先解析出相應(yīng)的碼字值,然后根據(jù)碼字值和59的大小情況,分情況經(jīng)過(guò)碼表映射找到其對(duì)應(yīng)的量化系數(shù)游程數(shù)組和量化系數(shù)值數(shù)組(run,level),為解碼器的逆掃描、反量化等模塊提供輸入數(shù)據(jù),大體流程如圖1所示。從圖中可以看出,整個(gè)熵解碼過(guò)程主要包含碼字的解析、碼表查詢、碼表切換3個(gè)部分[5]。本論文主要針對(duì)碼表查詢這部分內(nèi)容進(jìn)行研究和優(yōu)化。
AVS標(biāo)準(zhǔn)定義了19個(gè)變長(zhǎng)碼表:VLC0_Intra~VLC6_Intra這7個(gè)碼表用于解碼幀內(nèi)亮度塊的游程和非零量化系數(shù);VLC0_Inter~VLC6Inter這7個(gè)碼表用于解碼幀間亮度塊的游程和非零量化系數(shù);VLC0_Chroma~VLC4_Chroma這5個(gè)碼表用于解碼色度塊的游程和非零量化系數(shù)[6]。當(dāng)轉(zhuǎn)換系數(shù)trans_coef<59時(shí),如果當(dāng)前碼表中包含有此轉(zhuǎn)換系數(shù),直接查表獲得run和level值,否則以(trans_coef-1)為索引在當(dāng)前碼表中查表獲得run和level值。當(dāng)轉(zhuǎn)換系數(shù)trans_coef≥59時(shí),作為逃逸事件處理,逃逸系數(shù)escape_diff值由碼流信息計(jì)算得到,run值由(trans_coef-59)/2計(jì)算得出,level值獲得則分為兩種情況:
圖1 熵解碼流程
1)首先由當(dāng)前碼表號(hào)查詢出Maxrun值,若Maxrun≤(trans_coef-59)/2則以(trans_coef-59)/2為索引在當(dāng)前碼表中查表獲得level值,否則RefAbslevel賦值為1。
2)Maxrun>(trans_coef-59)/2:若trans_coef為偶數(shù),level值由(escape_diff+RefAbslevel)直接計(jì)算得出;若為奇數(shù),level值由(escape_diff+RefAbslevel)取反得到。
經(jīng)過(guò)對(duì)熵解碼流程的分析研究后發(fā)現(xiàn),在整個(gè)熵解碼的過(guò)程中,存在大量的判斷和跳轉(zhuǎn)指令,不利于軟件流水、代碼的并行處理,嚴(yán)重地影響代碼的運(yùn)行速度,不能體現(xiàn)DSP處理器的優(yōu)勢(shì)。另外僅存儲(chǔ)19個(gè)碼表所需要的數(shù)據(jù)就將近3 000 byte,在PC機(jī)上實(shí)現(xiàn)時(shí),PC資源豐富,可以把這些數(shù)據(jù)預(yù)先存儲(chǔ)到棧中,沒(méi)有資源短缺的問(wèn)題。但是OMAP3530開(kāi)發(fā)平臺(tái)的硬件資源遠(yuǎn)比不上PC機(jī)豐富,存儲(chǔ)數(shù)據(jù)的SRAM只有48 kbyte,除存儲(chǔ)參考幀信息和解碼輸出數(shù)據(jù)外,剩余空間很小,不能存放這么多的數(shù)據(jù),若存放到DDR中又會(huì)大大降低解碼速度。因此要想在DSP上實(shí)現(xiàn)AVS視頻解碼器并且要達(dá)到實(shí)時(shí)解碼的要求,必須對(duì)碼表的結(jié)構(gòu)和查詢方式進(jìn)行改進(jìn)。
由一維哥倫布碼數(shù)據(jù)索引二維數(shù)組run和level值時(shí),轉(zhuǎn)換系數(shù)在小于59的情況下,奇數(shù)和偶數(shù)的run值、RefAbslevel值都是相同的,不同的只是level值。AVS標(biāo)準(zhǔn)中規(guī)定轉(zhuǎn)換系數(shù)為奇數(shù)時(shí)和為偶數(shù)時(shí)的level值互為相反數(shù)。為了減少內(nèi)存空間數(shù)據(jù)的存儲(chǔ),本論文對(duì)19個(gè)碼表存儲(chǔ)的數(shù)據(jù)進(jìn)行了調(diào)整,根據(jù)具體碼表中數(shù)據(jù)的特點(diǎn),只存儲(chǔ)偶數(shù)或奇數(shù)各階指數(shù)哥倫布碼字值和對(duì)應(yīng)的run和level值。設(shè)定合適的閾值,由哥倫布碼字值、當(dāng)前碼表和閾值的關(guān)系共同決定碼字值是加1、減1后查詢碼表還是直接查詢碼表,來(lái)獲得對(duì)應(yīng)的run和level值。由于偶數(shù)碼字或奇數(shù)碼字加1或減1對(duì)應(yīng)的run值和RefAbslevel值相同,所以本設(shè)計(jì)只改動(dòng)每個(gè)碼表中碼字值及其對(duì)應(yīng)的level值的存儲(chǔ),run值和RefAbslevel值的存儲(chǔ)不變。
對(duì)程序調(diào)整和碼表改造后,雖然達(dá)到了碼表數(shù)據(jù)壓縮的目的,但是依然無(wú)法解決這部分代碼的復(fù)雜度難題。這部分代碼存在大量循環(huán),最麻煩的是循環(huán)體內(nèi)嵌套循環(huán)體;還存在大量的判斷條件和跳轉(zhuǎn)操作,這對(duì)于編譯器實(shí)現(xiàn)高效率的軟件流水十分困難[7]。經(jīng)過(guò)改進(jìn)后的碼表雖然已經(jīng)節(jié)省了大量?jī)?nèi)存分配空間,但是碼表中數(shù)據(jù)量還是很大。并且長(zhǎng)期占用了內(nèi)存空間,每次都需要在當(dāng)前碼表中遍歷查詢,對(duì)于整個(gè)解碼器系統(tǒng)來(lái)說(shuō),遠(yuǎn)遠(yuǎn)達(dá)不到實(shí)時(shí)的要求。針對(duì)碼表查詢遍歷耗時(shí)和碼表數(shù)據(jù)長(zhǎng)期占用內(nèi)存空間這一問(wèn)題,提出對(duì)當(dāng)前要解碼的碼字進(jìn)行擴(kuò)展打包處理的解決方案。利用大量的判斷、跳轉(zhuǎn)等待間隙,將當(dāng)前碼表數(shù)據(jù)臨時(shí)送入寄存器,查詢過(guò)后立即釋放的方式實(shí)現(xiàn)匯編優(yōu)化,盡量減少內(nèi)存的訪問(wèn)和修改。理想的情況下一次可查詢4個(gè)位置,最壞情況下一次查詢1個(gè)位置,利用不同的數(shù)據(jù)通道和不同的功能單元盡量同時(shí)獲得run和level值。
以VLC3_Intra為例,對(duì)改進(jìn)后的碼表進(jìn)行分組,具體分組優(yōu)化情況如圖2。
圖2 改進(jìn)后VLC3_Intra碼表查詢分組(截圖)
1)通過(guò)分析,知此碼表先獲得level值,再根據(jù)level值獲得run值可大幅度地使查表次數(shù)降低,提高查表效率。利用下圖中的分組方式,將VLC3_Intra碼字值和level值分別分為10組和5組。圖2中對(duì)碼字值標(biāo)示了8組,level值標(biāo)示了3 組,另2 組碼字值為5,3,1,9 和7,13,19,29。其對(duì)應(yīng)的2組level值分別為-3,-2,-1,4和-1,2,3,4。
2)改進(jìn)后的碼表僅存儲(chǔ)奇數(shù)的碼字值,由奇數(shù)查詢出對(duì)應(yīng)的run和level值,閾值設(shè)定為8。
3)從碼流中解析出碼字后,先判斷當(dāng)前的碼字值是否為奇數(shù),如果為奇數(shù),則直接查表可得相應(yīng)的(run,level)值;若當(dāng)前碼字值為偶數(shù),則跟閾值做比較,若小于閾值,則偶數(shù)加1得到奇數(shù);若大于閾值,則偶數(shù)減1得到奇數(shù),然后通過(guò)奇數(shù)來(lái)查詢碼字值對(duì)應(yīng)的run和level值。圖3和圖4分別是碼字值在小于59的情況下,VLC3_Intra改造前和改造后碼表查詢的流程。
圖3 改造前碼表VLC3_Intra查詢流程
圖4 改造后碼表VLC3_Intra查詢流程
4)當(dāng)所讀入轉(zhuǎn)換系數(shù)小于59時(shí),首先用PACK2和PACKL4將碼字值打包為32位,然后通過(guò)CMPEQ4指令在碼表中一次查詢4個(gè)碼字,當(dāng)取得某一個(gè)比較值為非零值后,將此非零值用XPND4指令進(jìn)行擴(kuò)展,最后通過(guò)DOTPSU4指令快速定位當(dāng)前轉(zhuǎn)換系數(shù)值對(duì)應(yīng)level,通過(guò)條件判斷得出run。最惡劣情況下需要查詢碼表10次,相比原遍歷查詢方式,與最壞情況下查詢58次相比減少了近6倍。由此可見(jiàn)對(duì)19個(gè)碼表均采取擇優(yōu)分組的方式進(jìn)行查表,可節(jié)省大量的查表次數(shù)和查表時(shí)間,并減少大量的條件判斷。
結(jié)合使用OMAP3530仿真測(cè)試和使用集成開(kāi)發(fā)仿真環(huán)境CCS3.3對(duì)所寫代碼進(jìn)行驗(yàn)證,本實(shí)驗(yàn)對(duì)4個(gè)碼流進(jìn)行了測(cè)試,其中football.avs是網(wǎng)上下載的測(cè)試序列football.yuv 編碼編出的碼流,Ceslab1.avs~ Ceslab3.avs是從實(shí)驗(yàn)室的環(huán)境下采集圖像,再由編碼器編出的碼流。從表1可以看出,用匯編語(yǔ)言實(shí)現(xiàn)的熵解碼模塊算法,消耗的解碼時(shí)間明顯減少。匯編優(yōu)化后熵解碼所消耗的解碼時(shí)間是未優(yōu)化的36%左右,幀率提高了1.63倍,達(dá)到了25幀以上,滿足了實(shí)時(shí)解碼的要求,優(yōu)化效果明顯。
表1 改造碼表結(jié)構(gòu)和優(yōu)化查詢前后效果對(duì)比
本文通過(guò)分析AVS熵解碼算法,對(duì)熵解碼的碼表結(jié)構(gòu)進(jìn)行了重新改造,提出了一種新的適合DSP處理器的碼表存儲(chǔ)方式;對(duì)碼表查詢提出了一種新的分組查詢方式,有效減少了判斷和跳轉(zhuǎn)情況,并且用DSP匯編實(shí)現(xiàn)。在不影響解碼質(zhì)量的前提下,節(jié)省了碼表存儲(chǔ)空間,并且提高了解碼速率,滿足了AVS視頻解碼器在OMAP3530上實(shí)時(shí)解碼的要求。
[1]GB/T 20090.2—2006,信息技術(shù) 先進(jìn)音視頻編碼 第2部分:視頻[S].2006.
[2]展鵬飛,張杰飛,張剛.在OMAP3530平臺(tái)實(shí)現(xiàn)AVS解碼器[J].電視技術(shù),2014,38(1):58-60.
[3]魏曉君,張剛.AVS解碼器環(huán)路濾波的優(yōu)化及實(shí)現(xiàn)[J].電視技術(shù),2013,37(5):23-25.
[4]江靜.AVS熵編碼技術(shù)研究及其在DSP上的實(shí)現(xiàn)[D].武漢:華中科技大學(xué),2008.
[5]陳光法,姚立敏,虞露.AVS熵解碼與DSP實(shí)現(xiàn)[J].電視技術(shù),2004,28(10):45-46.
[6] KIM W J,CHO K,CHUNG K S.Multi-threaded syntax element partitioning for parallel entropy decoding[J].IEEE Trans.Consumer Electronics,2011,57(2):897-905.
[7] LO CC,TSAIST,SHIEH M D.Reconfigurable architecture for entropy decoding and inverse transform in H.264[J].IEEE Trans.Consum.E-lectron.,2010,56(3):1670-1676.