隨著計(jì)算機(jī)網(wǎng)絡(luò)和多媒體技術(shù)的發(fā)展,數(shù)字視頻的應(yīng)用越來越廣泛,如DVD、網(wǎng)絡(luò)會(huì)議服務(wù)、數(shù)字電視等。在這些視頻處理與通信中,有效的視頻編碼是其關(guān)鍵技術(shù)。
H.264/AVC是ITU-T視頻編碼專家組和ISO/IEC運(yùn)動(dòng)圖像專家組聯(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)性更廣,能較好地滿足實(shí)時(shí)(視頻會(huì)議)及非實(shí)時(shí)(存儲(chǔ)、廣播等)等各種應(yīng)用。在DSP上實(shí)現(xiàn)H.264的實(shí)時(shí)編碼具有較大的工程意義及經(jīng)濟(jì)價(jià)值。
1 H.264標(biāo)準(zhǔn)簡(jiǎn)介及DSP平臺(tái)
1.1 H.264標(biāo)準(zhǔn)簡(jiǎ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ù)測(cè),共兩種預(yù)測(cè)模式:intra16×16和intra4×4。其中intra16×16有四種預(yù)測(cè)方式,intra4×4有九種預(yù)測(cè)方式。
(3) 對(duì)于幀間預(yù)測(cè),增加了預(yù)測(cè)模式,共七種預(yù)測(cè)模式。預(yù)測(cè)塊從16×16可以最小細(xì)分為4×4。
(4) 增加了參考幀的數(shù)目,使預(yù)測(cè)更為準(zhǔn)確。
(5) 將去塊效應(yīng)濾波放在編碼環(huán)內(nèi),提高圖像的主觀質(zhì)量。
(6) B幀可以作為參考幀,同時(shí)將圖像的解碼順序與顯示順序分離。
(7) 采用整系數(shù)變換,提高變換速度。
(8) 采用CAVLC、CABAC等新的熵編碼方法以提高編碼效果。
(9) 提高了碼流的抗誤碼能力,如對(duì)編碼數(shù)據(jù)進(jìn)行分割,一幀圖像可以靈活地分為幾個(gè)slice等。
1.2 基于Blackfin533的DSP平臺(tái)
Blackfin533是ADI公司Blackfin系列中的一款高性能視頻處理芯片。其主頻最高能達(dá)600MHz,每秒可處理1200M次乘加運(yùn)算。具有大量針對(duì)視頻的專用指令,可以并行處理多條指令。
從總體上看,Blackfin533分為內(nèi)核和系統(tǒng)接口兩大部分。內(nèi)核指處理器、L1存儲(chǔ)器、事件控制器、內(nèi)核定時(shí)器等;系統(tǒng)接口指SPORT接口、PPI接口、SPI接口、外部存儲(chǔ)控制器、DMA控制器及與它們接口的外部資源等。
Blackfin533開發(fā)平臺(tái)原理圖如圖1所示。攝像頭輸出的模擬視頻信號(hào)經(jīng)7113視頻芯片轉(zhuǎn)化為數(shù)字信號(hào),此信號(hào)從Blackfin533的PPI接口進(jìn)入Blackfin533,壓縮后的碼流由PCI橋傳給PC機(jī)。此系統(tǒng)通過Flash啟動(dòng),編碼過程中的原始圖像、參考幀及其他變量存儲(chǔ)在SDRAM中。
圖2為H.264編碼系統(tǒng)的視頻輸入模塊。7113芯片從視頻端子讀入攝像頭輸出的模擬信號(hào),通過并口將數(shù)字信號(hào)輸出給Blackfin533。Blackfin533通過I2C總線對(duì)7113進(jìn)行配置,使其輸出YUV模式、ITU656模式及增強(qiáng)ITU656模式等。
?????????????? 圖1 Blackfin533平臺(tái)總體框架圖
???????????????????? 圖2 視頻輸入模塊?
???????????
???????????????? 圖3 H.264編碼模塊圖
2 H.264編碼器的優(yōu)化
2.1 總體優(yōu)化
總體優(yōu)化主要包括兩部分內(nèi)容:程序模塊化的設(shè)計(jì)及數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)。
程序模塊化設(shè)計(jì)時(shí),既要考慮模塊的獨(dú)立性,又要考慮模塊的完整性。筆者的H.264的模塊關(guān)系圖如圖3所示。視頻輸入模塊負(fù)責(zé)圖像序列的讀取,從PPI口進(jìn)入的圖像首先保存到外部存儲(chǔ)器,再進(jìn)行編碼。讀入的圖像經(jīng)幀間模式選擇和幀內(nèi)模式選擇模塊,得到每個(gè)宏塊的預(yù)測(cè)模式。整系數(shù)變換、量化模塊對(duì)預(yù)測(cè)后的殘差進(jìn)行整系數(shù)變換及量化處理。量化后的系數(shù)經(jīng)過掃描后,在編碼模塊中進(jìn)行UVLC編碼。最后由寫碼流模塊輸出。其中,去塊效應(yīng)濾波模塊對(duì)反量化、整系數(shù)逆變換后的重建圖像進(jìn)行濾波;圖像緩存管理模塊負(fù)責(zé)管理對(duì)參考圖像的存取。從圖3中可以看出,整系數(shù)變換與量化結(jié)合在一起作為一個(gè)模塊。主要因?yàn)?一方面H.264中,量化和整系數(shù)變換本身就部分結(jié)合在一起;另一方面這樣可以在寄存器中一起完成變換、量化,有助于減少數(shù)據(jù)的存儲(chǔ)次數(shù)和讀取時(shí)間。對(duì)于反量化、整系數(shù)逆變換,采用相似的設(shè)計(jì)思路。
數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)是H.264編碼的重要組成部分。合理的數(shù)據(jù)結(jié)構(gòu)既有利于提高數(shù)據(jù)訪問的速度又有利于程序的不同平臺(tái)的移植。主要有以下原則:盡可能連續(xù)存放數(shù)據(jù),這樣有利于用DMA方式對(duì)數(shù)據(jù)進(jìn)行讀取;每種數(shù)據(jù)結(jié)構(gòu)完成相對(duì)簡(jiǎn)單的功能,這樣便于對(duì)不同數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)進(jìn)行管理。如表示幀間模式的InterMode、幀內(nèi)模式的IntraMode需要放在片內(nèi)存儲(chǔ)器中以加快讀取速度,而參考幀的數(shù)據(jù)ImgData由于數(shù)據(jù)太大則需要放在片外存儲(chǔ)器中;盡可能使用短的數(shù)據(jù)類型,節(jié)省DSP的存儲(chǔ)空間。
2.2 各程序模塊的優(yōu)化
各程序模塊的優(yōu)化主要指各模塊的C代碼優(yōu)化及部分代碼的匯編優(yōu)化。
C代碼的優(yōu)化對(duì)H.264編碼器有著重要意義,它既有利于提高編碼的速度,又有利于編碼器的跨平臺(tái)移植。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有兩個(gè)硬件循環(huán)器,可提供兩層的硬件循環(huán)。硬件循環(huán)實(shí)現(xiàn)了零開銷的循環(huán)判斷,能大大提高循環(huán)指令的執(zhí)行速度,然而數(shù)據(jù)依賴的存在會(huì)阻止硬件循環(huán)的使用。所以要盡可能消除循環(huán)中的數(shù)據(jù)依賴。
(3) 將除法轉(zhuǎn)化為乘法或查表方式。Blackfin533提供了硬件乘法器,但沒有硬件除法器。執(zhí)行除法指令會(huì)花費(fèi)幾十或上百個(gè)指令周期。將除法轉(zhuǎn)化為乘法或查表,能大大減少這種開銷。
(4) 減少對(duì)片外存儲(chǔ)器的訪問次數(shù)。片外存儲(chǔ)器相對(duì)于片內(nèi)存儲(chǔ)器是低速設(shè)備,片外存儲(chǔ)器的讀取時(shí)間是片內(nèi)存儲(chǔ)器的幾倍至十幾倍。對(duì)于片外存儲(chǔ)器的數(shù)據(jù)要做到一次讀取,完成多次計(jì)算。
Blackfin芯片的開發(fā)環(huán)境VisualDSP本身已經(jīng)帶有匯編器,但由于種種原因,對(duì)于某些運(yùn)算量大、調(diào)用頻繁的函數(shù)仍需要進(jìn)行手動(dòng)匯編優(yōu)化。進(jìn)行匯編優(yōu)化時(shí),應(yīng)注意以下幾點(diǎn):
(1) 節(jié)省寄存器資源。Blackfin533提供了8個(gè)32位數(shù)據(jù)寄存器以及一系列的地址寄存器。對(duì)于這些寄存器,應(yīng)盡可能做到一個(gè)寄存器多次使用;同時(shí)在能用較短的數(shù)據(jù)類型的情況下用短的數(shù)據(jù)類型,如能用short則不用int,這樣每個(gè)32位寄存器可以作為兩個(gè)16位寄存器使用,相當(dāng)于增加了寄存器的數(shù)量。
(2) 使用專用指令。Blackfin533提供了求最大值、最小值、絕對(duì)值、CLIP及大量視頻專用指令,通過使用這些指令,能大大提高代碼的執(zhí)行速度。
(3) 使用并行指令。對(duì)于大多數(shù)指令都存在相對(duì)應(yīng)的并行指令,如一條運(yùn)算指令可以并行兩條數(shù)據(jù)讀取指令。并行指令的使用能成倍提高代碼的執(zhí)行速度。
(4) 將內(nèi)層循環(huán)展開等。
對(duì)于不同的圖像幀(I、P),各模塊所占的比例各不相同。對(duì)于I幀,幀內(nèi)模式選擇和去塊效應(yīng)濾波占較大的比例;對(duì)于P幀,幀間模式選擇則占較大的比例。總之,模式選擇及去塊效應(yīng)濾波是H.264編碼的瓶頸,需要對(duì)這兩部分進(jìn)行優(yōu)化。
進(jìn)行模式選擇時(shí)會(huì)調(diào)用絕對(duì)差值求和函數(shù)(SAD)及hadamard變換后再絕對(duì)值求和函數(shù)(SATD)。這兩個(gè)函數(shù)雖然較簡(jiǎn)單,但調(diào)用較頻繁,對(duì)這兩個(gè)函數(shù)進(jìn)行匯編優(yōu)化,能較大提高模式選擇的速度。對(duì)于絕對(duì)差值求和函數(shù)(SAD),通過使用Blackfin的專用視頻指令SAA,可以大大提高運(yùn)算速度,具體見匯編優(yōu)化統(tǒng)計(jì)表1和表2。
表1 優(yōu)化前后函數(shù)所占時(shí)鐘周期數(shù)對(duì)比表?
????????
?
優(yōu)化函數(shù) | 優(yōu)化前(時(shí)鐘周期數(shù)) | 優(yōu)化后(時(shí)鐘周期數(shù)) | 提高倍數(shù) |
SAD | 1385 | 55 | 25 |
SATD | 1964 | 84 | 23 |
GetStrength | 50214 | 4983 | 10 |
EdgeLoopY | 61227 | 5032 | 12 |
EdgeLoopUV | 52110 | 4173 | 12 |
????????????????????????? 表2 優(yōu)化后的H.264各模塊性能?
??????
? | 占用時(shí)間(時(shí)鐘周期數(shù)M) | 所占比例 |
模式選擇(包含插值) | 11.26 | 53.6% |
變換、量化 | 1.87 | 8.9% |
反量化、反變換 | 1.93 | 9.2% |
編碼(UVLC) | 0.90 | 4.3% |
去塊效應(yīng)濾波 | 2.73 | 13% |
其他 | 2.31 | 11% |
??????????????????????? 表3 壓縮后的CIF圖像的質(zhì)量
?
?????
?
?
? | H.264編碼器 | |||
視頻序列 (100幀) |
平均峰值信噪比PSNR(dB) | 碼率(kbit/s) | ||
亮度Y | 色度U | 色度V | ? | |
Foreman | 36.57 | 41.23 | 43.39 | 503 |
Shanlin | 34.00 | 39.95 | 41.30 | 1035 |
tempete | 30.47 | 35.81 | 37.60 | 1059 |
mobile | 30.58 | 34.48 | 34.24 | 1587 |
?
去塊效應(yīng)濾波在編碼中占有較大的比重。主要包括:計(jì)算濾波強(qiáng)度和行列濾波兩部分,需要針對(duì)這兩個(gè)子模塊進(jìn)行優(yōu)化。去塊效應(yīng)濾波中有較多的判斷語句,判斷語句會(huì)打斷DSP的流水線,使DSP不能充分發(fā)揮其性能,優(yōu)化時(shí)應(yīng)盡可能將判斷轉(zhuǎn)移到循環(huán)外面去,以提高執(zhí)行效率。同時(shí)去塊效應(yīng)濾波需要頻繁地訪問待濾波數(shù)據(jù),減少對(duì)這些數(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)實(shí)現(xiàn)SAD的循環(huán)
row_start:
R3 = [I1++]; //讀取數(shù)據(jù)
SAA(R1:0,R3:2) || R1= [I0++] || R2= [I1++]; //計(jì)算R1:0和R3:2的SAD
SAA(R1:0,R3:2)(R) || R0= [I0++] || R3= [I1++]; //執(zhí)行SAA的同時(shí),讀取數(shù)據(jù)
SAA(R1:0,R3:2) || R1= [I0++] || R2= [I1++];
row_end:SAA(R1:0,R3:2)(R) || R0=[I0++] || R2= [I1++];
3 實(shí)驗(yàn)結(jié)果
筆者使用600MHz時(shí)鐘的Blackfin533,對(duì)于低、中運(yùn)動(dòng)復(fù)雜度的圖像序列,能夠?qū)崿F(xiàn)25幀/秒的實(shí)時(shí)編碼;對(duì)于高運(yùn)動(dòng)復(fù)雜度的圖像序列,能實(shí)現(xiàn)20幀/秒左右的準(zhǔn)實(shí)時(shí)編碼。其各模塊所占時(shí)間比例見表2。
編碼器的性能指標(biāo)如下:1個(gè)參考幀;幀間模式采用16×16、16×8、8×16、8×8模式;幀內(nèi)模式對(duì)16×16采用4種預(yù)測(cè)模式,對(duì)于4×4采用9種預(yù)測(cè)模式;1/4像素的運(yùn)動(dòng)估計(jì);熵編碼采用CAVLC編碼方式。
表3為不同圖像序列壓縮效果的比較。每種序列壓縮100幀圖像,采用IPPPP....的編碼模式。綜上所述,在Blkfin533平臺(tái)上實(shí)現(xiàn)了H.264的CIF圖像的準(zhǔn)實(shí)時(shí)編碼。該系統(tǒng)具有碼流低、延時(shí)小、圖像質(zhì)量高等優(yōu)點(diǎn)。
評(píng)論