1、概述
海思提供的媒體處理軟件平台(Media Process Platform,簡稱 MPP),可支持應用軟件快速 開發。該平台對應用軟件屏蔽了芯片相關的復雜的底層處理,並對應用軟件直接提供 MPI(MPP Program Interface)接口完成相應功能。該平台支持應用軟件快速開發以下 功能:輸入視頻捕獲、H.265/H.264/JPEG 編碼、H.265/H.264/JPEG 解碼、視頻輸出顯 示、視頻圖像前處理(包括去噪、增強、銳化)、圖像拼接、圖像幾何矯正、智能、音 頻捕獲及輸出、音頻編解碼等功能。
2、系統架構
硬件層
操作系統層
媒體處理平台
其他驅動
應用層
3、主要模塊:
- 視頻輸入(VI)
- 視頻處理(VPSS)
- 視頻編碼(VENC)
- 視頻解碼(VDEC)
- 視頻輸出(VO)
- 視頻拼接(AVS)
- 音頻輸入(AI)
- 音頻輸出(AO)
- 音頻編碼(AENC)
- 音頻解碼(ADEC)
- 區域管理(REGION)
4、處理流程:
VI 模塊捕獲視頻圖像,可對其做剪切、縮放、鏡像等處理,並輸出多路不同分辨率的圖像數據。
解碼模塊對編碼后的視頻碼流進行解碼,並將解析后的圖像數據送 VPSS 進行圖像處理或直接送 VO 顯示。可對 H.264/H.265/VC1/MPEG4/MPEG2/AVS 格式的視頻碼流進行解碼。
VPSS 模塊接收 VI 和解碼模塊發送過來的圖像,可對圖像進行去噪、圖像增強、銳化等處理,並實現同源輸出多路不同分辨率的圖像數據用於編碼、預覽或抓拍。
編碼模塊接收 VI 捕獲並經 VPSS 處理后輸出的圖像數據,可疊加用戶通過 Region模塊設置的 OSD 圖像,然后按不同協議進行編碼並輸出相應碼流。
VDA 模塊接收 VI 的輸出圖像,並進行移動偵測和遮擋偵測,最后輸出偵測分析結果。
VO 模塊接收 VPSS 處理后的輸出圖像,可進行播放控制等處理,最后按用戶配置
的輸出協議輸出給外圍視頻設備。
AI 模塊捕獲音頻數據,然后 AENC 模塊支持按多種音頻協議對其進行編碼,最后
輸出音頻碼流。
用戶從網絡或外圍存儲設備獲取的音頻碼流可直接送給 ADEC 模塊,ADEC 支持解碼多種不同的音頻格式碼流,解碼后數據送給 AO 模塊即可播放聲音。
5、常用分辨率
6、視頻緩存池
視頻緩存池主要向媒體業務提供大塊物理內存管理功能,負責內存的分配和回收,充分發揮內存緩存池的作用,讓物理內存資源在各個媒體處理模塊中合理使用。一組大小相同、物理地址連續的緩存塊組成一個視頻緩存池。視頻輸入通道需要使用公共視頻緩存池。所有的視頻輸入通道都可以從公共視頻緩存池中獲取視頻緩存塊用於保存采集的圖像(如圖 2-1 中所示從公共視頻緩存池 A 中獲取視頻緩存塊 Bm)。由於視頻輸入通道不提供創建和銷毀公共視頻緩存池功能,因此,在系統初始化之前,必須為視頻輸入通道配置公共視頻緩存池。根據業務的不同,公共緩存池的數量、緩存塊的大小和數量不同。圖 2-1 中所示緩存塊的生存期是指經過 VPSS 的通道以 USERMODE 方式傳給后續模塊的情形(圖 2-1 實線路徑)。如果該緩存塊完全沒有經過 VPSS 的通道透傳給其他模塊,則將在 VPSS 模塊處理后被放回公共緩存池(圖 2-1 虛線路徑)。
7、系統綁定
MPP 提供系統綁定接口(HI_MPI_SYS_Bind),即通過數據接收者綁定數據源來建立兩者之間的關聯關系(只允許數據接收者綁定數據源)。綁定后,數據源生成的數據將自動發送給接收者。目前 HiMPP 支持的綁定關系如表 2-1 所示。
綁定函數
HI_S32 HI_MPI_SYS_Bind(MPP_CHN_S *pstSrcChn, MPP_CHN_S *pstDestChn);
typedef struct hiMPP_CHN_S { MOD_ID_E enModId; //模塊號 HI_S32 s32DevId; //設備號 HI_S32 s32ChnId; //通道號 } MPP_CHN_S;
例子
HI_S32 vdec_bind_vpss(VDEC_CHN VdChn, VPSS_GRP VpssGrp) { HI_S32 s32Ret; MPP_CHN_S stSrcChn; //源通道 MPP_CHN_S stDestChn; //目的通道 stSrcChn.enModId = HI_ID_VDEC; //模塊號 stSrcChn.s32DevId = 0; //設備號 stSrcChn.s32ChnId = VdChn; //通道號 stDestChn.enModId = HI_ID_VPSS; stDestChn.s32DevId = VpssGrp; stDestChn.s32ChnId = 0; s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn); //數據源到接收者的綁定 if (s32Ret == HI_FAILURE) //返回值非0為失敗 { SDKPRINTF("HI_MPI_SYS_Bind failed with %#x!\n",s32Ret); return HI_FAILURE; } return HI_SUCCESS; }