??? 摘? 要: 分析了ARM7處理器的結(jié)構(gòu)特點(diǎn),針對解碼器的優(yōu)化特點(diǎn)和芯片的硬件結(jié)構(gòu),,采用了算法級,、語言級、ARM級聯(lián)合優(yōu)化的方法,,對標(biāo)準(zhǔn)MPEG-4解碼過程進(jìn)行了優(yōu)化,。通過本文所總結(jié)的ARM7TDMI上視頻解碼的優(yōu)化方法,可以使MPEG4視頻解碼節(jié)約大量的數(shù)據(jù)處理時間,,能較好地滿足低分辨率、低幀率場合實(shí)時解碼的要求,。?
????關(guān)鍵詞: ARM7,;MPEG-4;視頻解碼器
?
??? 目前,,手持設(shè)備的視頻播放非常流行,。一直以來,圖像壓縮大都采用H.263壓縮算法,,然而,,由于MPEG-4標(biāo)準(zhǔn)的成熟,,很多視頻圖像都已經(jīng)采用MPEG-4算法進(jìn)行壓縮,。本文旨在研究基于ARM7微處理器的MPEG-4視頻解碼器的優(yōu)化。利用嵌入式系統(tǒng)實(shí)現(xiàn)MPEG-4視頻解碼,,處理器的選擇是關(guān)鍵。在嵌入式系統(tǒng)中常用的RISC處理器是ARM核,,因為它具有體積小,、功耗低,、成本低,、性價比高的特點(diǎn),,這對于移動應(yīng)用領(lǐng)域非常重要,。ARM7系列微處理器為低功耗的32位處理器,,最適合于對價位和功耗要求較高的消費(fèi)類應(yīng)用[1],。本解碼器可以運(yùn)用于低分辨率和低幀率的應(yīng)用場合,因此選擇在ARM7TDMI核上實(shí)現(xiàn)解碼功能,。要實(shí)現(xiàn)更高幀率和分辨率的解碼,可將軟件直接應(yīng)用在更高端的處理器上,。?
1 MPEG-4視頻解碼算法?
??? MPEG-4標(biāo)準(zhǔn)可以劃分為一套子標(biāo)準(zhǔn),,標(biāo)準(zhǔn)的每一部分都有各自最適合的應(yīng)用場合,。MPEG-4 SVP(Simple Visual Profile[2])就是一種特殊的,、簡單的MPEG-4實(shí)現(xiàn),。其專門針對手持式產(chǎn)品中視頻傳輸應(yīng)用場合制定的,。由于本解碼器可應(yīng)用在手持移動設(shè)備視頻解碼的場合,因此選用MPEG-4 SVP作為解碼算法。?
??? 本文選用ARM7TDMI作為核心處理器進(jìn)行MPEG-4視頻解碼器的開發(fā)。在實(shí)際開發(fā)過程中,,針對ARM7TDMI的結(jié)構(gòu)和MPEG-4的算法特點(diǎn),,做了大量優(yōu)化工作,,保證了解碼精度,大幅度提高了解碼速度,。嚴(yán)格來說,,ARM7處理能力有限,更適合用于控制類型的應(yīng)用,。由于其沒有針對視頻解碼數(shù)據(jù)處理而進(jìn)行優(yōu)化設(shè)計,,因而不太適合于視頻解碼等數(shù)據(jù)處理類應(yīng)用,。但是由于該芯片具有明顯的成本優(yōu)勢,,所以經(jīng)過優(yōu)化,,在充分利用其性能的前提下,還是可以作為手機(jī)等嵌入式系統(tǒng)的視頻解碼應(yīng)用,。?
??? 解碼過程實(shí)際上就是從視頻編碼碼流中恢復(fù)出VOP數(shù)據(jù)的過程。圖1描述了一個視頻解碼過程,。解碼器主要包含運(yùn)動解碼和紋理解碼,。I幀中只含有紋理信息,因此只須解碼紋理信息即可恢復(fù)I幀,。而P幀中不僅包含紋理信息,,還包含運(yùn)動信息,所以須解碼運(yùn)動信息,,獲得運(yùn)動矢量并進(jìn)行運(yùn)動補(bǔ)償,。另外,還須進(jìn)行紋理解碼獲得殘差值,,將這兩部分組合起來才能重建P幀[3],。?
?
?
??? 解碼器的實(shí)現(xiàn)主要是提供一個簡單的接口函數(shù),供解碼時調(diào)用,。該接口函數(shù)根據(jù)解碼的不同需要和不同階段提供了5個入口,。5個接口函數(shù)中,,有 4個供初始化、預(yù)處理及后續(xù)處理時調(diào)用,,剩余1個是幀解碼的實(shí)現(xiàn)函數(shù),。圖2為幀解碼主程序流程圖。?
??? 解碼過程的計算主要集中在如下幾個模塊:IDCT,、運(yùn)動補(bǔ)償MC、逆量化,、逆掃描,、逆預(yù)測以及變長解碼VLD。表1給出了優(yōu)化前解碼過程的特征信息,。從表1中可以看出,,上述運(yùn)算模塊在解碼過程中占有很大比例。對以上各模塊進(jìn)行優(yōu)化的效果將直接反映在解碼器的實(shí)時效率上,。?
?
?
2 解碼器優(yōu)化?
2.1 效率更高的IDCT變換?
??? 通常,,MPEG-4編碼過程中有8×8塊在DCT變換后AC系數(shù)大都接近于零,經(jīng)過量化后直接變成了零,。同時根據(jù)幀間預(yù)測的相關(guān)性:在運(yùn)動不是非常劇烈的情況下,,量化后大部分DCT相關(guān)性是零。表2顯示了在快速運(yùn)動和慢速運(yùn)動序列下所有全零塊的百分比,。?
?
?
??? 對于快速運(yùn)動序列,,大約25%的DCT塊是全零;對于慢速運(yùn)動序列,,全零塊的百分比大約47%[4],。這樣,可以把DCT塊分為不同的三類:一類是全零塊(DC系數(shù)和AC系數(shù)都是零),,一類是只含有DC系數(shù)(AC系數(shù)是零),,一類是含有DC系數(shù)和AC系數(shù),如圖3所示(這里用4×4的塊舉例,,D代表DC系數(shù),,A表示AC系數(shù))。對于不同的IDCT進(jìn)行不同的處理:對于第一類情況,,全零塊,,跳過反變換;對于第二類情況,,只進(jìn)行反DC變換,,通常除以8,即移3位即可,;對于非零AC系數(shù)塊,,按照快速的IDCT處理,。這樣就可以針對不同的情況采用不同的處理辦法,提高了解碼效率,。?
?
?
2.2 效率更高的運(yùn)動補(bǔ)償?
2.2.1 運(yùn)動補(bǔ)償?shù)臄U(kuò)邊?
??? MPEG-4在進(jìn)行運(yùn)動補(bǔ)償時,,使用運(yùn)動向量在參考圖像中尋找預(yù)測塊。如果運(yùn)動向量變化比較快,,則運(yùn)動向量很可能指向參考圖像以外,。MPEG-4標(biāo)準(zhǔn)框架中,采用了很多分支判斷語句來處理運(yùn)動向量指向參考圖像以外的情況,。一方面IF語句的判斷會降低程序的效率,,造成解碼過程速度的下降;另一方面如果運(yùn)動向量沒有指向參考圖像以外,,IF判斷就顯得多余,。為了提高解碼效率,可以采用參考幀擴(kuò)邊的方式來解決,。將參考圖像的邊界擴(kuò)大部分全部置零,,這樣就可以減少很多判斷語句,提高解碼效率,。在實(shí)際中,,運(yùn)動向量的有效范圍很大,但當(dāng)運(yùn)動向量使計算一個預(yù)測塊所需的像素完全處于參考圖像以外時,,則不論運(yùn)動向量的水平分量或者垂直分量延伸多遠(yuǎn),,所得到的預(yù)測塊都是相同的。而運(yùn)動補(bǔ)償既可以基于塊(8×8)的,,也可以基于宏塊(16×16)的,,因此將擴(kuò)展的字節(jié)數(shù)取為16就可以了。同時將運(yùn)動向量的兩個分量分別裁剪到不超過參考圖像左邊和上邊的邊界8 B以及下邊和右邊的邊界2 B,。擴(kuò)展后的參考圖像見圖4,。?
?
?
2.2.2 雙線性插值的改進(jìn)?
??? MEPG-4解碼算法中,運(yùn)動補(bǔ)償是以宏塊為單位進(jìn)行的,。最初的做法基于參考圖像采用雙線性插值,,見圖5。?
?
?
??? 對這一做法進(jìn)行如下改進(jìn):對宏塊的運(yùn)動補(bǔ)償是根據(jù)獲得運(yùn)動矢量進(jìn)行不同的判斷,,而不是固定采用雙線性插值的算法,。運(yùn)動補(bǔ)償根據(jù)從解碼數(shù)據(jù)中獲得的水平運(yùn)動矢量MV_X和垂直運(yùn)動矢量MV_Y進(jìn)行,即根據(jù)MV_X和MV_Y最低位為0或1的情況分為:只進(jìn)行直接復(fù)制相應(yīng)數(shù)據(jù),;只進(jìn)行垂直方向插值,;只進(jìn)行水平方向插值;進(jìn)行雙線性插值,。具體做法如下:?
??? 當(dāng)MV_X和MV_Y的最低位都為零時,,運(yùn)動矢量指向的16×16的塊本身與緩沖區(qū)中的像素重合,,這時不需要進(jìn)行任何插值處理,直接復(fù)制相應(yīng)數(shù)據(jù),。當(dāng)MV_X最低位為零而MV_Y的最低位不為零時,,運(yùn)動矢量指向的8×8的塊的點(diǎn)落在某列兩相鄰像素的中間,這時只需要進(jìn)行垂直方向的插值,。當(dāng)MV_X最低位不為零而MV_Y的最低位為零時,,運(yùn)動矢量指向的8×8的塊的點(diǎn)落在某行兩相鄰像素的中間,這時只需要進(jìn)行水平方向的插值,。當(dāng)MV_X與MV_Y的最低位均不為零時,,運(yùn)動矢量指向的8×8的塊的點(diǎn)落在相鄰四個像素的中心,這時必須同時進(jìn)行兩個方向的插值,。由于相鄰幀之間具有很大的時間相關(guān)性,,所以本幀和上一幀大部分?jǐn)?shù)據(jù)是相同的,。假設(shè)上面4種運(yùn)動補(bǔ)償情形各占1/4,,當(dāng)進(jìn)行水平或垂直插值時,運(yùn)動補(bǔ)償所占的運(yùn)算量僅為原來的雙線性插值的1/2,,比雙線性插值約節(jié)省一半的計算量,,從而大大節(jié)省了運(yùn)動補(bǔ)償?shù)臅r間。?
2.2.3 像素的并行處理?
??? 解碼過程中處理的像素是8位,,如果運(yùn)動補(bǔ)償是在字節(jié)或像素的基礎(chǔ)上執(zhí)行,,則字節(jié)加載和存儲將被使用,它是存儲器訪問中代價最高的操作,。因為ARM7是32位微處理器,,存儲器可以按字讀取數(shù)據(jù),因此設(shè)計出一種有效的運(yùn)動補(bǔ)償方法,,即在字?jǐn)?shù)據(jù)的基礎(chǔ)上進(jìn)行操作,。利用這種方法,便可以用一種非常有效的方式同時對四像素進(jìn)行運(yùn)動補(bǔ)償,。下面以水平方向的半像素補(bǔ)償為例,,講述補(bǔ)償?shù)倪^程。?
??? 首先讀入一個字到寄存器中,,從低到高的數(shù)據(jù)依次對應(yīng)像素0,、像素1、像素2和像素3,;然后將讀碼流指針增加1字節(jié),,再讀取下一個字到另一寄存器中,從低到高的數(shù)據(jù)依次對應(yīng)的為像素1,、像素2,、像素3和像素4,。示意圖如圖6所示。?
?
?
??? 對于垂直方向和水平垂直方向的半像素補(bǔ)償,,其原理與水平方向相同,。在具體函數(shù)實(shí)現(xiàn)過程中,由解碼數(shù)據(jù)獲得當(dāng)前數(shù)據(jù)塊的運(yùn)動矢量,,根據(jù)獲得的運(yùn)動矢量得到當(dāng)前數(shù)據(jù)塊在參考幀的具體位置,,從而得到運(yùn)動補(bǔ)償所需要的參考數(shù)據(jù)塊。參考數(shù)據(jù)拷貝到片內(nèi),。運(yùn)動補(bǔ)償在片內(nèi)實(shí)行,,按照字讀取數(shù)據(jù)并根據(jù)情況采用不同的半像素插值,提高了程序的執(zhí)行效率,。?
2.3 VLD優(yōu)化?
??? 由于MPEG-4變長編碼中的碼字長度是不定的,,而解碼器的輸入是連續(xù)的比特流,碼字之間沒有間隔符,,所以VLC(Variable Length Coding)碼表必須判斷碼字的長度,。在通常情況下,VLD(Variable Length Decoding)解碼是通過不斷搜索和判斷得到碼字和碼長,,故解碼的時間因碼長而異,。對于實(shí)時處理來說,若該部分計算量過大,,將影響整個系統(tǒng)的處理速度,。原始查表方法涉及到多次讀取和判斷,計算量較大[5],。另外,,信源符號內(nèi)容不同,對應(yīng)碼長也不同,,造成查表判斷耗費(fèi)的時間差別很大,。可以采用基于分組的辦法,,根據(jù)碼字編碼位的不同劃分為多個碼表,,將碼字按照不同的區(qū)域進(jìn)行劃分。這樣,,不斷的搜索判斷可以簡化為三個步驟:(1)讀入定長碼字,;(2)通過對讀入數(shù)據(jù)大小的判斷確定讀入的符號應(yīng)屬于哪一個查找表;(3)利用得到的碼字在查找表中直接獲得其對應(yīng)的信息,。因每個分組包含的符號較少,,所以可在取出分組信息后,從剩下的信息位中直接得到符號在表中對應(yīng)的位置。?
??? 經(jīng)分組后,,解碼過程簡化為(按最大碼字長度讀入數(shù)據(jù),,以8位數(shù)據(jù)為例,設(shè)分成碼長小于3的小碼表和碼長大于3的大碼表):?
??? (1)對讀入數(shù)據(jù)進(jìn)行大小判斷,。因分組時考慮到數(shù)據(jù)大小判斷的簡便性,,可用移位代替。?
??? (2)數(shù)據(jù)大小的比較,。右移5位,,判斷是否為0。如果為0,,則符號落在碼長小碼表中,;否則,符號落在大碼表中,。?
??? (3)若符號落在小碼表中,,以右移5位的讀入數(shù)據(jù)作為相對地址,直接在小碼表中找到對應(yīng)非零系數(shù)個數(shù)和正/負(fù)個數(shù)及碼長,。若符號落在大碼表中,,則直接以讀入的數(shù)據(jù)為相對地址,在大碼表中找到相應(yīng)的信息,。?
??? 無法預(yù)見的反復(fù)讀取和判斷,,經(jīng)過基于分組的解碼優(yōu)化簡化成上述三個可預(yù)見的步驟,,減少了判斷次數(shù),,加快了處理時間。?
3 實(shí)驗結(jié)果與數(shù)據(jù)分析?
通過優(yōu)化,,MPEG-4的解碼性能有了較大的提升,。在ADS1.2環(huán)境下分別對各模塊進(jìn)行C算法優(yōu)化和ARM代碼優(yōu)化,結(jié)果如表3,。按調(diào)用一次模塊函數(shù)所需周期數(shù)進(jìn)行統(tǒng)計,。?
?
?
??? 這些模塊是解碼過程中經(jīng)常會調(diào)用的函數(shù),因此,,這些函數(shù)的優(yōu)化將使解碼速度有明顯提高,。?
??? 表4比較了不同序列的15幀QCIF格式視頻解碼優(yōu)化前后所需的帶寬。這些圖像具有不同的復(fù)雜度,,因而結(jié)果也不一樣,。
?
?
??? 解碼速度基本取決于圖像畫面的運(yùn)動情況和顏色是否豐富。從上面的數(shù)據(jù)可以看出對于不同的序列,,其解碼速度也不同,。news、salesman和miss_am之所以很快,是因為圖像背景靜止,,只有肩部和頭部有運(yùn)動,,因而P幀的編碼數(shù)據(jù)量較少,解碼速度較高,。另外,,如果圖像很簡單(單調(diào)),其能量集中到DC系數(shù)(直流分量)上,,交流系數(shù)會出現(xiàn)多個零,,因此變長解碼速度就會較高,從而節(jié)約了解碼時間。?
??? 通過本文所總結(jié)的ARM7TDMI上視頻解碼的優(yōu)化方法,,可以使MPEG4視頻解碼節(jié)約大量的數(shù)據(jù)處理時間,。由實(shí)驗結(jié)果可見,本視頻解碼器能較好地滿足低分辨率,、低幀率場合實(shí)時解碼的要求,。?
參考文獻(xiàn)?
[1] 杜春雷.ARM體系結(jié)構(gòu)與編程[M].北京:清華大學(xué)出版社,2003.?
[2] ISO/lEI.MPEC-4 video verfication model version 18.0.MPEG N3908,,2001.?
[3] 鐘玉琢,,王琪,賀玉文.基于對象的多媒體數(shù)據(jù)壓縮編碼國際標(biāo)準(zhǔn),,MPEG-4及其校驗?zāi)P停本嚎茖W(xué)出版社,,2000.?
[4] 田綱,胡瑞敏,,王中元,,等.Trimedia平臺MPEG4編碼器優(yōu)化策略.計算機(jī)工程與應(yīng)用,2006(36):78-81.?
[5] HE Yu Wen.A platform-based MPEG-4 advanced video?coding(AVC)decoder with block level pipelining.PCM2003:15-18,,Singapore,,2003,12.