海思 Hi35系列 MPP平台
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; }