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

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
 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值