MI LDC API


1. 概述


1.1. 模块说明

镜头畸变矫正(Lens distortion correction),通过bin档的设置将画面内容进行拉直或者融合。


1.2. 流程框图

注:32X32 为宽高对齐限制。


1.3. 关键字说明

  • bin档

    在发布包中包含libeptz.a 算法库文件,app通过调用算法接口,生成对应的bin文件, 以指针buffer形式送给MI_LDC。

  • channel

    Ldc 模块处理通道,各通道分时复用LDC硬件。

  • View/Block

    LDC根据bin中的mode配置,将画面分割成view,每一个view对应一个bin文件,view画面是由若干个block组成,block为LDC处理的最小单元。


2. API 参考


2.1. 功能模块API

表2-1

API名 功能
MI_LDC_CreateDevice 创建LDC device 设备
MI_LDC_DestroyDevice 销毁LDC device 设备
MI_LDC_CreateChannel 创建LDC channel 通道
MI_LDC_DestroyChannel 销毁LDC channel 通道
MI_LDC_StartChannel 启用LDC channel 通道
MI_LDC_StopChannel 禁用LDC channel 通道
MI_LDC_GetOutputPortAttr 获取LDC output 属性
MI_LDC_SetConfig 设置LDC config bin
MI_LDC_InitDev 初始化LDC设备
MI_LDC_DeInitDev 初始化LDC设备
MI_LDC_SetBatchViewConfig 设置一组LDC的配置

2.2. MI_LDC_CreateDevice

  • 描述

    创建一个LDC device设备。

  • 语法

    MI_S32 MI_LDC_CreateDevice(MI_LDC_DEV devId);
    
  • 参数

    表2-2

    参数名称 描述 输入/输出
    devId Device id号 输入
    eWorkMdoe 工作模式 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:libmi_ldc.a

  • 注意

    目前只支持devId = 0;

  • 举例

    LDC 初始化设置, 以及退出范例:

        MI_LDC_DEV LdcDevid = 0;
    
        MI_LDC_CHN LdcChnId = 0;
    
        MI_U32 u32ViewNum=1;
    
        MI_U32 i=0;
    
        MI_LDC_CreateDevice (LdcDevid,);
    
        MI_LDC_CreateChannel (LdcDevid, LdcChnId);
    
        for(i=0; i\< u32ViewNum; i++)
    
        {
    
        MI_LDC_SetConfig(LdcDevid, LdcChnId,
        pstLDCChnattr->ldcBinBuffer[i], pstLDCChnattr->u32LdcBinSize[i]);
    
        free(pstLDCChnattr->ldcBinBuffer);
    
        }
    
        MI_LDC_StartChannel(LdcDevid, LdcChnId);
    
        /*销毁通道*/
    
        MI_LDC_StopChannel(LdcDevid, LdcChnId);
    
        MI_LDC_DestroyChannel(LdcDevid, LdcChnId);
    
        MI_LDC_DestroyDevice(LdcDevid);
    
  • 相关主题

    MI_LDC_DestroyDevice


2.3. MI_LDC_DestroyDevice

  • 描述

    销毁LDC device 设备。

  • 语法

    MI_S32 MI_LDC_DestroyDevice(MI_LDC_DEV devId);
    
  • 参数

    表2-3

    参数名称 描述 输入/输出
    devId Device id号 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:libmi_ldc.a

  • 注意

    目前只支持devId = 0;

  • 举例

    参见MI_LDC_CreateDevice 举例.

  • 相关主题

    MI_LDC_CreateDevice


2.4. MI_LDC_CreateChannel

  • 描述

    创建LDC channel 通道

  • 语法

    MI_S32 MI_LDC_CreateChannel(MI_LDC_DEV devId, MI_LDC_CHN chnId);
    
  • 参数

    表2-4

    参数名称 描述 输入/输出
    devId Device id号 输入
    chnId Ldc Channel 号 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:libmi_ldc.a

  • 注意

    需在MI_LDC_CreateDevice之后调用。

  • 举例

    参见MI_LDC_CreateDevice 举例.

  • 相关主题

    MI_LDC_DestroyChannel


2.5. MI_LDC_DestroyChannel

  • 描述

    销毁LDC channel 通道

  • 语法

    MI_S32 MI_LDC_DestroyChannel(MI_LDC_DEV devId, MI_LDC_CHN chnId);
    
  • 参数

    表2-5

    参数名称 描述 输入/输出
    devId Device id号 输入
    chnId Ldc Channel 号 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:libmi_ldc.a

  • 举例

    参见MI_LDC_CreateDevice 举例.

  • 相关主题

    MI_LDC_CreateDevice


2.6. MI_LDC_StartChannel

  • 描述

    启用LDC channel 通道。

  • 语法

    MI_S32 MI_LDC_StartChannel(MI_LDC_DEV devId, MI_LDC_CHN chnId);
    
  • 参数

    表2-6

    参数名称 描述 输入/输出
    devId Device id号 输入
    chnId Ldc Channel 号 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:libmi_ldc.a

  • 注意

    Device和Channel 创建之后调用。

  • 举例

    参见MI_LDC_CreateDevice举例.

  • 相关主题

    MI_LDC_StopChannel


2.7. MI_LDC_StopChannel

  • 描述

    禁用LDC channel 通道。

  • 语法

    MI_S32 MI_LDC_StopChannel(MI_LDC_DEV devId, MI_LDC_CHN chnId);
    
  • 参数

    表2-7

    参数名称 描述 输入/输出
    devId Device id号 输入
    chnId Ldc Channel 号 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:libmi_ldc.a

  • 举例

    参见MI_LDC_CreateDevice举例.

  • 相关主题

    MI_LDC_StartChannel


2.8. MI_LDC_GetOutputPortAttr

  • 描述

    获取LDC output 属性。

  • 语法

    MI_S32 MI_LDC_GetOutputPortAttr(MI_LDC_DEV devId, MI_LDC_CHN chnId,   MI_LDC_OutputPortAttr_t *pstOutputAttr);
    
  • 参数

    表2-8

    参数名称 描述 输入/输出
    devId Device id号 输入
    chnId Ldc Channel 号 输入
    pstOutputAttr Output 属性 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:libmi_ldc.a

  • 注意

    output信息是设置在bin档中,当后端需要知道input信息的时候,可以通过该接口获得。

  • 举例

    参见MI_LDC_CreateDevice 举例.


2.9. MI_LDC_SetConfig

  • 描述

    设置LDC config bin。

  • 语法

    MI_S32 MI_LDC_SetConfig(MI_LDC_DEV devId, MI_LDC_CHN chnId, void *pConfigAddr, MI_U32 u32Size);
    
  • 参数

    表2-9

    参数名称 描述 输入/输出
    devId Device id号 输入
    chnId Ldc Channel 号 输入
    pConfigAddr Config bin buffer 指针 输入
    u32Size Config bin buffer size 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:libmi_ldc.a

  • 注意

    • api调用完之后才可以释放掉对应的bin buffer。

    • 每一个view对应一个ldc bin buffer, 一个channel可能会有多个view 窗口组成。

  • 举例

    • 初始化见MI_LDC_CreateDevice 举例.

    • 切换某一个view窗口的bin设置可以直接call 这个api设置

    • 切换mode或者view num 需要变化时流程如下:

      MI_LDC_StopChannel(LdcDevid, LdcChnId);
      
      for(i=0; i\< u32ViewNum; i++)
      
      {
      
          MI_LDC_SetConfig(LdcDevid, LdcChnId, pstLDCChnattr->ldcBinBuffer[i],
          pstLDCChnattr->u32LdcBinSize[i]);
      
          free(pstLDCChnattr->ldcBinBuffer);
      
      }
      
      MI_LDC_StartChannel(LdcDevid, LdcChnId);
      

2.10. MI_LDC_InitDev

  • 描述

    初始化LDC设备

  • 语法

    MI_S32 MI_LDC_InitDev(MI_LDC_InitParam_t *pstInitParam);
    
  • 参数

    表2-10

    参数名称 描述 输入/输出
    pstInitParam 设备初始化参数 输入
  • 返回值

    • MI_OK 成功。

    • 非MI_OK 失败,参照错误码。

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:

  • 注意

    本接口必须和MI_LDC_DeInitDev成对使用,不可单独重复调用,否则返回失败。


2.11. MI_LDC_DeInitDev

  • 描述

    反初始化LDC设备

  • 语法

    MI_S32 MI_LDC_DeInitDev(void);
    
  • 返回值

    • MI_OK 成功。

    • 非MI_OK 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:

  • 注意

    • 此函数必须在初始化设备后调用,否则返回失败。

    • 本接口必须和MI_LDC_InitDev成对使用,不可单独重复调用,否则返回失败。


2.12.MI_LDC_SetBatchViewConfig

  • 描述

    LDC 的config bin的批量配置,可以用来动态切换LDC的模式。

  • 语法

    MI_S32 MI_LDC_SetBatchViewConfig(MI_LDC_DEV devId, MI_LDC_CHN chnId, MI_LDC_Config_t * pstCfg, MI_U32 u32CfgNum);
    
  • 参数

    参数名称 描述 输入/输出
    devId Device ID号。 输入
    chnId LDC Channel 号 输入
    pstCfg LDC Config结构体指针 输入
    u32CfgNum Config的数量 输入
  • 返回值

    • MI_OK 成功。

    • 非MI_OK 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:libmi_ldc.a

  • 注意

    • api调用完之后才可以释放掉对应的bin buffer。

    • 每一个view对应一个ldc bin buffer, 一个channel可能会有多个view 窗口组成。

  • 举例

    • 初始化见MI_LDC_CreateDevice 举例.

    • 切换模式可参考如下程序直接调用此api进行设置

      MI_LDC_Config_t * pstLdcConfig =
      (MI_LDC_Config_t *)malloc(u32ViewNum * sizeof(MI_LDC_Config_t));
      
      for(i=0; i< u32ViewNum; i++)
      {
          pstLdcConfig[i]. pCfgAddr = pstLDCChnattr->ldcBinBuffer[i]
          pstLdcConfig[i]. u32CfgSize = pstLDCChnattr->u32LdcBinSize[i]
      }
      
      MI_LDC_SetBatchViewConfig(LdcDevid, LdcChnId, pstLdcConfig, u32ViewNum);
      free(pstLdcConfig);
      

3. ldc 数据类型


3.1. 数据类型定义

表3-1

数据类型 定义
MI_LDC_DEV 定义LDC device的类型
MI_LDC_CHN 定义LDC channel的类型
MI_LDC_OutputPortAttr_t 定义LDC output 端口属性
MI_LDC_InitParam_t 定义LDC设备初始化参数
MI_LDC_Config_t 定义LDC 配置的类型

3.2. MI_LDC_DEV

  • 说明

    定义LDC device的类型

  • 语法

    typedef MI_U32 MI_LDC_DEV;
    

3.3. MI_LDC_CHN

  • 说明

    定义LDC channel的类型

  • 语法

    typedef MI_U32 MI_LDC_CHN;
    

3.4. MI_LDC_OutputPortAttr_t

  • 说明

    定义LDC output 端口属性。

  • 语法

    typedef struct MI_LDC_OutputPortAttr_s
    
    {
    
        MI_U16 u16Width;
    
        MI_U16 u16Height;
    
        MI_SYS_PixelFormat_e ePixelFmt;
    
    } MI_LDC_OutputPortAttr_t;
    
  • 相关数据类型及接口

    MI_LDC_GetOutputPortAttr


3.5. MI_LDC_InitParam_t

  • 说明

    LDC设备初始化参数。

  • 定义

    typedef struct MI_LDC_InitParam_s
    
    {
    
        MI_U32 u32DevId;
    
        MI_U8 *u8Data;
    
    } MI_LDC_InitParam_t;
    
  • 成员

    表3-2

    成员名称 描述
    u32DevId 设备ID
    u8Data 数据buffer指针
  • 相关数据类型及接口

    MI_LDC_InitDev


3.6. MI_LDC_Config_t

  • 说明

    LDC 配置的结构体。

  • 定义

    typedef struct MI_LDC_Config_s
    
    {
    
        void *pCfgAddr;
    
        MI_U32 u32CfgSize;
    
    } MI_LDC_Config_t;
    
  • 成员

    成员名称 描述
    pCfgAddr 指向Ldc 配置的指针
    u32CfgSize 当前配置的大小
  • 相关数据类型及接口

    MI_LDC_SetBatchViewConfig


4. 错误码

表4-1 LDC API错误码

错误代码 宏定义 描述
0xA0172003 MI_ERR_LDC_ILLEGAL_PARAM 输入参数非法
0xA0172006 MI_ERR_LDC_NULL_PTR 输入参数空指针错误
0xA0172012 MI_ERR_LDC_BUSY Chanel 系统忙
0xA017201F MI_ERR_LDC_FAIL 操作执行失败
0xA0172001 MI_ERR_LDC_INVALID_DEVID 无效device id
0xA0172008 MI_ERR_LDC_NOT_SUPPORT 操作不支持
0xA0172016 MI_ERR_LDC_MOD_INITED Module 已经初始化
0xA0172015 MI_ERR_LDC_MOD_NOT_INIT Module 没有初始化
0xA0172300 MI_ERR_LDC_DEV_CREATED Device 已经创建
0xA0172301 MI_ERR_LDC_DEV_NOT_CREATE Device 还没有创建
0xA0172302 MI_ERR_LDC_DEV_NOT_DESTROY Device 没有被销毁
0xA0172303 MI_ERR_LDC_CHN_CREATED Channel 已经创建
0xA0172304 MI_ERR_LDC_CHN_NOT_CREATE Channel 还没有创建
0xA0172305 MI_ERR_LDC_CHN_NOT_STOP Channel 没有被禁用
0xA0172306 MI_ERR_LDC_CHN_NOT_DESTROY Channel 没有被销毁
0xA0172018 MI_ERR_LDC_PORT_NOT_DISABLE Port 没有失能
0xA0172307 MI_ERR_LDC_PORT_NOT_UNBIND Port 没有解绑

5. PROCFS介绍


5.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_ldc/mi_ldc0
    
  • 调试信息分析

    记录当前 LDC 的使用状况以及相关属性、可以动态地获取到这些信息,方便调试和测试。

  • 参数说明

    参数 描述
    Device Info DevID 设备 ID
    IRQ_Enable IRQ使能状况
    IsrCnt 中断发生的次数,cmdq mode没有参考意义
    IsrNum 中断号
    TotBlkNum 总共需要处理的ldc块的数量
    FramDonCnt 处理完帧的数量
    cmdqif cmdq 接口地址
    HalInFrmCnt 输入到Hal 的帧总数
    HalDoneFrmCnt

    Hal 处理完的帧总数

    HalDoneBlkCnt Hal 当前帧处理完的块总数
    HalIsrDoneCnt Hal done中断发生的次数
    HalIsrErrCnt Hal Err 中断发生的次数

    参数 描述
    Channel Info ChnId Channel ID
    workmode 当前channel的工作模式
    status 当前channel的状态:0:init 1:start 2:stop 3:destroyed
    InputWH 输入帧的分辨率
    Pixel 输入帧的格式
    Stride 输入帧的stride[0]
    InBufCnt 前级输入到帧总数量
    IntodoCnt 待处理帧的标号(递增)
    Atom 底层拿住 buffer 数量
    EptzInit 初始化算法所用时间
    OneBinSz 计算最新view 的buffer size 所用时间
    OneBin 计算最新view所用时间
    TotalBin LDC 算法计算所有view的时间
    LdcDone LDC 硬件处理时间
    EnqTDeq 拿到前级buf到处理完的总时间
    BlendT alpha blending 所用时间

    参数 描述
    ChnId Channel ID
    ViewId ldc 对应窗口的Id
    mode ldc使用的场景模式
    NumRuns ldc 当前场景需要处理的总区块数
    ImgFmt ldc 处理的图像格式
    OpMode 当前bbox的模式:
    0:2048x16 1:1024x32 2:512x64 3:256x128 4: 128x256
    flip ldc的镜像模式
    InSize 当前view的输入区域
    ViewSize 当前view的输出区域
    OutSize 当前场景的输出区域
    ViewTime 当前view的处理时间
    Inblk 当前blk的输入区域
    OutBlk 当前blk的算法输出区域
    SclBlk 当前blk的输出区域
    DeltaXY 当前blk对应delta 表的坐标
    BlkTime 对应blk的处理时间


5.2. echo

Echo help 查看可用命令

# echo help > /proc/mi_modules/mi_ldc/mi_ldc0
功能 dump LDC 输出文件
命令 echo writeoutfile [chnid cnt path] > /proc/mi_modules/mi_ldc/mi_ldc0
参数说明 chnid: channel Id
cnt:dump的数量
path:dump的路径
举例 echo writeoutfile 0 2 /mnt/ > /proc/mi_modules/mi_ldc/mi_ldc0
功能 dump LDC map文件
命令 echo dumptablebin [chnid view/all path] >  /proc/mi_modules/mi_ldc/mi_ldc0
参数说明 chnid: channel id
view/all:  下载的方式, view:具体的viewid, all:当前场景所有的view
path:dump的路径
举例 echo dumptablebin 0 all /mnt/ > /proc/mi_modules/mi_ldc/mi_ldc0
功能 配置输出属性
命令 echo setout[chnid width height pixel] >  /proc/mi_modules/mi_ldc/mi_ldc0
参数说明 chnid: channel id
width: 输出图像的width
height:输出图像的height
举例 echo setout 0 1920 1080 11 > /proc/mi_modules/mi_ldc/mi_ldc0
功能 循环播放前帧
命令 echo loopbuf [chnid cnt] >  /proc/mi_modules/mi_ldc/mi_ldc0
参数说明 chnid: channel id
cnt:循环播放前帧的次数
举例 echo loopbuf 0 11 > /proc/mi_modules/mi_ldc/mi_ldc0
功能 配置ldc 内部debug trace
命令 echo debug [chnid str] >  /proc/mi_modules/mi_ldc/mi_ldc0
参数说明 chnid: channel id
str:debug的方式,off: 关闭,ViewRes, ViewLock,ChnRdLock,ChnWrLock,DisGyro, Eptz
举例 echo debug ChnRdLock > /proc/mi_modules/mi_ldc/mi_ldc0
功能 软件eis 与硬件eis的切换
命令 echo eisswitch [chnid] >  /proc/mi_modules/mi_ldc/mi_ldc0
参数说明 chnid: channel id
举例 echo eisswitch 0 > /proc/mi_modules/mi_ldc/mi_ldc0
功能 配置单个ldc map
命令 echo setbin [chnid path] >  /proc/mi_modules/mi_ldc/mi_ldc0
参数说明 chnid: channel id
path:map的路径
举例 echo setbin /mnt/ldc.bin > /proc/mi_modules/mi_ldc/mi_ldc0