新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > H.264視頻解碼器在C6416 DSP上的實(shí)現(xiàn)

H.264視頻解碼器在C6416 DSP上的實(shí)現(xiàn)

作者: 時(shí)間:2008-08-13 來(lái)源:網(wǎng)絡(luò) 收藏
多媒體通信終端設(shè)備具有廣泛的應(yīng)用前景,可以應(yīng)用于會(huì)議、可視電話、PDA、數(shù)字電視等各個(gè)領(lǐng)域,所以高效、實(shí)用的多媒體終端設(shè)備一直是通信領(lǐng)域研究的主要方向之一。
多媒體通信終端的主要有兩點(diǎn):一方面需要快速、穩(wěn)定的處理器作為多媒體信號(hào)處理的平臺(tái),另一方面需要適合多媒體通信的協(xié)議標(biāo)準(zhǔn)和軟件算法,尤其是對(duì)音信號(hào)的壓縮處理算法。兩者的結(jié)合才能產(chǎn)生高效的多媒體通信設(shè)備。目前,隨著數(shù)字信號(hào)處理器()的高速發(fā)展,為高效的音信號(hào)處理提供了可能性;另一方面,最新的低碼率視頻壓縮標(biāo)準(zhǔn)的出臺(tái),提供了適合通信的視頻標(biāo)準(zhǔn)和算法指導(dǎo)。因此,將兩者結(jié)合,把算法在,對(duì)于多媒體通信的研究具有一定的意義和價(jià)值。
本文介紹了算法的實(shí)現(xiàn)。在設(shè)計(jì)中,采用了ATEME公司的網(wǎng)絡(luò)視頻開(kāi)發(fā)平臺(tái)(NVDK )作為DSP處理平臺(tái),實(shí)現(xiàn)了H.264的優(yōu)化解碼算法。對(duì)于QCIF視頻序列,解碼速度達(dá)50~60幀/秒。
1 網(wǎng)絡(luò)視頻開(kāi)發(fā)平臺(tái)NVDK簡(jiǎn)介
NVDK是TI的第三方ATEME公司推出的基于TI C6400系列DSP評(píng)估開(kāi)發(fā)套件,是一款適用于圖像、視頻信號(hào)處理的高速DSP開(kāi)發(fā)平臺(tái)[1]。該套件為諸如視頻基礎(chǔ)設(shè)施及網(wǎng)絡(luò)化視頻設(shè)備等高級(jí)視頻應(yīng)用制造商提供了方便,提高了數(shù)字視頻應(yīng)用項(xiàng)目的開(kāi)發(fā)速度。
1.1 NVDK 體系結(jié)構(gòu)
NVDK 由TMS320C6416 DSP內(nèi)核、10/100 Mbps 的以太網(wǎng)子卡、音頻/視頻接口盒、PCI總線、存儲(chǔ)器單元、擴(kuò)展接口及獨(dú)立電源等構(gòu)成。其功能結(jié)構(gòu)框圖如圖1所示。


1.2 NVDK C6416的主要特點(diǎn)
NVDK作為網(wǎng)絡(luò)及視頻開(kāi)發(fā)套件,把很多音視頻接口及網(wǎng)絡(luò)接口直接做在板卡上,給采用TI C6000系列DSP芯片作為處理單元的開(kāi)發(fā)用戶提供了便利的前端平臺(tái)。它為項(xiàng)目演示、算法實(shí)現(xiàn)、原型制作、數(shù)據(jù)仿真、FPGA開(kāi)發(fā)和軟件優(yōu)化提供了完整的DSP開(kāi)發(fā)平臺(tái)。其主要特點(diǎn)如下:
C6416 DSP內(nèi)核:600MHz時(shí)鐘頻率及8指令并行結(jié)構(gòu),最高可以達(dá)到4800MIPS的處理能力。
視頻特點(diǎn):在輸入端,NVDK能夠捕獲PAL制或NTSC制的模擬視頻信號(hào),可以采用復(fù)合視頻(CVBS)或者S-video視頻信號(hào)輸入,輸入模擬視頻信號(hào)被數(shù)字化為YUV422數(shù)字視頻格式。在輸出端,NVDK在支持復(fù)合視頻(CVBS)以及S-Video輸出的同時(shí),還提供了SVGA輸出模式,可以直接將信號(hào)輸出到顯示器上。就圖像尺寸而言,視頻采集提供FULL、CIF和QCIF三種圖像格式,視頻輸出提供FULL和CIF兩種圖像格式。
音頻特點(diǎn):提供兩路雙聲道音頻輸出,CD音質(zhì)的輸入輸出立體聲接口,另外還提供一路單聲道的麥克風(fēng)輸入。
主接口:提供了PCI接口,允許與PC機(jī)相連。該板既可以以PCI模式運(yùn)行,也可以單獨(dú)脫機(jī)工作。
網(wǎng)絡(luò)接口:以太網(wǎng)接口為視頻碼流的網(wǎng)絡(luò)傳輸帶來(lái)了方便。
外部擴(kuò)展存儲(chǔ)器:256M 64位寬擴(kuò)展內(nèi)存SDRAMA和8M 32位寬擴(kuò)展內(nèi)存SDRAMB及4MB FLASH ROM提供了足夠的內(nèi)存空間和靈活的內(nèi)存分配方案。
2 H.264視頻壓縮標(biāo)準(zhǔn)
H.264是由ITU-T 視頻編碼專家組(VCEG)和ISO/IEC移動(dòng)圖像專家組(MPEG)共同提出的最新國(guó)際視頻編碼標(biāo)準(zhǔn)。它在H.261、H.263視頻壓縮標(biāo)準(zhǔn)的基礎(chǔ)上,進(jìn)行了進(jìn)一步的改進(jìn)和擴(kuò)展。其目的是為了進(jìn)一步降低編碼碼率,提高壓縮效率,同時(shí)提供一個(gè)友好的網(wǎng)絡(luò)接口,使得視頻碼流更適合在網(wǎng)絡(luò)上傳送[2]。由于該標(biāo)準(zhǔn)可以提供更低的碼率,所以更適合應(yīng)用于多媒體通信領(lǐng)域。
H.264主要有以下新特點(diǎn):
網(wǎng)絡(luò)適配層NAL(Network Abstraction Layer)。
傳統(tǒng)的視頻編碼編完的視頻碼流在任何應(yīng)用領(lǐng)域下(無(wú)論用于存儲(chǔ)、傳輸?shù)龋┒际墙y(tǒng)一的碼流模式,視頻碼流僅有視頻編碼層(Video Coding Layer)。而H.264根據(jù)不同應(yīng)用增加不同的NAL片頭,以適應(yīng)不同的網(wǎng)絡(luò)應(yīng)用環(huán)境,減少碼流的傳輸差錯(cuò)。
幀內(nèi)預(yù)測(cè)編碼模式(Intra Prediction Coding)。
幀內(nèi)預(yù)測(cè)編碼合理地利用了I幀的空間冗余度,從而大大降低了I幀的編碼碼流。
自適應(yīng)塊大小編碼模式(Adaptive Block Size Coding)。
H.264允許使用1616、168、816、88、84、48、44等子塊預(yù)測(cè)和編碼模式,采用更小的塊和自適應(yīng)編碼的方式,使得預(yù)測(cè)殘差的數(shù)據(jù)量減少,進(jìn)一步降低了碼率。
高精度亞像素運(yùn)動(dòng)估計(jì)(High precision sub-pel Motion Estimation)。
H.264中明確提出了運(yùn)動(dòng)估計(jì)采用亞像素運(yùn)動(dòng)估計(jì)的方法,并制定1/4像素和1/8像素可選的運(yùn)動(dòng)估計(jì)方法。亞像素運(yùn)動(dòng)估計(jì),提高了預(yù)測(cè)精度,同時(shí)降低了殘差的編碼碼率。
多幀運(yùn)動(dòng)補(bǔ)償技術(shù)(Multi-frame Motion Compensation)。
傳統(tǒng)的視頻壓縮編碼采用一個(gè)(P幀)或兩個(gè)(B幀)解碼幀作為當(dāng)前幀預(yù)測(cè)的參考幀。在H.264中,最多允許5個(gè)參考幀,通過(guò)在更多的參考幀里進(jìn)行運(yùn)動(dòng)估計(jì)和補(bǔ)償,找到殘差更小的預(yù)測(cè)塊,降低編碼碼率。
整形變換編碼(Inter Transform Coding)。
H.264采用整形變換代替DCT變換,整形變換采用定點(diǎn)運(yùn)算代替浮點(diǎn)運(yùn)算。采用這種變換,不僅可以降低編解碼的時(shí)間,而且,為該算法在多媒體處理平臺(tái)上實(shí)現(xiàn)帶來(lái)了方便。在這一點(diǎn)上,H.264視頻編碼標(biāo)準(zhǔn)更適合作為多媒體終端的編解碼標(biāo)準(zhǔn)。
兩種可選擇熵編碼CAVLC和CABAC。
CAVLC(Context-based Adaptive Variable Length Coding):基于內(nèi)容的自適應(yīng)變長(zhǎng)編碼。
CABAC(Context-based Adaptive Binary Arithmetic Coding):自適應(yīng)二進(jìn)制算術(shù)編碼。
以往的視頻壓縮標(biāo)準(zhǔn)中,都采用Huffman編碼與變長(zhǎng)編碼相結(jié)合的方法進(jìn)行熵編碼。Huffman編碼雖然是一種很好用的熵編碼方法,但是其編碼效率并不是最高的,而且,Huffman編碼的抗差錯(cuò)性能很低。H.264中采用了兩種可以選擇的熵編碼方法:CAVLC編碼抗差錯(cuò)能力比較高,但是編碼效率不是很高;CABAC編碼是一種高效率的熵編碼方法,但是計(jì)算復(fù)雜度很高。兩者各有優(yōu)缺點(diǎn),所以針對(duì)不同的應(yīng)用,選擇不同的編碼方法。

3 H.264算法的DSP實(shí)現(xiàn)和優(yōu)化
3.1 在PC機(jī)上實(shí)現(xiàn)H.264算法并進(jìn)行優(yōu)化

ITU-T官方提供的H.264的核心算法不僅在代碼結(jié)構(gòu)上需要改進(jìn),而且在具體的核心算法上也需要做大的改動(dòng),才能達(dá)到實(shí)時(shí)的要求。這一步需要做的具體工作包括:去處冗余代碼、規(guī)范程序結(jié)構(gòu)、全局和局部變量的調(diào)整和重新定義、結(jié)構(gòu)體的調(diào)整等。
3.2 PC機(jī)H.264代碼的DSP化
C6000開(kāi)發(fā)工具Code Composer Studio有自己的ANSI C編譯器和優(yōu)化器,并有自己的語(yǔ)法規(guī)則和定義,所以在DSP上實(shí)現(xiàn)H.264的算法要把PC機(jī)上C語(yǔ)言編寫(xiě)的H.264代碼進(jìn)行改動(dòng),使其完全符合DSP中C的規(guī)則。
這些改動(dòng)包括:去除所有的文件操作;去除可視化界面的操作;合理安排內(nèi)存空間的預(yù)留和分配;規(guī)范數(shù)據(jù)類型――因?yàn)镃6416是定點(diǎn)DSP芯片,只支持四種數(shù)據(jù)類型:short型(16 bit)、int(32bits)、long型(40bits)和double型(64bits),因此必須對(duì)數(shù)據(jù)進(jìn)行重新規(guī)范,把浮點(diǎn)數(shù)的運(yùn)算部分近似用定點(diǎn)表示,或用定點(diǎn)實(shí)現(xiàn)浮點(diǎn)運(yùn)算;根據(jù)內(nèi)存的分配定義遠(yuǎn)近程常量和變量;把常用的數(shù)據(jù)在數(shù)據(jù)結(jié)構(gòu)中提取出來(lái),以near型數(shù)據(jù)定義在DSP內(nèi)部存儲(chǔ)空間,以減少對(duì)EMIF端口的讀取,從而提高速度。
3.3 H.264的DSP算法優(yōu)化[3]
通過(guò)把PC機(jī)H.264代碼DSP化,可以在DSP上實(shí)現(xiàn)H.264的編解碼算法,但是,這樣實(shí)現(xiàn)的算法運(yùn)行效率很低,因?yàn)樗械拇a都是由C語(yǔ)言編寫(xiě),并沒(méi)有完全利用DSP的各種性能。所以必須結(jié)合DSP本身的特點(diǎn),對(duì)其進(jìn)一步優(yōu)化,才能實(shí)現(xiàn)H.264視頻算法對(duì)視頻圖像的實(shí)時(shí)處理。
對(duì)DSP代碼的優(yōu)化共分為三個(gè)層次:項(xiàng)目級(jí)優(yōu)化、C程序級(jí)優(yōu)化、匯編程序級(jí)優(yōu)化。
(1)項(xiàng)目級(jí)優(yōu)化:主要是通過(guò)選擇CCS提供的編譯優(yōu)化參數(shù),根據(jù)H.264系統(tǒng)的要求進(jìn)行優(yōu)化,通過(guò)不斷地對(duì)各個(gè)參數(shù)( -mw -pm -o3 -mt等)的選擇、搭配、調(diào)整,改善循環(huán)、多重循環(huán)體的性能,進(jìn)行軟件流水,從而提高軟件的并行性。
(2)C程序級(jí)優(yōu)化:主要是針對(duì)采用的DSP的具體特點(diǎn)進(jìn)行代碼的功能精簡(jiǎn)、數(shù)據(jù)結(jié)構(gòu)的優(yōu)化、循環(huán)的優(yōu)化、代碼的并行化處理。在這里主要工作包括以下部分:去除掉SNR計(jì)算、幀率及其他輔助信息的程序模塊。函數(shù)及數(shù)據(jù)映射區(qū)域的調(diào)整,把經(jīng)常用的數(shù)據(jù)存儲(chǔ)在片內(nèi)存儲(chǔ)器中,頻繁調(diào)用的程序盡可能映射在相鄰或相近的存儲(chǔ)區(qū)域。C函數(shù)的并行化處理,針對(duì)并行化效果差的函數(shù),尤其是多重循環(huán)體,要進(jìn)行循環(huán)拆解,將多重循環(huán)拆解為單重循環(huán)。減少存儲(chǔ)區(qū)數(shù)據(jù)的讀取和存儲(chǔ),尤其是片外存儲(chǔ)區(qū)域數(shù)據(jù)的調(diào)用,以減少時(shí)間。數(shù)據(jù)結(jié)構(gòu)的重定義和調(diào)整。
下面以數(shù)據(jù)結(jié)構(gòu)的調(diào)整說(shuō)明如何合理利用DSP特性進(jìn)行軟件優(yōu)化。
數(shù)據(jù)結(jié)構(gòu)是指數(shù)據(jù)的類型及其在內(nèi)存空間的分配方式,不同的數(shù)據(jù)結(jié)構(gòu),對(duì)程序的性能有不同的影響。因此,數(shù)據(jù)結(jié)構(gòu)的調(diào)整對(duì)程序在DSP上并行執(zhí)行是必不可少的步驟。
在H.264解碼器內(nèi)核代碼中,數(shù)組mpr[i][j]用來(lái)存放一個(gè)宏塊的預(yù)測(cè)系數(shù),數(shù)據(jù)類型是int型,其中i、j是該系數(shù)的坐標(biāo)。但是預(yù)測(cè)系數(shù)實(shí)際上只有8位位寬,所以,定義成byte型就足夠了。這樣一方面節(jié)省了內(nèi)存空間,另一方面,用byte類型可以直接使用LDW指令代替LDB指令,一次讀取4個(gè)數(shù)據(jù),節(jié)省了讀取時(shí)間。因?yàn)镠.264中對(duì)系數(shù)的讀取都是以塊為單位的,而內(nèi)核中的mpr數(shù)據(jù)結(jié)構(gòu)顯然不能充分利用DSP的特性,所以數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)也需要調(diào)整,把mpr中每一個(gè)塊分配到一個(gè)連續(xù)的內(nèi)存空間有利于數(shù)據(jù)的傳送,如圖2所示。這樣,每一次確定了一個(gè)塊以后,只要更改一維的信息就能確定系數(shù)的位置,而原始的結(jié)構(gòu)對(duì)每一個(gè)系數(shù)都有確定兩位系數(shù)。通過(guò)這樣的數(shù)據(jù)調(diào)整,可以明顯地提高程序的運(yùn)行速度。


(3)匯編程序級(jí)優(yōu)化。匯編級(jí)的優(yōu)化包括兩部分:采用線性匯編語(yǔ)言進(jìn)行優(yōu)化和直接用匯編語(yǔ)言進(jìn)行優(yōu)化。由于系統(tǒng)編譯器的局限性,并不能將全部的函數(shù)都很好地優(yōu)化,這樣就需要統(tǒng)計(jì)比較耗時(shí)的C語(yǔ)言函數(shù),用匯編語(yǔ)言重新編寫(xiě)。這些函數(shù)包括:插值函數(shù)、幀內(nèi)預(yù)測(cè)函數(shù)、整形反變換等函數(shù)。
下面以差值函數(shù)中的一段來(lái)說(shuō)明匯編編寫(xiě)帶來(lái)的性能提高。
橫向1/2插值源代碼:
for (j = 0; j BLOCK_SIZE; j++) {
for (i = 0; i BLOCK_SIZE; i++) {
for (result = 0, x = -2; x 4; x++)
result += mref[ref_frame][ y_pos+j][ x_pos+i+x]*COEF[x+2];
block[i][j] = max(0, min(255, (result+16)/32));
}
}
該段代碼采用一個(gè)六階濾波器來(lái)插值1/2位置的像素值,共插出16個(gè)值(一個(gè)塊)。源代碼采用三重循環(huán),內(nèi)層循環(huán)是插值濾波器,如果直接用編譯器把源代碼編譯成匯編的話,內(nèi)部循環(huán)都要反復(fù)讀取一些內(nèi)存數(shù)據(jù)。采用匯編自己編寫(xiě),則可以改進(jìn)算法,大大降低函數(shù)的運(yùn)行時(shí)間。
如圖3所示,在插值第一個(gè)半像素位置時(shí),要在內(nèi)存中讀取1~6像素的值,插值第二個(gè)半像素位置時(shí),要讀取2~7點(diǎn)的值,這樣,就反復(fù)讀取了2~5像素點(diǎn)的值,而且,插值一個(gè)點(diǎn)需要進(jìn)行6次乘法、5次加法。用匯編語(yǔ)言編寫(xiě),手工排流水線,可以降低數(shù)據(jù)的讀取次數(shù),同時(shí)減少了乘、加法指令數(shù)。首先,采用LDNW指令直接讀取8個(gè)數(shù)據(jù)到寄存器中,每次插值直接使用寄存器而不再去內(nèi)存中讀取數(shù)據(jù)。另外,采用DOTPSU4乘累加命令代替MPL指令,將四次乘法和3次加法用一條指令來(lái)代替,減少了指令數(shù)目。


通過(guò)以上各種優(yōu)化方法,最終實(shí)現(xiàn)了基于C6416內(nèi)核的H.264 baseline解碼器算法。
4 算法性能的評(píng)測(cè)及前景展望
在NVDK C6416環(huán)境下,測(cè)試了解碼器算法,對(duì)QCIF測(cè)試序列,已經(jīng)能夠達(dá)到50~60幀/秒的解碼速度,遠(yuǎn)遠(yuǎn)達(dá)到了實(shí)時(shí)性解碼的目的。
在NVDK C6416板卡上實(shí)現(xiàn)的H.264視頻解碼器具有功能強(qiáng)、使用靈活等特點(diǎn),有廣泛的應(yīng)用前景。該優(yōu)化的算法不僅適用于NVDK板,對(duì)于所有的C64開(kāi)發(fā)板都具有通用性,只要根據(jù)板卡的內(nèi)存分配,重新配置內(nèi)存參數(shù)文件,便可以把該算法移植到新的開(kāi)發(fā)板中。該H.264視頻解碼器與網(wǎng)絡(luò)平臺(tái)相連接便可以應(yīng)用于視頻會(huì)議、可視電話、無(wú)線流媒體通信等應(yīng)用領(lǐng)域。
參考文獻(xiàn)
1 IEKC64X USERS MANUAL. Data Sheet.
2 Thomas Wiegand, Gary J.Sullivan, Gisle Bjontegaard andAjay Luthra.Overview of the H.264/AVC Video Coding Standard. IEEE Transactions on Circuits and Systems for VideoTechnology, 2003;(7):560~576
3 SPRU187g. TMS320 C6000 Optimizing C Compiler User'sGuide. March 2000



評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉