MI VIF API
1. 概述¶
1.1. 模块说明¶
视频输入(VIF)实现启用视频输入设备、视频输入通道、绑定视频输入通道等功能。
1.2. 流程框图¶
1.2.1. Pretzel, Macaron, Pudding, Ispahan ,Ikayaki流程框图¶
Vif output port1只有在BT656接口中用到,并且outport1的width/height是outport0的一半.
MI_VIF device 和channel之间的映射关系如下:
Pretzel和Pudding芯片中N max=3,
Macaron、Ispahan和 Ikayaki芯片中N max=2
注:N为Device Id.
Mipi接口中只能用到对应VifDev中的第一个channel,BT656接口复合模式下才会用到VifDev中的multi channel.
1.2.2. Tiramisu 框图¶
注意:
16 channel 中总共只有8个channel 可以用。默认情况下:
mipi接口4个sensor 分别用到:
linear mode dev0/dev4/dev8/dev12, hdr mode dev0/1, dev⅘, dev8/9, dev12/13。
BT656 接口2个sensor分别用到:
dev0/½/3, dev8/9/10/11。
2. API 参考¶
2.1. 功能模块API¶
表 2‑1:API参考
API名 | 功能 |
---|---|
MI_VIF_SetDevAttr | 设置 VIF 设备属性 |
MI_VIF_GetDevAttr | 获取 VIF 设备属性 |
MI_VIF_EnableDev | 启用 VIF 设备 |
MI_VIF_DisableDev | 禁用 VIF 设备 |
MI_VIF_SetChnPortAttr | 设置 VIF 通道Port属性 |
MI_VIF_GetChnPortAttr | 获取 VIF 通道Port属性 |
MI_VIF_EnableChnPort | 启用 VIF 通道Port |
MI_VIF_DisableChnPort | 禁用 VIF 通道Port |
MI_VIF_Query | 查询 VIF 通道的Port中断计数、平均帧率等信息 |
MI_VIF_SetDev2SnrPadMux | 设置VIF 设备和sensor 之间绑定关系 |
MI_VIF_InitDev | 初始化VIF设备 |
MI_VIF_DeInitDev | 反初始化VIF设备 |
MI_VIF_GetDevStatus | 获取Vif Dev当前状态 |
MI_VIF_CallBackTask_Register | 向 VIF 注册回调接口 |
MI_VIF_CallBackTask_UnRegister | 向 VIF 反注册回调接口 |
2.2. MI_VIF_SetDevAttr¶
-
功能
设置 VIF 设备属性。基本设备属性默认了部分芯片配置,满足绝大部分的 AD 芯片对接要求。
-
语法
MI_S32 MI_VIF_SetDevAttr(MI_VIF_DEV u32VifDev, MI_VIF_DevAttr_t *pstDevAttr)
-
形参
参数名称 描述 输入/输出 u32VifDev VIF 设备号。 输入 pstDevAttr VIF 设备属性指针。静态属性。 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
在调用前要保证 VIF 设备处于禁用状态。如果 VIF 设备已处于使能状态,可以使用 MI_VIF_DisableDev 来禁用设备。
-
参数 pstDevAttr 主要用来配置指定 VIF 设备的视频接口模式,用于与外围camera、 sensor对接,支持的接口模式包括 BT.656、digital camera、MIPI sensor。具体属性意义参见 VIF数据类型部分的说明。
-
-
举例
VIF初始化启动及退出范例:
STCHECKRESULT(MI_SNR_GetPadInfo(eSnrPadId, &stPad0Info)); STCHECKRESULT(MI_SNR_GetPlaneInfo(eSnrPadId, 0, &stSnrPlane0Info)); u32CapWidth = stSnrPlane0Info.stCapRect.u16Width; u32CapHeight = stSnrPlane0Info.stCapRect.u16Height; ePixFormat = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(stSnrPlane0Info.ePixPrecision, stSnrPlane0Info.eBayerId); /************************************************ init VIF *************************************************/ MI_VIF_DevAttr_t stDevAttr; memset(&stDevAttr, 0x0, sizeof(MI_VIF_DevAttr_t)); stDevAttr.eIntfMode = stPad0Info.eIntfMode; stDevAttr.eWorkMode = pstVifDevAttr->eWorkMode; stDevAttr.eHDRType = (MI_VIF_HDRType_e)pstVpeChnattr->eHdrType; if(stDevAttr.eIntfMode == E_MI_VIF_MODE_BT656) stDevAttr.eClkEdge = stPad0Info.unIntfAttr.stBt656Attr.eClkEdge; else stDevAttr.eClkEdge = E_MI_VIF_CLK_EDGE_DOUBLE; if(stDevAttr.eIntfMode == E_MI_VIF_MODE_MIPI) stDevAttr.eDataSeq =stPad0Info.unIntfAttr.stMipiAttr.eDataYUVOrder; else stDevAttr.eDataSeq = E_MI_VIF_INPUT_DATA_YUYV; if(stDevAttr.eIntfMode == E_MI_VIF_MODE_BT656) memcpy(&stDevAttr.stSyncAttr, &stPad0Info.unIntfAttr.stBt656Attr.stSyncAttr, sizeof(MI_VIF_SyncAttr_t)); stDevAttr.eBitOrder = E_MI_VIF_BITORDER_NORMAL; STCHECKRESULT(MI_VIF_SetDevAttr(vifDev, &stDevAttr)); STCHECKRESULT(MI_VIF_EnableDev(vifDev)); MI_VIF_ChnPortAttr_t stVifPortInfo; memset(&stVifPortInfo, 0, sizeof(MI_VIF_ChnPortAttr_t)); stVifPortInfo.stCapRect.u16X = stSnrPlane0Info.stCapRect.u16X; stVifPortInfo.stCapRect.u16Y = stSnrPlane0Info.stCapRect.u16Y; stVifPortInfo.stCapRect.u16Width = stSnrPlane0Info.stCapRect.u16Width; stVifPortInfo.stCapRect.u16Height = stSnrPlane0Info.stCapRect.u16Height; stVifPortInfo.stDestSize.u16Width = u32CapWidth; stVifPortInfo.stDestSize.u16Height = u32CapHeight; stVifPortInfo.ePixFormat = ePixFormat; //stVifPortInfo.u32FrameModeLineCount for lowlantancy mode if(stDevAttr.eIntfMode == E_MI_VIF_MODE_BT656) { stVifPortInfo.eFrameRate = E_MI_VIF_FRAMERATE_FULL; stVifPortInfo.eCapSel = E_MI_SYS_FIELDTYPE_BOTH; stVifPortInfo.eScanMode = E_MI_SYS_FRAME_SCAN_MODE_PROGRESSIVE; } STCHECKRESULT(MI_VIF_SetChnPortAttr(vifChn, vifPort, &stVifPortInfo)); STCHECKRESULT(MI_VIF_EnableChnPort(vifChn, vifPort)); /************************************************ call sys bind interface *************************************************/ /************************************************ exit call sys unbind interface *************************************************/ STCHECKRESULT(MI_VIF_DisableChnPort(vifChn, vifPort)); STCHECKRESULT(MI_VIF_DisableDev(vifDev));
-
相关主题
2.3. MI_VIF_GetDevAttr¶
-
功能
获取 VIF 设备属性。
-
语法
MI_S32 MI_VIF_GetDevAttr(MI_VIF_DEV u32VifDev, MI_VIF_DevAttr_t *pstDevAttr)
-
形参
参数名称 描述 输入/输出 u32VifDev VIF 设备号。 输入 pstDevAttr VIF 设备属性指针。 输出 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
如果未设置 VIF 设备属性,该接口将返回失败。
-
相关主题
2.4. MI_VIF_EnableDev¶
-
功能
启用 VIF 设备。
-
语法
MI_S32 MI_VIF_EnableDev(MI_VIF_DEV u32VifDev);
-
形参
参数名称 描述 输入/输出 u32VifDev VIF 设备号。 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
启用前必须已经设置设备属性,否则返回失败。
-
可重复启用,不返回失败。
-
-
举例
请参见 MI_VIF_SetDevAttr的举例。
-
相关主题
2.5. MI_VIF_DisableDev¶
-
功能
禁用 VIF 设备。
-
语法
MI_S32 MI_VIF_DisableDev(MI_VIF_DEV u32VifDev);
-
形参
参数名称 描述 输入/输出 u32VifDev VIF 设备号。 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
必须先禁用所有与该 VIF 设备绑定的 VIF 通道后,才能禁用 VIF 设备。
-
可重复禁用,不返回失败。
-
-
举例
请参见 MI_VIF_SetDevAttr的举例。
-
相关主题
2.6. MI_VIF_SetChnPortAttr¶
-
功能
设置 VIF 通道次属性。
-
语法
MI_S32 MI_VIF_SetChnPortAttr(MI_VIF_CHN u32VifChn, MI_VIF_PORT u32ChnPort, MI_VIF_ChnPortAttr_t *pstAttr);
-
形参
参数名称 描述 输入/输出 u32VifChn VIF 通道号。 输入 u32ChnPort Port号 输入 pstAttr VIF 通道Port属性指针。 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
- 默认情况下,使用 MI_VIF_SetChnPortAttr 接口的目的是设置端口属性,如CapSize、DestSize、FrameRate等等。
-
举例
请参见MI_VIF_SetDevAttr的举例。
-
相关主题
2.7. MI_VIF_GetChnPortAttr¶
-
功能
获取 VIF 通道次属性。
-
语法
MI_S32 MI_VIF_GetChnPortAttr(MI_VIF_CHN u32VifChn, MI_VIF_PORT u32ChnPort, MI_VIF_ChnPortAttr_t *pstAttr);
-
形参
参数名称 描述 输入/输出 u32VifChn VIF 通道号。 输入 u32ChnPort Port号。 输入 pstAttr VIF 通道Port属性指针。 输出 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
必须先设置属性再获取属性,否则将返回 MI_ERR_VIF_FAILED_NOTCONFIG。
-
举例
请参见 MI_VIF_SetChnPortAttr 的举例。
-
相关主题
2.8. MI_VIF_EnableChnPort¶
-
功能
启用 VIF 通道。
-
语法
MI_S32 MI_VIF_EnableChnPort (MI_VIF_CHN u32VifChn,MI_VIF_PORT u32ChnPort);
-
形参
参数名称 描述 输入/输出 VifChn VIF 通道号。 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
必须先设置通道属性,且通道所绑定的 VIF 设备必须使能。
-
可重复启用 VIF 通道,不返回失败。
-
-
举例
请参见 MI_VIF_SetDevAttr 的举例。
-
相关主题
2.9. MI_VIF_DisableChnPort¶
-
功能
禁用 VIF 通道。
-
语法
MI_S32 MI_VIF_DisableChnPort (MI_VIF_CHN u32VifChn, MI_VIF_PORT u32ChnPort);
-
形参
参数名称 描述 输入/输出 u32VifChn VIF 通道号。 输入 u32ChnPort Port号 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
禁用 VIF 通道Port后,此 VIF 通道Port即停止采集视频输入数据,如果已经绑定后端,则后端不会再接收到视频图像。
-
可重复禁用 VIF 通道Port,不返回失败。
-
-
举例
请参见 MI_VIF_SetDevAttr的举例。
-
相关主题
2.10. MI_VIF_Query¶
-
功能
查询 VIF 通道的中断计数、平均帧率等信息。
-
语法
MI_S32 MI_VIF_Query(MI_VIF_CHN u32VifChn, MI_VIF_PORT u32ChnPort, MI_VIF_ChnPortStat_t *pstStat);
-
形参
参数名称 描述 输入/输出 u32VifChn VIF 通道号。 输入 u32ChnPort Port口 输入 pstStat 通道信息结构体指针。 输出 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
该接口可查询中断计数、通道使能状态、平均帧率、中断丢失数、获取 VB 失败次数、图像宽高等信息。
-
通过该接口获取到的帧率是每 1 秒钟的平均帧率,即 VIF 会每隔一秒统计一次平均帧率,该值并不精确,会有些波动。
-
用户可通过该接口查询中断丢失数,如果该数值一直在增加,说明 VIF 工作出现异常。
-
2.11. MI_VIF_SetDev2SnrPadMux¶
-
功能
设置Vif Dev 和sensor Pad 之间的绑定关系
-
语法
MI_S32 MI_VIF_SetDev2SnrPadMux(MI_VIF_Dev2SnrPadMuxCfg_t stVifDevMap[], MI_U8 u8Length);
-
形参
参数名称 描述 输入/输出 stVifDevMap Dev 和SensorPad Maping 关系 输入 u8Length Dev Num 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
在默认情况下vif Dev 和SensorPad 对应关系是vif Dev0 -> SensorPad0, vif Dev2 -> SensorPad1.如果要用到其它的Vif Dev 或者Sensor Pad 需要用MI_VIF_SetDev2SnrPadMux api 设置对应连接关系。
-
在调用 MI_SNR_SetPlaneMode 后vif Dev 和 SenosrPad 对应关系会重置到默认情况,所以应在 MI_SNR_SetPlaneMode 后调用 MI_VIF_SetDev2SnrPadMux 。
-
-
举例
该api实现Vif Dev0 bind SensorPad0, Dev1 bind SensorPad2, Dev2 bind SensorPad1绑定关系范例如下:
MI_VIF_Dev2SnrPadMuxCfg_t stVifDev[4]; stVifDev[0].eSensorPadID = E_MI_VIF_SNRPAD_ID_0; stVifDev[0].u32PlaneID = 0xff;//oxff liner mode, 0:长曝光,1:短曝光。 stVifDev[1].eSensorPadID = E_MI_VIF_SNRPAD_ID_2; stVifDev[1].u32PlaneID = 0xff; stVifDev[2].eSensorPadID = E_MI_VIF_SNRPAD_ID_1; stVifDev[2].u32PlaneID = 0xff; stVifDev[3].eSensorPadID = E_MI_VIF_SNRPAD_ID_3; stVifDev[3].u32PlaneID = 0xff; MI_VIF_SetDev2SnrPadMux(stVifDev, 4);
2.12. MI_VIF_InitDev¶
-
描述
初始化VIF设备。
-
语法
MI_S32 MI_VIF_InitDev(MI_VIF_InitParam_t *pstInitParam);
-
参数
参数名称 描述 输入/输出 pstInitParam 设备初始化参数。 输入 -
返回值
-
MI_OK成功。
-
非MI_OK失败,参照错误码。
-
-
依赖
-
头文件:mi_common.h、mi_vif.h
-
库文件:libmi_vif.a
-
2.13. MI_VIF_DeInitDev¶
-
描述
反初始化vif设备。
-
语法
MI_S32 MI_VIF_DeInitDev(void);
-
返回值
-
MI_OK成功。
-
非MI_OK失败,参照错误码。
-
-
依赖
-
头文件:mi_common.h、mi_vif.h
-
库文件:libmi_vif.a
-
2.14. MI_VIF_GetDevStatus¶
-
描述
获取Vif Dev当前状态。
-
语法
MI_S32 MI_VIF_GetDevStatus(MI_VIF_DEV u32Vifdev,MI_VIF_DevStatus_t *pstVifDevStatus);
-
参数
参数名称 描述 输入/输出 u32Vifdev VIF Dev ID 输入 pstVifDevStatus VIF Dev当前状态 输出 -
返回值
-
MI_OK成功。
-
非MI_OK失败,参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
举例
该api实现Vif Dev当前状态的获取,使用范例如下:
MI_VIF_DevStatus_t stVifDev[VIF_MAX_DEV_NUM]; MI_VIF_DEV a = 0; for(a=0;a< VIF_MAX_DEV_NUM;a++) { ret = MI_VIF_GetDevStatus(a,&stVifDev[a]); }
2.15. MI_VIF_CallBackTask_Register¶
-
描述
向VIF注册回调接口。
-
语法
MI_S32 MI_VIF_CallBackTask_Register(MI_VIF_CHN u32VifChn, MI_VIF_CallBackParam_t *pstCallBackParam);
-
参数
参数名称 描述 输入/输出 u32VifChn VIF Chn ID 输入 pstCallBackParam 回调参数 输入 -
返回值
-
MI_OK成功。
-
非MI_OK失败,参照错误码。
-
-
依赖
-
头文件:mi_common.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
该接口目前只支持kernel mode调用
-
-
举例
MI_S32 _mi_vif_framestart1(MI_U64 u64Data) { DBG_ERR("DATA %llu \n", u64Data); return 0; } MI_S32 _mi_vif_framestart2(MI_U64 u64Data) { DBG_ERR("DATA %llu \n", u64Data); return 0; } static MS_S32 _mi_vif_testRegVifCallback(void) { MI_VIF_CallBackParam_t stCallBackParam1; MI_VIF_CallBackParam_t stCallBackParam2; MI_VIF_CHN u32VifChn = 0; memset(&stCallBackParam1, 0x0, sizeof(MI_VIF_CallBackParam_t)); memset(&stCallBackParam2, 0x0, sizeof(MI_VIF_CallBackParam_t)); stCallBackParam1.eCallBackMode = E_MI_VIF_CALLBACK_ISR; stCallBackParam1.eIrqType = E_MI_VIF_IRQ_FRAMESTART; stCallBackParam1.pfnCallBackFunc = _mi_vif_framestart1; stCallBackParam1.u64Data = 11; MI_VIF_CallBackTask_Register(u32VifChn,&stCallBackParam1); stCallBackParam2.eCallBackMode = E_MI_VIF_CALLBACK_ISR; stCallBackParam2.eIrqType = E_MI_VIF_IRQ_FRAMESTART; stCallBackParam2.pfnCallBackFunc = _mi_vif_framestart2; stCallBackParam2.u64Data = 22; MI_VIF_CallBackTask_Register(u32VifChn,&stCallBackParam2); return 0; } static MS_S32 _mi_vif_testUnRegVifCallback(void) { MI_VIF_CallBackParam_t stCallBackParam1; MI_VIF_CallBackParam_t stCallBackParam2; MI_VIF_CHN u32VifChn = 0; memset(&stCallBackParam1, 0x0, sizeof(MI_VIF_CallBackParam_t)); memset(&stCallBackParam1, 0x0, sizeof(MI_VIF_CallBackParam_t)); stCallBackParam1.eCallBackMode = E_MI_VIF_CALLBACK_ISR; stCallBackParam1.eIrqType = E_MI_VIF_IRQ_FRAMESTART; stCallBackParam1.pfnCallBackFunc = _mi_vif_framestart1; stCallBackParam1.u64Data = 33; MI_VIF_CallBackTask_UnRegister(u32VifChn,&stCallBackParam1); stCallBackParam2.eCallBackMode = E_MI_VIF_CALLBACK_ISR; stCallBackParam2.eIrqType = E_MI_VIF_IRQ_FRAMESTART; stCallBackParam2.pfnCallBackFunc = _mi_vif_framestart2; stCallBackParam2.u64Data = 44; MI_VIF_CallBackTask_UnRegister(u32VifChn,&stCallBackParam2); return 0; }
-
相关主题
2.16. MI_VIF_CallBackTask_UnRegister¶
-
描述
向VIF反注册回调接口。
-
语法
MI_S32 MI_VIF_CallBackTask_UnRegister(MI_VIF_CHN u32VifChn, MI_VIF_CallBackParam_t *pstCallBackParam);
-
参数
参数名称 描述 输入/输出 u32VifChn VIF Chn ID 输入 pstCallBackParam 回调参数 输入 -
返回值
-
MI_OK成功。
-
非MI_OK失败,参照错误码。
-
-
依赖
-
头文件:mi_common.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
该接口目前只支持kernel mode调用
-
-
举例
-
相关主题
3. VIF 数据类型¶
3.1. 数据类型定义¶
表 3‑1:VIF 数据类型
数据类型 | 描述 |
---|---|
MI_VIF_IntfMode_e | 定义视频输入设备的接口模式 |
MI_VIF_WorkMode_e | 定义视频设备的复合工作模式 |
MI_VIF_FrameRate_e | 定义视频设备输出fps和输入fps的关系 |
MI_VIF_DataYuvSeq_e | 定义视频设备接收的 YUV 数据的数据排列顺序 |
MI_VIF_ClkEdge_e | 定义视频设备接收的时钟类型 |
MI_VIF_BitOrder_e | 定义视频设备的data bit翻转顺序 |
MI_VIF_HDRType_e | 定义视频设备HDR 类型 |
MI_VIF_Polar_e | 定义信号极性 |
MI_VIF_DevId_e | 定义视频设备的ID |
MI_VIF_SyncAttr_t | 定义同步信号属性 |
MI_VIF_DevAttr_t | 定义视频输入设备的属性。 |
MI_VIF_ChnPortAttr_t | 定义 VIF 通道属性。 |
MI_VIF_ChnPortStat_t | 定义VIF 通道信息结构体 |
MI_VIF_SNRPad_e | 定义 SensorPad Id |
MI_VIF_Dev2SnrPadMuxCfg_t | 定义VIF 设备和SensorPad 绑定关系 |
MI_VIF_InitParam_t | 定义VIF设备初始化参数 |
MI_VIF_DevStatus_t | 定义VIF设备当前状态 |
MI_VIF_CALLBK_FUNC | 定义回调函数类型 |
MI_VIF_CallBackMode_e | 定义回调模式 |
MI_VIF_IrqType_e | 定义硬件中断类型 |
MI_VIF_CallBackParam_t | 定义回调参数 |
3.2. MI_VIF_IntfMode_e¶
-
说明
定义视频设备的接口模式。
-
定义
typedef enum { E_MI_VIF_MODE_BT656 = 0, E_MI_VIF_MODE_DIGITAL_CAMERA, E_MI_VIF_MODE_BT1120_STANDARD, E_MI_VIF_MODE_BT1120_INTERLEAVED, E_MI_VIF_MODE_MIPI E_MI_VIF_MODE_NUM } MI_VIF_IntfMode_e;
-
成员
成员名称 描述 E_MI_VIF_MODE_BT656 输入数据的协议符合标准 BT.656 协议,端口数据输入模式为亮度色度复合模式,分量模式为单分量。 E_MI_VIF_MODE_DIGITAL_CAMERA 输入数据的协议为 Digital camera 协议,端口数据输入模式为亮度色度复合模式,分量模式为单分量。 E_MI_VIF_MODE_BT1120_STANDARD 输入数据的协议符合标准 BT.1120 协议 (BT.656+双分量),端口数据输入模式为亮度色度分离模式,分量模式为双分量。 E_MI_VIF_MODE_BT1120_INTERLEAVED 输入数据的协议符合 BT.1120 interleave 模式,端口数据输入模式为亮度色度分离模式,分量模式为双分量。 E_MI_VIF_MODE_MIPI 输入数据符合MIPI 协议 -
注意事项
可以通过MI_SNR_GetPadInfo中的eIntfMode 获取当前接口模式。
-
相关数据类型及接口
3.3. MI_VIF_WorkMode_e¶
-
说明
定义视频设备的复合工作模式。
-
定义
typedef enum { /* BT656 multiple ch mode */ E_MI_VIF_WORK_MODE_1MULTIPLEX, E_MI_VIF_WORK_MODE_2MULTIPLEX, E_MI_VIF_WORK_MODE_4MULTIPLEX, /* RGB mode for MIPI/Parallel sensor */ E_MI_VIF_WORK_MODE_RGB_REALTIME, E_MI_VIF_WORK_MODE_RGB_FRAMEMODE, E_MI_VIF_WORK_MODE_MAX } MI_VIF_WorkMode_e;
-
成员
成员名称 | 描述 |
---|---|
E_MI_VIF_WORK_MODE_1MULTIPLEX | 1 路复合工作模式。 |
E_MI_VIF_WORK_MODE_2MULTIPLEX | 2 路复合工作模式,输入数据的协议必须为标准 BT.656 协议。 |
E_MI_VIF_WORK_MODE_4MULTIPLEX | 4 路复合工作模式,输入数据的协议必须为标准 BT.656 协议。 |
E_MI_VIF_WORK_MODE_RGB_REALTIME | RGB Realtime mode for MIPI/Parallel sensor |
E_MI_VIF_WORK_MODE_RGB_FRAMEMODE, | RGB Framemode mode for MIPI/Parallel sensor |
-
注意事项
-
当该项设为 1路或2 路或 4 路复合工作模式时,设备输入的协议必须是 BT.656 协议。
-
当该项设为RGB_REALTIME时 后端只能绑定MI_VPE模块,且MI_VPE也要设置为Realtime mode, 两个模块之间没有Dram buffer,底层硬件直接相连,两个模块不支持分时复用。
-
当该项设置为RGB_FRAME时,VIF向Dram写出buffer,送给后端模块。
-
-
相关数据类型及接口
3.4. MI_VIF_FrameRate_e¶
-
说明
定义视频设备输出fps和输入fps的关系。
-
定义
typedef enum { E_MI_VIF_FRAMERATE_FULL = 0, E_MI_VIF_FRAMERATE_HALF, E_MI_VIF_FRAMERATE_QUARTR, E_MI_VIF_FRAMERATE_OCTANT, E_MI_VIF_FRAMERATE_THREE_QUARTERS, E_MI_VIF_FRAMERATE_NUM, } MI_VIF_FrameRate_e;
-
成员
成员名称 描述 E_MI_VIF_FRAMERATE_FULL 源和目标1:1输出。 E_MI_VIF_FRAMERATE_HALF 源和目标2:1输出。 E_MI_VIF_FRAMERATE_QUARTER 源和目标4:1输出。 E_MI_VIF_FRAMERATE_OCTANT 源和目标8:1输出。 E_MI_VIF_FRAMERATE_THREE_QUARTERS 源和目标4:3输出。 -
注意事项
仅在BT656multiple ch mode 下设置又效
-
相关数据类型及接口
3.5. MI_VIF_DataYuvSeq_e¶
-
说明
定义视频设备接收的 YUV 数据的数据排列顺序。
-
定义
typedef enum { E_MI_VIF_INPUT_DATA_VUVU = 0, E_MI_VIF_INPUT_DATA_UVUV, E_MI_VIF_INPUT_DATA_UYVY = 0, E_MI_VIF_INPUT_DATA_VYUY, E_MI_VIF_INPUT_DATA_YUYV, E_MI_VIF_INPUT_DATA_YVYU, E_MI_VIF_DATA_YUV_NUM } MI_VIF_DataYuvSeq_e;
-
成员
成员名称 描述 E_MI_VIF_INPUT_DATA_VUVU YUV 数据通过分离模式输入时,C 分量的输入排列顺序为 VUVU。 E_MI_VIF_INPUT_DATA_UVUV YUV 数据通过分离模式输入时,C 分量的输入排列顺序为 UVUV。 E_MI_VIF_INPUT_DATA_UYVY YUV 数据通过复合模式输入时,顺序为UYVY。 E_MI_VIF_INPUT_DATA_VYUY YUV 数据通过复合模式输入时,顺序为VYUY。 E_MI_VIF_INPUT_DATA_YUYV YUV 数据通过复合模式输入时,顺序为YUYV。 E_MI_VIF_INPUT_DATA_YVYU YUV 数据通过复合模式输入时,顺序为YVYU。 -
相关数据类型及接口
3.6. MI_VIF_ClkEdge_e¶
-
说明
定义视频设备接收的时钟类型。
-
定义
typedef enum { E_MI_VIF_CLK_EDGE_SINGLE_UP = 0, E_MI_VIF_CLK_EDGE_SINGLE_DOWN, E_MI_VIF_CLK_EDGE_DOUBLE, E_MI_VIF_CLK_EDGE_NUM } MI_VIF_ClkEdge_e;
-
成员
成员名称 描述 E_MI_VIF_CLK_EDGE_SINGLE_UP 时钟单沿模式,且 VIF 设备在上升沿采样。 E_MI_VIF_CLK_EDGE_SINGLE_DOWN 时钟单沿模式,且 VIF 设备在下降沿采样。 E_MI_VIF_CLK_EDGE_DOUBLE 前端送过来双沿数据时,VIF 进行双沿采样。 -
注意事项
无。
-
相关数据类型及接口
3.7. MI_VIF_BitOrder_e¶
-
说明
Vif设备的data bit顺序翻转设定
-
定义
typedef enum { E_MI_VIF_BITORDER_NORMAL = 0, E_MI_VIF_BITORDER_REVERSED } MI_VIF_BitOrder_e;
-
成员
成员名称 描述 E_MI_VIF_BITORDER_NORMAL 正常data bit排序 E_MI_VIF_BITORDER_REVERSED 逆序data bit排序 -
相关数据类型及接口
3.8. MI_VIF_HDRType_e¶
-
说明
定义视频设备HDR 类型。
-
定义
typedef enum { E_MI_VIF_HDR_TYPE_OFF, E_MI_VIF_HDR_TYPE_VC, //virtual channel mode HDR,vc0->long, vc1->short E_MI_VIF_HDR_TYPE_DOL, E_MI_VIF_HDR_TYPE_EMBEDDED, //compressed HDR mode E_MI_VIF_HDR_TYPE_LI, //Line interlace HDR E_MI_VIF_HDR_TYPE_MAX } MI_VIF_HDRType_e;
-
成员
成员名称 描述 E_MI_VIF_HDR_TYPE_OFF 不开HDR E_MI_VIF_HDR_TYPE_VC virtual channel mode HDR,vc0->long, vc1->short E_MI_VIF_HDR_TYPE_DOL Digital Overlap High Dynamic Range E_MI_VIF_HDR_TYPE_EMBEDDED compressed HDR mode E_MI_VIF_HDR_TYPE_LI Line interlace HDR -
注意事项
hdr type和sensor相关, 可以通过MI_SNR_GetPadInfo的eHDRMode获取当前sensor支持的HDR type。
-
相关数据类型及接口
3.9. MI_VIF_Polar_e¶
-
说明
定义视频输入信号有效。
-
定义
typedef enum { E_MI_VIF_PIN_POLAR_POS, E_MI_VIF_PIN_POLAR_NEG } MI_VIF_Polar_e;
-
成员
成员名称 描述 E_MI_VIF_PIN_POLAR_POS 高电平信号有效 E_MI_VIF_PIN_POLAR_NEG 低电平信号有效 -
注意事项
只有parallel sensor 接口可以设置
-
相关数据类型及接口
3.10. MI_VIF_DevId_e¶
-
说明
定义视频设备的ID。
-
定义
typedef enum { E_MI_VIF_DEVICE_ID0 = 0x0001, E_MI_VIF_DEVICE_ID1 = 0x0002, E_MI_VIF_DEVICE_ID2 = 0x0004, E_MI_VIF_DEVICE_ID3 = 0x0008, E_MI_VIF_DEVICE_ID4 = 0x0010, E_MI_VIF_DEVICE_ID5 = 0x0020, E_MI_VIF_DEVICE_ID6 = 0x0040, E_MI_VIF_DEVICE_ID7 = 0x0080, E_MI_VIF_DEVICE_ID8 = 0x0100, E_MI_VIF_DEVICE_ID9 = 0x0200, E_MI_VIF_DEVICE_ID10 = 0x0400, E_MI_VIF_DEVICE_ID11 = 0x0800, E_MI_VIF_DEVICE_ID12 = 0x1000, E_MI_VIF_DEVICE_ID13 = 0x2000, E_MI_VIF_DEVICE_ID14 = 0x4000, E_MI_VIF_DEVICE_ID15 = 0x8000, E_MI_VIF_DEVICE_ID_MAX = 0xffff } MI_VIF_DevId_e;
-
相关数据类型及接口
3.11. MI_VIF_SyncAttr_t¶
-
说明
同步信号属性设置。
-
定义
typedef struct MI_VIF_SyncAttr_s { MI_VIF_Polar_e eVsyncPolarity; MI_VIF_Polar_e eHsyncPolarity; MI_VIF_Polar_e ePclkPolarity; MI_U32 VsyncDelay; MI_U32 HsyncDelay; MI_U32 PclkDelay; } MI_VIF_SyncAttr_t;
-
成员
成员名称 描述 eVsyncPolarity 垂直同步信号有效极性 eHsyncPolarity 水平同步信号有效极性 ePclkPolarity Pixel Clock 有效极性 VsyncDelay 垂直同步信号延时时间 HsyncDelay 水平同步信号延时时间 PclkDelay Pixel Clock 延时时间 以1920x1080分辨率, Pclk/Hsync/Vsync都是高电平有效,波形对应关系如下:
Pclk: pixel clock, 每收到一个pixel,产生一个clock。
Hsync:行同步,有效时收到的信号属于同一行。
Vsync:场同步,有效时收到的信号属于同一张frame。
-
注意事项
只有parallel sensor 接口可以设置
-
相关数据类型及接口
3.12. MI_VIF_DevAttr_t¶
-
说明
定义视频输入设备的属性。
-
定义
typedef struct MI_VIF_DevAttr_s { MI_VIF_IntfMode_e eIntfMode; MI_VIF_WorkMode_e eWorkMode; MI_VIF_HDRType_e eHDRType; MI_VIF_ClkEdge_e eClkEdge; MI_VIF_DataYuvSeq_e eDataSeq; MI_VIF_BitOrder_e eBitOrder; /* adjust bit order layout */ MI_VIF_SyncAttr_t stSyncAttr; MI_U32 u32DevStitchMask; //multi vif dev bitmask by MI_VIF_DevId_e } MI_VIF_DevAttr_t;
-
成员
成员名称 描述 eIntfMode 接口模式。 eWorkMode 工作模式。 eHDRType HDR类型 eClkEdge 时钟边沿模式(上升沿采样、下降沿采样、双沿采样)。 eDataSeq 输入数据顺序 (仅支持 yuv 格式), DC 模式时必须配置,其它模式时无效。 eBitOrder Vif的data线layout是正序还是逆序 stSyncAttr 同步信号属性 u32DevStitchMask 图像融合设备ID -
注意事项
-
u32DevStitchMask = E_MI_VIF_DEVICE_ID0| E_MI_VIF_DEVICE_ID2
-
当设置了该参数时,后端MI_VPE 必须使用MI_VPE_CreateMultiChannelStitch 该API创建通道,详细用法参考MI_VPE api doc中该api的举例。
-
-
相关数据类型及接口
3.13. MI_VIF_ChnPortAttr_t¶
-
说明
定义 VIF 通道Port属性。
-
定义
typedef struct MI_VIF_ChnPortAttr_s{ MI_SYS_WindowRect_t stCapRect; MI_SYS_WindowRect_t stDestSize; MI_SYS_FieldType_e enCapSel; MI_SYS_FrameScanMode_e nScanMode; MI_SYS_PixelFormat_e ePixFormat; MI_VI_FrameRate_e eFrameRate; MI_U32 u32FrameModeLineCount } MI_VIF_ChnPortAttr_t;
-
成员
次Port仅仅支持设置stDestSize,enDstFrameRate,其他属性会被忽略。
成员名称 描述 stCapRect 捕获区域起始坐标(相对于设备图像的大小)与宽高 stDestSize 目标图像大小。必须配置,且大小不应该超出外围 ADC 输出图像的大小范围,否则可能导致VIF 硬件工作异常 eCapSel 帧场选择,只用于隔行模式,建议捕获单场时选择捕获底场。逐行模式时,该项必须设置为 E_MI_SYS_FIELDTYPE_BOTH。 eScanMode 输入扫描模式 (逐行、隔行) ePixFormat 像素存储格式支持,在BT656格式下仅支持E_MI_SYS_PIXEL_FRAME_YUV422_YUYV。 eFrameRate 目标帧率和输入帧率的比值关系。如果不进行帧率控制,则该值设置为0。可以按照1:1,2:1,4:1,8:1,4:3等比例输出,仅在BT656接口中可用。 u32FrameModeLineCount 通知下一级处理的时机,用于E_MI_VIF_WORK_MODE_RGB_FRAMEMODE的时候 -
相关数据类型及接口
3.14. MI_VIF_ChnPortStat_t¶
-
说明
VIF 通道信息结构体。
-
定义
typedef struct MI_VIF_ChnStat_s { MI_BOOL bEnable; /* Whether this channel is enabled */ MI_U32 u32IntCnt; /* The VIFdeo frame interrupt count */ MI_U32 u32FrmRate; /* current frame rate */ MI_U32 u32LostInt; /* The interrupt is received but nobody care */ MI_U32 u32VbFail; /* video buffer malloc failure */ MI_U32 u32PicWidth;/* curren pic width */ MI_U32 u32PicHeight;/* current pic height */ } MI_VIF_ChnPortStat_t;
-
成员
成员名称 描述 bEnable 通道是否使能。 u32IntCnt 中断计数。 u32FrmRate 每 10 秒的平均帧率,该值不一定精确。 u32LostInt 中断丢失计数。 u32VbFail 获取 VB 失败计数。 u32PicWidth 图像宽度。 u32PicHeight 图像高度。 -
注意事项
-
结构体的中断计数,可用于无中断检测。
-
该结构体的帧率是每 10 秒钟的平均帧率,即 VIF 会每隔十秒统计一次平均帧率, 该值并不精确。
-
如果查询到该结构体的中断丢失计数一直在增加,说明 VIF 工作出现异常。
-
3.15. MI_VIF_SNRPad_e¶
-
说明
定义SensorPad Id。
-
定义
typedef enum { E_MI_VIF_SNRPAD_NULL, E_MI_VIF_SNRPADID0, E_MI_VIF_SNRPADID1, E_MI_VIF_SNRPADID2, E_MI_VIF_SNRPADID3, E_MI_VIF_SNRPAD_NUM }MI_VIF_SNRPad_e;
-
成员
成员名称 描述 E_MI_VIF_SNRPAD_NULL 不绑定SensorPad E_MI_VIF_SNRPADID0 对应硬件设备Sensor0 E_MI_VIF_SNRPADID1 对应硬件设备Sensor1 E_MI_VIF_SNRPADID2 对应硬件设备Sensor2 E_MI_VIF_SNRPADID3 对应硬件设备Sensor3 E_MI_VIF_SNRPAD_NUM 超过最大Sensor Num -
注意事项
在默认情况下是VIF Dev0 对应Sensor0, Dev2 对应Sensor1。
参考MI_SENSOR_API1.2章节流程框图。
-
相关数据类型及接口
3.16. MI_VIF_Dev2SnrPadMuxCfg_t¶
-
说明
定义VIF 设备和SensorPad 绑定关系。
-
定义
typedef struct MI_VIF_VIFDev2SnrPadMuxConf_s { MI_VIF_SNRPad_e eSensorPadID; //sensor Pad id MI_U32 u32PlaneID; //For HDR, 1 is short exposure, 0 is long exposure, } MI_VIF_Dev2SnrPadMuxCfg_t;
-
成员
成员名称 描述 eSensorPadID Sensor Pad Id u32PlaneID PlaneId, for HDR 1 长曝,0 短曝, for liner 为0xff. -
注意事项
在默认情况下是VIF Dev0 对应Sensor0, Dev2 对应Sensor1.默认不调用该接口。
-
相关数据类型及接口
3.17. MI_VIF_InitParam_t¶
-
说明
VIF设备初始化参数。
-
定义
typedef struct MI_VIF_InitParam_s { MI_U32 u32DevId; MI_U8 *u8Data; } MI_VIF_InitParam_t;
-
成员
成员名称 描述 u32DevId 设备ID u8Data 数据指针buffer -
相关数据类型及接口
3.18. MI_VIF_DevStatus_t¶
-
说明
VIF Dev当前状态
-
定义
typedef struct MI_VIF_VIFDevStatus_s { MI_VIF_Dev2SnrPadMuxCfg_t stDev2SensrPad; MI_U32 bDevEn; } MI_VIF_DevStatus_t;
-
成员
成员名称 描述 stDev2SensrPad VIF Dev 绑定的SensorPad及PlaneId bDevEn VIF Dev当前使能状态 -
相关数据类型及接口
3.19. MI_VIF_CALLBK_FUNC¶
-
说明
定义回调函数类型
-
定义
typedef MI_S32 (*MI_VIF_CALLBK_FUNC)(MI_U64 u64Data);
-
相关数据类型及接口
3.20. MI_VIF_CallBackMode_e¶
-
说明
定义回调模式。
-
定义
typedef enum { E_MI_VPE_CALLBACK_ISR, E_MI_VPE_CALLBACK_MAX, } MI_VPE_CallBackMode_e;
-
成员
成员名称 描述 E_MI_VPE_CALLBACK_ISR 硬件中断模式回调 E_MI_VPE_CALLBACK_MAX 回调模式最大值 -
注意事项
目前只支持ISR 回调模式。
-
相关数据类型及接口
3.21. MI_VIF_IrqType_e¶
-
说明
定义硬件中断类型
-
定义
typedef enum { E_MI_VIF_IRQ_FRAMESTART, //frame start irq E_MI_VIF_IRQ_FRAMEEND, //frame end irq E_MI_VIF_IRQ_LINEHIT, //frame line hit irq E_MI_VIF_IRQ_MAX, } MI_VIF_IrqType_e;
-
成员
成员名称 描述 E_MI_VIF_IRQ_FRAMESTART VIF Feame start 中断类型 E_MI_VIF_IRQ_FRAMEEND VIF Frame done 中断类型 E_MI_VIF_IRQ_LINEHIT VIF LineCount Hit中断类型 -
注意事项
-
E_MI_VIF_IRQ_FRAMESTART: 每一帧第一个pixel的信号
-
E_MI_VPE_IRQ_ISPFRAMEDONE:每一帧最后一个pixel的信号
-
E_MI_VIF_IRQ_LINEHIT:每一帧指定line到达时的信号
-
-
相关数据类型及接口
3.22. MI_VIF_CallBackParam_t¶
-
说明
定义回调参数
-
定义
typedef struct MI_VIF_CallBackParam_s { MI_VIF_CallBackMode_e eCallBackMode; MI_VIF_IrqType_e eIrqType; MI_VIF_CALLBK_FUNC pfnCallBackFunc; MI_U64 u64Data; } MI_VIF_CallBackParam_t;
-
成员
成员名称 描述 eCallBackMode Callback mode eIrqType Hardware interrupt type pfnCallBackFunc 回调函数 u64Data 回调函数参数 -
相关数据类型及接口
4. 错误码¶
视频输入 API 错误码如下表所示。
表 4‑1:视频输入 API 错误码
错误代码 | 宏定义 | 描述 |
---|---|---|
0xA0062001 | MI_ERR_VIF_INVALID_DEVID | 视频输入设备号无效 |
0xA0062002 | MI_ERR_VIF_INVALID_CHNID | 视频输入通道号无效 |
0xA0062003 | MI_ERR_VIF_INVALID_PARA | 视频输入参数设置无效 |
0xA0062006 | MI_ERR_VIF_INVALID_NULL_PTR | 输入参数空指针错误 |
0xA0062007 | MI_ERR_VIF_FAILED_NOTCONFIG | 视频设备或通道属性未配置 |
0xA0062008 | MI_ERR_VIF_NOT_SUPPORT | 操作不支持 |
0xA0062009 | MI_ERR_VIF_NOT_PERM | 操作不允许 |
0xA006200C | MI_ERR_VIF_NOMEM | 分配内存失败 |
0xA006200E | MI_ERR_VIF_BUF_EMPTY | 视频输入缓存为空 |
0xA006200F | MI_ERR_VIF_BUF_FULL | 视频输入缓存为满 |
0xA0062010 | MI_ERR_VIF_SYS_NOTREADY | 视频输入系统未初始化 |
0xA0062012 | MI_ERR_VIF_BUSY | 视频输入系统忙 |
0xA0062080 | MI_ERR_VIF_INVALID_PORTID | 视频输入端口无效 |
0xA0062081 | MI_ERR_VIF_FAILED_DEVNOTENABLE | 视频输入设备未启用 |
0xA0062082 | MI_ERR_VIF_FAILED_DEVNOTDISABLE | 视频输入设备未禁用 |
0xA0062083 | MI_ERR_VIF_FAILED_PORTNOTENABLE | 视频输入通道未启用 |
0xA0062084 | MI_ERR_VIF_FAILED_PORTNOTDISABLE | 视频输入通道未禁用 |
0xA0062085 | MI_ERR_VIF_CFG_TIMEOUT | 视频配置属性超时 |
0xA0062086 | MI_ERR_VIF_NORM_UNMATCH | 视频ADC VIU不匹配 |
0xA0062087 | MI_ERR_VIF_INVALID_WAYID | 视频通路号无效 |
0xA0062088 | MI_ERR_VIF_INVALID_PHYCHNID | 视频物理通道号无效 |
0xA0062089 | MI_ERR_VIF_FAILED_NOTBIND | 视频通道未绑定 |
0xA006208A | MI_ERR_VIF_FAILED_BINDED | 视频通道已绑定 |