1 概述

VPSS(Video Process Sub-System)支持对一幅输入图像进行统一预处理,如去噪、去隔行等,然后再对各通道分别进行缩放、锐化等处理,最后输出多种不同分辨率的图像。
  VPSS 单元支持的具体图像处理功能包括 FRC(Frame Rate Control)、 Crop、 NR(Noise Reduce)、 LDC(Lens Distortion Correction)、 Rotate、 Cover/Overlay、 Scale、Mirror/Flip、 FishEye 等。

2 功能描述

2.1 基本概念

GROUP
VPSS 对用户提供组(GROUP)的概念。最大可用数为 VPSS_MAX_GRP_NUM个,各芯片的最大组数目有所不同,各 GROUP 分时复用 VPSS 硬件。每个 VPSSGROUP 包含多个通道,通道数目视方案实现有所不同,具体描述请参见CHANNEL。

CHANNEL
VPSS 组的通道。通道分为 2 种:物理通道和扩展通道。 VPSS 硬件提供多个物理通道,每个通道具有缩放、裁剪等功能。扩展通道具备缩放功能,它通过绑定物理通道,将物理通道输出作为自己的输入,把图像缩放成用户设置的目标分辨率输出。

FRC
帧率控制,分为 2 种: group 帧率控制和 chn 帧率控制。

Group 帧率控制:用于控制各 group 对输入图像的接收,只应用在 VI—VPSS的离线方案中。
Chn 帧率控制:用于控制各个物理通道图像的处理,应用在离线和在线方案中。
Crop
裁剪,分为 3 种: group 的裁剪和物理通道的裁剪以及扩展通道的裁剪。
- Group 的裁剪, VPSS 对输入图像进行裁剪。
- 物理通道的裁剪, VPSS 对各个物理通道的输出图像进行裁剪。
- 扩展通道的裁剪, VPSS 调用 VGS 对扩展通道的输出图像进行裁剪。

DEI
De-interlace,去隔行。将交错的隔行视频源还原成逐行视频源。

NR
去噪。通过参数配置,把图像中的高斯噪声去除,使得图像变得平滑,有助于降低编码码率。

Scale
缩放,对图像进行缩小放大。

LDC
Lens Distortion Correction,镜头畸变校正,一些低端镜头容易产生图像畸变,需要根据畸变程度对其图像进行校正。

Cover
视频遮挡区域,对 VPSS 的输出图像填充纯色块。

Overlay
视频叠加区域,在 GROUP 上进行位图的加载和背景色更新,支持 ARGB4444、ARGB1555、 ARGB8888 三种格式的位图。

Border
边框, VPSS 在输出图像上加边框。

备份节点
原始图像的备份节点。每个 GROUP 都有一个备份节点,用于备份即将提交硬件处理的那帧原始图像。 VPSS 在以下情况会将缓存队列队头节点的图像放入备份节点:

当队头节点的图像要经过 VPSS 硬件处理时, VPSS 会将其放入备份节点,并替换掉原有图像。
当后端绑定的接收模块要求 VPSS 将队头图像放入备份节点时, VPSS 也会替换备份节点中的图像,即使该图像不经过硬件处理。

低延时
在 VI—VPSS 的在线方案中,编码器性能足够的情况下, VPSS 支持按照,以行为单位,边采集边发送的方式,将图像发送给编码模块进行编码,用来减少 VPSS处理完整帧图像再发送给编码模块过程中,数据的延时时间。这样的方式即为低延时方案。

2.2 功能描述

VPSS 上下文关系

通过调用 SYS 模块的绑定接口,可与 VI 和 VO/VENC/IVE 等模块进行绑定,其中前者为 VPSS 的输入源,后者为 VPSS 的接收者。用户可通过提供的 MPI 接口对 GROUP进行管理。每个 GROUP 仅可与一个输入源绑定。 GROUP 的物理通道有两种工作模式: AUTO 和 USER,两种模式间可动态切换。默认的工作模式为 AUTO,此模式下各通道仅可与一个接收者绑定。若想使用 USER 模式,则需调用 MPI 接口进行设置,同时指定所需图像的大小和格式,此模式下各通道可与多个接收者绑定。需要特别注意的是, USER 模式主要用于对同一通道图像进行多路编码的场景,此模式下播放控制不生效,因此预览和回放场景下不建议使用 USER 模式。

2.3 芯片处理流程

Hi3518EV200 VPSS 的数据流图

VPSS 通道规格

3 步骤

a.创建VPSS_Group

b.绑定VI-->VPSS

c.通道设置:通道属性,通道功能,通道使能

4.函数调用图谱

  1. SAMPLE_COMM_SYS_GetPicSize(step4)//start vpss and vi bind vpss
  2. SAMPLE_COMM_VPSS_StartGroup
  3. HI_MPI_VPSS_CreateGrp
  4. HI_MPI_VPSS_GetNRParam
  5. HI_MPI_VPSS_SetNRParam
  6. HI_MPI_VPSS_StartGrp
  7. SAMPLE_COMM_VI_BindVpss
  8. SAMPLE_COMM_VI_Mode2Param
  9. HI_MPI_SYS_Bind
  10. SAMPLE_COMM_VPSS_EnableChn
  11. HI_MPI_VPSS_SetChnAttr
  12. HI_MPI_VPSS_SetChnMode
  13. HI_MPI_VPSS_EnableChn

5.sample

  1. /******************************************
  2. *start vpss and vi bind vpss
  3. ******************************************/
  4. SIZE_S stSize;
  5. pstSize->u32Width = 1280;
  6. pstSize->u32Height = 720;
  7. VpssGrp = 0;
  8. stVpssGrpAttr.u32MaxW = stSize.u32Width; /*MAX width of the group*/
  9. stVpssGrpAttr.u32MaxH = stSize.u32Height; /*MAX height of the group*/
  10. stVpssGrpAttr.bIeEn = HI_FALSE; /*图像增强 enable*/
  11. stVpssGrpAttr.bNrEn = HI_TRUE; /*噪声降低 enable*/
  12. stVpssGrpAttr.bHistEn = HI_FALSE; /*Hist enable*/
  13. stVpssGrpAttr.bDciEn = HI_FALSE; /*动态对比改进 enable*/
  14. stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE;/*反交错 enable*/
  15. stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420;/*像素格式*/
  16. /******************************
  17. *step1 : 启用 VPSS GROUP
  18. *******************************/
  19. s32Ret = HI_MPI_VPSS_CreateGrp(VpssGrp, pstVpssGrpAttr);//创建一个 VPSS GROUP
  20. if (s32Ret != HI_SUCCESS)
  21. {
  22. SAMPLE_PRT("HI_MPI_VPSS_CreateGrp failed with %#x!\n", s32Ret);
  23. return HI_FAILURE;
  24. }
  25. /*** set vpss 3D NR(去噪) 属性 ***/
  26. s32Ret = HI_MPI_VPSS_GetNRParam(VpssGrp, &unNrParam);
  27. if (s32Ret != HI_SUCCESS)
  28. {
  29. SAMPLE_PRT("failed with %#x!\n", s32Ret);
  30. return HI_FAILURE;
  31. }
  32. s32Ret = HI_MPI_VPSS_SetNRParam(VpssGrp, &unNrParam);
  33. if (s32Ret != HI_SUCCESS)
  34. {
  35. SAMPLE_PRT("failed with %#x!\n", s32Ret);
  36. return HI_FAILURE;
  37. }
  38. s32Ret = HI_MPI_VPSS_StartGrp(VpssGrp);//启用 VPSS GROUP
  39. if (s32Ret != HI_SUCCESS)
  40. {
  41. SAMPLE_PRT("HI_MPI_VPSS_StartGrp failed with %#x\n", s32Ret);
  42. return HI_FAILURE;
  43. }
  44. /******************************
  45. *step2 : 绑定VI 和 VPSS
  46. *******************************/
  47. HI_S32 j, s32Ret;
  48. VPSS_GRP VpssGrp;
  49. MPP_CHN_S stSrcChn;
  50. MPP_CHN_S stDestChn;
  51. SAMPLE_VI_PARAM_S stViParam;
  52. VI_CHN ViChn;
  53. s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam);
  54. if (HI_SUCCESS !=s32Ret)
  55. {
  56. SAMPLE_PRT("SAMPLE_COMM_VI_Mode2Param failed!\n");
  57. return HI_FAILURE;
  58. }
  59. VpssGrp = 0;//VPSS GROUP 0
  60. ViChn = 0;//VI 通道0
  61. stSrcChn.enModId = HI_ID_VIU;//模块VI的ID
  62. stSrcChn.s32DevId = 0;
  63. stSrcChn.s32ChnId = ViChn;
  64. stDestChn.enModId = HI_ID_VPSS;//模块VPSS的ID
  65. stDestChn.s32DevId = VpssGrp;
  66. stDestChn.s32ChnId = 0;
  67. s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);//绑定VI和VPSS
  68. if (s32Ret != HI_SUCCESS)
  69. {
  70. SAMPLE_PRT("failed with %#x!\n", s32Ret);
  71. return HI_FAILURE;
  72. }
  73. /******************************
  74. *step3 : 前面设置了VPSS组,将VI通道与VPSS组里的0通道
  75. *绑定起来,但还未设置0通道,下面设置0通道。
  76. *******************************/
  77. VpssChn = 0;
  78. stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; //设置通道为USER模式
  79. stVpssChnMode.bDouble = HI_FALSE; //字段帧传输,仅对VPSS_PRE0_CHN有效
  80. stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; //目标图像像素格式
  81. stVpssChnMode.u32Width = stSize.u32Width;
  82. stVpssChnMode.u32Height = stSize.u32Height;
  83. stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG; //输出的压缩模式,按照 256 bytes 为一段进行压缩。
  84. memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr));
  85. stVpssChnAttr.s32SrcFrameRate = -1; //源通道帧率控制,源帧率与目标帧率都为-1,则不进行帧率控制。
  86. stVpssChnAttr.s32DstFrameRate = -1; //目的通道帧率控制
  87. //设置 VPSS 通道属性
  88. s32Ret = HI_MPI_VPSS_SetChnAttr(VpssGrp, VpssChn, pstVpssChnAttr);
  89. if (s32Ret != HI_SUCCESS)
  90. {
  91. SAMPLE_PRT("HI_MPI_VPSS_SetChnAttr failed with %#x\n", s32Ret);
  92. return HI_FAILURE;
  93. }
  94. //设置 VPSS 通道工作模式
  95. s32Ret = HI_MPI_VPSS_SetChnMode(VpssGrp, VpssChn, pstVpssChnMode);
  96. if (s32Ret != HI_SUCCESS)
  97. {
  98. SAMPLE_PRT("%s failed with %#x\n", __FUNCTION__, s32Ret);
  99. return HI_FAILURE;
  100. }
  101. //启用 VPSS 通道
  102. s32Ret = HI_MPI_VPSS_EnableChn(VpssGrp, VpssChn);
  103. if (s32Ret != HI_SUCCESS)
  104. {
  105. SAMPLE_PRT("HI_MPI_VPSS_EnableChn failed with %#x\n", s32Ret);
  106. return HI_FAILURE;
  107. }

6.注意点

对于函数:HI_MPI_VPSS_CreateGrp

离线模式时,可创建多个 GROUP,最大 GROUP 数为 VPSS_MAX_GRP_NUM;
在线模式时,仅支持创建 1 个 GROUP,且 GROUP 号仅能为 0。
不支持重复创建。
在线模式时,由于 VI 和 VPSS 的逻辑处理需要时序严格同步,所以 GROUP 创建中的 group 的图像属性必须和 VI 的图像设置属性一致;否则会出现 VPSS 的中断错误。具体请参见 VPSS_GRP_ATTR_S

二.海思Hi3516ev100视频处理子系统(VPSS)模块相关推荐

  1. 海思HI3518E视频处理基础概念《三》----- 视频处理子系统VPSS

    目录 视频处理子系统VPSS 1.概述 2. 基本概念 3.VPSS 上下文关系 视频处理子系统VPSS 1.概述 VPSS( Video Process Sub-System)支持对一幅输入图像进行 ...

  2. 海思HiMPP视频编解码开发文档

    前言: 海思提供的媒体处理软件平台(Media Process Platform,简称MPP),可支持应用软件快速开发.该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软件直接提供MPI(MP ...

  3. 海思3531DV100视频输入模块

    海思3531DV100视频输入模块(VI) VI 可以对接收到的原始视频图像数据进行裁剪(Crop).水平垂直缩小(Down Scaling)和水平垂直翻转(Mirror.Flip)等处理,并实现一路 ...

  4. 海思NNIE开发(一):海思Hi3559AV100/Hi3519AV100 NNIE深度学习模块开发与调试记录

    海思NNIE开发系列文章: 海思NNIE开发(一):海思Hi3559AV100/Hi3519AV100 NNIE深度学习模块开发与调试记录 海思NNIE开发(二):FasterRCNN在海思NNIE平 ...

  5. 海思Hi3559(十一)——VPSS图片放缩

    参考资料 网址/文档名 1 <HiMPP V4.0媒体处理软件开发参考> 2 https://blog.csdn.net/avideointerfaces/article/details/ ...

  6. 海思 关于视频层和通道的认识

    一.视频层和通道号的关系 SDK 将通道归属于视频层管理,一个视频层上可显示多个视频,每一个视频显示区域称为一个通道,视频被限制通道内,通道被限制在视频层内.对于一个视频层,其上面的通道都是独立的.同 ...

  7. 1.1 海思3518E视频编解码的一些概念

    目录 1.1.1 前言 1.1.2 视频编解码的基本概念了解 1.1.1 前言 这是我第一次写博客,我写博客的目的是为了记录我的学习笔记,同时也是想把我的学习记录分享出来,供参考学习.这个学习笔记是关 ...

  8. 海思3518E开发笔记2.7——海思VENC(Video Encode)模块详解

    目录 海思Video Encode模块架构介绍 海思Video Encode相关概念 码率控制 海思Video Encode模块功能介绍 编码通道 ROI 裁剪编码 函数调用关系 相关数据结构 流程分 ...

  9. 海思3518E开发笔记2.5——海思VI(video input)模块详解

    目录 海思video input模块架构介绍 海思video input模块功能介绍 结构体说明 函数调用关系 流程分析 step 1: mipi configure step 2: configur ...

最新文章

  1. web service方法进行全文检索_SpringMVC(Web应用)配置教程终章项目实战
  2. unreal4怎么设置游戏模式_在Unreal4中如何连接自定义服务器
  3. java白色_java-将精灵颜色更改为白色
  4. Fedora/RedHat上使用Docker命令搭建Mysql服务器
  5. USACO section1.3 Barn Repair 修理牛棚(贪心)
  6. python中字符串(二)-访问值、更新、转义、运算
  7. c++两个数组对比去掉重复的元素_每日一道 LeetCode (8):删除排序数组中的重复项和移除元素...
  8. 企业为什么要做高端网站优化呢?
  9. nc windows安装教程
  10. 如何写好科研论文思维导图分享
  11. 【Python】P2525 Uim的情人节礼物·其之壱
  12. LBP特征原理及代码实现
  13. 自动定时执行任务、定时任务执行的几种实现方法
  14. 学 AI 容易翻车?寸步难行的程序员,90%都输在了这点上!
  15. 愚人节这天,我辞职了
  16. 网络推广都有那些平台
  17. Selenium4.0+Python手撸自动化框架系列之 Web元素等待方式介绍 与 封装
  18. Cadence orcad 原理图导出带书签目录的办法
  19. 想找女朋友,结果遭遇了酒托,且行且小心啊!
  20. crawler project:bilibili_spider

热门文章

  1. win10系统增加虚拟内存的方法 windows10电脑虚拟内存怎么设置?教你设置一个合理的虚拟内存
  2. 通过Loadrunner读取excel表数据并批量更新到Oracle中
  3. Linux下百度网盘一直在加载打不开
  4. 解决0x0000098全版本通用极速版(不重装系统)
  5. PAT 10. 查找指定字符 python
  6. 明星热图|刘亦菲拍摄全新广告大片;易烊千玺、徐新驰、王紫璇、德约科维奇代言新品牌...
  7. 快易搜软件,快速查找电脑文件。
  8. 格子游戏 解题报告
  9. txt阅读器, 在别人的源码上 增加书签、字体缩放、书架 功能
  10. 批处理脚本命令---cls、color、title