hi3516 VPSS


原文链接: hi3516 VPSS

7 海思Hi3518E的视频处理子系统(VPSS) - 一个嵌入式小白 - CSDN博客
海思HI35XX之----视频处理单元各通道间的关系 - zqj6893的专栏 - CSDN博客

vpss有group和channel两个概念

简单来说 group是针对发送者来说的, 比如vi/vdec等, 数据发送者把数据发到 vpss的某个group中, 整个VPSS模块有N多个group, 其中分为物理和扩展

每个vpss group又有N多个channel, 这些channel是对于后续数据接受者来说的

也就是说一个数据源,比如vi, 可以把数据送到 vpss 的某个group中, 然后经过VPSS处理, 该group的不同channel, 把数据送到不同的多个数据接收者, 比如channel0 送到VO channel1 送到VENC, 可以认为是个一分多

而这些数据通道的建立可以通过"绑定"来实现

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(Noise Reduce)

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

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 模式。

Hi3516A/Hi3518EV200/Hi3519V100 仅支持 USER 工作模式,VI-VPSS 离线情况下开启了低功耗模式,vpss 模块硬件不工作的时候时钟是关闭的,读写 vpss 的寄存器可能导致挂死,因此最好不要做此操作。

【注意】

对于通道 0、 1、 2、 3,“应用场景”一栏为建议的使用方案,实际上用户可以根据自身需要和通道的功能来自由分配各个通道的用途。

接口:

1、创建一个VPSS GROUP

HI_S32 HI_MPI_VPSS_CreateGrp(VPSS_GRP  VpssGrp,  VPSS_GRP_ATTR_S 
*pstVpssGrpAttr)

2、销毁一个VPSS GROUP

HI_S32 HI_MPI_VPSS_DestroyGrp(VPSS_GRP  VpssGrp)

3、启用VPSS GROUP

HI_S32 HI_MPI_VPSS_StartGrp( VPSS_GRP  VpssGrp)

4、禁用VPSS GROUP

HI_S32 HI_MPI_VPSS_StopGrp(VPSS_GRP  VpssGrp)

5、复位VPSS GROUP

HI_S32 HI_MPI_VPSS_ResetGrp (VPSS_GRP  VpssGrp)

6、设置VPSS通道属性

HI_S32 HI_MPI_VPSS_SetChnAttr(VPSS_GRP  VpssGrp, VPSS_CHN  VpssChn, VPSS_CHN_ATTR_S *pstChnAttr)

/*set new image size for resize*/
static HI_S32 set_new_image_size(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, HI_U32 new_img_width, HI_U32 new_img_height)
{
    HI_S32 s32Ret;
    VPSS_CHN_ATTR_S stVpssChnAttr;
    
    s32Ret = HI_MPI_VPSS_GetChnAttr(VpssGrp, VpssChn, &stVpssChnAttr);
    if (HI_SUCCESS != s32Ret)
    {
        printf("HI_MPI_VPSS_GetChnAttr() fails 0x%x \n", s32Ret);
        return s32Ret;
    }

    stVpssChnAttr.u32Width = new_img_width;
    stVpssChnAttr.u32Height = new_img_height;
    s32Ret = HI_MPI_VPSS_SetChnAttr(VpssGrp, VpssChn, &stVpssChnAttr);
    if (HI_SUCCESS != s32Ret)
    {
        printf("HI_MPI_VPSS_SetChnAttr() fails 0x%x \n", s32Ret);
    }
    return s32Ret;
}

7、启用VPSS通道

HI_S32 HI_MPI_VPSS_EnableChn(VPSS_GRP  VpssGrp, VPSS_CHN  VpssChn)

8、禁用VPSS通道

HI_S32 HI_MPI_VPSS_DisableChn(VPSS_GRP  VpssGrp, VPSS_CHN  VpssChn)

9、设置VPSS CROP功能属性

HI_S32 HI_MPI_VPSS_SetCropCfg(VPSS_GRP  VpssGrp, VPSS_CROP_INFO_S 
*pstCropInfo) 

10、用户向VPSS发送数据

HI_S32 HI_MPI_VPSS_UserSendFrame( VPSS_GRP  VpssGrp,  VIDEO_FRAME_INFO_S 
*pstVideoFrame)

11、设置VPSS通道工作模式

HI_S32 HI_MPI_VPSS_SetChnMode(VPSS_GRP  VpssGrp, VPSS_CHN  VpssChn, 
VPSS_CHN_MODE_S *pstVpssMode)

12、设置用户图像队列深度

HI_S32 HI_MPI_VPSS_SetDepth( VPSS_GRP  VpssGrp, VPSS_CHN  VpssChn, HI_U32 
u32Depth)

13、设置用户图像队列深度

HI_S32 HI_MPI_VPSS_SetDepth( VPSS_GRP  VpssGrp, VPSS_CHN  VpssChn, HI_U32 
u32Depth) 

14、用户从通道获取一帧处理完成的图像

HI_S32 HI_MPI_VPSS_UserGetFrame(VPSS_GRP  VpssGrp, VPSS_CHN  VpssChn,  
VIDEO_FRAME_INFO_S *pstVideoFrame) 

15、设置通道Nr高级属性

HI_S32 HI_MPI_VPSS_SetChnNrParam( VPSS_GRP  VpssGrp, VPSS_CHN  VpssChn, 
VPSS_CHN_NR_PARAM_S *pstChnNrParam) 

16、设置通道SP高级属性

HI_S32 HI_MPI_VPSS_SetChnSpParam( VPSS_GRP  VpssGrp, VPSS_CHN  VpssChn, 
VPSS_CHN_SP_PARAM_S *pstChnSpParam)

17、设置VPSS预缩放属性

HI_S32 HI_MPI_VPSS_SetPreScale(VPSS_GRP  VpssGrp,VPSS_PRESCALE_INFO_S 
*pstPreScaleInfo)

————————————————
版权声明:本文为CSDN博主「未知电子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cheng401733277/article/details/73067095

`