MI VIF API


1. 概述


1.1. 模块说明

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


1.2. 流程框图

1.2.1. Tiramisu框图

注意:

  • 16个Dev中总共只有8个Dev可以用。

  • mipi接口4个sensor 分别用到:

    linear mode: dev0/dev4/dev8/dev12

    hdr frame mode: dev0/dev1, dev4/dev5, dev8/dev9, dev12/dev13

    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 参考


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.1. 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_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 注意

    • Tiramisu 系列芯片:MI VIF跟后端模块同时存在Realtime 和FrameMode连接时,例如ISP Bayer Realitme,SCL Dev2 YUV Realitme同时其他Dev有Frame mode连接,优先Create Realtime连接的DevGroup 并Bind后端模块。

    • 在Create DevGroup之前一定要确保 sensor 出流,即如果使用我们的MI sensor,需要确保MI_SNR_Enable,如果使用user sensor需要确保user自己的sensor已经完成初始化。

    • Group Id 包含Device Id
      0 Device0~3
      1 Device4~7
      2 Device8~11
      3 Device12~15
      4 Device16~19
      5 Device20~23
      6 Device24~27
      7 Device28~31
  • 举例

    #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_VIF_PORT vifPort = 0;
        MI_SNR_PADID SnrPadId = 0;
        MI_U32 u32PlaneId = 0;
        MI_U16 vifDevIdPerGroup=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(SnrPadId, &stPad0Info));
        STCHECKRESULT(MI_SNR_GetPlaneInfo(SnrPadId, 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++)
        {
            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++)
            {
                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_VIF_PORT vifPort=0;
        MI_U16 vifDevIdPerGroup=0;
        for(vifDevIdPerGroup=0; vifDevIdPerGroup< ST_MAX_VIF_DEV_PERGROUP; vifDevIdPerGroup++)
        {
            vifDev = groupId*ST_MAX_VIF_DEV_PERGROUP+vifDevIdPerGroup;
    
            for(vifPort=0; vifPort< ST_MAX_VIF_OUTPORT_NUM; vifPort++)
            {
                STCHECKRESULT(MI_VIF_DisableOutputPort(vifDev, vifPort));
            }
            STCHECKRESULT(MI_VIF_DisableDev(vifDev));
        }
    
        STCHECKRESULT(MI_VIF_DestroyDevGroup(groupId));
    
        return MI_SUCCESS;
    }
    
  • 相关主题

    MI_VIF_DestroyDevGroup


2.2. 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_SUCCESS(0):成功。

    • 非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的对应关系。

  • 相关主题

    MI_VIF_DestroyDevGroup


2.3. MI_VIF_DestroyDevGroup

  • 功能

    销毁设备对应的Group。

  • 语法

    MI_S32 MI_VIF_DestroyDevGroup(MI_VIF_GROUP GroupId)
    
  • 形参

    参数名称 描述 输入/输出
    GroupId Group ID 输入
  • 返回值

    • MI_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 注意

    需要先使用MI_VIF_DisableOutputPort 禁用掉device 上所有输出端口,再使用MI_VIF_DisableDev 禁用掉group 上所有device。

  • 举例

    请参见MI_VIF_CreateDevGroup的举例。

  • 相关主题

    MI_VIF_CreateDevGroup


2.4. MI_VIF_GetDevGroupAttr

  • 功能

    获取Group 的属性。

  • 语法

    MI_S32 MI_VIF_GetDevGroupAttr(MI_VIF_GROUP GroupId, MI_VIF_GroupAttr_t *pstGroupAttr)
    
  • 形参

    参数名称 描述 输入/输出
    GroupId Group ID 输入
    pstGroupAttr Group属性 输出
  • 返回值

    • MI_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 相关主题

    MI_VIF_CreateDevGroup


2.5. MI_VIF_SetDevAttr

  • 功能

    设置 VIF 设备属性。

  • 语法

    MI_S32 MI_VIF_SetDevAttr(MI_VIF_DEV DevId, MI_VIF_DevAttr_t *pstDevAttr)
    
  • 形参

    参数名称 描述 输入/输出
    DevId VIF 设备号。 输入
    pstDevAttr VIF 设备属性指针,静态属性。 输入
  • 返回值

    • MI_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 注意

    • 在调用前要保证 VIF 设备处于禁用状态。如果 VIF 设备已处于使能状态,可以使用MI_VIF_DisableDev 来禁用设备。

    • 参数 pstDevAttr 主要用来配置指定 VIF 设备的视频输入格式。

    • eInputPixel只支持YUV422_YUYV/YVYU/UYVY/VYUY 和 bayer格式,具体请参考章节1.2,根据chip规格设置。

  • 举例

    请参见MI_VIF_CreateDevGroup的举例。

  • 相关主题

    MI_VIF_GetDevAttr


2.6. MI_VIF_GetDevAttr

  • 功能

    获取 VIF 设备属性。

  • 语法

    MI_S32 MI_VIF_GetDevAttr(MI_VIF_DEV DevId, MI_VIF_DevAttr_t *pstDevAttr)
    
  • 形参

    参数名称 描述 输入/输出
    DevId VIF 设备号。 输入
    pstDevAttr VIF 设备属性指针。 输出
  • 返回值

    • MI_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 相关主题

    MI_VIF_SetDevAttr


2.7. MI_VIF_EnableDev

  • 功能

    启用 VIF 设备。

  • 语法

    MI_S32 MI_VIF_EnableDev(MI_VIF_DEV DevId);
    
  • 形参

    参数名称 描述 输入/输出
    DevId VIF 设备号。 输入
  • 返回值

    • MI_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 注意

    • 启用前必须已经设置设备属性,否则返回失败。

    • 可重复启用,不返回失败。

  • 举例

    请参见MI_VIF_CreateDevGroup的举例。

  • 相关主题

    MI_VIF_DisableDev


2.8. MI_VIF_DisableDev

  • 功能

    禁用 VIF 设备。

  • 语法

    MI_S32 MI_VIF_DisableDev(MI_VIF_DEV DevId);
    
  • 形参

    参数名称 描述 输入/输出
    DevId VIF 设备号。 输入
  • 返回值

    • MI_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 注意

    • 必须先禁用所有设备上的输出端口后,才能禁用 VIF 设备。

    • 可重复禁用,不返回失败。

  • 举例

    请参见MI_VIF_CreateDevGroup的举例。

  • 相关主题

    MI_VIF_EnableDev


2.9. MI_VIF_GetDevStatus

  • 功能

    获取设备的状态。

  • 语法

    MI_S32 MI_VIF_GetDevStatus(MI_VIF_DEV DevId, MI_VIF_DevStatus_t *pstVifDevStatus)
    
  • 形参

    参数名称 描述 输入/输出
    DevId VIF 设备号 输入
    pstVifDevStatus 设备状态 输出
  • 返回值

    • MI_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a


2.10. 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_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 注意

    • 默认情况下,使用 MI_VIF_SetOutputPortAttr 接口的目的是设置端口属性,如CapSize、DestSize、FrameRate等等。

    • Port0不支持crop和scaling, 所以cap和dest size 必须和MI_VIF_SetDevAttr时的input size 相等。

    • Tiramisu 系列芯片支持port1,port1输入只支持YUV格式, 所以只有YUVsensor 才可以使用port1, 支持crop, 和scaling down, 输出只支持12bit bayer格式。

    • Tiramisu 系列芯片支持port1,Port1 height 有做scaling down 时, 输出width 最大等于960。

    • Tiramisu系列芯片:不支持eFrameRate 设置。

    • Tiramisu系列芯片:port0支持输出12bit bayer格式,可以送进MI_ISP 做3DNR。

  • 举例

    请参见MI_VIF_CreateDevGroup的举例。

  • 相关主题

    MI_VIF_GetOutputPortAttr


2.11. 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_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 相关主题

    MI_VIF_SetOutputPortAttr


2.12. MI_VIF_EnableOutputPort

  • 功能

    启用 VIF输出端口。

  • 语法

    MI_S32 MI_VIF_EnableOutputPort(MI_VIF_DEV DevId, MI_VIF_PORT PortId)
    
  • 形参

    参数名称 描述 输入/输出
    DevId VIF 设备号 输入
    PortId Port号 输入
  • 返回值

    • MI_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 注意

    • 必须先设置通道属性,且通道所绑定的 VIF 设备必须使能。

    • 可重复启用 VIF 通道,不返回失败。

  • 举例

    请参见 MI_VIF_SetDevAttr 的举例。

  • 相关主题

    MI_VIF_DisableOutputPort


2.13. MI_VIF_DisableOutputPort

  • 功能

    禁用 VIF 输出端口。

  • 语法

    MI_S32 MI_VIF_DisableOutputPort(MI_VIF_DEV DevId, MI_VIF_PORT PortId)
    
  • 形参

    参数名称 描述 输入/输出
    DevId VIF 通道号。 输入
    PortId Port号 输入
  • 返回值

    • MI_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 注意

    • 禁用 VIF 通道Port后,此 VIF 通道Port即停止采集视频输入数据,如果已经绑定后端,则后端不会再接收到视频图像。

    • 可重复禁用 VIF 通道Port,不返回失败。

  • 举例

    请参见MI_VIF_CreateDevGroup的举例。

  • 相关主题

    MI_VIF_EnableOutputPort


2.14. 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_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_vif_datatype.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 注意

    • 该接口可查询中断计数、通道使能状态、平均帧率、中断丢失数、获取 VB 失败次数、图像宽高等信息。

    • 通过该接口获取到的帧率是每 1 秒钟的平均帧率,即 VIF 会每隔一秒统计一次平均帧率,该值并不精确,会有些波动。

    • 用户可通过该接口查询中断丢失数,如果该数值一直在增加,说明 VIF 工作出现异常。

    • Tiramisu系列以后的芯片才支持该接口。


2.15. 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_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_common.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 注意

  • 举例

    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;
    }
    
  • 相关主题

    MI_VIF_CallBackTask_UnRegister


2.16. 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_SUCCESS(0):成功。

    • 非0:失败,详情参照错误码

  • 依赖

    • 头文件:mi_common.h、mi_vif.h

    • 库文件:libmi_vif.a

  • 注意

  • 举例

    MI_VIF_CallBackTask_Register举例

  • 相关主题

    MI_VIF_CallBackTask_Register


3. 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 输入驱动clock 类型
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.1. MI_VIF_GROUP

  • 说明

    定义设备群组ID。

  • 定义

    typedef MI_U32 MI_VIF_GROUP;
    
  • 相关数据类型及接口

    MI_VIF_CreateDevGroup


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_LVDS,
    
            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 协议
    E_MI_VIF_MODE_LVDS 输入数据符合LVDS 协议
  • 注意事项

    可以通过MI_SNR_GetPadInfo中的eIntfMode 获取当前接口模式。

  • 相关数据类型及接口

    MI_VIF_GroupAttr_t


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,
    


    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 会采集信号异常。

  • 相关数据类型及接口

    MI_VIF_GroupAttr_t


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输出。
  • 注意事项

    该功能为预留功能,暂不支持,如果需要控制帧率输出,可以通过MI_SYS_BindChnPort2 来设置。

  • 相关数据类型及接口

    MI_VIF_OutputPortAttr_t


3.5. 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 进行双沿采样。
  • 注意事项

    无。

  • 相关数据类型及接口

    MI_VIF_GroupAttr_t


3.6. 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类型。

  • 相关数据类型及接口

    MI_VIF_GroupAttr_t


3.7. 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 才通过该参数设置。

  • 相关数据类型及接口

    MI_VIF_GroupAttr_t


3.8. 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 在一起即可。

  • 相关数据类型及接口

    MI_VIF_GroupAttr_t


3.9. 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_4 = 4,
        E_MI_VIF_SNRPAD_ID_5 = 5,
        E_MI_VIF_SNRPAD_ID_6 = 6,
        E_MI_VIF_SNRPAD_ID_7 = 7,
        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_4 对应硬件设备Sensor4
    E_MI_VIF_SNRPAD_ID_5 对应硬件设备Sensor5
    E_MI_VIF_SNRPAD_ID_6 对应硬件设备Sensor6
    E_MI_VIF_SNRPAD_ID_7 对应硬件设备Sensor7
    E_MI_VIF_SNRPAD_ID_MAX 超过最大Sensor Num
    E_MI_VIF_SNRPAD_ID_NA 无效sensor id
  • 注意事项

    • 在默认情况下是VIF Group0 对应Sensor0,Group2 对应Sensor1,group6 对应Sensor5。

    • Tiramisu 只有4个pad(0-3)。参考章节1.2

  • 相关数据类型及接口

    MI_VIF_GroupExtAttr_t

    MI_VIF_DevStatus_t


3.10. 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、Muffin系列芯片eScanMode只支持 E_MI_SYS_FRAME_SCAN_MODE_PROGRESSIVE。

  • 相关数据类型及接口

    MI_VIF_CreateDevGroup

    MI_VIF_CreateDevGroupExt

    MI_VIF_GetDevGroupAttr


3.11. 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之间的映射。

  • 相关数据类型及接口

    MI_VIF_CreateDevGroupExt


3.12. MI_VIF_DevAttr_t

  • 说明

    定义视频输入设备的属性。

  • 定义

    typedef struct MI_VIF_DevAttr_s
    {
        MI_SYS_PixelFormat_e   eInputPixel;
        MI_SYS_DataPrecision_e eDataPrecision;            
        MI_SYS_WindowRect_t   stInputRect;
        MI_SYS_FieldType_e     eField;
        MI_BOOL               bEnH2T1PMode;
    } MI_VIF_DevAttr_t;
    
  • 成员

    成员名称 描述
    eInputPixel 设备输入像素格式。
    eDataPrecision 设备输入像素位宽。
    stInputRect 设备采集输入范围。
    eField 帧场选择,只用于隔行模式,建议捕获单场时选择捕获底场。逐行模式时,该项必须设置为 E_MI_SYS_FIELDTYPE_NONE。
    bEnH2T1PMode 使能采集水平方向缩小一半功能。
  • 注意事项

    • 如果设备是bayer格式, pixel format设置形式如下:

      stVifDevAttr.eInputPixel = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(stSnrPlane0Info.ePixPrecision, stSnrPlane0Info.eBayerId);

    • eDataPrecision 参数仅在DVP接口跑YUV sensor时使用。如:输入8 bit YUV时,需设置eDataPrecision为E_MI_SYS_DATA_PRECISION_8BPP,告知VIF当前输入的data pin数目为8。

    • bEnH2T1Pmode 参数只有输入是YUV格式时 才可以使用, 非YUV格式使用会返回err。

  • 相关数据类型及接口

    MI_VIF_SetDevAttr

    MI_VIF_GetDevAttr


3.13. MI_VIF_OutputPortAttr_t

  • 说明

    定义 VIF输出端口属性。

  • 定义

    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 像素存储格式支持,可支持YUV422 packet/bayer。
    eFrameRate 目标帧率和输入帧率的比值关系。如果不进行帧率控制,则该值设置为0。可以按照1:1,2:1,4:1,8:1,4:3等比例输出。该功能为预留功能,暂不支持,如果需要控制帧率输出,可以通过MI_SYS_BindChnPort2 来设置。
  • 相关数据类型及接口

    MI_VIF_SetOutputPortAttr

    MI_VIF_GetOutputPortAttr


3.14. 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 每 1 秒的平均帧率,该值不一定精确。
    u32LostInt 中断丢失计数。
    u32VbFail 获取 VB 失败计数。
    u32PicWidth 图像宽度。
    u32PicHeight 图像高度。
  • 注意事项

    • 结构体的中断计数,可用于无中断检测。

    • 该结构体的帧率是每 1 秒钟的平均帧率,即 VIF 会每隔一秒统计一次平均帧率, 该值并不精确。

    • 如果查询到该结构体的中断丢失计数一直在增加,说明 VIF 工作出现异常。

  • 相关数据类型及接口

    MI_VIF_Query


3.15. 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
  • 相关数据类型及接口

    MI_VIF_GetDevStatus


3.16. MI_VIF_CALLBK_FUNC

  • 说明

    定义回调函数类型

  • 定义

    typedef MI_S32 (*MI_VIF_CALLBK_FUNC)(MI_U64 u64Data);
    
  • 相关数据类型及接口

    MI_VIF_CallBackParam_t


3.17. MI_VIF_CallBackMode_e

  • 说明

    定义回调模式。

  • 定义

    typedef enum
    {
        E_MI_VIF_CALLBACK_ISR,
        E_MI_VIF_CALLBACK_MAX,
    } MI_VIF_CallBackMode_e;
    
  • 成员

    成员名称 描述
    E_MI_VIF_CALLBACK_ISR 硬件中断模式回调
    E_MI_VIF_CALLBACK_MAX 回调模式最大值
  • 注意事项

    目前只支持ISR 回调模式。

  • 相关数据类型及接口

    MI_VIF_CallBackParam_t


3.18. 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到达时的信号

  • 相关数据类型及接口

    MI_VIF_CallBackParam_t


3.19. 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 回调函数参数
  • 相关数据类型及接口

    MI_VIF_CallBackTask_Register

    MI_VIF_CallBackTask_UnRegister


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 视频通道已绑定

5. PROCFS介绍


5.1. cat

  • 调试信息

    #cat /proc/mi_modules/mi_vif/mi_vif0
    

  • 调试信息分析

    记录当前VIF的使用状况以及Group/Dev/pipe/outport属性,可以动态地获取到这些信息,方便调试和测试。

  • 参数说明

    参数 描述
    Group Attr GroupId Group号
    Intf 输入数据的协议
    Work 工作模式
    Clkedge 时钟边沿触发模式,与Intf有关系
    Hdr Hdr类型
    Dev Attr Dev Dev号
    IsrCnt 收到的中断总数
    incrop Input Corp Size
    infmt 输入数据格式
    AsyncCnt/EnqCnt/BarCnt/CheckCnt/DequCnt Callback接口执行次数
    Pipe Attr PipeId Pipe号
    PortId Port号
    DevId Dev号
    Hdn H2T1PMode使能
    crop Input Corp Size
    Dest Output Size
    Pixel Output Pixel
    wkmode Pipe工作模式
    Fbc Fbc使能
    OutPort Attr Dev Device id
    Port Port id
    Cap_size 输入size
    Dest_size 输出size
    Fmt Out put pixel format
    Rate Frame rate type
    Atom 底层拿住buffer 数量
    MetaInfo Frame id
    OutCount 输出frame count
    Addr0Cnt Frame地址0的次数
    FailCount 获取outputbuffer失败次数
    Fps Frame per second
    Recv_size Vif 硬件收到size
    Out_size Write dma size
    SubOut_size Write sub dma size
    ReadIdx/WriteIdx/DequeIdx Read,write,deque的index
    FrameStartCnt 处理到第几frame
    FrameDoneCnt 处理完多少frame
    VbFail VbFail计数
    DropFrameCnt Drop frame的数量
    RingBufStatus Ring buf 状态


5.2. echo

# echo help >/proc/mi_modules/mi_vif/mi_vif0

Echo help 查看可用命令

| 功能 |

Dump frame 到指定路径 | |------|--------|P | 命令 | echo dump [devid portid /path] > /proc/mi_modules/mi_vif/mi_vif0 | | 参数说明 | Devid: device id
Portid: port id
Path: 路径存放 | | 举例 | echo dump 0 0 /tmp > /proc/mi_modules/mi_vif/mi_vif0 |

功能
设置vif的atom 数量
命令 echo initatom [devid InitAtom] > /proc/mi_modules/mi_vif/mi_vif0
参数说明 Devid: device id
InitAtom: Driver 最大持有buffer 数量
举例 echo initatom 0 2 > /proc/mi_modules/mi_vif/mi_vif0
功能
设置timer
命令 echo usetimer [devid bUseTimer] > /proc/mi_modules/mi_vif/mi_vif0
参数说明 devid: device id
bUseTimer: 使能timer
举例 echo usetimer 0 1 > /proc/mi_modules/mi_vif/mi_vif0
功能
擦除vif缓存
命令 echo erasebuffer [devid portid bEraseBuffer] > /proc/mi_modules/mi_vif/mi_vif0
参数说明 devid: device id
portid: port id
EraseBuffer: 使能擦除缓存
举例 echo erasebuffer 0 0 1 > /proc/mi_modules/mi_vif/mi_vif0
功能
设置Dev Mask
命令 echo devmask [devid bMask] > /proc/mi_modules/mi_vif/mi_vif0
参数说明 devid: device id
bmask: 使能mask
举例 echo devmask 0 1 > /proc/mi_modules/mi_vif/mi_vif0