MI VIF API
1. 概述¶
1.1. 模块说明¶
视频输入(VIF)实现启用视频输入设备、视频输入通道、绑定视频输入通道等功能。
1.2. 流程框图¶
图 1 1:Tiramisu框图
注意:
-
16个Dev中总共只有8个Dev可以用。
-
mipi接口4个sensor 分别用到:
linear mode: dev0/dev4/dev8/dev12, hdr frame mode: dev0/1, dev⅘, dev8/9, dev12/13。
hdr reatlime mode: dev0/dev4
-
BT656 接口2个sensor分别用到:sensor pad0/2
-
每个device 都只有一个channel Id0, 通过MI_SYS和后端绑定时只能用channel id0
| PortId | 输入Pixel | 输出Pixel | Crop | scaling | 输出形式 | |--------|---------------|----------|----------|---------------| | 0 | 按照sensor格式输入 | 1. 按照sensor格式输出;
2. 将YUV422格式转成12bit bayer 格式输出。 | 不支持 | 不支持 | 1. Dram 输出。
2. 一个Device支持sensor 格式 realtime 输出到MI_ISP,DeviceId 任意。
3. 一个Device支持YUV422格式realtime 输出到MI_SCL,DeviceId 任意. | | 1 | 只支持YUV422格式输入 | 只支持12bit bayer格式输出 | 支持 | 只支持scaling down, height 有做scaling down 时, width 最大等于960。 | 只支持Dram 输出。 |
1.3. 关键字说明¶
-
Group
群组,一个sensor pad中有可能会混合多种信号,所以一个sensor pad 需要一个group来对应接收。
-
Dev
Group 中处理单独一种信号的设备。
-
Port
Dev 上的输出端口。
2. API 参考¶
2.1. 功能模块API¶
表 2‑1:API参考
API名 | 功能 |
---|---|
MI_VIF_CreateDevGroup | 创建Device 对应的Group |
MI_VIF_CreateDevGroupExt | 创建Group 并且设置一些额外属性 |
MI_VIF_DestroyDevGroup | 销毁Group |
MI_VIF_GetDevGroupAttr | 获取Group 的属性 |
MI_VIF_SetDevAttr | 设置设备属性 |
MI_VIF_GetDevAttr | 获取设备属性 |
MI_VIF_EnableDev | 启用 设备 |
MI_VIF_DisableDev | 禁用设备 |
MI_VIF_GetDevStatus | 获取设备的状态 |
MI_VIF_SetOutputPortAttr | 设置output 端口属性 |
MI_VIF_GetOutputPortAttr | 获取output 端口属性 |
MI_VIF_EnableOutputPort | 启用output 端口Port |
MI_VIF_DisableOutputPort | 禁用output 端口 |
MI_VIF_Query | 查询 VIF 通道的Port中断计数、平均帧率等信息 |
MI_VIF_CallBackTask_Register | 向 VIF 注册回调接口 |
MI_VIF_CallBackTask_UnRegister | 向 VIF 反注册回调接口 |
2.2. MI_VIF_CreateDevGroup¶
-
功能
创建Device 对应的Group
-
语法
MI_S32 MI_VIF_CreateDevGroup(MI_VIF_GROUP GroupId, MI_VIF_GroupAttr_t *pstGroupAttr)
-
形参
参数名称 描述 输入/输出 GroupId Group ID 输入 pstGroupAttr Group属性,静态属性。 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
Group Id 包含Device Id 0 Device0~3 1 Device4~7 2 Device8~11 3 Device12~15 -
举例
#define ST_MAX_VIF_DEV_PERGROUP (4) #define ST_MAX_VIF_OUTPORT_NUM (2)
MI_VIF 初始化流程:
MI_S32 ST_VifModuleInit(MI_VIF_GROUP GroupId) { MI_VIF_DEV vifDev =0; MI_U8 vifDevIdPerGroup = 0; MI_VIF_PORT vifPort = 0; ST_VifGroupAttr_t *pstVifGroupAttr = &gstVifModule.stVifGroupAttr[GroupId]; MI_SNR_PAD_ID_e eSnrPadId = (MI_SNR_PAD_ID_e)pstVifGroupAttr->stBindSensor.eSensorPadID; MI_U32 u32PlaneId = pstVifGroupAttr->stBindSensor.u32PlaneID[0]; MI_SNR_PADInfo_t stPad0Info; MI_SNR_PlaneInfo_t stSnrPlane0Info; memset(&stPad0Info, 0x0, sizeof(MI_SNR_PADInfo_t)); memset(&stSnrPlane0Info, 0x0, sizeof(MI_SNR_PlaneInfo_t)); MI_VIF_GroupAttr_t stGroupAttr; memset(&stGroupAttr, 0x0, sizeof(MI_VIF_GroupAttr_t)); STCHECKRESULT(MI_SNR_GetPadInfo(eSnrPadId, &stPad0Info)); STCHECKRESULT(MI_SNR_GetPlaneInfo(eSnrPadId, u32PlaneId, &stSnrPlane0Info)); stGroupAttr.eIntfMode = E_MI_VIF_MODE_MIPI; stGroupAttr.eWorkMode = E_MI_VIF_WORK_MODE_1MULTIPLEX; stGroupAttr.eHDRType = E_MI_VIF_HDR_TYPE_OFF; if(stGroupAttr.eIntfMode == E_MI_VIF_MODE_BT656) stGroupAttr.eClkEdge = (MI_VIF_ClkEdge_e)stPad0Info.unIntfAttr.stBt656Attr.eClkEdge; else stGroupAttr.eClkEdge = E_MI_VIF_CLK_EDGE_DOUBLE; STCHECKRESULT(MI_VIF_CreateDevGroup(GroupId, &stGroupAttr)); for(vifDevIdPerGroup=0; vifDevIdPerGroup< ST_MAX_VIF_DEV_PERGROUP; vifDevIdPerGroup++) { ST_VifDevAttr_t *pstVifDevAttr = &pstVifGroupAttr->stVifDevAttr[vifDevIdPerGroup]; MI_VIF_DevAttr_t stVifDevAttr; memset(&stVifDevAttr, 0x0, sizeof(MI_VIF_DevAttr_t)); vifDev = GroupId*ST_MAX_VIF_DEV_PERGROUP+vifDevIdPerGroup; stVifDevAttr.stInputRect.u16X = stSnrPlane0Info.stCapRect.u16X; stVifDevAttr.stInputRect.u16Y = stSnrPlane0Info.stCapRect.u16Y; stVifDevAttr.stInputRect.u16Width = stSnrPlane0Info.stCapRect.u16Width; stVifDevAttr.stInputRect.u16Height = stSnrPlane0Info.stCapRect.u16Height; if(stSnrPlane0Info.eBayerId >= E_MI_SYS_PIXEL_BAYERID_MAX) { stVifDevAttr.eInputPixel = stSnrPlane0Info.ePixel; } else stVifDevAttr.eInputPixel = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(stSnrPlane0Info.ePixPrecision, stSnrPlane0Info.eBayerId); printf("setchnportattr (%d,%d,%d,%d) \n", stVifDevAttr.stInputRect.u16X, stVifDevAttr.stInputRect.u16Y, stVifDevAttr.stInputRect.u16Width, stVifDevAttr.stInputRect.u16Height); STCHECKRESULT(MI_VIF_SetDevAttr(vifDev, &stVifDevAttr)); STCHECKRESULT(MI_VIF_EnableDev(vifDev)); for(vifPort=0; vifPort< ST_MAX_VIF_OUTPORT_NUM; vifPort++) { ST_VifPortAttr_t *pstVifPortAttr = &pstVifDevAttr->stVifOutPortAttr[vifPort]; MI_VIF_OutputPortAttr_t stVifPortInfo; memset(&stVifPortInfo, 0, sizeof(MI_VIF_OutputPortAttr_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 = stSnrPlane0Info.stCapRect.u16Width; stVifPortInfo.stDestSize.u16Height = stSnrPlane0Info.stCapRect.u16Height; printf("sensor bayerid %d, bit mode %d \n", stSnrPlane0Info.eBayerId, stSnrPlane0Info.ePixPrecision); if(stSnrPlane0Info.eBayerId >= E_MI_SYS_PIXEL_BAYERID_MAX) { stVifPortInfo.ePixFormat = stSnrPlane0Info.ePixel; } else stVifPortInfo.ePixFormat = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(stSnrPlane0Info.ePixPrecision, stSnrPlane0Info.eBayerId); stVifPortInfo.eFrameRate = E_MI_VIF_FRAMERATE_FULL; STCHECKRESULT(MI_VIF_SetOutputPortAttr(vifDev, vifPort, &stVifPortInfo)); STCHECKRESULT(MI_VIF_EnableOutputPort(vifDev, vifPort)); } } return MI_SUCCESS; }
MI_VIF 去初始化流程:
MI_S32 ST_VifModuleUnInit(MI_VIF_GROUP GroupId) { MI_VIF_DEV vifDev = 0; MI_U32 vifDevIdPerGroup =0; MI_VIF_PORT vifPort=0; ST_VifGroupAttr_t *pstVifGroupAttr = &gstVifModule.stVifGroupAttr[GroupId]; for(vifDevIdPerGroup=0; vifDevIdPerGroup< ST_MAX_VIF_DEV_PERGROUP; vifDevIdPerGroup++) { ST_VifDevAttr_t *pstDevAttr = &pstVifGroupAttr->stVifDevAttr[vifDevIdPerGroup]; vifDev = GroupId*ST_MAX_VIF_DEV_PERGROUP+vifDevIdPerGroup; for(vifPort=0; vifPort< ST_MAX_VIF_OUTPORT_NUM; vifPort++) { ST_VifPortAttr_t *pstVifOutputPortAttr = &pstDevAttr->stVifOutPortAttr[vifPort]; STCHECKRESULT(MI_VIF_DisableOutputPort(vifDev, vifPort)); } STCHECKRESULT(MI_VIF_DisableDev(vifDev)); } STCHECKRESULT(MI_VIF_DestroyDevGroup(GroupId)); return MI_SUCCESS; }
-
相关主题
2.3. MI_VIF_CreateDevGroupExt¶
-
功能
创建Group 并且设置一些额外属性。
-
语法
MI_S32 MI_VIF_CreateDevGroupExt(MI_VIF_GROUP GroupId, MI_VIF_GroupAttr_t *pstGroupAttr, MI_VIF_GroupExtAttr_t *pstGroupOptionExtAttr)
-
形参
参数名称 描述 输入/输出 GroupId Group ID 输入 pstGroupAttr Group 常规属性,静态属性 输入 pstGroupOptionExtAttr Group 额外属性 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
VIF Group 和sensor Pad, Device和PlaneId 有默认的对应关系, 如果需要改变这个关系, 可以通过这个api 设置Group 接收对应Sensor Pad信号, Device 接收对应Plane信号。
在调用 MI_SNR_SetPlaneMode 后VIF Group 和sensor Pad, Device和PlaneId对应关系会重置到默认情况,所以应在 MI_SNR_SetPlaneMode 后调用MI_VIF_CreateDevGroupExt 。
Tiramisu系列芯片不支持改Group 和sensor pad的对应关系。
-
相关主题
2.4. MI_VIF_DestroyDevGroup¶
-
功能
销毁设备对应的Group。
-
语法
MI_S32 MI_VIF_DestroyDevGroup(MI_VIF_GROUP GroupId)
-
形参
参数名称 描述 输入/输出 GroupId Group ID 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
需要先使用MI_VIF_DisableOutputPort 禁用掉device 上所有输出端口,再使用MI_VIF_DisableDev 禁用掉group 上所有device。
-
举例
请参见MI_VIF_CreateDevGroup的举例。
-
相关主题
2.5. MI_VIF_GetDevGroupAttr¶
-
功能
获取Group 的属性。
-
语法
MI_S32 MI_VIF_GetDevGroupAttr(MI_VIF_GROUP GroupId, MI_VIF_GroupAttr_t *pstGroupAttr)
-
形参
参数名称 描述 输入/输出 GroupId Group ID 输入 pstGroupAttr Group属性 输出 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
相关主题
2.6. MI_VIF_SetDevAttr¶
-
功能
设置 VIF 设备属性。
-
语法
MI_S32 MI_VIF_SetDevAttr(MI_VIF_DEV DevId, MI_VIF_DevAttr_t *pstDevAttr)
-
形参
参数名称 描述 输入/输出 DevId VIF 设备号。 输入 pstDevAttr VIF 设备属性指针,静态属性。 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
在调用前要保证 VIF 设备处于禁用状态。如果 VIF 设备已处于使能状态,可以使用MI_VIF_DisableDev 来禁用设备。
-
参数 pstDevAttr 主要用来配置指定 VIF 设备的视频输入格式。
-
-
举例
请参见MI_VIF_CreateDevGroup的举例。
-
相关主题
2.7. MI_VIF_GetDevAttr¶
-
功能
获取 VIF 设备属性。
-
语法
MI_S32 MI_VIF_GetDevAttr(MI_VIF_DEV DevId, MI_VIF_DevAttr_t *pstDevAttr)
-
形参
参数名称 描述 输入/输出 DevId VIF 设备号。 输入 pstDevAttr VIF 设备属性指针。 输出 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
相关主题
2.8. MI_VIF_EnableDev¶
-
功能
启用 VIF 设备。
-
语法
MI_S32 MI_VIF_EnableDev(MI_VIF_DEV DevId);
-
形参
参数名称 描述 输入/输出 DevId VIF 设备号。 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
启用前必须已经设置设备属性,否则返回失败。
-
可重复启用,不返回失败。
-
-
举例
请参见MI_VIF_CreateDevGroup的举例。
-
相关主题
2.9. MI_VIF_DisableDev¶
-
功能
禁用 VIF 设备。
-
语法
MI_S32 MI_VIF_DisableDev(MI_VIF_DEV DevId);
-
形参
参数名称 描述 输入/输出 DevId VIF 设备号。 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
必须先禁用所有设备上的输出端口后,才能禁用 VIF 设备。
-
可重复禁用,不返回失败。
-
-
举例
请参见MI_VIF_CreateDevGroup的举例。
-
相关主题
2.10. MI_VIF_GetDevStatus¶
-
功能
获取设备的状态。
-
语法
MI_S32 MI_VIF_GetDevStatus(MI_VIF_DEV DevId, MI_VIF_DevStatus_t *pstVifDevStatus)
-
形参
参数名称 描述 输入/输出 DevId VIF 设备号 输入 pstVifDevStatus 设备状态 输出 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
2.11. MI_VIF_SetOutputPortAttr¶
-
功能
设置 VIF 输出端口属性。
-
语法
MI_S32 MI_VIF_SetOutputPortAttr(MI_VIF_DEV DevId, MI_VIF_PORT PortId, MI_VIF_OutputPortAttr_t *pstAttr);
-
形参
参数名称 描述 输入/输出 DevId VIF 通道号。 输入 PortId Port号 输入 pstAttr VIF 通道Port属性指针。 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
默认情况下,使用 MI_VIF_SetOutputPortAttr 接口的目的是设置端口属性,如CapSize、DestSize、FrameRate等等。
-
Tiramisu 系列芯片:port0不支持crop和scaling, 所以cap 和dest size 必须和MI_VIF_SetDevAttr时的input size 相等;port1 的输入只支持YUV格式, 所以只有YUVsensor 才可以使用port1, 支持crop, 和scaling down, 输出只支持12bit bayer格式。
-
Port1 height 有做scaling down 时, 输出width 最大等于960。
-
-
举例
请参见MI_VIF_CreateDevGroup的举例。
-
相关主题
2.12. MI_VIF_GetOutputPortAttr¶
-
功能
获取 VIF 输出端口属性。
-
语法
MI_S32 MI_VIF_GetOutputPortAttr(MI_VIF_DEV DevId, MI_VIF_PORT PortId, MI_VIF_OutputPortAttr_t *pstAttr)
-
形参
参数名称 描述 输入/输出 DevId VIF 通道号。 输入 PortId Port号。 输入 pstAttr VIF 通道Port属性指针。 输出 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
相关主题
2.13. MI_VIF_EnableOutputPort¶
-
功能
启用 VIF输出端口。
-
语法
MI_S32 MI_VIF_EnableOutputPort(MI_VIF_DEV DevId, MI_VIF_PORT PortId)
-
形参
参数名称 描述 输入/输出 DevId VIF 设备号 输入 PortId Port号 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
必须先设置通道属性,且通道所绑定的 VIF 设备必须使能。
-
可重复启用 VIF 通道,不返回失败。
-
-
举例
请参见 MI_VIF_SetDevAttr 的举例。
-
相关主题
2.14. MI_VIF_DisableOutputPort¶
-
功能
禁用 VIF 输出端口。
-
语法
MI_S32 MI_VIF_DisableOutputPort(MI_VIF_DEV DevId, MI_VIF_PORT PortId)
-
形参
参数名称 描述 输入/输出 DevId VIF 通道号。 输入 PortId Port号 输入 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
禁用 VIF 通道Port后,此 VIF 通道Port即停止采集视频输入数据,如果已经绑定后端,则后端不会再接收到视频图像。
-
可重复禁用 VIF 通道Port,不返回失败。
-
-
举例
请参见MI_VIF_CreateDevGroup的举例。
-
相关主题
2.15. MI_VIF_Query¶
-
功能
查询 VIF 通道的中断计数、平均帧率等信息。
-
语法
MI_S32 MI_VIF_Query(MI_VIF_DEV DevId, MI_VIF_PORT PortId, MI_VIF_DevPortStat_t *pstStat)
-
形参
参数名称 描述 输入/输出 DevId VIF 通道号。 输入 PortId Port口 输入 pstStat 通道信息结构体指针。 输出 -
返回值
-
MI_OK 成功。
-
非0 失败,详情参照错误码。
-
-
依赖
-
头文件:mi_vif_datatype.h、mi_vif.h
-
库文件:libmi_vif.a
-
-
注意
-
该接口可查询中断计数、通道使能状态、平均帧率、中断丢失数、获取 VB 失败次数、图像宽高等信息。
-
通过该接口获取到的帧率是每 1 秒钟的平均帧率,即 VIF 会每隔一秒统计一次平均帧率,该值并不精确,会有些波动。
-
用户可通过该接口查询中断丢失数,如果该数值一直在增加,说明 VIF 工作出现异常。
-
2.16. MI_VIF_CallBackTask_Register¶
-
描述
向VIF注册回调接口。
-
语法
MI_S32 MI_VIF_CallBackTask_Register(MI_VIF_DEV DevId, MI_VIF_CallBackParam_t *pstCallBackParam);
-
参数
参数名称 描述 输入/输出 DevId 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_DEV u32DevId = 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(u32DevId,&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(u32DevId,&stCallBackParam2); return 0; } static MS_S32 _mi_vif_testUnRegVifCallback(void) { MI_VIF_CallBackParam_t stCallBackParam1; MI_VIF_CallBackParam_t stCallBackParam2; MI_VIF_DEV u32DevId = 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(u32DevId,&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(u32DevId,&stCallBackParam2); return 0; }
-
相关主题
2.17. MI_VIF_CallBackTask_UnRegister¶
-
描述
向VIF反注册回调接口。
-
语法
MI_S32 MI_VIF_CallBackTask_UnRegister(MI_VIF_DEV DevId, MI_VIF_CallBackParam_t *pstCallBackParam);
-
参数
参数名称 描述 输入/输出 DevId 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_GROUP | 定义设备群组Id |
MI_VIF_IntfMode_e | 定义视频输入设备的接口模式 |
MI_VIF_WorkMode_e | 定义视频设备的复合工作模式 |
MI_VIF_FrameRate_e | 定义视频设备输出fps和输入fps的关系 |
MI_VIF_ClkEdge_e | 定义视频设备接收的时钟类型 |
MI_VIF_HDRType_e | 定义视频设备HDR 类型 |
MI_VIF_MclkSource_e | 定义给Sensor 输入驱动clk 类型 |
MI_VIF_GroupIdMask_e | 定义设备群组mask |
MI_VIF_SNRPad_e | 定义 SensorPad Id |
MI_VIF_GroupAttr_t | 定义设备群组属性 |
MI_VIF_GroupExtAttr_t | 定义设备群组额外属性 |
MI_VIF_DevAttr_t | 定义视频输入设备的属性。 |
MI_VIF_OutputPortAttr_t | 定义VIF 输出端口属性。 |
MI_VIF_DevPortStat_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_GROUP¶
-
说明
定义设备群组ID。
-
定义
typedef MI_U32 MI_VIF_GROUP;
-
相关数据类型及接口
3.3. 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.4. 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, E_MI_VIF_WORK_MODE_MAX } MI_VIF_WorkMode_e;
-
成员
成员名称 描述 E_MI_VIF_WORK_MODE_1MULTIPLEX 1 路复合工作模式。 E_MI_VIF_WORK_MODE_2MULTIPLEX 2 路复合工作模式。 E_MI_VIF_WORK_MODE_4MULTIPLEX 4 路复合工作模式。 -
注意事项
例如E_MI_VIF_WORK_MODE_4MULTIPLEX, 代表Group 对应的Sensor Pad中有4路混合视频信号, 如果SensorPad 中混合信号数量, 和Group 的复合工作模式不匹配,Group 会采集信号异常。
-
相关数据类型及接口
3.5. 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输出。 -
注意事项
该功能为预留功能,暂不支持,如果需要控制帧率输出,可以通过MI_SYS_BindChnPort2 来设置。
-
相关数据类型及接口
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_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。
实现HDR功能需要MI_VIF 和MI_ISP 模块设置相同的HDR类型。
-
相关数据类型及接口
3.8. MI_VIF_MclkSource_e¶
-
说明
设置Senor时钟驱动。
-
定义
typedef enum { E_MI_VIF_MCLK_12MHZ, E_MI_VIF_MCLK_18MHZ, E_MI_VIF_MCLK_27MHZ, E_MI_VIF_MCLK_36MHZ, E_MI_VIF_MCLK_54MHZ, E_MI_VIF_MCLK_108MHZ, E_MI_VIF_MCLK_MAX }MI_VIF_MclkSource_e;
-
成员
成员名称 描述 E_MI_VIF_MCLK_12MHZ 12M clk 类型 E_MI_VIF_MCLK_18MHZ 18M clk 类型 E_MI_VIF_MCLK_27MHZ 27M clk 类型 E_MI_VIF_MCLK_36MHZ 36M clk 类型 E_MI_VIF_MCLK_54MHZ 54M clk 类型 E_MI_VIF_MCLK_108MHZ 108M clk 类型 -
注意事项
-
有sensor driver的情况下, 优先从sensor driver中设置mclk。
-
如果没有sensor driver 并且需要主控芯片输出mclk 才通过该参数设置。
-
-
相关数据类型及接口
3.9. MI_VIF_GroupIdMask_e¶
-
说明
设备群组mask。
-
定义
typedef enum { E_MI_VIF_GROUPMASK_ID0 = 0x0001, E_MI_VIF_GROUPMASK_ID1 = 0x0002, E_MI_VIF_GROUPMASK_ID2 = 0x0004, E_MI_VIF_GROUPMASK_ID3 = 0x0008, E_MI_VIF_GROUPMASK_ID_MAX = 0xffff } MI_VIF_GroupIdMask_e;
-
注意事项
在多sensor 拼接场景中, 需要两个sensor 图像同步输出, 此时只需要创建一个group, 将这两个group id mask 在一起即可。
-
相关数据类型及接口
3.10. MI_VIF_SNRPad_e¶
-
说明
定义SensorPad Id。
-
定义
typedef enum { E_MI_VIF_SNRPAD_ID_0 = 0, E_MI_VIF_SNRPAD_ID_1 = 1, E_MI_VIF_SNRPAD_ID_2 = 2, E_MI_VIF_SNRPAD_ID_3 = 3, E_MI_VIF_SNRPAD_ID_MAX, E_MI_VIF_SNRPAD_ID_NA = 0xFF, }MI_VIF_SNRPad_e;
-
成员
成员名称 描述 E_MI_VIF_SNRPAD_ID_0 对应硬件设备Sensor0 E_MI_VIF_SNRPAD_ID_1 对应硬件设备Sensor1 E_MI_VIF_SNRPAD_ID_2 对应硬件设备Sensor2 E_MI_VIF_SNRPAD_ID_3 对应硬件设备Sensor3 E_MI_VIF_SNRPAD_ID_MAX 超过最大Sensor Num E_MI_VIF_SNRPAD_ID_NA 无效sensor id -
注意事项
在默认情况下是VIF Group0 对应Sensor0, Group2 对应Sensor1。
参考MI_SENSOR_API1.2章节流程框图。
-
相关数据类型及接口
3.11. MI_VIF_GroupAttr_t¶
-
说明
定义Group群组属性。
-
定义
typedef struct MI_VIF_GroupAttr_s { MI_VIF_IntfMode_e eIntfMode; MI_VIF_WorkMode_e eWorkMode; MI_VIF_HDRType_e eHDRType; MI_VIF_ClkEdge_e eClkEdge; //BT656 MI_VIF_MclkSource_e eMclk; MI_SYS_FrameScanMode_e eScanMode; MI_U32 u32GroupStitchMask; //multi vif dev bitmask by MI_VIF_GroupIdMask_e } MI_VIF_GroupAttr_t;
-
成员
成员名称 描述 MI_VIF_IntfMode_e 接口模式。 MI_VIF_WorkMode_e 工作模式。 MI_VIF_HDRType_e HDR类型 MI_VIF_ClkEdge_e 时钟边沿模式(上升沿采样、下降沿采样、双沿采样)。 MI_VIF_MclkSource_e 输出给sensor的时钟类型 MI_SYS_FrameScanMode_e 输入扫描模式 (逐行、隔行) u32GroupStitchMask 多个GroupId缝合输出, 由MI_VIF_GroupIdMask_e bitmask 组成。 -
注意事项
Tiramisu系列芯片eScanMode只支持 E_MI_SYS_FRAME_SCAN_MODE_PROGRESSIVE。
-
相关数据类型及接口
3.12. MI_VIF_GroupExtAttr_t¶
-
说明
定义SensorPad Id。
-
定义
typedef struct MI_VIF_GroupExtAttr_s { MI_VIF_SNRPad_e eSensorPadID; //sensor Pad id MI_U32 u32PlaneID[MI_VIF_MAX_GROUP_DEV_CNT]; //For HDR,0 is short exposure, 1 is long exposure } MI_VIF_GroupExtAttr_t;
-
成员
成员名称 描述 eSensorPadID 硬件设备Sensor号 u32PlaneID PlaneId, for HDR 1 长曝,0 短曝, for liner 为0xff. -
注意事项
默认情况下按照1.2 章节框架图 sensor Pad 和Vif Group之间的映射。
-
相关数据类型及接口
3.13. MI_VIF_DevAttr_t¶
-
说明
定义视频输入设备的属性。
-
定义
typedef struct MI_VIF_DevAttr_s { MI_SYS_PixelFormat_e eInputPixel; MI_SYS_WindowRect_t stInputRect; MI_SYS_FieldType_e eField; MI_BOOL bEnH2T1PMode; } MI_VIF_DevAttr_t;
-
成员
成员名称 描述 eInputPixel 设备输入像素格式。 stInputRect 设备采集输入范围。 eField 帧场选择,只用于隔行模式,建议捕获单场时选择捕获底场。逐行模式时,该项必须设置为 E_MI_SYS_FIELDTYPE_NONE。 bEnH2T1PMode 使能采集水平方向缩小一半功能。 -
注意事项
-
如果设备是bayer格式, pixel format设置形式如下:
stVifDevAttr.eInputPixel = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(stSnrPlane0Info.ePixPrecision, stSnrPlane0Info.eBayerId);
-
bEnH2T1Pmode 参数只有输入是YUV格式时 才可以使用, 非YUV格式使用会返回err。
-
-
相关数据类型及接口
3.14. MI_VIF_OutputPortAttr_t¶
-
说明
定义 VIF 通道Port属性。
-
定义
typedef struct MI_VIF_OutputPortAttr_s { MI_SYS_WindowRect_t stCapRect; MI_SYS_WindowSize_t stDestSize; MI_SYS_PixelFormat_e ePixFormat; MI_VIF_FrameRate_e eFrameRate; } MI_VIF_OutputPortAttr_t;
-
成员
成员名称 描述 stCapRect 捕获区域起始坐标(相对于设备图像的大小)与宽高 stDestSize 目标图像大小。必须配置,且大小不应该超出外围 ADC 输出图像的大小范围,否则可能导致VIF 硬件工作异常 ePixFormat 像素存储格式支持,在BT656格式下仅支持YUV422。 eFrameRate 目标帧率和输入帧率的比值关系。如果不进行帧率控制,则该值设置为0。可以按照1:1,2:1,4:1,8:1,4:3等比例输出,仅在BT656接口中可用。 -
相关数据类型及接口
3.15. MI_VIF_DevPortStat_t¶
-
说明
VIF 通道信息结构体。
-
定义
typedef struct MI_VIF_DevPortStat_s { MI_BOOL bEnable; MI_U32 u32IntCnt; MI_U32 u32FrameRate; MI_U32 u32LostInt; MI_U32 u32VbFail; MI_U32 u32PicWidth; MI_U32 u32PicHeight; } MI_VIF_DevPortStat_t;
-
成员
成员名称 描述 bEnable 通道是否使能。 u32IntCnt 中断计数。 u32FrameRate 每 10 秒的平均帧率,该值不一定精确。 u32LostInt 中断丢失计数。 u32VbFail 获取 VB 失败计数。 u32PicWidth 图像宽度。 u32PicHeight 图像高度。 -
注意事项
-
结构体的中断计数,可用于无中断检测。
-
该结构体的帧率是每 10 秒钟的平均帧率,即 VIF 会每隔十秒统计一次平均帧率, 该值并不精确。
-
如果查询到该结构体的中断丢失计数一直在增加,说明 VIF 工作出现异常。
-
-
相关数据类型及接口
3.16. MI_VIF_DevStatus_t¶
-
说明
VIF Dev当前状态
-
定义
typedef struct MI_VIF_VIFDevStatus_s { MI_VIF_GROUP GroupId; MI_BOOL bGroupCreated; MI_U32 bDevEn; MI_VIF_SNRPad_e eSensorPadID; MI_U32 u32PlaneID; } MI_VIF_DevStatus_t;
-
成员
成员名称 描述 GroupId Device 所属Group number bGroupCreated Group 当前Create 状态 bDevEn VIF Dev 当前使能状态 eSensorPadID VIF Dev 绑定的SensorPad u32PlaneID VIF Dev 绑定的PlaneId -
相关数据类型及接口
3.17. MI_VIF_CALLBK_FUNC¶
-
说明
定义回调函数类型
-
定义
typedef MI_S32 (*MI_VIF_CALLBK_FUNC)(MI_U64 u64Data);
-
相关数据类型及接口
3.18. 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.19. 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.20. 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 | 视频通道已绑定 |