基于Blackfin533的H.264編碼
隨著計算機(jī)網(wǎng)絡(luò)和多媒體技術(shù)的發(fā)展,數(shù)字視頻的應(yīng)用越來越廣泛,如DVD、網(wǎng)絡(luò)會議服務(wù)、數(shù)字電視等。在這些視頻處理與通信中,有效的視頻編碼是其關(guān)鍵技術(shù)。
H.264/AVC是ITU-T視頻編碼專家組和ISO/IEC運(yùn)動圖像專家組聯(lián)合提出的最新一代的視頻編碼標(biāo)準(zhǔn)。H.264具有許多優(yōu)良的性能[1]:壓縮比更高,與現(xiàn)有編碼標(biāo)準(zhǔn)(H.263、MPEG-4 Simple Profile)相比,在相同視頻質(zhì)量下,能節(jié)省大約50%的碼流,圖像質(zhì)量更好,適應(yīng)性更廣,能較好地滿足實時(視頻會議)及非實時(存儲、廣播等)等各種應(yīng)用。在DSP上實現(xiàn)H.264的實時編碼具有較大的工程意義及經(jīng)濟(jì)價值。
1 H.264標(biāo)準(zhǔn)簡介及DSP平臺
1.1 H.264標(biāo)準(zhǔn)簡介
H.264是ITU-T和ISO/IEC聯(lián)合制定的最新的視頻編碼標(biāo)準(zhǔn),于1997年由ITU-T提出,2003年3月形成最終標(biāo)準(zhǔn)草案。它包含了視頻壓縮領(lǐng)域的許多最新研究成果,主要采用了下面的技術(shù)[1]:
(1) 將編碼分為編碼層VCL(Video Coding Layer)和傳輸層NAL(Network Abstraction Layer)。將編碼層和傳輸層分離,有利于H.264的擴(kuò)展。
(2) H.264采用了空域內(nèi)的幀內(nèi)預(yù)測,共兩種預(yù)測模式:intra16×16和intra4×4。其中intra16×16有四種預(yù)測方式,intra4×4有九種預(yù)測方式。
(3) 對于幀間預(yù)測,增加預(yù)測模式,共七種預(yù)測模式。預(yù)測塊從16×16可以最小細(xì)分為4×4。
(4) 增加了參考幀的數(shù)目,使預(yù)測更為準(zhǔn)確。
(5) 將去塊效應(yīng)濾波放在編碼環(huán)內(nèi),提高圖像的主觀質(zhì)量。
(6) B幀可以作為參考幀,同時將圖像的解碼順序與顯示順序分離。
(7) 采用整系數(shù)變換,提高變換速度。
(8) 采用CAVLC、CABAC等新的熵編碼方法以提高編碼效果。
(9) 提高了碼流的抗誤碼能力,如對編碼數(shù)據(jù)進(jìn)行分割,一幀圖像可以靈活地分為幾個slice等。
1.2 基于Blackfin533的DSP平臺
Blackfin533是ADI公司Blackfin系列中的一款高性能視頻處理芯片。其主頻最高能達(dá)600MHz,每秒可處理1200M次乘加運(yùn)算。具有大量針對視頻的專用指令,可以并行處理多條指令。
從總體上看,Blackfin533分為內(nèi)核和系統(tǒng)接口兩大部分。內(nèi)核指處理器、L1存儲器、事件控制器、內(nèi)核定時器等;系統(tǒng)接口指SPORT接口、PPI接口、SPI接口、外部存儲控制器、DMA控制器及與它們接口的外部資源等。
Blackfin533開發(fā)平臺原理圖如圖1所示。攝像頭輸出的模擬視頻信號經(jīng)7113視頻芯片轉(zhuǎn)化為數(shù)字信號,此信號從Blackfin533的PPI接口進(jìn)入Blackfin533,壓縮后的碼流由PCI橋傳給PC機(jī)。此系統(tǒng)通過Flash啟動,編碼過程中的原始圖像、參考幀及其他變量存儲在SDRAM中。
圖2為H.264編碼系統(tǒng)的視頻輸入模塊。7113芯片從視頻端子讀入攝像頭輸出的模擬信號,通過并口將數(shù)字信號輸出給Blackfin533。Blackfin533通過I2C總線對7113進(jìn)行配置,使其輸出YUV模式、ITU656模式及增強(qiáng)ITU656模式等。
圖1 Blackfin533平臺總體框架圖
圖2 視頻輸入模塊
圖3 H.264編碼模塊圖
2 H.264編碼器的優(yōu)化
2.1 總體優(yōu)化
總體優(yōu)化主要包括兩部分內(nèi)容:程序模塊化的設(shè)計及數(shù)據(jù)結(jié)構(gòu)的設(shè)計。
程序模塊化設(shè)計時,既要考慮模塊的獨(dú)立性,又要考慮模塊的完整性。筆者的H.264的模塊關(guān)系圖如圖3所示。視頻輸入模塊負(fù)責(zé)圖像序列的讀取,從PPI口進(jìn)入的圖像首先保存到外部存儲器,再進(jìn)行編碼。讀入的圖像經(jīng)幀間模式選擇和幀內(nèi)模式選擇模塊,得到每個宏塊的預(yù)測模式。整系數(shù)變換、量化模塊對預(yù)測后的殘差進(jìn)行整系數(shù)變換及量化處理。量化后的系數(shù)經(jīng)過掃描后,在編碼模塊中進(jìn)行UVLC編碼。最后由寫碼流模塊輸出。其中,去塊效應(yīng)濾波模塊對反量化、整系數(shù)逆變換后的重建圖像進(jìn)行濾波;圖像緩存管理模塊負(fù)責(zé)管理對參考圖像的存取。從圖3中可以看出,整系數(shù)變換與量化結(jié)合在一起作為一個模塊。主要因為:一方面H.264中,量化和整系數(shù)變換本身就部分結(jié)合在一起;另一方面這樣可以在寄存器中一起完成變換、量化,有助于減少數(shù)據(jù)的存儲次數(shù)和讀取時間。對于反量化、整系數(shù)逆變換,采用相似的設(shè)計思路。 [!--empirenews.page--]
數(shù)據(jù)結(jié)構(gòu)的設(shè)計是H.264編碼的重要組成部分。合理的數(shù)據(jù)結(jié)構(gòu)既有利于提高數(shù)據(jù)訪問的速度又有利于程序的不同平臺的移植。主要有以下原則:盡可能連續(xù)存放數(shù)據(jù),這樣有利于用DMA方式對數(shù)據(jù)進(jìn)行讀取;每種數(shù)據(jù)結(jié)構(gòu)完成相對簡單的功能,這樣便于對不同數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)進(jìn)行管理。如表示幀間模式的InterMode、幀內(nèi)模式的IntraMode需要放在片內(nèi)存儲器中以加快讀取速度,而參考幀的數(shù)據(jù)ImgData由于數(shù)據(jù)太大則需要放在片外存儲器中;盡可能使用短的數(shù)據(jù)類型,節(jié)省DSP的存儲空間。
2.2 各程序模塊的優(yōu)化
各程序模塊的優(yōu)化主要指各模塊的C代碼優(yōu)化及部分代碼的匯編優(yōu)化。
C代碼的優(yōu)化對H.264編碼器有著重要意義,它既有利于提高編碼的速度,又有利于編碼器的跨平臺移植。C代碼優(yōu)化有下面的原則:
(1) 使編碼器代碼線性化,這樣有利于DSP的流水線滿負(fù)荷運(yùn)行,更充分地發(fā)揮DSP的數(shù)據(jù)處理能力。
(2) 取消循環(huán)中的數(shù)據(jù)依賴。數(shù)據(jù)依賴是指后面指令的輸入數(shù)據(jù)依賴于前面指令的輸出數(shù)據(jù)。許多DSP芯片都提供了硬件循環(huán)指令,Blackfin533有兩個硬件循環(huán)器,可提供兩層的硬件循環(huán)。硬件循環(huán)實現(xiàn)了零開銷的循環(huán)判斷,能大大提高循環(huán)指令的執(zhí)行速度,然而數(shù)據(jù)依賴的存在會阻止硬件循環(huán)的使用。所以要盡可能消除循環(huán)中的數(shù)據(jù)依賴。
(3) 將除法轉(zhuǎn)化為乘法或查表方式。Blackfin533提供了硬件乘法器,但沒有硬件除法器。執(zhí)行除法指令會花費(fèi)幾十或上百個指令周期。將除法轉(zhuǎn)化為乘法或查表,能大大減少這種開銷。
(4) 減少對片外存儲器的訪問次數(shù)。片外存儲器相對于片內(nèi)存儲器是低速設(shè)備,片外存儲器的讀取時間是片內(nèi)存儲器的幾倍至十幾倍。對于片外存儲器的數(shù)據(jù)要做到一次讀取,完成多次計算。
Blackfin芯片的開發(fā)環(huán)境VisualDSP本身已經(jīng)帶有匯編器,但由于種種原因,對于某些運(yùn)算量大、調(diào)用頻繁的函數(shù)仍需要進(jìn)行手動匯編優(yōu)化。進(jìn)行匯編優(yōu)化時,應(yīng)注意以下幾點:
(1) 節(jié)省寄存器資源。Blackfin533提供了8個32位數(shù)據(jù)寄存器以及一系列的地址寄存器。對于這些寄存器,應(yīng)盡可能做到一個寄存器多次使用;同時在能用較短的數(shù)據(jù)類型的情況下用短的數(shù)據(jù)類型,如能用short則不用int,這樣每個32位寄存器可以作為兩個16位寄存器使用,相當(dāng)于增加了寄存器的數(shù)量。
(2) 使用專用指令。Blackfin533提供了求最大值、最小值、絕對值、CLIP及大量視頻專用指令,通過使用這些指令,能大大提高代碼的執(zhí)行速度。
(3) 使用并行指令。對于大多數(shù)指令都存在相對應(yīng)的并行指令,如一條運(yùn)算指令可以并行兩條數(shù)據(jù)讀取指令。并行指令的使用能成倍提高代碼的執(zhí)行速度。
(4) 將內(nèi)層循環(huán)展開等。
對于不同的圖像幀(I、P),各模塊所占的比例各不相同。對于I幀,幀內(nèi)模式選擇和去塊效應(yīng)濾波占較大的比例;對于P幀,幀間模式選擇則占較大的比例??傊?模式選擇及去塊效應(yīng)濾波是H.264編碼的瓶頸,需要對這兩部分進(jìn)行優(yōu)化。
進(jìn)行模式選擇時會調(diào)用絕對差值求和函數(shù)(SAD)及hadamard變換后再絕對值求和函數(shù)(SATD)。這兩個函數(shù)雖然較簡單,但調(diào)用較頻繁,對這兩個函數(shù)進(jìn)行匯編優(yōu)化,能較大提高模式選擇的速度。對于絕對差值求和函數(shù)(SAD),通過使用Blackfin的專用視頻指令SAA,可以大大提高運(yùn)算速度,具體見匯編優(yōu)化統(tǒng)計表1和表2。
去塊效應(yīng)濾波在編碼中占有較大的比重。主要包括:計算濾波強(qiáng)度和行列濾波兩部分,需要針對這兩個子模塊進(jìn)行優(yōu)化。去塊效應(yīng)濾波中有較多的判斷語句,判斷語句會打斷DSP的流水線,使DSP不能充分發(fā)揮其性能,優(yōu)化時應(yīng)盡可能將判斷轉(zhuǎn)移到循環(huán)外面去,以提高執(zhí)行效率。同時去塊效應(yīng)濾波需要頻繁地訪問待濾波數(shù)據(jù),減少對這些數(shù)據(jù)的訪問次數(shù)也能較大地提高去塊效應(yīng)濾波的速度。
SAD()的函數(shù)原型及其匯編代碼[2]:
for(i=0;i<16*16;i++)
result +=abs( *pSrc++ - *pRef++);
LSETUP(row_start,row_end) LC0=P1; //利用Blackfin的硬件循環(huán)實現(xiàn)SAD的循環(huán)
row_start:
R3 = [I1++]; //讀取數(shù)據(jù)
SAA(R1:0,R3:2) R1= [I0++] R2= [I1++]; //計算R1:0和R3:2的SAD
SAA(R1:0,R3:2)(R) R0= [I0++] R3= [I1++]; //執(zhí)行SAA的同時,讀取數(shù)據(jù)
SAA(R1:0,R3:2) R1= [I0++] R2= [I1++];
row_end:SAA(R1:0,R3:2)(R) R0=[I0++] R2= [I1++];
3 實驗結(jié)果
筆者使用600MHz時鐘的Blackfin533,對于低、中運(yùn)動復(fù)雜度的圖像序列,能夠?qū)崿F(xiàn)25幀/秒的實時編碼;對于高運(yùn)動復(fù)雜度的圖像序列,能實現(xiàn)20幀/秒左右的準(zhǔn)實時編碼。其各模塊所占時間比例見表2。
編碼器的性能指標(biāo)如下:1個參考幀;幀間模式采用16×16、16×8、8×16、8×8模式;幀內(nèi)模式對16×16采用4種預(yù)測模式,對于4×4采用9種預(yù)測模式;1/4像素的運(yùn)動估計;熵編碼采用CAVLC編碼方式。
表3為不同圖像序列壓縮效果的比較。每種序列壓縮100幀圖像,采用IPPPP....的編碼模式。綜上所述,在Blkfin533平臺上實現(xiàn)了H.264的CIF圖像的準(zhǔn)實時編碼。該系統(tǒng)具有碼流低、延時小、圖像質(zhì)量高等優(yōu)點。
參考文獻(xiàn)
Draft ITU-T recommendation and final draft international stan- dard of joint
video specification (ITU-T Rec. H.264/ISO/IEC 14 496-10 AVC. in Joint Video Team (JVT)
of ISO/IEC MPEG and ITU-T VCEG, JVTG050, 2003
2 AD Inc. Blackfin processor instruction set reference.Rev 3.0,June 2004:417~421,487~492