賴梓昌,楊斌
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 610031)
?
異構(gòu)多核的全高清H264解碼系統(tǒng)設(shè)計※
賴梓昌,楊斌
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 610031)
利用異構(gòu)多核處理器OMAP4430在多媒體視頻編解碼上的運算優(yōu)勢,實現(xiàn)了全高清H264視頻的實時解碼。采用virtio緩存隊列和RPMsg消息框架來實現(xiàn)基于異步通知的異構(gòu)多核間數(shù)據(jù)通信,并結(jié)合TI公司IVA-HD多媒體硬件加速引擎和針對多核進(jìn)行的合理任務(wù)分配機制來提高解碼器的工作效率。實驗結(jié)果表明,此方法實現(xiàn)的解碼速度達(dá)到35 F/s,能夠完成對1080P全高清視頻的實時解碼。
異構(gòu)多核;通信效率;IVA-HD加速引擎;全高清視頻;H264解碼
隨著移動互聯(lián)網(wǎng)時代的到來、高清多媒體視頻的普及、3D大型手機游戲的出現(xiàn),單核嵌入式硬件平臺已經(jīng)難以滿足復(fù)雜的計算需求。而異構(gòu)多核處理器在視頻編解碼運算上具有強大的優(yōu)勢[1],已經(jīng)成為嵌入式處理器架構(gòu)發(fā)展的趨勢。目前高清視頻編解碼大多采用異構(gòu)多核處理器內(nèi)的DSP進(jìn)行協(xié)同處理,通過片上通信機制實現(xiàn)核間多媒體數(shù)據(jù)傳輸。DSP相比軟解碼在速度和性能上得到了一定的提升,如DaVinci平臺內(nèi)置DSP能夠?qū)崿F(xiàn)720P視頻實時解碼[2]。但DSP運行時需要對信箱以及 DMA進(jìn)行配置,占用較多的片上通信帶寬,導(dǎo)致核間通信效率不高,同時DSP編解碼效率與硬編解碼器相比仍偏低。為了進(jìn)一步提高全高清H264編解碼性能,本文采用TI SoC OMAP4430異構(gòu)多核處理器作為處理平臺,其最大不同在于內(nèi)置雙核Cortex-A9主處理器、雙核Cortex-M3協(xié)處理器及IVA-HD多媒體硬編解碼加速引擎。IVA-HD引擎內(nèi)部有7個針對各種視頻編解碼而設(shè)計的加速引擎,每個加速引擎擁有獨立的數(shù)據(jù)存儲器,可以在很大程度上降低模塊間因為讀寫數(shù)據(jù)造成的競爭。同時采用virtio緩存隊列[3]和RPMsg 消息框架[4]來實現(xiàn)基于異步通知的主處理核Cortex-A9與協(xié)處理核Cortex-M3間數(shù)據(jù)通信,具有大數(shù)據(jù)通信效率高、異步通知等優(yōu)點。OMAP4430處理器內(nèi)部的Cortex-A9雙核處理器將運行高級嵌入式操作系統(tǒng)Linux,負(fù)責(zé)系統(tǒng)工作任務(wù)的調(diào)度、音頻解碼、用戶界面交互,而其內(nèi)部的Cortex-M3將充當(dāng)輔助處理器核,管理IVA-HD加速引擎完成解碼任務(wù),最后用實例驗證設(shè)計的正確性。
1.1 virtio緩存隊列
virtio是半虛擬化 hypervisor中位于設(shè)備之上的抽象層,為異構(gòu)多核間數(shù)據(jù)通信提供了最底層的實現(xiàn)。它使用了兩個基于異步通知的緩存隊列(一個用于向協(xié)處理核發(fā)送數(shù)據(jù),另一個用于從協(xié)處理核接收數(shù)據(jù))和散列表,用于與遠(yuǎn)程異構(gòu)處理器進(jìn)行數(shù)據(jù)通信。每個隊列最多包含有512個緩存,每個緩存的大小限制在512字節(jié)以內(nèi),緩沖池里面存放著通信數(shù)據(jù)。為了盡量減少共享內(nèi)存,采用環(huán)形散列表,散列表每個表項包括了緩存的物理地址和緩存的大小,散列表存放在內(nèi)存特定地址中,主處理器核與協(xié)處理器核基于互斥機制的共享內(nèi)存方式進(jìn)行訪問。異構(gòu)多核間訪問virtio緩存池示意圖如圖1所示。
圖1 異構(gòu)多核間訪問virtio緩存池示意圖
采用共享環(huán)形散列表進(jìn)行異構(gòu)處理器核間數(shù)據(jù)通信的好處主要有幾個方面:
① 采用散列表表項表示數(shù)據(jù)緩存,可以減小共享內(nèi)存區(qū)域的大小,提高系統(tǒng)內(nèi)存使用率,同時允許變長數(shù)據(jù)傳輸;
② 采用中斷方式通知目的處理器散列表的變化,減少了處理器盲目等待時間,提高了處理器的利用率;
③ 允許同時傳輸多個緩存數(shù)據(jù),提高了系統(tǒng)通信的吞吐率。
1.2 RPMsg消息框架
RPMsg(Remote Processor Messaging)是基于virtio技術(shù)的用于處理器核間數(shù)據(jù)通信的消息框架,提供協(xié)處理器核上電復(fù)位管理、消息通信等功能。
1.2.1 協(xié)處理器核復(fù)位管理
協(xié)處理器核復(fù)位管理主要負(fù)責(zé)加載程序執(zhí)行體到協(xié)處理器核的運行內(nèi)存中、設(shè)置虛擬地址映射到物理地址MMU單元,當(dāng)協(xié)處理器核遇段錯誤或內(nèi)部代碼異常時,輸出直觀的出錯信息并且提供恢復(fù)機制,使得協(xié)處理器核可以重新使用。
1.2.2 消息通信
RPMsg消息框架基于virtio緩存隊列實現(xiàn)主處理器核和協(xié)處理器核間進(jìn)行消息通信,RPMsg向系統(tǒng)注冊了一條消息總線,并為每個Cortex-M3協(xié)處理器核創(chuàng)建相應(yīng)的總線設(shè)備,而多個客戶端驅(qū)動程序也注冊在該消息總線上,并分配一個本地地址端口src和遠(yuǎn)程地址端口dst。當(dāng)客戶端驅(qū)動需要發(fā)送消息時,會把消息封裝成virtio緩存并添加到緩存隊列中以完成消息的發(fā)送,當(dāng)消息總線接收到協(xié)處理器送來的消息時,會根據(jù)消息地址端口dst合理的派送給客戶驅(qū)動程序進(jìn)行處理。其示意圖如圖2所示。
圖2 RPMsg消息總線工作示意圖
1.3 IVA-HD加速引擎
H.264/MPEG-4 Part 10是由ITU-T視頻編碼專家組和ISO/IEC運動圖像專家組(MPEG)聯(lián)合提出的高度壓縮數(shù)字視頻編解碼器標(biāo)準(zhǔn)[6],被廣泛應(yīng)用于網(wǎng)絡(luò)流媒體資源、HDTV等方面。與MPEG4、H263等標(biāo)準(zhǔn)相比,H264具有低碼率、高畫質(zhì)、高壓縮率和高可靠性等特點,適用于干擾嚴(yán)重、丟包率高的信道傳輸。
H264解碼器工作流程如圖3所示,解碼器從網(wǎng)絡(luò)抽象層NAL中接收輸入的數(shù)據(jù)幀,經(jīng)過熵解碼、重排列后得到量化系數(shù)矩陣X,量化系數(shù)矩陣在經(jīng)過反量化和反變換后得到計算殘差Dn,同時通過運動補償和幀間預(yù)測或幀內(nèi)預(yù)測得到預(yù)測塊Pn,將Pn和Dn相加結(jié)果uFn經(jīng)過環(huán)路濾波得到輸出緩存圖像Fn。
圖3 H264解碼器工作流程
IVA-HD引擎是TI公司針對嵌入式平臺進(jìn)行多媒體編解碼加速而設(shè)計的第3代硬件加速引擎,支持H264、MPEG4、MPEG2、H263等常見的視頻編解碼標(biāo)準(zhǔn)。為了讓CPU更有效地進(jìn)行數(shù)據(jù)準(zhǔn)備和邏輯功能控制,IVA-HD集成了7個硬件加速引擎,它們和H264解碼器各個功能模塊的對應(yīng)關(guān)系在圖3中用虛線框表示,其中加速引擎名稱core1~5所對應(yīng)的模塊功能分別是:熵解碼、反量化和反變換、環(huán)路濾波、幀內(nèi)預(yù)測、運動補償。
全高清H264解碼任務(wù)由主處理器Cortex-A9和協(xié)處理器Cortex-M3共同完成,Cortex-A9主要負(fù)責(zé)從多媒體文件中或網(wǎng)絡(luò)數(shù)據(jù)流中進(jìn)行數(shù)據(jù)的讀取、多媒體數(shù)據(jù)包過濾分離視頻流和音頻流、構(gòu)建RPMsg控制消息經(jīng)過virtio緩存封裝發(fā)送給協(xié)處理器Cortex-M3以設(shè)置IVA-HD加速引擎的控制參數(shù)、向協(xié)處理器發(fā)送多媒體數(shù)據(jù)包進(jìn)行H264解碼、在協(xié)處理器完成解碼任務(wù)后接收圖像并通過DRM API[7]及KMS 模塊[8]繪制到屏幕上。
平臺上有兩個Cortex-M3處理器,分為Sys M3和App M3,都運行TI BIOS實時操作系統(tǒng)[9],其中Sys M3主要負(fù)責(zé)創(chuàng)建與Cortex-A9通信的virtio緩存隊列,對程序執(zhí)行流程和CPU負(fù)載情況進(jìn)行記錄,接收A9發(fā)過來的緩存數(shù)據(jù)并進(jìn)行參數(shù)解析,同時根據(jù)緩存中dst參數(shù)分派緩存到App M3的相應(yīng)消息鏈表中。而App M3協(xié)處理器則完成實際的解碼工作,通過運行于嵌入式平臺的Codec Engine[10]來完成對IVA-HD加速引擎的操作。App M3提取消息鏈表中消息請求,相應(yīng)設(shè)置IVA-HD加速引擎的狀態(tài)和初始化參數(shù),在進(jìn)行實際解碼時,通過Codec Engine來調(diào)用IVA-HD加速引擎來完成解碼任務(wù),并將解碼結(jié)果通過緩存隊列發(fā)送回Cortex-A9處理器。整個系統(tǒng)解碼的框架圖如圖4所示。
圖4 H264解碼器工作框架圖
3.1 Cortex-A9軟件實現(xiàn)
Cortex-A9運行Linux操作系統(tǒng),包括內(nèi)核模塊omapdce.ko和virtio緩存、RPMsg總線驅(qū)動程序設(shè)計和FFmpeg多媒體庫[11]及DRM顯示接口調(diào)用。
3.1.1 virtio緩存隊列實現(xiàn)
virtio緩存隊列以共享散列表的方式和協(xié)處理器進(jìn)行數(shù)據(jù)通信,通過中斷方式通知對方散列表的添加,包括以下幾個方面:
① Irq _require()注冊中斷函數(shù),Register_bus_type("virtio")向系統(tǒng)注冊virtio總線;
② Regsiter_virtio_driver(&virtio_driver)向virtio總線注冊一個驅(qū)動客戶端,用于創(chuàng)建向RPMsg總線注冊的設(shè)備;
③ 系統(tǒng)在發(fā)現(xiàn)協(xié)處理器后通過Register_virtio_device(&virtio_device)向virtio總線注冊一個設(shè)備,設(shè)備內(nèi)部含有創(chuàng)建virtio緩存隊列的函數(shù)指針;
④ virtio_bus->match(&virtio_device,&virtio_driver)函數(shù)將匹配virtio_driver與virtio_device是否合適,如果匹配成功,virtio_driver->probe(virtio_device)來創(chuàng)建send_virqueue、recv_virqueue及注冊到RPMsg的rpmsg_device,這樣virtio緩存隊列就和RPMsg總線聯(lián)系在一起了。
3.1.2 RPMsg消息框架實現(xiàn)
RPMsg總線將掛載許多rpmsg_driver和rpmsg_device,rpmsg_driver都有本地端口src和目的端口dst屬性,每次發(fā)送消息時會調(diào)用rpmsg_send((void*)data,src,dst)將消息添加到virtio的緩存隊列中,而當(dāng)消息msg到達(dá)RPMsg總線時,總線把msg分配給dst屬性和msg->dst相同的rpmsg_driver,并調(diào)用rpmsg_driver->callback()進(jìn)行消息處理。
3.1.3 omapdce.ko驅(qū)動模塊的實現(xiàn)
omapdce.ko模塊將作為一個rpmsg_driver,其完成了應(yīng)用程序引擎相關(guān)API的內(nèi)核實現(xiàn),主要包括ioctl_engine_open()、ioctl_viddec_create()、ioctl_viddec_control()、ioctl_viddec_process(),它們提供了應(yīng)用API engine_open、viddec_create()、viddec_control()、viddec_process()的驅(qū)動實現(xiàn),這些驅(qū)動函數(shù)將調(diào)用RPMsg總線rpmsg_send()、rpmsg_recv()與協(xié)處理器進(jìn)行消息通信以完成工作任務(wù)。
3.1.4 解碼應(yīng)用viddectest實現(xiàn)
H264解碼應(yīng)用程序viddectest的工作主要分為以下幾個方面:
① Linux顯示接口DRM初始化,通過Drmopen()函數(shù)打開/dev/dri/card0設(shè)備文件,獲取設(shè)備資源drmModeGetResources(),創(chuàng)建幀緩存drmModeAddFB2()及設(shè)置輸出分辨率及模式drmModeSetCrtc();
② FFmpeg多媒體庫的調(diào)用,通過AVOpenStreamFile()打開多媒體文件,AVFindStream()分離出音頻流和視頻流,然后依次通過AVGetPacket()讀取視頻流數(shù)據(jù)包送去解碼器進(jìn)行解碼;
③ 加速引擎初始化和利用消息總線進(jìn)行解碼數(shù)據(jù)通信,通過Engine_open()打開H264解碼引擎,Viddec3_create()創(chuàng)建一個解碼實例對象,Viddec3_control()設(shè)置解碼所需的參數(shù),Viddec3_process()將用RPMsg消息總線送出解碼數(shù)據(jù)流并接收解碼后的圖像緩存數(shù)據(jù)。應(yīng)用Viddectest解碼流程圖略——編者注。
3.2 Cortex-M3軟件實現(xiàn)
雙核Cortex-M3運行TI公司 BIOS實時操作系統(tǒng),負(fù)責(zé)與主處理器的virtio緩存隊列通信及通過Codec engine調(diào)用IVA-HD加速引擎實現(xiàn)H264解碼,運行流程圖略——編者注。主要包括以下內(nèi)容。
① virqueue_create(&send_queue),virqueue_create(&recv_queue)創(chuàng)建與Cortex-A9主處理器通信的 virtio發(fā)送及接收緩存隊列;
② Message_get_queue(&recv_queue)從virtio緩存隊列獲取主處理器發(fā)過來的請求數(shù)據(jù),Message_send_queue派發(fā)到App M3的消息隊列中;
③ App M3將獲取消息鏈表的消息,設(shè)置IVA-HD加速引擎的工作狀態(tài)并初始化,如果為解碼消息則通過Codec Engine 調(diào)用IVA-HD加速引擎來完成解碼過程;
④ 將解碼后的圖像緩存封裝成virtio緩存,調(diào)用Message_send_queue(),通過virtio緩存隊列發(fā)送回主處理器調(diào)用DRM進(jìn)行顯示輸出。
本文在OMAP4430開發(fā)平臺上實現(xiàn)了基于異構(gòu)多核的全高清H264解碼,為了測試解碼器的性能,將針對不同比特率的720P、1080P 的網(wǎng)絡(luò)視頻文件Big_Buck_Bunny_Sunflower 進(jìn)行解碼測試,測試結(jié)果如表1所列,同時采用FFmpeg開源庫項目軟解碼進(jìn)行測試,其對比圖略——編者注。
表1 H264解碼系統(tǒng)解碼測試表
本次設(shè)計的H264解碼器在解碼720P(1280×720)和1080P(1920×1080)視頻時分別達(dá)到60和34 fps,相比FFmpeg開源H264軟解碼器效率提高了一倍。而普遍全高清流暢視頻的幀率為30 fps[12],能夠達(dá)到實時解碼性能需求。
隨著移動互聯(lián)網(wǎng)時代的到來,在移動終端上流暢播放全高清視頻成為日常需求。為此本文采用移動SoC OMAP4430異構(gòu)多核處理器為實驗平臺,通過virtio緩存隊列和RPMsg消息框?qū)崿F(xiàn)了異構(gòu)多核間多媒體數(shù)據(jù)通信,同時結(jié)合IVA-HD多媒體硬件加速引擎設(shè)計了一款全高清H264視頻硬解碼系統(tǒng)。實驗結(jié)果表明,設(shè)計的解碼系統(tǒng)具有解碼速度快、解碼過程由硬件加速器完成無需消耗主核運算資源、核間通信效率高、功耗小等優(yōu)點,比開源FFmpeg軟解碼器在性能上提升了一倍,滿足實時性要求。
[1] 陳芳園,張冬松,王志英.異構(gòu)多核處理器體系結(jié)構(gòu)設(shè)計研究[J].計算機工程與科學(xué),2011,33(12):27-36.
[2] 林李松,陳耀武.基于TMS320DM6467的H.264自適應(yīng)錯誤掩蓋并行解碼算法[J].計算機工程與應(yīng)用,2012(8):172-175.
[3] RUSTY R.Virtio: Towards a De-facto Standard for Virtual I/O Devices[EB/OL]. [2014-08]. http://ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf.
[4] Texas Instruments. Design Overview - RPMsg[EB/OL].[2014-08].http://www.omappedia.org/wiki/Design_Overview_-_RPMsg.
[5] Texas Instruments. OMAP4430 Multimedia Device Silicon Revision 2.0 [EB/OL].[2014-08].http://focus.ti.com/pdfs/wtbu/OMAP4430_ES2.0_Public_TRM_vJ.pdf.
[6] 畢厚杰.新一代視頻壓縮編碼標(biāo)準(zhǔn)-H.264/AVC[M].北京: 人民郵電出版社,2005.
[7] JESSE BARNES. Linux DRM Developer's Guide[EB/OL]. [2014-08].http://landley.net/kdocs/htmldocs/drm.html.
[8] JOONYOUNG SHM. DRM(Direct Rendering Manager)[EB/OL].[2014-08].https://download.tizen.org/misc/media/conference2012/wednesday/ballroom-c/2012-05-09-1330-1410-the_drm_(direct_rendering_manager)_of_tizen_kernel.pdf.
[9] 何偉,陳彬,張玲.DSP/BIOS在基于DM642的視頻圖像處理中的應(yīng)用[J].信息與電子工程,2006,4(1):60-62.
[10] 白樺,杜宇.DM6446的Codec Engine原理及應(yīng)用[J]. 黑龍江科技信息,2009(5).
[11] 李科,李璐,蘭時勇.基于FFmpeg和SDL實現(xiàn)多路實時流變換及播放[J].計算機技術(shù)與發(fā)展,2014(4):65-68.
[12] Wikipedia. Frame rate[EB/OL].[2014-08].http://en.wikipedia.org/wiki/Frame_rate.
Lai Zichang, Yang Bin
(School of Information Science&Technology,Southwest Jiaotong University,Chengdu 610031,China)
The paper achieves the real-time decoding H264 full high-definition video based on the heterogeneous multi-core processor OMAP4430 which has advantage on handling multimedia video encoding and decoding computation.The design uses virtio buffer queue and RPMsg message framework to realize the data communication between heterogeneous multi-core based on asynchronous notification,and improves the decoder efficiency by using TI company IVA-HD multimedia hardware accelerator and adopting reasonable task allocation mechanism for multi-core.Experimental result shows that the decoder's decoding speed can reach 35 frames per second,meeting the requirement of real-time decoding for 1080P full high-definition video.
heterogeneous multi-core;communication efficiency;IVA-HD accelerator;full high-definition video;H264 decode
TP37
A
士然
2014-08-07)