随着 AI 技术的不断发展,从 Sensor 采集数据,经过处理之后给 AI 模型做图像分析已经变成一个很典型的应用。因此,在嵌入式应用行业,无论是汽车,安防,手机等应用中,对 Sensor 采集的数据做图像处理变得非常重要。针对以上需求,Cambricon CE3226 内部集成了多个复杂的硬件组件,并实现了对应的中间层软件库,能够满足客户对视频处理的各种要求。
本系列博文会对 CNMPS(Cambricon Media Process System,寒武纪媒体处理系统)各个组件功能,工作原理作详细介绍,并对中间层软件作系统分析,方便客户编写自己的应用程序。
本文是该系列博文的第一篇,从整体系统上概括性说明 CNMPS。
一、系统总览
1.概述
CNMPS(Cambricon Media Process System,寒武纪媒体处理系统)封装了寒武纪媒体芯片复杂的底层处理,并提供了媒体 SDK,用于快速开发应用软件。CNMPS 支持开发视频输入、视频图像处理(包括降噪、去雾、裁剪、缩放、旋转等)、H.265/H.264/JPEG 编码和解码、视频输出显示、多路图像拼接、图像矫正、音频输入及输出等功能。
2.系统架构
CNMPS 支持的典型的系统层次如下图所示,主要分为以下层次:
- 硬件层
硬件层由 CE3226V100 芯片和 SD 卡、DDR、Flash、视频 Sensor、网卡等外围器件组成。
- 操作系统层
基于 Linux 的 OS 系统。
- 媒体处理系统
基于操作系统层,提供媒体相关模块驱动和库,完成媒体功能。
- 其他驱动
寒武纪为 CE3226V100 芯片提供了 Watchdog、RTC 等其他相关硬件驱动。
- 应用层
用户基于媒体系统平台和其它驱动,开发的具有媒体功能的应用系统。
3.系统处理流程
CNMPS 主要包含以下模块:视频输入(VI)、视频处理子系统(VPPS)、视频编码(VENC)、视频解码(VDEC)、视频输出(VO)、先进全景拼接(APS)、音频输入(AI)、音频输出(AO)、区域管理(REGION)、2 维图像引擎(G2D)等。
典型数据处理流程如图(1)所示:
图(1)
- VI(Video Input,视频输入)模块包含 MIPI/LVDS/DVP 等视频捕获接口、ISP 图像处理单元,实现视频 RAW 图像接收、图像校正、图像增强等功能,输出 YUV 图像。
- VPPS(Video Post Process Sub‑System,视频处理子系统)模块包含图像裁剪、图像翻转镜像、 图像缩放、打马赛克等处理,可以输出多路不同分辨率 YUV 图像。
- VDEC(Video Decoder,视频解码)模块支持 H.265/H.264/JPEG 视频格式的解码,输出 YUV 图像。
- VENC(Video Encoder,视频编码)模块支持 H.265/H.264/JPEG 视频格式的编码,并叠加 OSD 到码流。
- VO(Video Output,视频输出)模块支持视频图像显示。
- APS(Advanced Panoramic Stitching,先进全景拼接)模块支持接收多路图像,然后拼接校正成全景图像。
- AI(Audio Input,音频输入)模块支持音频数据采集。
- AO(Audio Output,音频输出)模块支持音频数据播放。
二、系统控制
系统控制主要对硬件模块进行复位、初始化工作,去初始化、建立模块之间绑定关系、并提供设备内存管理等功能。
系统启动媒体业务前,必须先完成系统初始化。退出媒体业务后,需要完成系统去初始化,释放。
1.视频缓存池
VP(Video Pool,视频缓存池)提供大块设备内存及管理功能,负责内存的分配及回收。缓存池由一组设备地址连续,物理地址可以不连续,大小相同的 VB(Video Block,视频缓存块)组成。媒体业务启动前,需要配置及初始化 VP。根据需要可以配置不同大小不同个数的 VP。VB 数据流如下图所示,系统根据需要,先创建 k 个大小相同的 VP_A 缓存池,m 个大小相同的 VP_B 缓存池,n 个大小相同的 VP_C 缓存池,组成公共视频缓冲池(Common VP)。详细步骤如图(2)所示:
图(2)
① VI 模块通过 VB 管理模块获取大小匹配的 Ai 缓存块,捕获视频数据,并处理后,把 Ai 块传递给 VPPS模块。
② VPPS 模块通过 VB 管理模块为两路输出获取大小匹配的 Bj、Ck 缓存块。
③ 处理 Ai 块后,释放 Ai 块,并把 Bj 块传递给 VENC 模块,把 Ck 块传递给 VO 模块。
④ VENC 处理后释放 Bj 块,VO 模块处理后释放 Ck 块。
2.绑定
CNMPS 提供系统绑定接口 cnsysBind 建立两个模块之间数据传递关系,一旦绑定,数据源会自动发送数据给数据接收者,数据源支持绑定多个接收者。系统模块的绑定关系如图(3)所示:
图(3)
3.VI 和 VPPS 工作模式
VI 和 VPPS 工作模式说明如图(4)所示:
图(4)
- TDNR(Three Dimension Noise Reduce)指 3D 降噪,CE3226V100 只支持 1 路在线。
- CSI(CMOS Sensor Interface)指 CMOS Sensor 接口,CE3226V100 只支持 2 路线性模式在线,不支持 WDR 模式在线。
PIPE(视频数据处理单元)可以设置成 VI 和 VPPS 在线离线组合模式:
- VI 在线 VPPS 离线
- VI 在线 VPPS 在线
- VI 离线 VPPS 离线
- VI 离线 VPPS 在线
注解:
- VI 在线/离线指 CSI 与 ISP 之间的在线/离线模式。
- VPPS 在线/离线指 TDNR 与 VPPS 之间的在线/离线模式。
三、API
系统相关的 API实现一般在动态库 libcn_sys.so文件中,不公开源代码,并在 /mps/out/include/cn_sys.h , cn_api.h等文件中导出,如图(5)cnS32_t cnsysInit(cnVoid_t) & cnS32_t cnsysBind(const cnMediaChn_t* pstSrcChn, const cnMediaChn_t* pstDestChn) 两个函数最为重要,cnsysInit()函数用于初始化 MPS 系统,cnsysBind()根据 cnMediaChn_t 结构体绑定两个模块,该结构体指定了模块 ID,设备 ID以及通道 ID。mps/out/include/cn_common.h对各个模块 ID 做了编号,不同模块的设备 ID,通道 ID 具体含义不同,详细请参考后续章节。
图(5)
为了方便应用程序的编写, mps/sample/common/cnsample_common_sys.cpp 调用以上接口,实现了若干系统初始化、系统退出、模块之间的绑定与解除绑定函数,供客户直接使用。以下对两个具有代表性的函数说明如图(6)cnS32_t cnsampleCommSysInit(struct vbConfigs* pstVbConfig) 函数用于初始化 MPS 系统,如前文所讲,在启动 MPS 前必须对视频缓存池进行配置,line220 cnVBSetComCfg() 函数,根据输入参数 pstVbConfig 对系统进行配置。
图(6)
如图(7)cnS32_t cnsampleCommViBindVpps(viPipe_t ViPipe, viChn_t ViChn, vppsGrp_t VppsGrp) 用于VI(源) 绑定VPPS(目的)。其他各个模块之间绑定函数与此类似。
图(7)
参考资料:寒武纪媒体处理系统开发者手册-CN-v0.8.0.PDF
评论