本系列博文会对 CNMPS(Cambricon Media Process System,寒武纪媒体处理系统)各个组件功能,工作原理作详细介绍,并对中间层软件作系统分析,方便客户编写自己的应用程序。
本文是该系列博文的第四篇,介绍视频处理系统(VPPS)的组成,工作原理以及软件架构。
一、基本概念
VPPS(Video Post Process Sub‑System,视频处理子系统)支持以下图像处理功能:
- FRC(Frame Rate Control,帧率控制);
- CROP 裁剪;
- Scale 放大缩小;
- 像素格式转换;
- 固定角度旋转;
- Mosaic;
- Mirror/Flip;
- Aspect Ratio 幅型比转换;
- 压缩和解压缩。
7.2 基本概念
- GROUP
GROUP 即 VPPS 对 用 户 提 供 的 组, 为 用 户 提 供 输 入 能 力。 最 大 个 数 请 参 见 macro
VPPS_MAX_GRP_NUM 定义,各 GROUP 分时复用 VPPS 硬件,硬件依次处理各个组提交的任
务。
- CHANNEL
通道包含物理通道和扩展通道。物理通道由 VPPS 硬件提供,包含多个物理通道,每个物理通道具备
缩放、裁剪、马赛克、幅型转换等功能。扩展通道具备缩放功能,必须绑定物理通道才能使用。它将
绑定的物理通道的输出作为自己的输入,将输入图像缩放成设置的分辨率输出。各 GROUP 分时复用
VPPS 硬件,逻辑上拥有同样的通道数。
- PIPE
VPPS 组的管道,为用户提供输入能力,取值只能为 0。
- FRC
帧率控制,分为组帧率控制和通道帧率控制。
– 组帧率控制:用于控制各 GROUP 对输入图像的接收。
– 通道帧率控制,用控制各个物理通道和扩展通道图像的处理。
- CROP
裁剪,分为组裁剪、物理通道裁剪以及扩展通道裁剪。
– 组裁剪,VPPS 对输入图像进行裁剪。
– 物理通道裁剪,VPPS 对各个物理通道的输出图像进行裁剪。
– 扩展通道裁剪,VPPS 调用 VGU 对扩展通道的输出图像进行裁剪。
- 像素格式转换
支持输入输出图像的像素数据格式转换。
- Scale
缩放,对图像进行放大缩小。物理通道水平、垂直最大支持 64 倍缩小,最大支持 64 倍放大;扩展通道水平、垂直最大支持 64 倍缩小,最大支持 64 倍放大。
- Mirror/Flip
Mirror 为水平镜像,Flip 为上下翻转。可使用 Mirror+Flip 实现 180° 旋转。
- Mosaic
马赛克,对 VPPS 的输出图像填充马赛克。
- 固定角度旋转
调用 VGU 对 VPPS 通道的输出图像进行旋转,支持 0 度、90 度、180 度以及 270 度固定角度的旋转功能。
- 压缩
支持 linear 格式的 SEG 压缩。
- 解压
支持 linear 格式的 SEG 解压。
- Aspect Ratio
– 幅型比,制定输出画面相对于输入画面的宽高纵横比。
– 幅型比参数在通道属性中设置。
– 设定为 ASPECT_RATIO_MANUAL 模式时,用户手动设置图像的起始坐标和宽高,VPPS 会根据用户的设置来输出图像并添加边幅,边幅颜色可设置,默认为黑边。
– 设定为 ASPECT_RATIO_AUTO 模式时,VPPS 会保持画面的宽高比和输入宽高比一致,边幅颜色可设置,默认为黑边。
- 工作模式
– 支 持 VI_OFFLINE_VPPS_OFFLINE、VI_ONLINE_VPPS_OFFLINE、VI_ONLINE_VPPS_ONLINE、
VI_OFFLINE_VPPS_ONLINE 模式。
– 工作模式通过 cnsysSetViVppsMode 接口设置,详见“系统控制”章节。
- vpps_en
VPPS 硬件开关,用户可以在加载 VPPS 驱动时设置模块参数 vpps_en 来设置 VPPS IP(硬件 ID 号)使能。只支持开启或关闭 VPPS1,VPPS0 和 VPPS1 默认开启。
- 分块
输入图像宽度超过 4096 像素时分块。
二、功能描述
通过调用 SYS 模块的绑定接口,可与 APS/USER/VDEC/VI/和 VO/VENC 等模块进行绑定,其中前者为
VPPS 的输入源,后者为 VPPS 的接收者。用户可通过 API 接口对 GROUP 进行管理。每个 GROUP 仅可
与一个输入源绑定。GROUP 的物理通道支持 USER 模式,USER 模式下各通道可与多个接收者绑定。
三、API
1.驱动交互 API
/mps/out/include/cn_vpps.h 头文件中,具体实现封装在/mps/out/lib/libcn_vi.so 动态库文件中。这些 API函数直接与驱动程序交互。涉及的数据类型在 /mps/out/include/cn_common_vpps.h 中。以下列举一些重要的 API 作说明。
cnS32_t cnvppsCreateGrp(vppsGrp_t s32VppsGrp, const cnvppsGrpAttr_t *pstGrpAttr);//创建GROUP
cnS32_t cnvppsStartGrp(vppsGrp_t s32VppsGrp);//启动 VPPS GRP
cnS32_t cnvppsResetGrp(vppsGrp_t s32VppsGrp);//重置
cnS32_t cnvppsGetGrpAttr(vppsGrp_t s32VppsGrp, cnvppsGrpAttr_t *pstGrpAttr);//获取属性
cnS32_t cnvppsSetGrpAttr(vppsGrp_t s32VppsGrp, const cnvppsGrpAttr_t *pstGrpAttr);//设置属性
cnS32_t cnvppsSetGrpCrop(vppsGrp_t s32VppsGrp, const cnvppsCropInfo_t *pstCropInfo);//设置功能属性
cnS32_t cnvppsSendFrame(vppsGrp_t s32VppsGrp, vppsGrpPipe_t stVppsGrpPipe, const cnVideoFrameInfo_t *pstVideoFrame, cnS32_t s32MilliSec);//向VPPS发送数据
/* Chn Settings */
cnS32_t cnvppsSetChnAttr(vppsGrp_t s32VppsGrp, vppsChn_t s32VppsChn, const cnvppsChnAttr_t *pstChnAttr);//设置 VPPS 物理通道属性
cnS32_t cnvppsSetChnCrop(vppsGrp_t s32VppsGrp, vppsChn_t s32VppsChn, const cnvppsCropInfo_t *pstCropInfo);//设置 VPPS CHN 功能属性
cnS32_t cnvppsSetChnRotation(vppsGrp_t s32VppsGrp, vppsChn_t s32VppsChn, cnvppsEnRotate_t enRotationInfo);//设置 VPPS 通道图像固定角度旋转属性
cnS32_t cnvppsGetChnFrame(vppsGrp_t s32VppsGrp, vppsChn_t s32VppsChn, cnVideoFrameInfo_t *pstVideoFrame, cnS32_t s32MilliSec);//从通道获取一帧处理完成的图像
/* ExtChn Settings */
cnS32_t cnvppsSetExtChnAttr(vppsGrp_t s32VppsGrp, vppsChn_t s32VppsChn, const cnvppsExtChnAttr_t *pstExtChnAttr);//设置 VPPS 扩展通道属性
cnS32_t cnvppsGetGrpFrame(vppsGrp_t s32VppsGrp, vppsGrpPipe_t stVppsGrpPipe, cnVideoFrameInfo_t *pstVideoFrame);//获取 VPPS GROUP 的一帧原始图像
2.驱动交互 API
该函数主要通过传入的 VPPS Group,CHN 属性参数,设置对应的硬件并启动。
cnsampleCommVppsStop()实现了对应的反操作。具体不再赘述。
参考资料:
寒武纪媒体处理系统开发者手册-CN-v0.8.0.pdf
评论