海思MPP之视频处理子系统模块VPSS
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};编译后运行正常。
总结
更多推荐


所有评论(0)