蔡成都,張正炳 (長江大學電子信息學院,湖北 荊州 434023)
基于ARM9的H.264編解碼器實現(xiàn)
蔡成都,張正炳 (長江大學電子信息學院,湖北 荊州 434023)
基于ARM9嵌入式開發(fā)平臺和嵌入式Linux操作系統(tǒng),實現(xiàn)了基于H.264標準的編解碼器x264以及ffmpeg的移植,并提出優(yōu)化方案。結果表明,該編解碼器能滿足qcif格式文件實時解碼的要求。
H.264;ARM9;嵌入式系統(tǒng);編解碼
H.264/AVC 是由ITU-T 和ISO/IEC 聯(lián)合視頻小組(JVT[1]) 開發(fā)的新一代視頻壓縮標準, 該標準引進了許多新技術, 包括可變塊大小運動補償、1/4 像素運動估計、幀內預測、4×4整數(shù)變換和去塊效應濾波等[2]。與之前的H.263以及MPEG-4等標準相比,在同等圖像質量上,H.264平均碼流低40%左右,壓縮比更高[3];同樣的,在同等壓縮比的基礎上,H.264重建圖像更加精細,質量更好。H.264具有壓縮率高,碼流低的特點,使得經(jīng)過H.264壓縮的視頻數(shù)據(jù),在通過網(wǎng)絡傳輸?shù)倪^程中需要的帶寬更低,傳輸起來十分便利。然而,這些優(yōu)點是以成倍增加編解碼計算復雜度為代價的,其編碼的計算復雜度大約相當于H.263的3倍以上, 解碼復雜度大約相當于H.263的2~3倍[4]。
雖然H.264帶來了編解碼效率和質量的提升,但是其較高的編解碼復雜度使得在實際應用時必須進行優(yōu)化,否則很難實現(xiàn)實時編解碼和傳輸。隨著嵌入式技術以及視頻壓縮編碼技術的發(fā)展,基于嵌入式系統(tǒng)的視頻編解碼軟件的開發(fā)使得人們能在嵌入式系統(tǒng)上實現(xiàn)軟解碼并達到比較理想的效果。下面,筆者基于ARM9處理器,對H.264解碼器在嵌入式平臺上的應用提出優(yōu)化方案。
采用友善之臂的mini2440作為硬件平臺,處理器主頻為400MHZ,并且擁有64M片上SDRAM(Synchronous DRAM,同步動態(tài)隨機存儲器),足夠運行一般軟件的內存需要,256M的NAND FLASH可用于存儲文件。以功能強大、免費并且可靠性高的LINUX系統(tǒng)作為嵌入式操作系統(tǒng)。
首先在PC機上建立交叉編譯環(huán)境,然后通過交叉編譯分別將引導程序和嵌入式系統(tǒng)移植到目標板。構建嵌入式系統(tǒng)主要包含2方面:①針對目標板的硬件狀況對操作系統(tǒng)內核進行裁剪和配置;②構建根文件系統(tǒng)[5]。
筆者采用的軟件包為ffmpeg_x264_src_20071007.rar,解壓之后包含一個ffmpeg的文件夾和一個x264的文件夾。其中,x264作為編碼器輸出H.264碼流,ffmpeg則作為解碼器進行解碼播放。
在編譯X264之前首先要編譯yasm以支持MMX或者SSE優(yōu)化,使得編碼性能得到提升。筆者采用的是yasm1.1.0版本,解壓軟件包后進行配置:
#./configure——prefix=usr/local/bin/yasm
#make
#make install
完成yasm編譯之后即可編譯x264:
#cd x264
#./configure——prefix=/static //如果要移植到arm開發(fā)板上的話則添加——host=arm-linux選項
#make
#make install
完成之后即可在x264的目錄下生成x264文件以及一些必須的庫文件。
在進行ffmpeg和ffplay的編譯移植之前需進行SDL庫的移植,編譯之前鍵入./configure-help查看幫助,選好需要設置的參數(shù)即可進行編譯。鍵入以下命令進行編譯:
#./configure——prefix=/FriendlyArm/SDL——disable-video-qtopia——disable-video-dummy——disable-video-fbcon——disable-video-dga——disable-arts——disable-esd——disable-alsa——disable-cdrom——disable-video-x11——disable-nasm——target=arm-linux——host=arm-linux——enable-video-fbcon
#make
#make install
編譯完成之后會在選定目錄下生成所需的動態(tài)庫和include頭文件。在交叉編譯ffmpeg時必須將x264的相關選項——enable-libx264加上,另外要添加額外的include/link路徑:
——extra-cflags=-I/usr/local/include
——extra-ldflags=-L/usr/local/lib
——extra-libs=-L/usr/local/lib
直接configure后會發(fā)現(xiàn)SDL不被支持,這樣便無法生成所需要的ffplay,查看configure后發(fā)現(xiàn)在檢測SDL(SDL check)時未定義SDL目錄,筆者定義的SDL的目錄為/opt/FriendlyArm/SDL/bin,所以將未定義目錄的地方改為:SDL_CONFIG=“/opt/FriendlyArm/SDL/bin/sdl-config”即可編譯通過并同時產生可以在目標平臺上運行的ffmpeg和ffplay這2個所需的文件。將整個編譯過程中生成的庫文件libSDL-1.2.so.0、libx264.so.56以及ffmpeg和ffplay移植到目標板對應目錄下即可。
1)算法優(yōu)化 H.264標準雖然在性能上有很大的提升,但是算法卻極為復雜。所以,針對ARM處理器,對于CPU占用較大的乘除運算改用移位運算。如a+12b-4c+d+20e-20f,其中包含5個加法和4個乘法。利用移位運算將其改寫為a+d+(3b-c)?2+5[(e-f)?2],則變成了5個加法,2個乘法和2個移位運算,這樣就大大的降低了運算量。
另外,將CAVLC碼表轉化為二叉樹碼表的形式;對調用頻率高但代碼量小的函數(shù)使用關鍵字_inline等方法都可以起到優(yōu)化代碼的作用[6]。
2)基于ARM指令集的優(yōu)化 在ARM處理器上條件分支語句需要3個時鐘周期,而普通操作只需要1個時鐘周期,所以,可通過將循環(huán)語句展開,降低開銷,從而達到提高效率的目的。
此外,將一些變換函數(shù)(如DCT變換和IDCT變換)采用更加適合ARM處理器的匯編代碼改寫,同時在編譯器優(yōu)化選項上使用O3選項,可以降低程序的時間復雜度。同時在編解碼的時候可加入一些優(yōu)化參數(shù),也可以得到更理想的效果。
試驗所用的處理器為S3C2440,主頻400MHz,操作系統(tǒng)為linux系統(tǒng)2.6版本內核,交叉編譯器版本為4.3.2的版本。使用移植好的x264和ffmpeg以及ffplay對標準序列做測試,測試結果如表1所示。
表1 測試結果
注:qp值表示量化步長,共有52個值,當qp取最大值51時,表示最粗糙的量化;當qp取0時,表示最精細的量化,筆者統(tǒng)一選取qp=26;選取的測試序列akiyo_qcif、coastguard_qcif以及coastguard_cif出自http://trace.eas.asu.edu/yuv/;PSNR一欄中所示的分別是亮度信號(Y分量,即灰度值)、色度信號(U、V分量,描述影像色彩及飽和度)、均值(Avg)以及全局(Global)峰值信噪比。
圖1 視頻序列播放效果
從表1可以看出筆者采用的S3C2440處理器在編碼時速度比較慢,特別是對于格式更大的cif序列,編碼速度比同樣內容的qcif格式的序列慢4倍。但是在解碼的時候qcif序列能達到15fps左右的幀率,基本達到了實時解碼。目標板上播放標準qcif序列akiyo_qcif.yuv效果如圖1所示,基本可以滿足安防監(jiān)控的需求。若采用更好的處理器或者更優(yōu)化的算法,可以達到更好的幀率,滿足更高的需求。
基于ARM9架構的處理器,對H.264軟解碼算法做了一定優(yōu)化,對qcif格式的視頻序列基本達到實時解碼,但對于格式較大的cif序列效果不太顯著,后期希望能通過對算法其他方面的優(yōu)化以及采用支持多媒體擴展MMX指令的處理器來實現(xiàn)更大格式序列的實時解碼。
[1]郭存鎖.基于H.264 的數(shù)字視頻解碼器設計[D].北京:北方工業(yè)大學,2011.
[2]畢厚杰.新一代視頻壓縮編碼標準——H.264/AVC[M].北京:人民郵電出版社,2005.
[3]張春田,蘇育挺,張靜.數(shù)字圖像壓縮編碼[M].北京:清華大學出版社,2006.
[4]Tsai C Y,Chen T C,Chen L G.Low power entropy coding hardware design for H.264/AVC baseline profile encoder[A].IEEE International Conference on Multimedia and Expo[C].2006:1941-1944.
[5]陳文智.嵌入式系統(tǒng)開發(fā)原理與實踐[M].北京:清華大學出版社,2005.
[6]沈騫,婁淑琴,宿金華.基于VW2010芯片的網(wǎng)絡視頻壓縮編解碼器設計與實現(xiàn)[J].計算機測量與控制,2007,15(12):1814-1816.
[7]沙亮,王貴錦,趙安邦,等.H.264編碼下基于DCT系數(shù)量化值的PSNR估計方法[J].清華大學學報(自然科學版),2008, 48(4):510-513.
[編輯] 洪云飛
10.3969/j.issn.1673-1409(N).2012.04.042
TN919.8
A
1673-1409(2012)04-N121-03
2012-02-13
蔡成都(1987-),男, 2009年大學畢業(yè),碩士生,現(xiàn)主要從事視頻通信方面的研究工作。