7.3.6 视频处理
概述
VPS(Video Process System)
是视频 处理系统,支持对图像进行缩小、放大、裁剪、旋转、GDC矫正、帧率控制以及金字塔图像输出。
功能描述
基本概念
-
Group
VPS
对用户提供组的概念,各个Group
分时复用IPU
,GDC
,PYM
硬件,可以将多个VPS Group
进行级联使用。 -
Channel
VPS
的通道,一路通道代表VPS
的一路输出。输出的通道主要分为普通图像通道和金字塔图像通道,普通通道输出缩放裁剪或旋转后的单层数据,金字塔通道输出多层金字塔缩放数据。
功能描述
VPS
可以通过调用 系统控制 提供的绑定接口与其他模块绑定,输入可以与VIN
、VDEC
模块绑定,VPS
输出可以与VOT
、VENC
模块绑定,前者为VPS
的输入源,后者为VPS
的接收者,也可以与另一个VPS
绑定实现更多的通道;支持处理用户回灌的图像数据。用户可以通过VPS
接口对Group
进行管理,每个Group
仅可以与一个输入源绑定,每个Channel
可以与不同的模块绑定。 VPS
与VIN
绑定场景下,需要调用HB_SYS_SetVINVPSMode
来配置VIN
与VPS
之间在线或离线的不同模式。
VPS
硬件由一个IPU
,一个PYM
,两个GDC
组成。共有7路输出Channel
(chn0chn6),chn0chn4可以实现downscale
,chn5可以实现upscale
,chn0~chn5均可实现裁剪(ROI)、旋转、矫正、帧率控制,chn6为金字塔online Channel。虚框为硬件复用,其中OSD
灰色块为CPU叠加,其余三个米色块为硬件叠加。
-
Upscale功能:
尺寸限制请参考下表
支持水平方向最大1.5倍放大,宽度需为4的倍数,最小32x32,最大4096
支持垂直方向最大1.5倍放大, 高度需为偶数,最小32x32,最大4096
只有channel5支持Upscale功能
-
Downscale功能:
尺寸限制参考下表
水平方向最大缩小为原尺寸的1/8(大于1/8), 最小32x32,最大4096
垂直方向最大缩小为原尺寸的1/8(大于1/8), 最小32x32,最大4096
Channel0~channel4支持Downscale功能
-
IPU各通道的尺寸限制如下:
Scaler | FIFO(bytes) | Resolution(pixel) |
---|---|---|
Scaler 5 (IPU US) | 4096 | 8M |
Scaler 2 (IPU DS2) | 4096 | 8M |
Scaler 1 (IPU DS1) | 2048 | 2M |
Scaler 3 (IPU DS3) | 2048 | 2M |
Scaler 4 (IPU DS4) | 1280 | 1M |
Scaler 0 (IPU DS0) | 1280 | 1M |
-
Crop功能:
VPS
可以对输入的图形进行裁剪,选择裁剪后的ROI区域去做放大或者缩小 -
PYM金字塔处理功能:
最大输入图像宽度4096,最大输入图像高度4096
最小输入图像宽度64,最小输入图像高度64
最大输出图像宽度4096,最大输出图像高度4096
最小输出图像宽度48,最小输出图像高度32
缩小图像层数24(0
23)层,其中0、4、8、12、16、20层为基础Base层,基础层每一层的size为上一层的1/2;其余层为ROI层,ROI层基于Base层作缩小(1、2、3层基于Base0层,5、6、7层基于Base4层,以此类推)各层可以单独使能,缩放区域、缩放系数可以配置放大图像层数为6(2429)层,放大比例固定,分别为1.28、1.6、2、2.56、3.2、4倍。PYM
通道也可以为0~5,此时为非online通道。每一个group下最多使用一个
PYM
。
注意事项
-
PYM
硬件要求最少使能BASE0层与BASE4层; -
PYM
在online输入(chn6)时,PYM ds所有层(023)累计输出数据量不得大于输入数据量的2.5倍,us层(2429)累计宽之和不得超过输入宽,否则会有未知风险; -
IPU
绑定了PYM
后,不能再绑定VOT
/VPS
/VENC
等模块; -
Rotate
旋转功能:VPS
支持旋转90度、180度、270度,支持Group旋转
与Chnnel旋转
(二选一),Group旋转
时VPS
所有输出通道均旋转,Chnnel旋转
可以将chn0~chn5中任意两路旋转,PYM
处理过的通道不可以旋转。 -
Gdc
矫正功能:VPS
支持输入矫正文件作图形畸变矫正,支持Group矫正
与Chnnel矫正
(二选一),Group矫正
时VPS
所有输出通道均作矫正,Chnnel矫正
可以在chn0~chn5中任意两路作矫正。 -
帧率控制功能:
VPS
的channel0~5支持帧率控制,可以输出小于等于输入帧率的任意帧率。
API参考
HB_VPS_CreateGrp
【函数声明】
int HB_VPS_CreateGrp(int VpsGrp, const VPS_GRP_ATTR_S *grpAttr);
【功能描述】
创建一个VPS Group
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
grpAttr | Group属性指针 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
VPS最多可以创建8个Group;Group属性主要包含输入的宽、高和GDC的buf深度。
【参考代码】
VPS参考代码
HB_VPS_DestroyGrp
【函数声明】
int HB_VPS_DestroyGrp(int VpsGrp);
【功能描述】
销毁一个VPS Group
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
Group必须已经创建
【参考代码】
无
HB_VPS_StartGrp
【函数声明】
int HB_VPS_StartGrp(int VpsGrp);
【功能描述】
启动VPS Group处理
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
Group必须已经创建
【参考代码】
VPS参考代码
HB_VPS_StopGrp
【函数声明】
int HB_VPS_StopGrp(int VpsGrp);
【功能描述】
停止VPS Group处理
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
Group必须已经创建并且已经启动
【参考代码】
VPS参考代码
HB_VPS_GetGrpAttr
【函数声明】
int HB_VPS_GetGrpAttr(int VpsGrp, VPS_GRP_ATTR_S *grpAttr);
【功能描述】
获取VPS Group属性
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
grpAttr | 属性结构体指针 | 输出 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
无
【参考代码】
无
HB_VPS_SetGrpAttr
【函数声明】
int HB_VPS_SetGrpAttr(int VpsGrp, const VPS_GRP_ATTR_S *grpAttr);
【功能描述】
设置VPS Group属性
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
grpAttr | 属性结构体指针 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
无
【参考代码】
VPS参考代码
HB_VPS_SetGrpRotate
【函数声明】
int HB_VPS_SetGrpRotate(int VpsGrp, ROTATION_E enRotation);
【功能描述】
设置VPS Group旋转功能,使VPS的所有输出都旋转
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
enRotation | 旋转参数 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
该接口需要在HB_VPS_SetChnAttr之前调用,GroupRotate使能之后禁止使能ChnRotate;isp绑定ipu必须得是offline模式
【参考代码】
VPS参考代码
HB_VPS_GetGrpRotate
【函数声明】
int HB_VPS_Get GrpRotate(int VpsGrp, ROTATION_E *enRotation);
【功能描述】
获取VPS Group旋转功能属性
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
enRotation | 旋转功能参数指针 | 输出 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
无
【参考代码】
无
HB_VPS_SetGrpRotateRepeat
【函数声明】
int HB_VPS_SetGrpRotateRepeat(int VpsGrp, ROTATION_E enRotation);
【功能描述】
动态组旋转:该接口会保存当前group及后面绑定的多个VPS group所有通道配置,根据传的enRotation,自动重新计算旋转后所有通道的尺寸、roi区域,重新初始化group,重新绑定VIN;
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
enRotation | 旋转参数 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
该接口暂时不支持配置过PYM的场景
【参考代码】
无
HB_VPS_SetGrpGdc
【函数声明】
int HB_VPS_SetGrpGdc(int VpsGrp, char* buf_addr, uint32_t buf_len, ROTATION_E enRotation)
【功能描述】
设置VPS Group GDC矫正功能,使VPS的所有输出都有矫正效果
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
buf_addr | 矫正文件地址 | 输入 |
buf_len | 矫正文件长度 | 输入 |
enRotation | 旋转参数 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
该接口需要在HB_VPS_SetChnAttr之前调用;根据不同的镜头,不同的畸变,不同的尺寸,需要传入不同矫正bin文件。
【参考代码】
VPS参考代码
HB_VPS_SendFrame
【函数声明】
int HB_VPS_SendFrame(int VpsGrp, void* videoFrame, int ms);
【功能描述】
向VPS发送数据
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
videoFrame | 图像数据指针;VPS回灌数据结构为hb_vio_buffer_t结构; | 输入 |
ms | 超时参数 ms设为-1 时,为阻塞接口;0 时为 非阻塞接口;大于 0 时为超时等待时间,超时时间的 单位为毫秒(ms) | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
无
【参考代码】
VPS参考代码
HB_VPS_SetChnAttr
【函数声明】
int HB_VPS_SetChnAttr(int VpsGrp, int VpsChn, const VPS_CHN_ATTR_S *chnAttr);
【功能描述】
设置VPS通道属性(设置IPU某个通道的输出尺寸)
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
VpsChn | 通道号 | 输入 |
chnAttr | 通道属性指针 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
该接口支持动态配置IPU的输出尺寸,动态配置需要在StartGrp之后调用该接口,动态配置的新尺寸不可以比第一次初始化配置的尺寸大。如果需要启动以后从小尺寸改到大尺寸,那么需要在StartVps之前调用两次该接口,第一次传最大size,第二次传最小size。
【参考代码】
VPS参考代码
HB_VPS_GetChnAttr
【函数声明】
int HB_VPS_GetChnAttr(int VpsGrp, int VpsChn, VPS_CHN_ATTR_S *chnAttr);
【功能描述】
获取VPS通道属性
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
VpsChn | 通道号 | 输入 |
chnAttr | 通道属性指针 | 输出 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
无
【参考代码】
无
HB_VPS_EnableChn
【函数声明】
int HB_VPS_EnableChn(int VpsGrp, int VpsChn);
【功能 描述】
启用VPS通道
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
VpsChn | 通道号 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
如果未使能通道,GetChnFrame接口获取不到图像
【参考代码】
VPS参考代码
HB_VPS_DisableChn
【函数声明】
int HB_VPS_DisableChn(int VpsGrp, int VpsChn);
【功能描述】
禁用VPS通道
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
VpsChn | 通道号 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
无
【参考代码】
VPS参考代码
HB_VPS_SetChnRotate
【函数声明】
int HB_VPS_SetChnRotate(int VpsGrp, int VpsChn, ROTATION_E enRotation);
【功能描述】
设置VPS通道图像固定角度旋转
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
VpsChn | 通道号 | 输入 |
enRotation | 旋转属性 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
SetChnRotate属性需要在SetChnAttr之后调用,最多同时支持两个CHN做旋转;启动以后也支持调用,可以动态控制通道旋转。
【参考代码】
VPS参考代码
HB_VPS_GetChnRotate
【函数声明】
int HB_VPS_GetChnRotate(int VpsGrp, int VpsChn, ROTATION_E *enRotation);
【功能描述】
获取VPS通道图像旋转属性
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
VpsChn | 通道号 | 输 入 |
enRotation | 旋转属性 | 输出 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
无
【参考代码】
无
HB_VPS_SetChnGdc
【函数声明】
int HB_VPS_SetChnGdc(int VpsGrp, int VpsChn, char* buf_addr, uint32_t buf_len, ROTATION_E enRotation)
【功能描述】
设置VPS chn GDC矫正功能
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
VpsChn | Channel号 | 输入 |
buf_addr | 矫正文件地址 | 输入 |
buf_len | 矫正文件长度 | 输入 |
enRotation | 旋转参数 | 输入 |
【返 回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败 |
【注意事项】
该接口需要在HB_VPS_SetChnAttr之后调用,最多同时支持两个CHN做矫正;根据不同的镜头,不同的畸变,不同的尺寸,需要传入不同矫正bin文件。
【参考代码】
VPS参考代码
HB_VPS_UpdateGdcSize
【函数声明】
int HB_VPS_UpdateGdcSize(int VpsGrp, int VpsChn, uint16_t out_width, uint16_t out_height)
【功能描述】
设置VPS GDC矫正输出尺寸(GDC输入输出尺寸默认是一致的,可以用该接口改变GDC输出的尺寸)
【参数描述】
参数名称 | 描述 | 输入/输出 |
---|---|---|
VpsGrp | Group号 | 输入 |
VpsChn | Channel号 | 输入 |
out_width | 输出宽度 | 输入 |
out_height | 输出高度 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 |