賴(lài)梓昌,楊斌
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 610031)
?
異構(gòu)多核的全高清H264解碼系統(tǒng)設(shè)計(jì)※
賴(lài)梓昌,楊斌
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 610031)
利用異構(gòu)多核處理器OMAP4430在多媒體視頻編解碼上的運(yùn)算優(yōu)勢(shì),實(shí)現(xiàn)了全高清H264視頻的實(shí)時(shí)解碼。采用virtio緩存隊(duì)列和RPMsg消息框架來(lái)實(shí)現(xiàn)基于異步通知的異構(gòu)多核間數(shù)據(jù)通信,并結(jié)合TI公司IVA-HD多媒體硬件加速引擎和針對(duì)多核進(jìn)行的合理任務(wù)分配機(jī)制來(lái)提高解碼器的工作效率。實(shí)驗(yàn)結(jié)果表明,此方法實(shí)現(xiàn)的解碼速度達(dá)到35 F/s,能夠完成對(duì)1080P全高清視頻的實(shí)時(shí)解碼。
異構(gòu)多核;通信效率;IVA-HD加速引擎;全高清視頻;H264解碼
隨著移動(dòng)互聯(lián)網(wǎng)時(shí)代的到來(lái)、高清多媒體視頻的普及、3D大型手機(jī)游戲的出現(xiàn),單核嵌入式硬件平臺(tái)已經(jīng)難以滿(mǎn)足復(fù)雜的計(jì)算需求。而異構(gòu)多核處理器在視頻編解碼運(yùn)算上具有強(qiáng)大的優(yōu)勢(shì)[1],已經(jīng)成為嵌入式處理器架構(gòu)發(fā)展的趨勢(shì)。目前高清視頻編解碼大多采用異構(gòu)多核處理器內(nèi)的DSP進(jìn)行協(xié)同處理,通過(guò)片上通信機(jī)制實(shí)現(xiàn)核間多媒體數(shù)據(jù)傳輸。DSP相比軟解碼在速度和性能上得到了一定的提升,如DaVinci平臺(tái)內(nèi)置DSP能夠?qū)崿F(xiàn)720P視頻實(shí)時(shí)解碼[2]。但DSP運(yùn)行時(shí)需要對(duì)信箱以及 DMA進(jìn)行配置,占用較多的片上通信帶寬,導(dǎo)致核間通信效率不高,同時(shí)DSP編解碼效率與硬編解碼器相比仍偏低。為了進(jìn)一步提高全高清H264編解碼性能,本文采用TI SoC OMAP4430異構(gòu)多核處理器作為處理平臺(tái),其最大不同在于內(nèi)置雙核Cortex-A9主處理器、雙核Cortex-M3協(xié)處理器及IVA-HD多媒體硬編解碼加速引擎。IVA-HD引擎內(nèi)部有7個(gè)針對(duì)各種視頻編解碼而設(shè)計(jì)的加速引擎,每個(gè)加速引擎擁有獨(dú)立的數(shù)據(jù)存儲(chǔ)器,可以在很大程度上降低模塊間因?yàn)樽x寫(xiě)數(shù)據(jù)造成的競(jìng)爭(zhēng)。同時(shí)采用virtio緩存隊(duì)列[3]和RPMsg 消息框架[4]來(lái)實(shí)現(xiàn)基于異步通知的主處理核Cortex-A9與協(xié)處理核Cortex-M3間數(shù)據(jù)通信,具有大數(shù)據(jù)通信效率高、異步通知等優(yōu)點(diǎn)。OMAP4430處理器內(nèi)部的Cortex-A9雙核處理器將運(yùn)行高級(jí)嵌入式操作系統(tǒng)Linux,負(fù)責(zé)系統(tǒng)工作任務(wù)的調(diào)度、音頻解碼、用戶(hù)界面交互,而其內(nèi)部的Cortex-M3將充當(dāng)輔助處理器核,管理IVA-HD加速引擎完成解碼任務(wù),最后用實(shí)例驗(yàn)證設(shè)計(jì)的正確性。
1.1 virtio緩存隊(duì)列
virtio是半虛擬化 hypervisor中位于設(shè)備之上的抽象層,為異構(gòu)多核間數(shù)據(jù)通信提供了最底層的實(shí)現(xiàn)。它使用了兩個(gè)基于異步通知的緩存隊(duì)列(一個(gè)用于向協(xié)處理核發(fā)送數(shù)據(jù),另一個(gè)用于從協(xié)處理核接收數(shù)據(jù))和散列表,用于與遠(yuǎn)程異構(gòu)處理器進(jìn)行數(shù)據(jù)通信。每個(gè)隊(duì)列最多包含有512個(gè)緩存,每個(gè)緩存的大小限制在512字節(jié)以?xún)?nèi),緩沖池里面存放著通信數(shù)據(jù)。為了盡量減少共享內(nèi)存,采用環(huán)形散列表,散列表每個(gè)表項(xiàng)包括了緩存的物理地址和緩存的大小,散列表存放在內(nèi)存特定地址中,主處理器核與協(xié)處理器核基于互斥機(jī)制的共享內(nèi)存方式進(jìn)行訪問(wèn)。異構(gòu)多核間訪問(wèn)virtio緩存池示意圖如圖1所示。
圖1 異構(gòu)多核間訪問(wèn)virtio緩存池示意圖
采用共享環(huán)形散列表進(jìn)行異構(gòu)處理器核間數(shù)據(jù)通信的好處主要有幾個(gè)方面:
① 采用散列表表項(xiàng)表示數(shù)據(jù)緩存,可以減小共享內(nèi)存區(qū)域的大小,提高系統(tǒng)內(nèi)存使用率,同時(shí)允許變長(zhǎng)數(shù)據(jù)傳輸;
② 采用中斷方式通知目的處理器散列表的變化,減少了處理器盲目等待時(shí)間,提高了處理器的利用率;
③ 允許同時(shí)傳輸多個(gè)緩存數(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é)處理器核的運(yùn)行內(nèi)存中、設(shè)置虛擬地址映射到物理地址MMU單元,當(dāng)協(xié)處理器核遇段錯(cuò)誤或內(nèi)部代碼異常時(shí),輸出直觀的出錯(cuò)信息并且提供恢復(fù)機(jī)制,使得協(xié)處理器核可以重新使用。
1.2.2 消息通信
RPMsg消息框架基于virtio緩存隊(duì)列實(shí)現(xiàn)主處理器核和協(xié)處理器核間進(jìn)行消息通信,RPMsg向系統(tǒng)注冊(cè)了一條消息總線,并為每個(gè)Cortex-M3協(xié)處理器核創(chuàng)建相應(yīng)的總線設(shè)備,而多個(gè)客戶(hù)端驅(qū)動(dòng)程序也注冊(cè)在該消息總線上,并分配一個(gè)本地地址端口src和遠(yuǎn)程地址端口dst。當(dāng)客戶(hù)端驅(qū)動(dòng)需要發(fā)送消息時(shí),會(huì)把消息封裝成virtio緩存并添加到緩存隊(duì)列中以完成消息的發(fā)送,當(dāng)消息總線接收到協(xié)處理器送來(lái)的消息時(shí),會(huì)根據(jù)消息地址端口dst合理的派送給客戶(hù)驅(qū)動(dòng)程序進(jìn)行處理。其示意圖如圖2所示。
圖2 RPMsg消息總線工作示意圖
1.3 IVA-HD加速引擎
H.264/MPEG-4 Part 10是由ITU-T視頻編碼專(zhuān)家組和ISO/IEC運(yùn)動(dòng)圖像專(zhuān)家組(MPEG)聯(lián)合提出的高度壓縮數(shù)字視頻編解碼器標(biāo)準(zhǔn)[6],被廣泛應(yīng)用于網(wǎng)絡(luò)流媒體資源、HDTV等方面。與MPEG4、H263等標(biāo)準(zhǔn)相比,H264具有低碼率、高畫(huà)質(zhì)、高壓縮率和高可靠性等特點(diǎn),適用于干擾嚴(yán)重、丟包率高的信道傳輸。
H264解碼器工作流程如圖3所示,解碼器從網(wǎng)絡(luò)抽象層NAL中接收輸入的數(shù)據(jù)幀,經(jīng)過(guò)熵解碼、重排列后得到量化系數(shù)矩陣X,量化系數(shù)矩陣在經(jīng)過(guò)反量化和反變換后得到計(jì)算殘差Dn,同時(shí)通過(guò)運(yùn)動(dòng)補(bǔ)償和幀間預(yù)測(cè)或幀內(nèi)預(yù)測(cè)得到預(yù)測(cè)塊Pn,將Pn和Dn相加結(jié)果uFn經(jīng)過(guò)環(huán)路濾波得到輸出緩存圖像Fn。
圖3 H264解碼器工作流程
IVA-HD引擎是TI公司針對(duì)嵌入式平臺(tái)進(jìn)行多媒體編解碼加速而設(shè)計(jì)的第3代硬件加速引擎,支持H264、MPEG4、MPEG2、H263等常見(jiàn)的視頻編解碼標(biāo)準(zhǔn)。為了讓CPU更有效地進(jìn)行數(shù)據(jù)準(zhǔn)備和邏輯功能控制,IVA-HD集成了7個(gè)硬件加速引擎,它們和H264解碼器各個(gè)功能模塊的對(duì)應(yīng)關(guān)系在圖3中用虛線框表示,其中加速引擎名稱(chēng)core1~5所對(duì)應(yīng)的模塊功能分別是:熵解碼、反量化和反變換、環(huán)路濾波、幀內(nèi)預(yù)測(cè)、運(yùn)動(dòng)補(bǔ)償。
全高清H264解碼任務(wù)由主處理器Cortex-A9和協(xié)處理器Cortex-M3共同完成,Cortex-A9主要負(fù)責(zé)從多媒體文件中或網(wǎng)絡(luò)數(shù)據(jù)流中進(jìn)行數(shù)據(jù)的讀取、多媒體數(shù)據(jù)包過(guò)濾分離視頻流和音頻流、構(gòu)建RPMsg控制消息經(jīng)過(guò)virtio緩存封裝發(fā)送給協(xié)處理器Cortex-M3以設(shè)置IVA-HD加速引擎的控制參數(shù)、向協(xié)處理器發(fā)送多媒體數(shù)據(jù)包進(jìn)行H264解碼、在協(xié)處理器完成解碼任務(wù)后接收?qǐng)D像并通過(guò)DRM API[7]及KMS 模塊[8]繪制到屏幕上。
平臺(tái)上有兩個(gè)Cortex-M3處理器,分為Sys M3和App M3,都運(yùn)行TI BIOS實(shí)時(shí)操作系統(tǒng)[9],其中Sys M3主要負(fù)責(zé)創(chuàng)建與Cortex-A9通信的virtio緩存隊(duì)列,對(duì)程序執(zhí)行流程和CPU負(fù)載情況進(jìn)行記錄,接收A9發(fā)過(guò)來(lái)的緩存數(shù)據(jù)并進(jìn)行參數(shù)解析,同時(shí)根據(jù)緩存中dst參數(shù)分派緩存到App M3的相應(yīng)消息鏈表中。而App M3協(xié)處理器則完成實(shí)際的解碼工作,通過(guò)運(yùn)行于嵌入式平臺(tái)的Codec Engine[10]來(lái)完成對(duì)IVA-HD加速引擎的操作。App M3提取消息鏈表中消息請(qǐng)求,相應(yīng)設(shè)置IVA-HD加速引擎的狀態(tài)和初始化參數(shù),在進(jìn)行實(shí)際解碼時(shí),通過(guò)Codec Engine來(lái)調(diào)用IVA-HD加速引擎來(lái)完成解碼任務(wù),并將解碼結(jié)果通過(guò)緩存隊(duì)列發(fā)送回Cortex-A9處理器。整個(gè)系統(tǒng)解碼的框架圖如圖4所示。
圖4 H264解碼器工作框架圖
3.1 Cortex-A9軟件實(shí)現(xiàn)
Cortex-A9運(yùn)行Linux操作系統(tǒng),包括內(nèi)核模塊omapdce.ko和virtio緩存、RPMsg總線驅(qū)動(dòng)程序設(shè)計(jì)和FFmpeg多媒體庫(kù)[11]及DRM顯示接口調(diào)用。
3.1.1 virtio緩存隊(duì)列實(shí)現(xiàn)
virtio緩存隊(duì)列以共享散列表的方式和協(xié)處理器進(jìn)行數(shù)據(jù)通信,通過(guò)中斷方式通知對(duì)方散列表的添加,包括以下幾個(gè)方面:
① Irq _require()注冊(cè)中斷函數(shù),Register_bus_type("virtio")向系統(tǒng)注冊(cè)virtio總線;
② Regsiter_virtio_driver(&virtio_driver)向virtio總線注冊(cè)一個(gè)驅(qū)動(dòng)客戶(hù)端,用于創(chuàng)建向RPMsg總線注冊(cè)的設(shè)備;
③ 系統(tǒng)在發(fā)現(xiàn)協(xié)處理器后通過(guò)Register_virtio_device(&virtio_device)向virtio總線注冊(cè)一個(gè)設(shè)備,設(shè)備內(nèi)部含有創(chuàng)建virtio緩存隊(duì)列的函數(shù)指針;
④ virtio_bus->match(&virtio_device,&virtio_driver)函數(shù)將匹配virtio_driver與virtio_device是否合適,如果匹配成功,virtio_driver->probe(virtio_device)來(lái)創(chuàng)建send_virqueue、recv_virqueue及注冊(cè)到RPMsg的rpmsg_device,這樣virtio緩存隊(duì)列就和RPMsg總線聯(lián)系在一起了。
3.1.2 RPMsg消息框架實(shí)現(xiàn)
RPMsg總線將掛載許多rpmsg_driver和rpmsg_device,rpmsg_driver都有本地端口src和目的端口dst屬性,每次發(fā)送消息時(shí)會(huì)調(diào)用rpmsg_send((void*)data,src,dst)將消息添加到virtio的緩存隊(duì)列中,而當(dāng)消息msg到達(dá)RPMsg總線時(shí),總線把msg分配給dst屬性和msg->dst相同的rpmsg_driver,并調(diào)用rpmsg_driver->callback()進(jìn)行消息處理。
3.1.3 omapdce.ko驅(qū)動(dòng)模塊的實(shí)現(xiàn)
omapdce.ko模塊將作為一個(gè)rpmsg_driver,其完成了應(yīng)用程序引擎相關(guān)API的內(nèi)核實(shí)現(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ū)動(dòng)實(shí)現(xiàn),這些驅(qū)動(dòng)函數(shù)將調(diào)用RPMsg總線rpmsg_send()、rpmsg_recv()與協(xié)處理器進(jìn)行消息通信以完成工作任務(wù)。
3.1.4 解碼應(yīng)用viddectest實(shí)現(xiàn)
H264解碼應(yīng)用程序viddectest的工作主要分為以下幾個(gè)方面:
① Linux顯示接口DRM初始化,通過(guò)Drmopen()函數(shù)打開(kāi)/dev/dri/card0設(shè)備文件,獲取設(shè)備資源drmModeGetResources(),創(chuàng)建幀緩存drmModeAddFB2()及設(shè)置輸出分辨率及模式drmModeSetCrtc();
② FFmpeg多媒體庫(kù)的調(diào)用,通過(guò)AVOpenStreamFile()打開(kāi)多媒體文件,AVFindStream()分離出音頻流和視頻流,然后依次通過(guò)AVGetPacket()讀取視頻流數(shù)據(jù)包送去解碼器進(jìn)行解碼;
③ 加速引擎初始化和利用消息總線進(jìn)行解碼數(shù)據(jù)通信,通過(guò)Engine_open()打開(kāi)H264解碼引擎,Viddec3_create()創(chuàng)建一個(gè)解碼實(shí)例對(duì)象,Viddec3_control()設(shè)置解碼所需的參數(shù),Viddec3_process()將用RPMsg消息總線送出解碼數(shù)據(jù)流并接收解碼后的圖像緩存數(shù)據(jù)。應(yīng)用Viddectest解碼流程圖略——編者注。
3.2 Cortex-M3軟件實(shí)現(xiàn)
雙核Cortex-M3運(yùn)行TI公司 BIOS實(shí)時(shí)操作系統(tǒng),負(fù)責(zé)與主處理器的virtio緩存隊(duì)列通信及通過(guò)Codec engine調(diào)用IVA-HD加速引擎實(shí)現(xiàn)H264解碼,運(yùn)行流程圖略——編者注。主要包括以下內(nèi)容。
① virqueue_create(&send_queue),virqueue_create(&recv_queue)創(chuàng)建與Cortex-A9主處理器通信的 virtio發(fā)送及接收緩存隊(duì)列;
② Message_get_queue(&recv_queue)從virtio緩存隊(duì)列獲取主處理器發(fā)過(guò)來(lái)的請(qǐng)求數(shù)據(jù),Message_send_queue派發(fā)到App M3的消息隊(duì)列中;
③ App M3將獲取消息鏈表的消息,設(shè)置IVA-HD加速引擎的工作狀態(tài)并初始化,如果為解碼消息則通過(guò)Codec Engine 調(diào)用IVA-HD加速引擎來(lái)完成解碼過(guò)程;
④ 將解碼后的圖像緩存封裝成virtio緩存,調(diào)用Message_send_queue(),通過(guò)virtio緩存隊(duì)列發(fā)送回主處理器調(diào)用DRM進(jìn)行顯示輸出。
本文在OMAP4430開(kāi)發(fā)平臺(tái)上實(shí)現(xiàn)了基于異構(gòu)多核的全高清H264解碼,為了測(cè)試解碼器的性能,將針對(duì)不同比特率的720P、1080P 的網(wǎng)絡(luò)視頻文件Big_Buck_Bunny_Sunflower 進(jìn)行解碼測(cè)試,測(cè)試結(jié)果如表1所列,同時(shí)采用FFmpeg開(kāi)源庫(kù)項(xiàng)目軟解碼進(jìn)行測(cè)試,其對(duì)比圖略——編者注。
表1 H264解碼系統(tǒng)解碼測(cè)試表
本次設(shè)計(jì)的H264解碼器在解碼720P(1280×720)和1080P(1920×1080)視頻時(shí)分別達(dá)到60和34 fps,相比FFmpeg開(kāi)源H264軟解碼器效率提高了一倍。而普遍全高清流暢視頻的幀率為30 fps[12],能夠達(dá)到實(shí)時(shí)解碼性能需求。
隨著移動(dòng)互聯(lián)網(wǎng)時(shí)代的到來(lái),在移動(dòng)終端上流暢播放全高清視頻成為日常需求。為此本文采用移動(dòng)SoC OMAP4430異構(gòu)多核處理器為實(shí)驗(yàn)平臺(tái),通過(guò)virtio緩存隊(duì)列和RPMsg消息框?qū)崿F(xiàn)了異構(gòu)多核間多媒體數(shù)據(jù)通信,同時(shí)結(jié)合IVA-HD多媒體硬件加速引擎設(shè)計(jì)了一款全高清H264視頻硬解碼系統(tǒng)。實(shí)驗(yàn)結(jié)果表明,設(shè)計(jì)的解碼系統(tǒng)具有解碼速度快、解碼過(guò)程由硬件加速器完成無(wú)需消耗主核運(yùn)算資源、核間通信效率高、功耗小等優(yōu)點(diǎn),比開(kāi)源FFmpeg軟解碼器在性能上提升了一倍,滿(mǎn)足實(shí)時(shí)性要求。
[1] 陳芳園,張冬松,王志英.異構(gòu)多核處理器體系結(jié)構(gòu)設(shè)計(jì)研究[J].計(jì)算機(jī)工程與科學(xué),2011,33(12):27-36.
[2] 林李松,陳耀武.基于TMS320DM6467的H.264自適應(yīng)錯(cuò)誤掩蓋并行解碼算法[J].計(jì)算機(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] 李科,李璐,蘭時(shí)勇.基于FFmpeg和SDL實(shí)現(xiàn)多路實(shí)時(shí)流變換及播放[J].計(jì)算機(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)