基于異構多核全高清H264解碼系統設計
2系統設計
本文引用地址:http://dyxdggzs.com/article/271885.htm全高清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(
3)系統在發(fā)現協(xié)處理器后將通過(guò)register_virtio_device(
4)virtio_bus->match(
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所示:

圖5&6 應用viddectest流程圖&M3運行流程圖
評論