在DM642 EVM平臺上實(shí)現了 H.264視頻編碼器,并從內存分配、Cache優(yōu)化、代碼優(yōu)化以及匯編程序級優(yōu)化等幾個(gè)方面對編碼器進(jìn)行了優(yōu)化。實(shí)驗結果表明,優(yōu)化后的編碼器能保持較高的圖象質(zhì)量和壓縮效率,并具有較好的實(shí)時(shí)性能。 1 引言 H.264/AVC是ITU-T視頻編碼專(zhuān)家組和ISO/IEC運動(dòng)圖象專(zhuān)家組聯(lián)合提出的新一代視頻編碼標準。在相同的條件下,與MPEG-1、MPEG-2、H.263、MPEG-4等標準相比,H.264/AVC能夠減少50%的碼流。但是,H.264的高編碼效率是以高運算量和高復雜度為代價(jià)的。 本文采用具有較高運算速度和較強數據處理能力的DM642 EVM作為H.264視頻編碼器實(shí)現和優(yōu)化的 DSP硬件平臺,實(shí)現了 H.264視頻編碼算法,并對算法程序進(jìn)行了綜合優(yōu)化。實(shí)驗結果表明,經(jīng)過(guò)優(yōu)化的 H.264視頻編碼器能保持較高的圖象質(zhì)量和壓縮效率,并具有較好的實(shí)時(shí)性能。 2 H.264視頻編碼技術(shù)及DM642 EVM開(kāi)發(fā)平臺 2.1 H264視頻編碼技術(shù) H.264壓縮算法采用與H.263和MPEG-4類(lèi)似的基于塊的混和編碼方法,采用幀內(Intra)和幀間(Inter)兩種編碼模式。為了提高編碼效率、壓縮比和圖象質(zhì)量,H.264采用了許多新的編碼技術(shù),這些技術(shù)主要有: ⑴ H.264標準壓縮系統由視頻編碼層(VCL,Video Coding Layer)和網(wǎng)絡(luò )抽象層(NAL,Network Abstraction Layer)兩部分組成。 ⑵ H.264采用幀內預測,昀大程度地減少圖象的空間冗余信息。 ⑶ H.264的幀間預測采用多幀參考幀(參考的個(gè)數為1~5)、高精度的內插算法(包括1/4和 1/8精度)、多種變形搜索塊等新的方法,在很大程度上提高運動(dòng)估計與補償的效率。 ⑷ 1/4、1/8象素精度的亞象素運動(dòng)估計:對于QCIF視頻格式使用1/4象素精度預測方式,對于CIF視頻格式使用1/8象素精度預測方法。 ⑸ 殘差圖象的4x4整數DCT變換技術(shù),逆變換過(guò)程中沒(méi)有匹配錯誤問(wèn)題。 ⑹ 新的環(huán)路濾波技術(shù)及熵編碼技術(shù)等。 2.2 DM642 EVM開(kāi)發(fā)平臺DM642 EVM是TI推出的一款專(zhuān)門(mén)面向多媒體應用的開(kāi)發(fā)平臺,板上資源包括:DM642 CPU芯片、4M×64bit同步動(dòng)態(tài)存儲器(SDRAM)、4M×8bit FLASH存儲器和一路視頻編碼和兩路視頻解碼等,其結構如圖1所示。DM642基于C64X內核,主頻高達600MHz,采用超長(cháng)指令字(VLIW)結構,每個(gè)指令周期可并行處理8條32位的指令,處理能力達4800MIPS;片上內存采用二級緩存Cache結構,L1由16KB的數據Cache L1D和16KB的程序Cache L1P組成,256KB的L2可配置成SRAM或Cache,大幅度提高了程序的運行性能;片內64位的EMIF(External MemoryInterface)接口可以與SDRAM、Flash等存儲器件無(wú)縫連接,極大地方便了大量數據的搬移;DM642包括了3個(gè)專(zhuān)用的視頻端口(VP0~VP2),用于接收、處理視頻數據,提高了整個(gè)系統的性能;DM642自帶的EMAC口以及從EMIF口擴展出來(lái)的ATA口,還為處理完成后產(chǎn)生的海量數據提供了存儲通道。因此,實(shí)現H.264的視頻算法,高性能的DM642 EVM是一個(gè)理想的硬件平臺。 3 H.264視頻編碼器的實(shí)現與優(yōu)化 3.1 編碼器的實(shí)現 H.264視頻編碼器的實(shí)現有多種方法,不過(guò)大部分都是進(jìn)行移植、優(yōu)化的操作。H.264代碼要在DSP的軟件平臺CCS環(huán)境下運行,需要注意幾個(gè)問(wèn)題:如配置文件、庫文件的改動(dòng)、數據類(lèi)型的調整、匯編程序的處理、內存終結模式的調整等。 H.264編碼采用變換和預測的混合編碼方法,其原理如圖2所示。輸入幀或者場(chǎng)Fn以宏塊為單位被編碼器處理,即將圖象分成子圖象塊,以子圖象塊作為編碼單元。當采用幀內預測編碼時(shí),預測值P是由當前片中已編碼的參考圖象經(jīng)過(guò)運動(dòng)補償(MC)后得出的,其中參考圖象用F1n-1表示;為了提高預測精度,從而提高壓縮比,實(shí)際的參考圖象可在過(guò)去或未來(lái)已編碼解碼重建和濾波的幀中選擇。預測值P和當前塊相減后,產(chǎn)生一個(gè)殘差塊Dn,經(jīng)塊變換、量化后產(chǎn)生一組量化后的變化系數X,再經(jīng)過(guò)熵編碼,與解碼所需的一些邊信息(如預測模式量化參數、運動(dòng)矢量等)一起組成一個(gè)壓縮后的碼流,經(jīng)過(guò)NAL供傳輸和存儲用。 3.2 內存分配及Cache優(yōu)化 與PC機相比,DSP的程序數據存儲空間非常有限。因此,對于視頻編碼這種需要處理大量數據的程序而言,必須合理安排數據和程序的存儲方式,實(shí)現對存儲器的優(yōu)化。實(shí)驗表明,合理利用兩級緩存并配合低工作頻率外部存儲器,系統的效率能達到全部使用高工作頻率內部存儲器的80%~90%。 本文將占據較大空間的數據或使用頻率不高的程序放在片外存儲器中,啟用L2 Cache,調用C6000的芯片支持庫CSL中的CACHE-setL2Mode函數,將L2設置為198KB的SRAM和64KB的Cache模式。并根據H.264算法本身的結構,采取以下方法對存儲器進(jìn)行優(yōu)化:利用CCS的分析工具Profile分析C代碼,將反復調用的程序段(例如DCT變換和IDCT變換)放在片內程序存儲區中,把頻繁用到的數據段(如編碼表)放在片內數據存儲器中,把運用次數較少的程序和數據段放在片外存儲器中,避免對程序或數據進(jìn)行不必要的反復搬移。 在H.264編碼器運行過(guò)程中,由于一幀圖象的數據量很大,因此將參考幀和當前幀數據放到片外存儲器中,需要用到時(shí),再將它們從外部存儲器搬到片內存儲器中,以提高程序的運行效率。 3.3 代碼優(yōu)化 進(jìn)行代碼優(yōu)化,先要找出程序的瓶頸,即占用CPU時(shí)間較多的代碼,然后對其進(jìn)行有針對性的優(yōu)化。使用CCS提供的代碼剖析工具Profile可以統計顯示出程序中各個(gè)重要段和函數的運行時(shí)間,找出運算量較大的程序段,優(yōu)化這些程序段,對于提高算法的性能有巨大影響。 ⑴ 聯(lián)合使用-pm和-03編譯選項,對代碼進(jìn)行項目級的優(yōu)化:CCS提供了強大功能的編譯選項,從-O0到-O3共四級優(yōu)化。-O3編譯選項使能軟件流水和其他優(yōu)化方法,-pm選項從程序代碼角度,把整個(gè)項目的所有源程序聯(lián)合起來(lái),作為一個(gè)模塊來(lái)處理。-pm和-03兩個(gè)選項聯(lián)合使用,能進(jìn)行一系列的優(yōu)化,并且代碼尺寸變小很多。 ⑵ 使用const、restrict 關(guān)鍵字修飾指針:const指示編譯器其修飾的指針所指向的內容不能修改;restrict指示編譯器其修飾的指針與其他指針指向的內容不會(huì )覆蓋,這些信息使兩個(gè)指針不會(huì )訪(fǎng)問(wèn)同一存儲器地址,可以消除存儲器之間的相關(guān)性,這樣可以并行執行多個(gè)數據的讀取和運算,使代碼運行達到昀大效率。 ⑶ 對短字長(cháng)數據使用寬長(cháng)度的存儲器訪(fǎng)問(wèn)(數據打包處理):即當CPU執行一連串短型數據(如16bit數據)操作時(shí),可將數據類(lèi)型設置為32bit長(cháng)度的int型,這樣可以一次性訪(fǎng)問(wèn)2個(gè)短型數據,然后使用C6000指令,同時(shí)進(jìn)行兩個(gè)數據的操作,減少了對內存的訪(fǎng)問(wèn),這比采用16bit長(cháng)度short型節約一半的時(shí)間。 ⑷ 循環(huán)展開(kāi),把C語(yǔ)言中的循環(huán)打開(kāi),把多循環(huán)變?yōu)樯傺h(huán),減少循環(huán)嵌套,使得可能并行的指令增加,從而改進(jìn)軟件流水編排,改善代碼性能。 ⑸ 減少C函數的調用,盡量使用系統提供的內聯(lián)函數(intrinsics函數)代替C函數,C6000編譯器提供了許多intrinsics,是直接與C6000匯編指令映射的在線(xiàn)函數,可以快速優(yōu)化C代碼,這樣減少許多不必要的操作,提高代碼運算速度。 ⑹ 使用軟件流水技術(shù),軟件流水是一種對循環(huán)中的指令進(jìn)行調度優(yōu)化的技術(shù),利用軟件流水可生成非常緊湊的循環(huán)代碼。當編譯時(shí)采用-O2或-O3級別的優(yōu)化選項時(shí),編譯器將對程序中的循環(huán)進(jìn)行軟件流水。通過(guò)軟件流水的優(yōu)化,可以大大提高循環(huán)代碼的效率,極大地實(shí)現指令的并行性。 3.4 匯編程序級優(yōu)化 通過(guò) profile clock工具找出效率很低的部分,使用線(xiàn)形匯編繼續優(yōu)化。線(xiàn)性匯編語(yǔ)言是 C6000系列 DSP獨有的一種編程語(yǔ)言,介于高級語(yǔ)言和低級語(yǔ)言之間。和標準的匯編語(yǔ)言不同的是,在編寫(xiě)線(xiàn)性匯編程序時(shí)可不必考慮指令的延時(shí)、指令的并行、寄存器的使用和功能單元的分配等,匯編優(yōu)化器將根據代碼的情況自動(dòng)確定這些信息。匯編程序優(yōu)化可通過(guò)對自動(dòng)編譯生成的匯編文件進(jìn)行修改而進(jìn)行。匯編優(yōu)化其實(shí)就是根據以上各個(gè)方面的特點(diǎn),采取針對性的方法,以獲得盡可能高的程序效率。常用的匯編偽指令如下: ⑴ 定義一個(gè)可被匯編優(yōu)化器優(yōu)化且可被 C/C++當做函數調用的線(xiàn)性匯編代碼段的偽指令: label .cproc [ var1,[var2,…] ] .endproc ⑵ 定義一個(gè)可被匯編優(yōu)化器優(yōu)化的線(xiàn)性匯編代碼段的偽指令: label .proc [ reg1,[reg2,…] ] .endproc [ reg1,[reg2,…] ] 線(xiàn)性匯編優(yōu)化時(shí)還需要考慮以下幾個(gè)方面:① 平均分配使用功能單元,提高代碼的并 行度。② 使流水線(xiàn)核心循環(huán)的時(shí)鐘周期數昀小。 4 實(shí)驗結果 經(jīng)過(guò)以上各種算法優(yōu)化后,基于DSP硬件平臺DM642 EVM的H.264編碼算法的性能得到了極大提高。實(shí)驗中采用Foreman、Container、News三個(gè)H.264標準測試序列,分別代表高、中、低運動(dòng)格式,采用IPP編碼模式,對優(yōu)化前后的算法進(jìn)行了測試。 表3給出了優(yōu)化前后對各種標準測試序列進(jìn)行編碼后的測試結果,算法優(yōu)化在保證圖象質(zhì)量的前提下,極大提高了編碼速度,視頻圖象較好地實(shí)現了實(shí)時(shí)性編碼要求。 本文重點(diǎn)探討了H.264視頻編碼算法在DM642 EVM硬件平臺上的實(shí)現和優(yōu)化,經(jīng)過(guò)優(yōu)化后算法具有較好的實(shí)現性和實(shí)時(shí)性。在此基礎上,還可以在調整代碼結構方面進(jìn)行優(yōu)化,使其更加適合DSP的指令系統。此外還可以更合理的利用TMS320DM642芯片的結構和豐富的外部接口,更高效的實(shí)現編解碼器算法。 |