本系列博文会对 CNMPS(Cambricon Media Process System,寒武纪媒体处理系统)各个组件功能,工作原理作详细介绍,并对中间层软件作系统分析,方便客户编写自己的应用程序。
本文是该系列博文的第五篇,结合前面四篇所述内容,创建一个简单的应用程序。
- APP Demo 演示
1.启动开发板:
2.加载驱动:
3.修改配置文件:
4.运行 Demo:
- APP Demo 代码分析
cnsample_vio demo 的源代码为 /mps/sample/vio/cnsample_vio.cpp。用户 APP 编程流程大致与此类似。
- 定义全局变量。
2.获取配置信息,并填充对应的 VI、VO、VPPS、SYS 属性结构体,调用用户 APP 启动相关组件。
该函数首先调用 cnsampleCommSysGetPicSize(g_enVoPicSize, &stSize),根据 g_enVoPicSize 宏定义 PIC_720P,确定 width = 1080,height = 720;然后根据已定义的全局变量,填充 g_stVoConfig 结构体成员,并将之作为输入参数传递给 cnsampleCommVoStartVo(&g_stVoConfig),启动 VO 设备。
cnsampleVioInitVpps() 首先定义了 VPPS 的 Layer,Channel 属性结构体,像素格式,视频格式等结构体。然后调用两次 cnsampleCommSysGetPicSize(),分别获取VI 和 VO 的图像宽度和高度,其中 VI 的宽度和高度将做为 VPPS 的 Group 组件的配置参数,VO 的宽度和高度作为 VPPS Channel 组件的配置参数。
接下来分别填充 Group 属性结构体 stVppsGrpAttr,Channel 属性结构体 stVppsChnAttr,并作为输入参数传递给 cnsampleCommVppsStart(VppsGrp, abChnEnable, &stVppsGrpAttr, stVppsChnAttr),启动 VPPS。
cnsampleVioInitVi() 主要功能是填充 g_stviconfig 结构体。除了已经做了宏定义的参数外,其余参数通过 cnsampleCommViGetClockBySensor()和 cnsampleCommViGetWdrModeBySensor()这个两个函数,根据 Sensor Type 的不同,获取预定义好的配置。
然后将 g_stviconfig 传给 cnsampleCommViStartVi(&g_stViConfig) 函数,启动 VI。VI 启动后,根据需求,调用 cnsampleVioSetDis(),cnsampleVioSetLdc(),cnsampleVioSetSpread(),依次设置防抖、畸变矫正、展宽效果。
④系统初始化:
该函数申请了 3 个内存缓存池。其中pool1为 sensor raw 数据内存,8个连续的视频缓存块组成,每个缓存块大小根据 RAW12像素格式和宽度,高度,压缩模式计算得出。Pool2 和 pool3 供 VPPS、VO、VENC 模块使用,为 10 个连续的缓存块,大小为 YUV420_8BIT 的像素格式以及宽度,高度,压缩模式计算得出。最后由 cnsampleCommSysInit(&stVbConf) 函数初始化系统。
3.main 函数
main函数中所涉及函数大部分在之前的章节中都有提及。
cnsampleCommViGetSensorInfo(&g_stViConfig) 用于获取 Sensor 信息。如前文所述,VI、VO、VPPS的部分属性参数都必须在 Sensor Type 确定后,再去获取对应的宏预定义配置去填充相关结构体。
该函数调用 cnsampeCommGetSensorCfg(),实现在 mps\sample\common\cnsample_comm_config.cpp 中,用于解析 sensor 配置文件 cnsampleconfig.ini,内容如图(3)所示。客户如需自行配置 sensor 参数,务必参照 /mps/sample 路径下的 .ini 文件的书写格式。 cnsampleconfig.ini 为单摄头配置,Cnsampleconfig_APS.ini 为四摄像头配置。
参考资料:
寒武纪媒体处理系统开发者手册-CN-v0.8.0.PDF
Cambricon CE3226 媒体处理系统(一):概述
Cambricon CE3226 媒体处理系统(二):视频输入
Cambricon CE3226 媒体处理系统(三):视频输出
Cambricon CE3226 媒体处理系统(四):视频处理子系统
评论