VPSS(Video Process Sub-System)是视频处理子系统,支持的具体图像处理功能包括FRC(Frame Rate Control)、CROP、Sharpen、3DNR、Scale、像素格式转换、LDC、Spread、固定角度旋转、任意角度旋转、鱼眼校正、Cover/Coverex、Overlayex、Mosaic、Mirror/Flip、HDR、Aspect Ratio、压缩解压等。

一、基本概念

 组(GROUP):VPSS对用户提供组的概念,各GROUP分时复用VPSS硬件,硬件依次处理各个组提交的任务。

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

PIPE:VPSS组的管道,取值只能为0。

FRC:帧率控制,分为组帧率控制和通道帧率控制两种。组帧率控制用于控制各GROUP对输入图像的处理,通道帧率控制用于控制各个物理通道和扩展通道图像的处理。

CROP:裁剪,分为组裁剪、物理通道裁剪以及扩展通道裁剪三种。组裁剪,VPSS 对输入图像进行裁剪;物理通道裁剪,VPSS 对各个物理通道的输出图像进行裁剪;扩展通道裁剪,VPSS 调用 VGS 对扩展通道的输出图像进行裁剪。

Sharpen:锐化,对图像进行锐化处理。仅Hi3559AV100、Hi3519AV100支持。

 像素格式转换:支持输入输出图像的数据格式转换,其中3559AV100仅离线模式下支持semi-planar 422 转 semi-planar 420。

Scale:缩放,物理通道水平、垂直最大支持15倍的缩小和16倍的放大;扩展通道水平、垂直最大支持30倍的缩小和16倍的放大。

Mirror/Flip:Mirror 即水平镜像,Flip 即上下翻转,可使用 Mirror+Flip 实现 180°旋转。

Mosaic:对VPSS输出的图像填充马赛克块,Hi3559AV100ES/Hi3559AV100通道0和通道1共用一个Mosaic逻辑,马赛克效果相同,使用时只需将REGION属性绑定到通道0;通道2和通道3共用一个Mosaic逻辑,马赛克效果相同,使用时只需将REGION属性绑定到通道 2;其他芯片所有通道共用一个Mosaic逻辑,马赛克效果相同, 使用时只需将 REGION属性绑定到通道0。

Cover:视频遮挡区域,对VPSS的输出图像填充纯色块,Hi3559AV100ES/Hi3559AV100通道0和通道1共用一个Cover逻辑,遮挡效果相同,使用时只需将REGION属性绑定到通道0;通道2和通道3共用一个 Cover逻辑,遮挡效果相同,使用时只需将REGION属性绑定到通道2;其他芯片所有通道共用一个Cover逻辑,遮挡效果相同, 使用时只需将REGION属性绑定到通道0。

Coverex:视频遮挡区域,调用VGS对VPSS通道的输出图像填充纯色块。

Overlayex:视频叠加区域,调用VGS对VPSS通道的输出图像叠加位图,支持位图格式ARGB4444、ARGB1555、ARGB8888、2BPP(仅Hi3516EV200/Hi3516EV300)。

3DNR:去噪,通过参数配置,把图像中的高斯噪声去除,使得图像变得平滑,有助于降低编码码率。Hi3559AV100ES/Hi3559AV100不支持。

固定角度旋转:支持0度、90度、180度以及270度固定角度的旋转功能。

HDR输出:VPSS支持的HDR类型包括HDR10和HLG。Hi3559AV100ES/Hi3559AV100 VPSS 通道0或通道1输出 HDR 时,动态范围配置需保持一致;通道2或通道3输出HDR时,动态范围配置需保持一致;Hi3559AV100ES 通道2和通道3不支持非 SDR 转 SDR。注意:VPSS 输出HDR图像时,需要从ISP获取色温参数,如果是用户送图像给VPSS 则无法获取色温,HDR效果无法保证,因此不建议这样使用。

        任意角度旋转、LDC(镜头畸变矫正)、Spread(展宽处理)、鱼眼矫正Hi3559AV100均不支持。

视频缓冲池VB(Video Buffer):就是一段很大、又被合理划分和管理的内存。

规则:

用户可通过 MPI 接口对 GROUP 进行管理,每个 GROUP 仅可与一个输入源绑定。

二、相关结构体及函数

1.结构体

typedef struct {
    hi_vpss_chn vpss_chn[CHN_NUM_MAX];
    hi_venc_chn venc_chn[CHN_NUM_MAX];
} sample_venc_vpss_chn;

说明:hi_vpss_chn:最终对应int类型

           hi_venc_chn:最终对应int类型

2.MPP初始化

代码如下

 hi_vb_supplement_cfg supplement_conf = {0};
    hi_venc_chn_attr venc_chn_attr;//
    hi_venc_rc_param rc_param;//
    hi_venc_start_param start_param;
    hi_vb_blk vb_blk;
    hi_u32 buf_size;
    hi_vb_pool poolID;
    hi_phys_addr_t dst_phys_addr;
    hi_phys_addr_t dst_virt_addr;


    hi_s32 ret;
    hi_vb_cfg vb_cfg;
    hi_vb_calc_cfg calc_cfg;
    hi_pic_buf_attr buf_attr;
    buf_attr.width         = 1280;
    buf_attr.height        = 1024;
    buf_attr.align         = HI_DEFAULT_ALIGN;
    buf_attr.bit_width     = HI_DATA_BIT_WIDTH_8;
    buf_attr.pixel_format  = HI_PIXEL_FORMAT_YUV_400;
    buf_attr.compress_mode = HI_COMPRESS_MODE_NONE;
    hi_common_get_pic_buf_cfg(&buf_attr, &calc_cfg);

    vb_cfg.max_pool_cnt=128;//最大视频缓存池数量--系统默认128。
    vb_cfg.common_pool[0].blk_size = calc_cfg.vb_size;//=1280*1024;
    printf("vb_cfg blk size=%d\n",calc_cfg.vb_size);//Val=1310720
    vb_cfg.common_pool[0].blk_cnt  = 20;//分的块数
    ret = hi_mpi_vb_set_cfg(&vb_cfg);
    if (ret != HI_SUCCESS)
    {
        sample_print("hi_mpi_vb_set_conf failed %#x! \n", ret);
        return -1;
    }
    supplement_conf.supplement_cfg = HI_VB_SUPPLEMENT_BNR_MOT_MASK;
    ret = hi_mpi_vb_set_supplement_cfg(&supplement_conf);
    if (ret != HI_SUCCESS)
    {
        sample_print("hi_mpi_vb_set_supplement_conf failed!\n");
        return -2;
    }
    ret = hi_mpi_vb_init();
    if (ret != HI_SUCCESS)
    {
            sample_print("hi_mpi_vb_init failed!\n");
            return -3;
    }
    ret = hi_mpi_sys_init();//初始化MPP系统。MPP依赖缓存池,需先调ss_mpi_vb_init初始化缓存池.
    if (ret != HI_SUCCESS)
    {
        sample_print("hi_mpi_sys_init failed!\n");
        return -1;
    }

编译下载执行报错如下:

查找对应说明书描述如下

根据错误代码提示参数设置无效,根本原因未对结构体 hi_vb_cfg vb_cfg;进行初始化,修改如下:

 hi_vb_cfg vb_cfg={0};编译后运行正常。


总结

Logo

海思 HiSpark 开发者社区是上海海思为开发者搭建的内容和交流平台,依托完备芯片解决方案、专业开发环境、开源/开放的软件资源与社区技术内容,构建完整服务生态开发者的闭环体系。

更多推荐