關(guān) 閉

新聞中心

EEPW首頁 > 安全與國防 > 設(shè)計應(yīng)用 > 基于異構(gòu)多核全高清H264解碼系統(tǒng)設(shè)計

基于異構(gòu)多核全高清H264解碼系統(tǒng)設(shè)計

作者: 時間:2015-03-31 來源:網(wǎng)絡(luò) 收藏

  2系統(tǒng)設(shè)計

本文引用地址:http://m.butianyuan.cn/article/271885.htm

  全高清解碼任務(wù)由主處理器Cortex-A9和協(xié)助處理器Cortex-M3共同完成,Cortex-A9主要負(fù)責(zé)從多媒體文件中或網(wǎng)絡(luò)數(shù)據(jù)流中進行數(shù)據(jù)的讀取、多媒體數(shù)據(jù)包過濾分離視頻流和音頻流、構(gòu)建RPMsg控制消息進過virtio緩存封裝發(fā)送給協(xié)處理核Cortex-M3以設(shè)置IVA-HD加速引擎的控制參數(shù)、向協(xié)處理器發(fā)送多媒體數(shù)據(jù)包進行解碼、在協(xié)處理器完成解碼任務(wù)后接收圖像并通過DRM API及KMS模塊繪制到屏幕上。

  平臺上有兩個Cortex-M3處理核,分為Sys M3和App M3,都運行TI BIOS實時操作系統(tǒng),其中Sys M3主要負(fù)責(zé)創(chuàng)建與Cortex-A9通信的virtio緩存隊列,對程序執(zhí)行流程和CPU負(fù)載情況進行記錄,接收A9發(fā)過來的緩存數(shù)據(jù)并進行參數(shù)解析,同時根據(jù)緩存中dst參數(shù)分派緩存到App M3的相應(yīng)消息鏈表中。而App M3協(xié)處理器則完成實際的解碼工作,App M3將通過運用于嵌入式平臺的Codec Engine來完成對IVA-HD加速引擎的操作。App M3將提取消息鏈表中消息請求相應(yīng)設(shè)置IVA-HD加速引擎的狀態(tài)和初始化參數(shù),在進行實際解碼時會通過Codec Engine來調(diào)用IVA-HD加速引擎來完成解碼任務(wù)并將解碼結(jié)果通過緩存隊列發(fā)送回Cortex-A9處理器。整個系統(tǒng)解碼的框架圖如圖4所示:

  

 

  圖4 解碼器工作框架圖

  3系統(tǒng)實現(xiàn)

  3.1 Cortex-A9軟件實現(xiàn)

  Cortex-A9運行Linux操作系統(tǒng),包括內(nèi)核模塊omapdce.ko和virtio緩存、RPMsg總線驅(qū)動程序設(shè)計和ffmpeg多媒體庫及DRM顯示接口調(diào)用。

  3.1.1 virtio緩存隊列實現(xiàn)

  Virtio緩存隊列以共享散列表的方式和協(xié)處理器進行數(shù)據(jù)通信,通過中斷方式通知對方散列表的添加,包括以下幾個方面:

  1)Irq_require()注冊中斷函數(shù),Register_bus_type(“virtio”)向系統(tǒng)注冊virtio總線

  2)Regsiter_virtio_driver(

  3)系統(tǒng)在發(fā)現(xiàn)協(xié)處理器后將通過register_virtio_device(

  4)virtio_bus->match(

  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達到RPMsg總線時,總線把msg分配給dst屬性和msg->dst相同的rpmsg_driver,并調(diào)用rpmsg_driver->callback()進行消息處理。

  3.1.3 omapdce.ko驅(qū)動模塊的實現(xiàn)

  Omapdce.ko模塊將作為一個RPMsg driver,其實現(xiàn)了應(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é)處理器進行消息通信以完成工作任務(wù)。

  3.1.4解碼應(yīng)用viddectest實現(xiàn)

  H264解碼應(yīng)用程序viddectest的工作主要分為以下幾個方面

  1)Linux顯示接口DRM初始化,通過Drmopen()函數(shù)打開/dev/dri/card0設(shè)備文件,獲取設(shè)備資源drmModeGetResources(),創(chuàng)建幀緩存drmModeAddFB2()及設(shè)置輸出分辨率及模式drmModeSetCrtc()

  2)FFmpeg媒體庫的調(diào)用,通過AVOpenStreamFile()打開多媒體文件,AVFindStream()分離出音頻流和視流,然后依次通過AVGetPacket()讀取視頻流數(shù)據(jù)包送去解碼器進行解碼。

  3)加速引擎初始化和利用消息總線進行解碼數(shù)據(jù)通信,通過Engine_open()打開H264解碼引擎,Viddec3_create()創(chuàng)建一個解碼實例對象,Viddec3_control()設(shè)置解碼所需的參數(shù),Viddec3_process()將用RPMsg消息總線送出解碼數(shù)據(jù)流并接收解碼后的圖像緩存數(shù)據(jù),其流程圖如圖5所示:

  

 

  圖5&6 應(yīng)用viddectest流程圖&M3運行流程圖



關(guān)鍵詞: H264 DaVinci

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉