HiMPP V3.0 媒体处理软件笔记(三)

中间省略了一点 直接开始API参考

3.4 API参考

视频输入(VI)实现启用视频输入设备、视频输入通道、绑定视频输入通道等功能。

·   HI_MPI_VI_SetDevAttr:设置VI设备属性。
·   HI_MPI_VI_GetDevAttr:获取VI设备属性。
·   HI_MPI_VI_SetDevAttrEx:设置VI设备高级属性(特殊时序可调用该高级接口)。
·   HI_MPI_VI_GetDevAttrEx:获取VI设备高级属性。
·   HI_MPI_VI_EnableDev:启动VI设备。
·   HI_MPI_VI_DisableDev:禁用VI设备。
·   HI_MPI_VI_SetChnAttr:设置VI通道属性。
·   HI_MPI_VI_GetChnAttr:获取VI通道属性。
·   HI_MPI_VI_SetChnMinorAttr:设置VI通道次属性。
·   HI_MPI_VI_GetChnMinorAttr:获取VI通道次属性。
·   HI_MPI_VI_ClearChnMinorAttr:清除VI通道次属性。
·   HI_MPI_VI_SetSkipMode:设置VI通道水平方向上的丢点模式。
·   HI_MPI_VI_GetSkipMode:获取VI通道水平方向上的丢点模式。
·   HI_MPI_VI_EnableChn:启动VI通道。
·   HI_MPI_VI_DisableChn:禁用VI通道。
·   HI_MPI_VI_EnableChnInterrupt:启动VI通道响应硬件中断处理模式。
·   HI_MPI_VI_DisableChnInterrupt:禁止VI通道响应硬件中断处理程序。
·   HI_MPI_VI_SetFrameDepth:设置可获取的VI图像最大深度。
·   HI_MPI_VI_SetFrameDepth:获取设置的VI图像最大深度。
·   HI_MPI_VI_GetFrame:获取VI图像。
·   HI_MPI_VI_ReleaseFrame:释放VI图像数据所占的缓存。
·   HI_MPI_VI_SetUserPic:设置用户图片
,作为无视频信号时吃的插入图片。
·   HI_MPI_VI_EnableUserPic:启动插入用户图片。
·   HI_MPI_VI_DisableUserPic:禁用插入用户图片。
·   HI_MPI_VI_SetVbiAttr:设置VBI属性。
·   HI_MPI_VI_GetVbiAttr:获取VBI属性。
·   HI_MPI_VI_EnableVbi:使能VBI。
·   HI_MPI_VI_DisableVbi:禁用VBI。
·   HI_MPI_VI_EnableCascadeChn:启动VI级联扩展通道。
·   HI_MPI_VI_DisableCascadeChn:禁用VI级联扩展通道。
·   HI_MPI_VI_BindChn:设置VI通道绑定关系。
·   HI_MPI_VI_UnBindChn:解除VI通道绑定关系。
·   HI_MPI_VI_GetChnBind:获取VI通道绑定关系。
·   HI_MPI_VI_GetFd:获取VI通道的设备文件句柄。
·   HI_MPI_VI_Query:查询VI通道的中断计数、平均帧率等信息。
·   HI_MPI_VI_GetChnLuma:获取通道亮度和统计。
·   HI_MPI_VI_GetFileHandle:获取设备或通道的文件句柄。
·   HI_MPI_VI_EnableDllSlave:启动DLL的slave模式。
·   HI_MPI_VI_DisableDllSlave:禁用DLL的slave模式。
·   HI_MPI_VI_SetSkipModeEx:设置VI高级丢点属性
·   HI_MPI_VI_GetSkipModeEx:获取VI高级丢点属性。
·   HI_MPI_VI_SetRotate:设置VI图像旋转属性。
·   HI_MPI_VI_GetRotate:获取VI图像旋转属性。
·   HI_MPI_VI_SetModParam:设置VI模块参数。
·   HI_MPI_VI_GetModParam:获取VI模块参数。
·   HI_MPI_VI_AttachVbPool:将VI通道绑定到某个视频缓存VB池中。
·   HI_MPI_VI_DetachVbPool:将VI通道从某个视频缓存VB池中解绑定。

HI_MPI_VI_SetDevAttr
【描述】
设置VI设备属性。基本设备属性默认了部分芯片配置,满足绝大部分的AD芯片对接要求,对于特殊的时序,可使用高级设备属性接口HI_MPI_VI_SetDevAttrEx,配置VI设备的所有属性。
【语法】
HI_S32 HI_MPI_VI_SetDevAttr(VI_DEV ViDev,const VI_DEV_ATTR_S *pstDevAttr)

参数名称描述输入/输出
ViDevVI设备号。
取值范围:[0,VIU_MAX_DEV_NUM]。
输入
pstDevAttrVI设备属性指针。
静态属性
输入

【返回值】
同上
【芯片差异】

芯片差异差异
Hi3536只支持BT.1120standard时序,并且只支持一路复合。
Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100支持BT.1120 standard、BT.1120 interleave、BT.656,可以多路复合。

【需求】
·  头文件:hi_comm_vi.h、mpi_vi.h
·  库文件:libmpi.a
【注意】
·  在调用前保证VI设备处于禁用状态。如果VI设备已处于使能状态,可以使用HI_MPI_VI_DisableDev来禁用设备。
·  参数pstDevAttr主要用来配置指定VI设备的视频接口模式,用于与外围camera、sensor或codec对接,支持的接口模式包括BT.655、BT.601、digital camera、BT.1120逐行以及BT.1120隔行模式。用户需要配置以下几类信息,具体属性意义参见3.5 数据类型部分的说明:
- 接口模式信息enIntMode:接口模式为BT656、BT.601、digital camera、BT.1120等模式
- 工作模式信息 enWorkMode:1路、2路、4路复合模式
- 时钟信息enClkEdge:上升沿或下降沿采样,当前端送来双沿数据时,VI还可以进行双沿采样。
:(数字电路中,把电压的高低用逻辑电平来表示。逻辑电平包括高电平和低电平这两种。不同的元器件形成的数字电路,电压对应的逻辑电平也不同。在TTL门电路 中,把大于3.5伏的电压规定为逻辑高电平,用数字1表示;把电压小于0.3伏的电压规定为逻辑低电平,用数字0表示。数字电平从低电平(数字“0”)变 为高电平(数字“1”)的那一瞬间(时刻)叫作上升沿。
上升沿就是从0变成1中间的过程
下降沿就是从1变成0中间的过程
转载于:https://www.cnblogs.com/azbane/p/7484669.html)
- 数据布局信息:有效数据的布局。
- 数据信息:隔行或逐行输入、YUV数据输入顺序
- 同步时序信息:垂直、水平同步信号的属性。

【举例】

HI_S32 s32Ret;
VI_DEV ViDev = 0;
VI_CHN ViChn = 0;
VI_DEV_ATTR_S stDevAttr;
VI_CHN_ATTR_S stChnAttr;

stDevAttr.enIntfMode = VI_MODE_BT1120_STANDARD;
stDevAttr.enworkMode = VI_WORK_MODE_1Multiplex;
stDevAttr.au32CompMask[0] = 0xFF0000000;
stDevAttr.au32CompMask[1] = 0xFF0000;
stDevAttr.enClkEdge = VI_CLK_EDGE_SINGLE_UP;
stDevAttr.s32AdChnId[0] =-1;
stDevAttr.s32AdChnId[1] =-1;
stDevAttr.s32AdChnId[2] =-1;
stDevAttr.s32AdChnId[3] =-1;
s32Ret = HI_MPI_VI_SetDevAttr(ViDev,&stDevAttr);
if( s32Ret != HI_SUCCESS )
{
   printf("Set dev attributes failed with error code %#x!\n",s32Ret);
   return HI_FALLURE;
}
s32Ret = HI_MPI_VI_EnableDev(ViDev);
if( s32Ret != HI_SUCCESS )
{
   printf("Enable dev failed with error code %#x!\n",s32Ret);
   return HI_FALLURE;
}

stChnAttr.stCapRest.s32X =0;
stChnAttr.stCapRect.s32Y =0;
stChnAttr.stCapRect.u32Width = 1920;
stChnAttr.stCapRect.u32Height =1080;
stChnAttr.stDestSize.u32Width = 1920;
stChnAttr.stDestSize.u32Height = 1080;
stChnAttr.enCapSel = VI_CAPSEL_BOTH;
stChnAttr.enScanMode = VI_SCAN_PROGRESSIVE;
stChnAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPANAR_422;
stChnAttr.bMirror = HI_FALSE;
stChnAttr.bFlip = HI_FALSE;
stChnAttr.s32SrcFrameRate = -1;
stChnAttr.s32DstFrameRate = -1;
s32Ret = HI_MPI_VI_SetChnAttr(ViChn,&stChnAttr);
if( s32Ret != HI_SUCCESS )
{
   printf(("Set chn attributes failed with error code %#x!\n",s32Ret);
   return HI_FALLURE;
}
s32Ret = HI_MPI_VI_EnableChn(ViChn);
if( s32Ret != HI_SUCCESS )
{
   printf("Enable chn failed with error code %#x!\n",s32Ret);
   return HI_FALLURE;
}
/* now,vi is capturing images,you can do something else ... */

s32Ret = HI_MPI_VI_DisableChn(ViChn);
if ( s32Ret != HI_SUCCESS )
{
   printf("Disable chn failed with reeor code %#x!\n",s32Ret);
   return HI_FALLURE;
}
s32Ret = HI_MPI_VI_DisableDev(ViDev);
if( s32Ret != HI_SUCCESS )
{
   printf("Disable dev failed with error code %#x!\n",s32Ret);
   return HI_FALLURE;
}

【相关主题】
·  HI_MPI_VI_GetDevAttr
·  HI_MPI_VI_SetDevAttrEx

HI_MPI_VI_GetDevAttr
【描述】
获取VI设备属性
【语法】
HI_S32 HI_MPI_VI_GetDevAttr(VI_DEV ViDev , VI_DEV_ATTR_S *pstDevAttr)
【参数】

参数名称描述输入/输出
ViDevVI设备号。
取值范围[0,VIU_MAX_DEV_NUM]。
输入
pstDevAttrVI设备属性指针。输出

【返回值】
同上
【需求】
同上
【注意】
如果未设置VI设备属性,该接口将返回失败。
【举例】

【相关主题】
HI_MPI_VI_SetDevAttr

HI_MPI_VI_SetDevAttrEx
【描述】设置VI设备高级属性。一边情况下,不需要调用此接口,特殊地,当基本设备属性接口HI_MPI_VI_SetDevAttr不能满足特殊的时序时,可使用该高级接口,配置VI设备的所有属性。
【语法】
HI_S32 HI_MPI_VI_SetDevAttrEx(VI_DEV ViDev,const VI_DEV_ATTR_EX_S *pstDevAttrEx)
【参数】

参数名称描述输入/输出
ViDevVI设备号
取值范围:[0,VIU_MAX_DEV_NUM]。
输入
pstDevAttrExVI设备高级属性指针。
静态属性
输入

【返回值】
同上
【芯片差异】

芯片类型差异
Hi3536只支持BT.1120stardand时序,并且只支持一路复合。
Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100支持BT.1120standard、BT.1120interleave、BT.656,可以多路复合。

【需求】
同上
【注意】
· 在调用前要保证VI设备处于禁用状态,如果VI设备已处于使能状态,可以使用HI_MPI_VI_DisableDev来禁用设备。
· 参数pstDevAttrEx主要用来配置指定VI设备的视频接口模式,用于与外围camera、sensor或codec对接,支持的接口模式包括BT.656、BT.601、digital camera、BT.1120逐行以及BT.1120隔行模式。用户需要配置以下几类信息,具体属性意义参见3.5数据类型部分的说明:
同HI_MPI_VI_SetDevAttr
【举例】

【相关主题】
HI_MPI_VI_GetDevAttrEx

HI_MPI_VI_GetDevAttrEx
【描述】
获取VI设备高级属性
【语法】
HI_S32 HI_MPI_VI_GetDevAttrEx(VI_DEV ViDev , VI_DEV_ATTR_EX_S *pstDevAttrEx)

参数名称描述输入/输出
ViDevVI设备号
取值范围:[0,VIU_MAX_DEV_NUM)。
输入
pstDevAttrExVI设备属性指针。

输出
【返回值】
同上
【需求】
同上
【注意】
如果未设置VI设备属性,该接口将返回失败。
【举例】

【相关主题】
HI_MPI_VI_SetDevAttrEx

HI_MPI_VI_EnableDev
【描述】
启动VI设备
【语法】
HI_S32 HI_MPI_VI_EnableDev(VI_DEV ViDev);
【参数】

参数名称描述输入/输出
ViDevVI设备号。
取值范围:[0,VIU_MAX_DEV_NUM]。
输入

【返回值】
同上
【需求】
同上
【注意】
· 启用前必须已经设置设备属性,否则返回失败。
· 可重复启用,不返回失败。
【举例】
参见HI_MPI_VI_SetDevAttr的举例。
【相关主题】
HI_MPI_VI_DisableDev

HI_MPI_VI_DisableDev
【描述】
禁用VI设备。
【语法】
HI_S32 HI_MPI_VI_DisableDev(VI_DEV ViDev);
【参数】

参数名称描述输入/输出
ViDevVI设备号。
取值范围:[0,VIU_MAX_DEV_NUM)。
输入

【返回值】
同上
【需求】
同上
【注意】
· 必须先禁用所有与该VI设备绑定的VI通道后,才能禁用VI设备。
· 可重复禁用,不返回失败。
· SDK支持低功耗处理,禁用VI设备后将完全关闭该设备,需要重新设置属性,才能使能VI设备
【举例】
参见HI_MPI_VI_SetDevAttr的举例。
【相关主题】
HI_MPI_VI_EnableDev

HI_MPI_VI_SetChnAttr
【描述】
设置VI通道属性。
【语法】
HI_S32 HI_MPI_VI_SetChnAttr (VI_CHN ViChn , const VI_CHN_ATTR_S *pstAttr);
【参数】

参数名称描述输输入/输出
ViChnVI通道号。输入
pstAttrVI通道属性指针。输入

【返回值】
同上
【芯片差异】

芯片类型差异差异
Hi3536通道号范围[0,VIU_MAX_PHYCHN_NUM)
通道属性参数限制· stCapRect的宽与高为静态属性;其他项为动态属性:无次属性;
· stCapRect是针对原始图像进行裁剪;stDestSize的宽必须等于stCapRect的宽;stDestSize的高在只采集单场时为stCapRect高的1/2,采集两场时两个必须相同。;
· stCapRect中s32Y和u32Height隔行采集时必须4对齐。;
· 输出格式enPixFormat可以动态改变。
Hi3521A/Hi3521DV100
Hi3531A/Hi3531DV100
通道号范围[0,VIU_MAX_PHYCHN_NUM)
通道属性参数限制· stCapRect的宽与高为静态属性,其他项为动态属性;有次属性;
· stCapRect是针对原始图像进行剪裁;stDestSize的宽与高可以等于stCapRect的宽与高,也可以为stCapRect的宽与高的1/2;;
· stCapRect中s32Y和u32Height隔行采集时必须4对齐。;
· 输出格式enPixFormat可以动态改变。;
· 次属性除了stDestSize有效外,其他属性无效,这些属性全部来自于主属性。

【需求】
同上
【注意】
通道属性的各项配置限制如下:
· 采集区域stCapRect:
  - 采集区域起始坐标用于配置需要采集的矩形图像相对于原始图像起始点的位置。起始点位置的横坐标以像素为单位,纵坐标以行为单位。
  - stCapRect中32X和u32Width必须2对齐:s32Y和u32Height逐行采集时必须2对齐。
· 目标图像大小stDestSize:
  - 必须配置,且大小不应该超出外围ADC输出图像的大小范围,否则可能导致VI硬件工作异常。
  - 当输入图像为隔行时,根据采单场或两场,将采集高度分别配置为单场或两场的高度,并要求两场采集时高度是4的整数倍。
  - 最小目标图像大小:最小采集宽高为32×32.
  - 目标图像宽度可以配置为采集宽度的1倍,1/2或1/4,高度可以配置为采集高度的1倍或1/2。
· 抽场选择enCapSel:
  - 抽场选择用于在原始图像为隔行输入时,用户可选择仅捕获其中的一场。
  - 为防止图像上下抖动现象,仅支持捕获两场或底场。
· 扫描模式enScanMode:
  - 扫描模式用于在原始图像为隔行/逐行输入。
· 像素格式enPixFormat:支持semi-planar4:2:2和semi-planar4:2:0。
· 水平镜像bMirror:是否进行水平翻转。
· 垂直镜像bFlip:是否进行垂直翻转。
· 原始帧率s32rcFrameRate:如果不进行帧率控制,则该值设置为-1。
· 目标帧率s32DstFrameRate:如果不进行帧率控制,则该值设置为-1,否则必须先设置原始帧率s32SrcFrameRate的值,且目标帧率必须小于原始帧率。在进行帧率控制采集时,由于逻辑处理机制的原因,会检测到采集未完成,从而会影响ccErrN的统计计数,该采集未完成的次数与不采集/采集的切换次数相关。
· 隔行图像不支持垂直镜像bFlip(因为开启该功能后顶底场采集顺序与原来的相反,后续模块处理可能会引起图像质量问题),MPP内部不做此检查,由用户保证。
· 对于Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100在设置设备属性时根据复合模式进行默认绑定,如果要改变绑定关系,必须要调用HI_MPI_VI_UnBindChn进行解绑,然后再调用HI_MPI_VI_BindChn进行通道绑定,否则会报错。HI3536不能进行显式绑定,所以不能进行绑定关系的设置。
【举例】
参见HI_MPI_VI_SetDevAttr的举例
【相关主题】
HI_MPI_VI_GetChnAttr

HI_MPI_VI_GetChnAttr
【描述】
获取VI通道属性。
【语法】
HI_S32 HI_MPI_VI_GetChnAttr(VI_CHN ViChn, VI_CHN_ATTR_S *pstAttr);
【参数】

参数名称描述输入/输出
ViChnVI通道号输入
pstAttrVI通道属性指针。
动态属性。
输出

【返回值】
同上
【芯片差异】

芯片类型通道号范围
Hi3536/Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100[0,VIU_MAX_PHYCHN_NUM)

【需求】
同上
【注意】
必须先设置通道属性再获取属性,否则将返回失败。
【举例】

HI_S32 s32ret;
VI_CHN ViChn = 0;
VI_CHN_ATTR_S stChnAttr;

/* first enable vi device and vi chn */

/*get channel attribute and vi chn */
s32ret = HI_MPI_VI_GetChnAttr(ViChn,&stChnAttr);
if( HI_SUCCESS != s32ret )
{
   printf("get vi chn attr err:0x%x\n",s32ret);
   return s32ret;
}

【相关主题】
HI_MPI_VI_SetChnAttr

HI_MPI_VI_SetChnMinorAttr
【描述】
设置VI通道次属性。
【语法】
HI_S32 HI_MPI_VI_SetChnMinorAttr(VI_CHN ViChn , const VI_CHN_ATTR_S *pstAttr);
【参数】

参数名称描述输入/输出
ViChnVI通道号。
取值范围:[0,VIU_MAX_PHYCHN_NUM)。
输入
pstAttrVI通道次属性指针。
动态属性,但stCapRect不起作用 ,由主属性的值决定。
输入

【返回值】
同上
【芯片差异】

芯片类型是否支持次属性
Hi3536
Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100支持

【需求】
同上
【注意】
· 默认情况下,VI通道将按HI_MPI_VI_SetChnAttr接口中设置的分辨率来采集连续的视频帧图像;使用HI_MPI_VI_SetChnMinorAttr接口的目的是设置另外一个分辨率,VI通道将会按照配置的帧率来轮流采集两种不同分辨率的视频图像。
· 所谓“通道次(要)属性”是相对主(要)属性而言的,主属性在函数HI_MPI_VI_SetChnAttr中配置:主、次属性的概念只有在对VI做了帧率控制时才有效,VI采集图像时,按配置的目标帧率采集主属性大小的图像,其他帧则继续给次属性做帧率控制,按次属性的目标帧率采集次属性大小的图像。
例如:设置主属性原始帧率为25,目标帧率为5,主属性大小为D1,次属性目标帧率为15,大小为CIF,则实际视频捕获则为5帧输出D1大小图像,15帧输出CIF大小图像,剩余5帧丢掉。
· 如果已配置VI帧率,但未配置通道次属性,则按照目标帧率只输出主属性大小的视频图像。
· 如果对次属性做帧率控制,则主属性的源帧率和目标帧率及次属性的目标帧率为实际帧率值(次属性源帧率目前无效)。次属性的目标帧率最大值为主属性的源与目标帧率之差,当设置的目标帧率值超过最大值或者小于等于0时,目标帧率默认为最大值。
· 如果已经配置了通道次属性,而中途需要关闭次属性图像采集,则可以调用HI_MPI_VI_ClearChnMinorAttr接口将此属性清除。
· 如果主属性源帧率大于0,而目标帧率设为0,表示不输出主属性图像,全部输出次属性图像。
· FrameRate配置为与SrcFrameRate相等,则表示不输出次属性图像,全部输出主属性图像。
· 可以在VI通道启用后动态更改通道次属性。

【举例】

VI_CHN_ATTR_S stAttr;

/* set public attribute of VI device */
/* ... ... */

/* enable VI device */
/* ... ... */

StAttr.s32SrcFrameRate = 25;
stAttr.s32DstFrameRate = 5;

/* set main attribute of VI channel,size is D1 */
/* ... ... */

HI_MPI_VI_GetChnAttr(ViChn,&stAttr);
stAttr.enCapSel = VI_CAPSEL_BOTTOM;
stAttr.bDownScale = HI_TRUE;

/* set minor attribute of VI channel,size is CIF */
if(HI_MPI_VI_SetChnMinorAttr(ViChn,&stAttr))
{
   BBIT_ERR("set chn attr ex fail\n");
   return -1;
}

/* enable VI channel */
/* ... ... */

/* if you not ned minor attr capture */
if(HI_MPI_VI_ClearChnMinorAttr(ViChn))
{
   BBIT_ERR("clear chn minor attr fail\n");
   return -1;
}

【相关主题】
HI_MPI_VI_GetChnMinorAttr

HI_MPI_VI_GetChnMinorAttr
【描述】
获取VI通道此属性。
【语法】
HI_S32 HI_MPI_VI_GetChnMinorAttr(VI_CHN ViChn , VI_CHN_ATTR_S *pstAttr);
【参数】

参数名称描述输入/输出
ViChnVI通道号。
取值范围:[0,VIU_MAX_PHYCHN_NUM)。
输入
pstAttrVI通道属性指针。
动态属性。
输出

【返回值】
同上
【芯片差异】

芯片类型是否支持次属性
Hi3536
Hi3521A/Hi3521DV100/Hi3531A/Hi3531Dv100

【需求】
同上
【注意】
必须先设置通道属性再获取属性,否则将返回HI_ERR_VI_FAILED_NOTCONFIG.
【举例】
参见HI_MPI_VI_SetChnMinorAttr的举例。
【相关主题】
HI_MPI_VI_SetChnAttr

HI_MPI_VI_ClearChnMinorAttr
【描述】
清除VI通道次属性。
【语法】
HI_S32 HI_MPI_VI_ClearChnMinorAttr(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI通道号
取值范围:[0,VIU_MAX_PHYCHN_NUM)
输入

【返回值】
同上
【芯片差异】

芯片差异是否支持次属性
Hi3536
Hi3521A/Hi3521DV100/Hi3531A/Hi3531Dv100

【需求】
同上
【注意】
· 如果已经配置通道次属性,可以调用此接口将其取消。
· 本接口可以在通道启用状态下调用。
【举例】
参见HI_MPI_VI_SetChnMinorAttr的举例。
【相关主题】
HI_MPI_VI_SetChnAttr

HI_MPI_VI_SetSkipMode
【描述】
设置VI通道水平方向上的丢点模式
【语法】
HI_S32 HI_MPI_VI_SetSkipMode(VI_CHN ViChn , VI_SKIP_MODE_E enSkipMode)
【参数】

参数名称描述输入/输出
ViChnVI通道号。输入
enSkipMode丢点模式。
取值范围:{VI_SKIP_NONE,VI_SKIP_YES}。
输入

【返回值】
同上
【芯片差异】

芯片类型描述
Hi3536不支持此接口
Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100支持此接口
通道号范围:[0,VIU_MAX_CHN_NUM)

【需求】
同上
【注意】

· 用于设置某一VI通道采集中水平方向上的丢点模式。只针对视频图像水平方向上的丢点模式进行设置。在垂直方向上,系统根据通道属性中的目标高度和捕获图像高度之比,默认只有不丢点和1/2丢点两种模式。若此接口不被调用,在水平方向上,设置通道的主属性时候,系统根据通道主属性中的目标图像宽度和捕获图像宽度之比,在比值为1/4时初始化为VI_SKIP_YES,在为比值为1或者1/2时,初始化为VI_SKIP_NONE。
· VI_SKIP_NONE包含目标图像宽度和捕获图像宽度之比为1和1/2缩放两种情况;VI_SKIP_YES包含1/2丢点和1/4丢点两种情况。
· 只针对主属性有效,对次属性无效。针对次属性的设置,系统将根据其目标宽度和捕获图像宽度之比,默认运行不丢点(含宽度不变和水平1/2缩放)或1/2丢点+1/2缩放模式。
· HI_MPI_VI_SetSkipMode须在执行函数HI_MPI_VI_SetChnAttr函数之后调用,水平方向上
可动态设置丢点模式。
· 用户在调用HI_MPI_VI_DisableChn之后,再重新调用HI_MPI_VI_EnableChn接口使能通道时,请再次调用此接口重新设置丢点模式。
【举例】

【相关主题】

HI_MPI_VI_GetSkipMode
【描述】
获取VI通道水平方向上的丢点模式。
【语法】
HI_S32 HI_MPI_VI_GetSkipMode(VI_CHN ViChn , VI_SKIP_MODE_E *penSkipMode);
【参数】

参数名称描述输入/输出
ViChnVI通道号。输入
penSkipMode枚举类型的指针,该指针对应的变量为采集方式中的丢点模式。输出

【返回值】
同上

【芯片差异】

芯片类型通道号范围
Hi3536不支持此接口
Hi3521A/Hi3521DV100/Hi3531A/Hi3531Dv100支持此接口
通道号范围:[0,VIU_MAX_CHN_NUM)

【需求】
同上
【注意】
须在通道使能之后调用,用于获取此时水平方向上的丢点模式。
【举例】

【相关主题】

HI_MPI_VI_EnableChn
【描述】
启动VI通道
【语法】
HI_S32 HI_MPI_VI_EnableChn(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI通道号输入

【返回值】

【芯片差异】

芯片类型通道号范围
Hi3536/Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100[0,VIU_MAX_PHYCHN_NUM)

【需求】
同上
【注意】
· 必须先设置通道属性,且通道所绑定的VI设备必须使能。
· 如果设置了VI与VO/VENC的绑定关系,成功调用该接口后即可得到视频数据。
· 可重复启动VI通道,不返回失败。
【举例】
参见HI_MPI_VI_SetDevAttr的举例
【相关主题】
HI_MPI_VI_DisableChn

HI_MPI_VI_DisableChn
【描述】
禁用VI通道。
【语法】
HI_S32 HI_MPI_VI_DisableChn(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI通道号输入

【返回值】
同上
【芯片差异】

芯片类型通道号范围
Hi3536/Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100[0,VIU_MAX_PHYCHN_NUM)

【需求】
同上
【注意】
· 禁用VI通道后,此VI通道即停止采集视频输入数据,如果已经绑定VO或VENC,则VO或VENC将不会再接收到视频图像。
· 可重复禁用VI通道,不返回失败。
· 在禁用本通道之前,如果已经使能了用户图片,则需要先禁用本通道用户图片,否则会报错。
【举例】
参见HI_MPI_VI_SetDevAttr的举例
【相关主题】
HI_MPI_VI_EnableChn

HI_MPI_VI_EnableChnInterrupt
【描述】
启用VI通道响应硬件中断处理程序
【语法】
HI_S32 HI_MPI_VI_EnableChnInterrupt(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI通道号输入

【返回值】
同上
【芯片差异】

芯片类型描述
Hi3536/Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100通道号范围:[0,VIU_MAX_PHYCHN_NUM)

【需求】
同上
【注意】
· 该接口为高级接口,一般不需调用。
· 主要应用场景:当应用程序自行检测到前端AD时序发生异常,启动插入用户图片功能时,为了减少因时序异常导致硬件上报大量中断造成的系统资源消耗,调用HI_MPI_VI_DisableChnInterrupt接口,使VI不再相应该通道的硬件中断处理程序。当检测到前端AD时序恢复正常时,可调用本接口恢复VI响应该通道的硬件中断处理程序。
· 必须先启用VI通道,否则程序返回错误。
· 可重复启用VI通道中断,不返回失败。
【举例】
无。
【相关主题】
HI_MPI_VI_DisableChnInterrupt

HI_MPI_VI_DisableChnInterrupt
【描述】
禁止VI通道响应硬件中断处理程序。
【语法】
HI_S32 HI_MPI_VI_DisableChnInterrupt(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI通道号输入

【返回值】
同上
【芯片差异】
同上
【需求】
同上
【注意】
· 如果通道未启用,则无需禁止VI通道响应中断处理程序,调用本接口将直接返回成功。
【举例】

【相关主题】
HI_MPI_VI_EnableChnInterrupt

HI_MPI_VI_SetFrameDepth
【描述】
设置可获取的VI图像最大深度。
【语法】
HI_S32 HI_MPI_VI_SetFrameDepth(VI_CHN ViChn,HI_U32 u32Depth)
【参数】

参数名称描述输入/输出
ViChnVI通道号输入
u32Depth可获取的VI图像最大深度。
默认值:0
取值范围:[0,8]。

【返回值】
同上
【芯片差异】
同上
【需求】
同上
【注意】
· 此接口用于设置某一VI通道缓存的视频图像帧数。当用户设置缓存多帧视频图像时,用户可以获取到一定数目的连续图像数据。
· 若指定u32Depth为0,表示不需要系统为该VI通道缓存图像,即u32Depth默认为0。
· 若指定u32Depth>0,系统将为该VI通道缓存u32Depth个图像,用户可通过接口HI_MPI_VI_GetFrame获取该VI通道图像数据。具体分为以下集中情况:
  - 用户一直不获取图像。
    系统将自动更新最旧的图像数据,保证用户一旦开始获取,就可获取到最近最新的u32Depth个连续图像。
  - 用户连续获取u32Depth次并一直不释放。
    系统因获取不到VB而自动停止缓存新的VI图像,用户也不能获取心得VI图像。故建议用户保证获取和释放接口配对使用。
  - 用户获取/释放的速度比VI通道产生图像的速度慢。
    系统将自动更新用户仍未获取的最旧的图像数据,保证缓存的图像队列为最近的新VI图像。由于用户不能保证获取速度,导致获取的可能不是连续图像。
· 系统为每个VI通道缓存的u32Depth个VI图像数据,占用MPP内部的缓存块(简称VB)。故用户应通过接口HI_MPI_VI_SetConf设置足够的VB,否则可能由于系统缓存图像占用过多VB,从而影响v1的正常图像采集,导致用户获取不到VI图像数据。支持动态吊装u32Depth。如用户不再需要该VI通道数据时,可设置u32Depth为0,以减少VI通道占用内部VB的数量;在需要获取时,再设置u32Depth为合适的值,即可获取到设置时刻后的连续VI图像。
【举例】
参见HI_MPI_VI_GetFrame的举例

HI_MPI_VI_GetFrameDepth
【描述】
获取设置的VI图像最大深度
【语法】
HI_S32 HI_MPI_VI_GetFrameDepth( VI_CHN ViChn , HI_U32 *pu32Depth );
【参数】

参数名称描述输入/输出
ViChnVI通道号。输入
pu32DepthU32类型的指针,该指针对应的变量为获取的深度。输出

【返回值】
同上
【芯片差异】
同上
【需求】
同上
【注意】

【举例】

【相关主题】

HI_MPI_VI_GetFrame
【描述】
获取VI采集的图像。
【语法】
HI_S32 HI_MPI_VI_GetFrame(VI_CHN ViChn,VIDEO_FRAME_INFO_S *pstFrameInfo,HI_S32 s32MilliSec);
【参数】

参数名称描述输入/输出
ViChnVI通道号输入
pstFrameInfoVI帧信息结构指针。输出
s32MilliSec-1:阻塞式等待,0:非阻塞,大于0时为等待时间,在这个时间内获取不到,则超时退出,单位为毫秒。输入

【返回值】
同上
【芯片差异】
同上
【需求】
同上
【注意】
· 此接口可以获取指定VI通道的视频图像信息。图像信息主要包括:图像的宽度、高度、像素格式、时间戳已经YUV各分量的物理地址。
· 此接口需在通道已启用后才有效。
· 支持多次获取后再释放,但建议获取和释放接口配对使用。
· 获取的物理地址信息来自MPP内部使用的VideoBuffer,因此使用完之后,必须要调用HI_MPI_VI_ReleaseFrame接口释放其内存。
· pstFrameInfo->stVFrame.u32PhyAddr[0]和pstFrameInfo->stVFrame.u32PhyAddr[1]分别指向图像的亮度分量和色度分量的物理地址。
【举例】

HI_S32 s32ret;
VI_CHN ViChn = 0;
VIDEO_FRAME_INFO_S stFrame;
HI_U32 u32Depth;

/* set max depth */
u32Depth = 10;
s32ret = HI_MPI_VI_SetFrameDepth(ViChn,u32Depth);
if(HI_SUCCESS != s32ret)
{
   printf("set max depth err:0x%x\n",s32ret);
   return s32ret;
}

/* get video frame from vi chn */
s32ret = HI_MPI_VI_GetFrame(ViChn,&stFrame)
if( HI_SUCCESS != 32ret )
{
   printf("get vi frame err:0x%x\n",s32ret);
   return s32ret;
}

/* deal with video frame ...*/

/* release video frame */
(void)HI_MPI_VI_ReleaseFrame(ViChn,&stFrame);

【相关主题】
HI_MPI_VI_ReleaseFrame

HI_MPI_VI_ReleaseFrame
【描述】
释放VI图像数据所占的缓存。
【语法】
HI_S32 HI_MPI_VI_ReleaseFrame(VI_CHN ViChn ,VIDEO_FRAME_INFO_S *pstFrameInfo);
【参数】

参数名称描述输入/输出
ViChnVI通道号。输入
pstFrameInfoVI帧数据存储结构指针。输入

【返回值】
同上
【芯片差异】
同上
【需求】
同上
【注意】
· 用户必须保证pstFrameInfo结构中的信息与获取时一致,否则会造成释放不成功。
· 要求用户使用完获取原始图像接口后,调用本接口释放原始图像数据(即必须与HI_MPI_VI_GetFrame配对使用)。
【举例】
参见HI_MPI_VI_GetFrame

HI_MPI_VI_SetUserPic
【描述】
设置用户图片,作为无视频信号时的插入图片。
【语法】
HI_S32 HI_MPI_VI_SetUserPic(VI_CHN ViChn,VI_USERPIC_ATTR_S *pstUserPic);
【参数】

参数名称描述输入/输出
ViChnVI通道号。输入
pstUserPic用户图片信息结构指针输入

【返回值】
同上
【芯片差异】
同上
【需求】
同上
【注意】

· 此接口支持两种用户图片模式,一种是YUV图像模式,另一种是纯色背景模式。
· 设置VI用户图片,用于将VI通道输出的视频帧图像修改为用户配置的指定YUV图像数据或纯色背景,而不是codec的视频数据:此接口需要与HI_MPI_VI_EnableUserPic、HI_MPI_VI_DisableUserPic配合使用。
目前此接口中得参数VI通道号未被使用,即设置用户图像针对得是所有VI通道,而不使具体某个VI通道。
· 设置完用户图片后,即可调用HI_MPI_VI_EnableUserPic接口对指定VI通道启用插入用户图片,此时VI通道输出得数据即为所配置得图片YUV数据或纯色背景:一般用于视频信号丢失时,VI通道输出NoVideo图片。
配置的用户图片的宽、高大小范围为[32,3840],一般应该与VI通道大小相一致;如果不一致,VI内部会自动将其缩放为VI通道大小。在VI通道混合采集时,建议把用户图片大小设为与高分辨率一致,其格式设为INTERLACED,否则VO预览时可能会抖动。
· 用户图片的视频帧信息结构中,需要设置图片的宽度、高度、行间隔、YUV格式以及Y分量和C分量数据的物理地址;可以从MPP公共缓冲池中获取一块相应大小的视频缓存块,从缓存块信息中得到存放YUV数据的梳理地址,然后将物理地址映射到用户空间,即可对这块内存进行YUV数据的填充操作;注意只支持semi-planarYUV420、semi-planarYUV422的格式,因此填充数据时需要遵循先存Y分量数据,再存UV分量间插数据的存储顺序(小端字节序先V后U)。
VIU模块在启用插入用户图片时,会直接使用设置的用户图片帧信息中的物理地址,因此设置完用户图片后,不应该释放或销毁其视频缓存块,除非确认不再使用。可以通过再次调用此接口设置另外一块VideoBuffer以修改图片信息。
· 启用VI通道或启用插入用户图片时,此接口都可以动态调用。
【举例】

HI_S32 s32ret;
HI_U32 u32Width;
HI_U32 u32Height;
HI_U32 u3LStride;
HI_U32 u32CStride;
HI_U32 u32LumaSize;
HI_U32 u32ChrmSize;
HI_U32 u32Size;
VB_BLK VbVlk;
HI_U32 u32PhyAddr;
HI_U8 *pVirAddr;

/* you need get width and height of pictrue */
u32LumaSize = (u32LStride * u32Height);
u32ChrmSize = (u32CStride * u32Height) >>2;/*420 */
u32Size = u32LumaSize + (u32ChrmSize << 1);

/* get video buffer block form common pool */
VbBlk = HI_MPI_VB_GetBlock(VB_INVALID_POOLID,u32Size);
if(VB_INVALID_HANDLE == VbBlk)
{
   return -1;
}

/* get physical address */
u32PhyAddr = HI_MPI_VB_HandlePhysAddr(VbBlk);
if(0 == u32PhyAddr)
{
   return -1;
}

/* mmap physical address to virtual address */
/* ... ...*/

/* get pool id */
ostVFrameInfo->u32PoolId = HI_MPI_VB_Handle2PoolId(VbBlk);
if(VB_INVALID_POOLID == pstVFrameInfo->u32PoolId)
{
   return -1;
}

pstVFrameInfo->stVFrame.u32PhyAddr[0] = u32PhyAddr;
pstVFrameInfo->stVFrame.u32PhyAddr[1] = pstVFrameInfo->stVFrame.u32PhyAddr[0]+u32LumaSize;
pstVFrameInfo->stVFrame.u32PhyAddr[2] = pstVFrameInfo->stVFrame.u32PhyAddr[1]+u32ChrmSize;

pstVFrameInfo->stVFrame.pVirAddr[0] = pVirAddr;
pstVFrameInfo->stVFrame.pVirAddr[1] = pstVFrameInfo->stVFrame.pVirAddr[0]+u32LumaSize;
pstVFrameInfo->stVFrame.pVirAddr[2] = pstVFrameInfo->stVFrame.pVirAddr[1]+u32LumaSize;

pstVFrameInfo->stVFrame.u32Width = u32Width;
pstVFrameInfo->stVFrame.u32Height = u32Height;
pstVFrameInfo->stVFrame.u32Stride[0] = u32LStride;
pstVFrameInfo->stVFrame.u32Stride[1] = u32CStride;
pstVFrameInfo->stVFrame.u32Stride[2] = u32CStride;
pstVFrameInfo->stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;

/* now you need get YUV Semi Palnar Data , fill them to the virtual address */
/* ... ... */

/* enabel VI channel ... ... */

/* first set user pic info */
s32ret = HI_MPI_VI_SetUserPic(0,pstVFrameInfo);
if(s32ret)
{
   return -1;
}

/* ... ... */

/* enable insert user pic if you need */
s32ret = HI_MPI_VI_EnableUserPic(0)
if(s32ret)
{
   return -1;
}

/* ... ... */

/*disable insert user pic f yu don't need */
s32ret = HI_MPI_VI_DisableUserPic(0,0);
if(s32ret)
{
   return -1;
}

HI_MPI_VI_EnableUserPic
【描述】
启用插入用户图片。
【语法】
HI_S32 HI_MPI_VI_EnableUserPic(VI_CHN_ViChn);
【参数】

参数名称描述输入/输出
ViChnVI通道号输入

【返回值】
同上
【芯片差异】
同上
【需求】
同上
【注意】
· 启用插入用户图片之前,需要先设置用户图片帧信息。
· 启用插入用户图片之后,当前VI通道即输出配置的用户图片帧数据。
· 此接口可以重复调用。
· 使能用户图片后,如果有时序中断,用户图片帧率由时序和通道帧率决定;如果没有时序中断,用户图片帧率则仅由通道帧率决定,如果此时通道帧率没有设定,即采用默认值,用户图片的输出帧率默认为30fps。
· 在使能本通道用户图片之前,需要先使能本通道,否则会报错。
【举例】
请参见HI_MPI_VI_SetUserPic的举例。
【相关主题】

HI_MPI_VI_DisableUserPic
【描述】
禁用插入用户图片
【语法】
HI_S32 HI_MPI_VI_DisableUserPic(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI通道号输入

【返回值】
同上
【芯片差异】
同上
【需求】
同上
【注意】

· VI通道不再需要输出用户图片时,应该调用此接口以恢复输出AD的原始视频数据。
· 此接口可以重复调用。
【举例】
参见HI_MPI_VI_SetUserPic的举例。
【相关主题】

HI_MPI_VI_SetVbiAttr
【描述】
设置VI通道的VBI属性。
【语法】
HI_S32 HI_MPI_VI_SetVbiAttr(VI_CHN ViChn,VI_VBI_ARG_S *pstVbiAttr);
【参数】

参数名称描述输入/输出
ViChnVI通道号。
取值范围:[0,VIU_MAX_PHYCHN_NUM)。
输入
pstVbiAttrVBI属性指针。输入

【返回值】
同上
【芯片差异】

芯片类型差异
Hi3536通道0支持设置VBI属性。
Hi3521A/Hi3521DV100不支持设置VBI属性。
Hi3531A只有通道32支持设置VBI属性。
Hi3531DV100只有通道32支持设置VBI属性。

【需求】
同上
【注意】

· 设置通道VBI属性前必须已经设置通道属性,否则返回失败。
· 级联模式只支持BT.1120逐行时序。
· 可重复设置,不返回失败。
【举例】

HI_S32 s32Ret;
VI_DEV ViDev = 0;
VI_CHN ViChn = 0,ViCasChn = VI_CAS_CHN_1;
VI_DEV_ATTR_S stDevAttr;
VI_CHN_ATTR_S stChnAttr;
VI_VBI_ARG_S stVbAttr;

memset(&stDevAttr,0,sizeof(VI_DEV_ATTR_S));
stDevAttr.enIntfMode = VI_MODE_BT1120_STANDARD;
stDevAttr.enWorkMode = VI_WORK_MODE_1Multiplex;
stDevAttr.au32CompMask[0] = 0xFF000000;
stDevAttr.au32CompMask[1] = 0xFF0000;
stDevAttr.enScanMode = VI_SCAN_PROGRESSIVE;
stDevAttr.enClkEdge = VI_CLK_EDGE_SINGLE_UP;
stDevAttr.s32AdChnId[0] = -1;
stDevAttr.s32AdChnId[1] = -1;
stDevAttr.s32AdChnId[2] = -1;
stDevAttr.s32AdChnId[3] = -1;

s32Ret = HI_MPI_VI_SetDevAttr(ViDev,&stDevAttr);
if(s32Ret != HI_SUCCESS)
{
   printf("Set dev attributes failed with error code %#x\n",s32Ret);
   return HI_FAILURE;
}
s32Ret = HI_MPI_VI_EnableDev(ViDev);
if(s32Ret != HI_SUCCESS)
{
   printf("Enable dev failed with error code %#x!\n",s32Ret);
   return HI_FAILURE;
}
stChnAttr.stCapRect.s32X = 0;
stChnAttr.stCapRect.s32Y = 0;
stChnAttr.stCapRect.u32Width = 1920;
stChnAttr.stCapRect.u32Height = 1080;
stChnAttr.stDestSize.u32Width = 1920;
stChnAttr.stDestSize.u32Height = 1080;
stChnAttr.enCapSel = VI_CAPSEL_BOTH;
stChnAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_422;
stChnAttr.bMirror = HI_FALSE;
stChnAttr.bFlip = HI_FALSE;
stChnAttr.s32SrcFrameRate = -1;
stChnAttr.s32DstFrameRate = -1
s32Ret = HI_MPI_VI_SetChnAttr(ViChn,&stChnAttr);
if(s32Ret != HI_SUCCESS)
{
   printf("Set chn attributes failed with error code %#x!\n",s32Ret);
   reurn HI_FAILURE;
}
stVbiArg.stVbiAttr[0].enLocal = VI_VBI_LOCAL_ODD_END;
stVbiArg.stVbiAttr[0].s32X = 0x114;
stVbiArg.stVbiAttr[0].s32Y =0x28;
stVbiArg.stVbiAttr[0].u32Len = 0x20;

s32Ret = HI_MPI_VI_SetVbiAttr(ViChn,&stVbiAttr);
if( s32Ret !=HI_SUCCESS )
{
   printf("Set chn VBI attributes failed with error code %#x!\n",s32Ret);
   return HI_FAILURE;
}
s32Ret = HI_MPI_VI_EnableVbi(ViChn);
if(s32Ret != HI_SUCCESS)
{
   printf("enable chn VBI failed wih error code %#x\n",s32Ret);
   return HI_FAILURE;
}
s32Ret = HI_MPI_VI_EnableChn(ViChn);
if(s32Ret != HI_SUCCSS)
{
   printf("Enable chn failed with error code %#x!\n",s32Ret);
   return HI_FAILURE;
}
/* here,we suppose it's VO_CAS_MOD_SINGLE cascade mode */
s32Ret = HI_MPI_VI_EnableCascadChn(ViCasChn);
if(s32Ret != HI_SUCCES)
{
   printf("Enable cascade chn failed wit error ode %#x!\n",s32Ret);
   return HI_FAILURE;
}
/* now ,vi is capturig images,you cando somethin else ... */
s32Ret = HI_MPI_VI_DisableCascadeChn(ViCasChn);
if(s32Ret != HI_SUCESS)
{
   printf("Disable cascade chn failed with error code %#x!\n",s32Ret);
   return HI_FAILUR;
}
s32Ret = HI_MPI_VI_DisableVbi(ViChn);
if(s32Ret != HI_SUCCESS)
{
   printf("Disable chn VBI failed with error code %#x!\n",s32Ret);
   return HI_FAILURE;
}
s32Ret = HI_MPI_VI_DisableChn(ViChn);
if(s32Re!= HI_SUCCESS)
{
   printf("Disable chn failed with error code %#x!\n",s32Ret);
   return HI_FAILURE;
}
s32Ret = HI_MPI_VI_DisableDev(ViDev);
if(s32Ret != HI_SUCCESS)
{
   printf("Disable dev faile with errr code %#x!\n",s32Ret);
   return HI_FAILURE;
}

【相关主题】
· HI_MPI_VI_GetVbiAttr
· HI_MPI_VI_EnableVbi
· HI_MPI_VI_DisableVbi

HI_MPI_VI_GetVbiAttr
【描述】
获取VBI属性。
【参数】

参数名称描述输入/输出
ViChnVI通道号
取值范围:[0,VIU_MAX_PHYCHN_NUM)。
输入
pstVbiAttrVBI属性指针。输出

【返回值】
同上

【芯片差异】

芯片差异差异
Hi3536通道0支持获取VBI属性。
Hi3521A/Hi3521DV100不支持获取VBI属性。
Hi3531A只有通道32支持获取VBI属性。
Hi3531DV100只有通道32支持设置VBI属性。

【需求】
同上

【注意】
· 必须先设置通道的VBI属性后才能获取,否则返回失败。
· 可重复获取,不返回失败。
【举例】

【相关主题】
HI_MPI_VI_SetVbiAttr

HI_MPI_VI_EnableVbi
【描述】
使能VBI
【语法】
HI_S32 HI_MPI_VI_EnableVbi(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI通道号。
取值范围:[0,VIU_MAX_PHYCHN_NUM)。
输入

【返回值】
同上

【芯片差异】

芯片差异差异
Hi3536通道0支持使能VBI。
Hi3521A/Hi3521DV100不支持使能VBI。
Hi3531A只有通道32支持使能VBI。
Hi3531DV100只有通道32支持shezhiVBI属性。

【需求】
同上
【注意】
· 必须先设置通道的VBI属性后才能使能,否则返回失败。
· 可重复使能,不返回失败。
【举例】

【相关主题】
HI_MPI_VI_DisableVbi

HI_MPI_VI_DisableVbi
【描述】
禁用VBI
【语法】
HI_S32 HI_MPI_VI_DisableVbi(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI通道号。
取值范围:[0,VIU_MAX_PHYCHN_NUM)。
输入

【返回值】
同上

【芯片差异】

芯片类型差异
Hi3536通道0支持禁用VBI。
Hi3521A/Hi3521DV100不支持使能VBI。
Hi3531A只有通道32支持禁用VBI属性。
Hi3531DV100只有通道32支持设置VBI属性。

【需求】
同上

【注意】
· 在关闭通道之前,如果已经使能VBI,则必须要调用此接口,否则会报错。
· 可重复关闭,不返回失败。
· 在调用本接口之前,如果已经使能了级联通道,则必须要先禁用级联通道,否则会摆错。
【举例】

【相关主题】
HI_MPI_VI_EnableVbi

HI_MPI_VI_EnableCascadeChn
【描述】
启用VI级联扩展通道。
【语法】
HI_S32 HI_MPI_VI_EnableCascodeChn(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI级联扩展通道号。
取值范围:{VI_CAS_CHN_1,VI_CAS_CHN_2}。
输入

【返回值】
同上

【芯片差异】

芯片差异是否支持级联
Hi3536/Hi3531A/Hi3531DV100
Hi3521A/Hi3521DV100

【需求】
同上
【注意】
· 必须先调用HI_MPI_VI_EnableVbi接口使能通道VBI。
· 级联扩展通道只是软件上的概念,必须先使能级联物理通道再调用此接口使能扩展通道。
· 如果用户使能了通道VBI,但不能使能级联扩展通道,VI将不会采集、发送图像。
· 扩展通道VI_CAS_CHN_1固定接收级联单路模式的图像和双路模式下的奇数帧,VI_CAS_CHN_2固定接收级联双路模式下的偶数帧。
· 如果用户不使能级联模式,却输入双路线级联视频数据,VI将不对两路数据进行区分处理,只是简单的当成一路数据来采集、发送。
· 可重复启用VI级联扩展通道,不返回失败。
【举例】
请参见HI_MPI_VI_SetVbiAttr举例
【相关主题】
HI_MPI_VI_DisableCascadeChn

HI_MPI_VI_DisableCascadeChn
【描述】
禁用VI级联扩展通道
【语法】
HI_S32 HI_MPI_VI_DisableCascadeChn(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI级联扩展通道号。
取值范围:{VI_CAS_CHN_1,VI_CAS_CHN_2}。
输入

【返回值】
同上

【芯片差异】

芯片类型是否支持级联
Hi3536/Hi3531A/Hi3531DV100
Hi3521A/Hi3521DV100

【需求】
同上
【注意】
· 禁用VI级联扩展通道后,此时VI物理通道即停止采集该扩展通道对应的级联奇偶帧数据,如果已经绑定VO或VENC,则VO或VENC将不会再接收到视频图像。
· 可重复禁用VI级联扩展通道,不返回失败。
【举例】
请参见HI_MPI_VI_EnableVbi举例
【相关主题】
HI_MPI_VI_EnableCascadeChn

HI_MPI_VI_BindChn
【描述】
高级接口,设置VI通道绑定关系。
【语法】
HI_S32 HI_MPI_VI_BindChn(VI_CHN ViChn,const VI_CHN_BIND_ATTR_S *pstChnBindAttr);
【参数】

参数名称描述输入/输出
ViChnVI通道号。输入
pstChnBindAttrVI通道绑定属性指针。
静态属性
输入

【返回值】
同上
【芯片差异】

芯片类型是否支持显示设置绑定关系通道号范围
Hi3536-
Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100[0,VIU_MAX_PHYCHN_NUM)

【需求】
同上
【注意】
· 通常不需调用该接口,特殊情况,需要调整默认绑定关系,或使多个通道绑定到同一个{Dev,Way}时,可调用此接口来实现。但是,调用此接口前,必须先调用HI_MPI_VI_UnbindChn接口解开默认绑定关系,再设置新的绑定关系。
· 必须先设置设备属性,再设置VI通道的绑定关系。
· 不允许重复绑定。如果已设定绑定关系必须先解除,再重新设定新的绑定关系。
· 绑定关系为静态属性,设置绑定关系时必须先禁用通道。
【举例】
无。
【相关主题】
无。

HI_MPI_VI_UnBindChn
【描述】
高级接口,解除VI通道绑定关系。
【语法】
HI_MPI_VI_UnBindChn(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI通道号。输入

【返回值】
同上

【芯片差异】

芯片类型是否支持显示设置绑定关系通道号范围
Hi3536-
Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100[0,VIU_MAX_PHYCHN_NUM)

【需求】
同上
【注意】
· 通常不需要调用该接口,如果要调整默认绑定关系,则调用此接口解绑定。
· 通道必需在禁止(Disable)状态下才能解绑定。
· 重复解绑定,不返回失败。
【举例】
无。
【相关主题】
无。

HI_MPI_VI_GetChnBind
【描述】
获取VI通道绑定关系。
【语法】
HI_S32 HI_MPI_VI_GetChnBind(VI_CHN ViChn,VI_CHN_BIND_ATTR_S *pstChnBindAttr);
【参数】

参数名称描述输入/输出
ViChnVI通道号。输入
pstChnBindAttrVI通道绑定属性指针。输出

【返回值】
同上

【芯片差异】

芯片类型是否支持显式绑定关系通道号范围
Hi3536-
Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100[0,VIU_MAX_PHYCHN_NUM)

【需求】
同上
【注意】
必须先设置VI通道对应的Dev属性,才能获取其默认的绑定关系。
【举例】
无。
【相关主题】
无。

HI_MPI_VI_GetFd
【描述】
获取VI通道对应的设备文件句柄。
【语法】
HI_S32 HI_MPI_VI_GetFd(VI_CHN ViChn);
【参数】

参数名称描述输入/输出
ViChnVI通道号输入

【返回值】

返回值描述
正数值有效返回值。
非正数值无效返回值。

【芯片差异】

芯片类型通道号范围
Hi3536/Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100[0,VIU_MAX_CHN_NUM)

【错误码】

【需求】
同上
【注意】
用户可以获取文件句柄实现多通道select获取视频帧数据。

【举例】

VI_CHN ViChn = 0;
HI_S32 s32ViFd = 0;

/* enable vi dev and vi chn */

/* get video frame from vi chn */
s32ViFd = HI_MPI_VI_GetFd(ViChn);
if(s32ViFd <= 0)
{
   return HI_FAOILURE;
}

【相关主题】

HI_MPI_VI_Query
【描述】
查询VI通道的中断计数、平均帧率等信息。
【语法】
HI_S32 HI_MPI_VI_Query(VI_CHN ViChn,VI_CHN_STAT_S *pstStat);
【参数】

参数名称描述输入/输出
ViChnVI通道号。输入
pstStat通道信息结构体指针。输出

【返回值】
同上

【芯片差异】

芯片类型通道号范围
Hi3536/Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100[0,VIU_MAX_PHYCHN_NUM)

【需求】
同上

【注意】
· 该接口可查询中断计数、通道使能状态、平均帧率、中断丢失数、获取VB失败次数、图像宽高等信息。
· 可以通过该接口查询通道当前的中断计数,用于无中断检测。
· 通过该接口获取到的帧率是每10秒钟的平均帧率,即VI会每隔十秒统计一次平均帧率,该值并不精准。
· 用户可通过该接口查询中断丢失数,如果该数值一致在增加,说明VI工作出现异常。
【举例】

【相关主题】

HI_MPI_VI_GetChnLuma
【描述】
获取通道亮度和统计。
【语法】
HI_S32 HI_MPI_VI_GetChnLuma(VI_CHN ViChn,VI_CHN_LUM_S *pstLuma);
【参数】

参数名称描述输入/输出
ViChnVI物理通道号。输入
pstLuma亮度和统计指针输出

【返回值】
同上
【芯片差异】

芯片类型是否支持
Hi3536
Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100

【需求】
同上
【注意】

【举例】

【相关主题】

HI_MPI_VI_GetFileHandle
【描述】
获取设备或通道的文件句柄。
【语法】
HI_S32 HI_MPI_VI_GetFileHandle(HI_S32 s32Id);

【参数】

参数名称描述输入/输出
s32Id设备号或通道号的描述符。输入

【返回值】

返回值描述
正数值设备号或通道号的描述符
-1失败

【芯片差异】

芯片类型是否支持
Hi3536
Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100

【需求】
同上
【注意】
暂时不使用。
【举例】

【相关主题】

HI_MPI_VI_DisableDllSlave
【描述】
禁用DLL salve mode。
【语法】

参数名称描述输入/输出
ViDevVi设备号输入

【返回值】
同上

【芯片差异】

芯片类型是否支持
Hi3536
Hi3521A/Hi3521DV100/Hi3531A/Hi3531dv100

【需求】
同上
【注意】
· VI在双沿148.5M频率采集图像才会用到DLL,因此只有在双沿148.5M时才会使用到该接口,其他频率下不需要使用此接口。
· DLL slave mode默认启用,如果需要禁用,建议在加载了AD得驱动后,先调用此接口来禁用DLL,再配置VI设备。

【举例】

【相关主题】

HI_MPI_VI_EnableDllSlave
【描述】
启用DLL slave mode
【语法】
HI_S32 HI_MPI_VI_EnableDllSlave(VI_DEV ViDev);
【参数】

参数名称描述输入/输出
ViDevVi设备号输入

【返回值】
同上

【芯片差异】

芯片类型是否支持
Hi3536
Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100

【需求】
同上
【注意】
参见HI_MPI_VI_DisableDllSlave接口注意事项。
【举例】

【相关主题】

HI_MPI_VI_SetSkipModeEx
【描述】
设置VI高级丢点模式。此接口一般不需要调用,一般调用HI_MPI_VI_SetSkipMode即可满足目前对接得AD过采样时的插点模式。如果后续AD又出现了新的插电模式,则调用此接口来设置新的丢点方式。

【语法】
HI_S32 HI_MPI_VI_SetSkipModeEx(VI_CHN ViChn,VI_SKIP_MODE_EX_S *pstModeEx);
【参数】

参数名称描述输入/输出
ViChnVI通道号输入
pstModeExVI丢点模式输入

【返回值】
同上
【芯片差异】

芯片类型是否支持
Hi3536
Hi3521A/Hi3521DV100/Hi3531A/Hi3531DV100

【需求】
同上
【注意】
· 默认不需调用,如果AD又有新的插点方式,原有的丢点方式不能满足,则调用此接口来设置新的丢点方式。
· 调用此接口之前,建议首先调用HI_MPI_VI_GetSkipModeEx接口。
· 须在执行参数HI_MPI_VI_SetChnAttr函数之后调用,水平方向上可动态设置丢点模式。在执行HI_MPI_VI_DisableChn后,会恢复为默认的丢点模式,即上次的设置会被取消。
· 用户在设置了此接口后,HI_MPI_VI_SetSkipMode设置的模式将不再生效。
· 用户在设置了丢点模式后,也可以再调用此接口取消丢点模式的设置。
· 丢点模式只支持1/2和1/4丢点,即只支持1/2和1/4缩放。
· 丢点模式有亮度和色度的丢点,对于色度,建议用户不要随便配置,系统会给出默认值,先调用HI_MPI_VI_GetSkipModeEx接口获取到系统默认值,再使用此接口配置时只需改动亮度丢点模式即可。

【举例】

HI_S32 s32Ret;
VI_DEV ViDev = 0;
VI_CHN ViChn = 0;
VI_DEV_ATTR_S stDevAttr;
VI_CHN_ATTR_S stChnAttr;
VI_SKIP_MODE_EX_S stModeEx;
stDevAttr.enIntfMode = VI_MODE_BT1120_STANDARD;
stDevAttr.enWorkMode = VI_WORK_MODE_1Multiplex;
stDevAttr.au32CompMask[0] = 0xFF000000;
stDevAttr.au32CompMask[1] = 0xFF0000;
stDevAttr.enClkEdge = VI_CLK_EDGE_SINGLE_UP;stDevAttr.s32AdChnId[0] = -1;
VI_CLK_EDGE_SINGLE_UP;stDevAttr.s32AdChnId[1] = -1;
VI_CLK_EDGE_SINGLE_UP;stDevAttr.s32AdChnId[2] = -1;
VI_CLK_EDGE_SINGLE_UP;stDevAttr.s32AdChnId[3] = -1;

s32Ret = HI_MPI_VI_SetDevAttr(ViDev,&stDevAttr);
if(s32Ret != HI_SUCCESS)
{
   printf("Set dev attributes failed with error  code %#x!\n",s32Ret);
   return HI_FAILURE;
}
s32Ret = HI_MPI_VI_EnableDev(ViDev);
if(s32Ret != HI_SUCESS)
{
   printf("Enable dev failed with error coe %#x!\n",s32Ret);
   retrn HI_FAILURE;
}
stChnAttr.stCapRest.s32X = 0;
stChnAttr.stCapRect.s32Y = 0;
stChnAttr.stCapRect.u32Width = 1920;
stChnAttr.stCapRect.u32Height =1080;
stChnAttr.stDestSize.u32Width =1920;
stChnAttr.stDestSize.u32Height = 1080;
stChnAttr.enCapSel = VI_CAPSEL_BOTH;
stChnAttr.enScanMode = VI_SCAN_PROGRESSIVE;
stChnAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_422;
stChnAttr.bMirror = HI_FALSE;
stChnAttr.bFlip;
stChnAttr.s32SrcFrameRate = -1;
stChnAttr.s32DstFrameRate = -1;
s32Ret = HI_MPI_VI_SetChnAttr(ViChn,&stChnAttr);
if(s32Ret != HI_SUCCESS)
{
   printf("Set chn attributes faled with error code %#x!\n",s32Ret);
   return HI_FAILURE;
}

s32Ret = HI_MPI_VI_EnableChn(ViChn);
if(s32Ret != HI_SUCCESS)
{
   printf("Enable ch failed woth erorcod %#x!\n",s32Ret);
   return HI_FAILURE;
}

/* set skip mode */
s32Ret = HI_MPI_VI_GetSkipModeEx(ViChn,&stModeEx);
if(s32Ret != HI_SUCCESS)
{
   printf("ge chnd% skip mode faild with error code %#x!\n",ViChn,s32Ret);
   return HI_FAILURE;
}
stModeEx.bEnable = HI_TRUE;
stModeEx.u32YMask = 5;
s32Ret = HI_MPI_VI_SetSkipModeEx(ViChn,&stModeEx);
if(s32Ret != HI_SUCCESS)
{
   printf("set chn%d skip mode failed with error code %#x!\n",ViChn,s32Ret);
   return HI_FAILRE;
}

/* now,vi is capturing images,you can do something else ... */

s32Ret = HI_MPI_VI_DisableChn(ViChn);
if(s32Ret != HI_SUCCESS)
{
   printf("Disable chn failed with error code %#x!\n",s32Ret);
   return HI_FAILURE;
}

s32Ret = HI_MPI_VI_DisableDev(ViDev);
if(s32Ret != HI_SUCCESS)
{
   printf("Disable dev failed with error code %#x!\n",s32Ret);
   return HI_FAIURE;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值