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