MI LDC API

Version 3.0


1. 概述


1.1. 模块说明

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


1.2. 流程框图

图1-1

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

注:

  1. 32X2,GridxGrid分别为输入图像,输出图像宽高对齐限制。

  2. Grid为网格大小,如配置成16,表示图像将按照16个像素点取一个像素点进行处理。


1.3. 各平台特性

  1. Pudding

    Grid 取值范围:16,32

  2. Tiramisu

    Grid 取值范围:16,32


1.4. 关键字说明

  • device

    Ldc 对应的硬件设备。

  • channel

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


2. API 参考


2.1. 功能模块API

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_SetChnParam 设置LDC 通道属性。
MI_LDC_DoLutDirectTask 执行直接的查表任务,将buf直接送给ldc硬件处理

2.2. MI_LDC_CreateDevice

  • 描述

    创建一个LDC device设备。

  • 语法

    MI_S32 MI_LDC_CreateDevice(MI_LDC_DEV devId, MI_LDC_DevAttr_t *pstDevAttr);
    
  • 参数

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

    • 0 成功。

    • 非0 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:libmi_ldc.a

  • 注意

    目前只支持devId = 0;

  • 举例

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

    MI_LDC_DEV LdcDevid = 0;
    MI_LDC_CHN LdcChnId = 0;
    MI_LDC_DevAttr_t stDevAttr = {0};
    MI_LDC_ChnAttr_t stChnAttr = {};
    
    stChnAttr. eMode = MI_LDC_WORKMODE_LDC ;
    //配置其它channel属性
    
    MI_LDC_CreateDevice(LdcDevid, & stDevAttr);
    MI_LDC_CreateChannel(LdcDevid, LdcChnId);
    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);
    
  • 参数

    参数名称 描述 输入/输出
    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, MI_LDC_ChnAttr_t *pstChnAttr);
    
  • 参数

    参数名称 描述 输入/输出
    devId Device id号 输入
    chnId Ldc Channel 号 输入
    pstChnAttr 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);
    
  • 参数

    参数名称 描述 输入/输出
    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);
    
  • 参数

    参数名称 描述 输入/输出
    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);
    
  • 参数

    参数名称 描述 输入/输出
    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);
    
  • 参数

    参数名称 描述 输入/输出
    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_SetChnParam

  • 描述

    设置LDC 通道属性。

  • 语法

    MI_S32 MI_LDC_SetChnParam (MI_LDC_DEV devId, MI_LDC_CHN chnId, MI_LDC_ChnParam_t *pstChnParam);
    
  • 参数

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

    • 0 成功。

    • 非0 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:libmi_ldc.a

  • 注意

    需要在MI_LDC_CreateChnaael之后使用

  • 举例

    • 初始化见MI_LDC_CreateDevice 举例.

    • 更新channel 配置时使用,可以用于切换算法模式以及调节镜头参数

      MI_LDC_DEV devId = 0;
      MI_LDC_CHN chnId = 0;
      MI_LDC_ChnParam_t  stChnParam = {};
      
      //stChnParam 参数配置
      MI_LDC_SetChnParam(devId, chnId, & stChnParam)
      

2.10. MI_LDC_DoLutDirectTask

  • 描述

    执行直接的查表任务,将buf直接送给ldc硬件处理

  • 语法

    MI_S32 MI_LDC_DoLutDirectTask(MI_LDC_DEV devID, MI_LDC_CHN chnId, MI_LDC_LutTaskAttr_t *pstAttr);
    
  • 参数

    参数名称 描述 输入/输出
    devID 设备初始化参数 输入
    pstAttr 查表任务配置属性
  • 返回值

    • MI_OK 成功。

    • 非MI_OK 失败,参照错误码

  • 需求

    • 头文件:mi_ldc.h

    • 库文件:

  • 举例

    MI_LDC_DEV devId = 0;
    MI_LDC_CHN chnId = 0;
    MI_LDC_LutTaskAttr_t  stLutTask = {};
    
    // stLutTask 配置
    MI_LDC_DoLutDirectTask (devId, chnId, & stLutTask)
    

3. 数据类型


3.1. 数据类型定义

数据类型 定义
MI_LDC_DEV 定义LDC device的类型
MI_LDC_CHN 定义LDC channel的类型
MI_LDC_DevAttr_t 定义LDC device 属性
MI_LDC_WorkMode_e 定义LDC的工作模式
MI_LDC_MapInfoType_e 定义LDC映射信息类型
MI_LDC_DisplacementMapInfo_t 定义LDC 置换图
MI_LDC_SensorCalibInfo_t 定义LDC sensor校准参数
MI_LDC_ChnAttr_t 定义LDC channel 属性
MI_LDC_ChnParam_t 定义LDC channel 动态参数
MI_LDC_OutputPortAttr_t 定义LDC output 端口属性
MI_LDC_DirectBuf_t 定义LDC输入buf 类型
MI_LDC_LutTaskAttr_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_DevAttr_t

  • 说明

    LDC设备初始化参数。

  • 定义

    typedef struct MI_LDC_DevAttr_s
    {
        MI_U32 u32Reserved;
    } MI_LDC_DevAttr_t;
    
  • 成员

    成员名称 描述
    u32Reserved 保留数据
  • 相关数据类型及接口

    MI_LDC_CreateDevice


3.5. MI_LDC_WorkMode_e

  • 说明

    LDC工作模式。

  • 定义

    typedef enum
    {
        MI_LDC_WORKMODE_LDC = 0x01,
        MI_LDC_WORKMODE_LUT = 0x02,
        MI_LDC_WORKMODE_DIS_GYRO = 0x04,
    } MI_LDC_WorkMode_e;
    
  • 成员

    成员名称 描述
    MI_LDC_WORKMODE_LDC LDC 模式
    MI_LDC_WORKMODE_LUT LUT直接查表模式
    MI_LDC_WORKMODE_DIS_GYRO 基于陀螺仪的DIS 防抖模式
  • 相关数据类型及接口

    MI_LDC_ChnAttr_t


3.6. MI_LDC_MapInfoType_e

  • 说明

    LDC映射信息类型。

  • 定义

    typedef enum
    {
        MI_LDC_MAPINFOTYPE_DISPMAP,
        MI_LDC_MAPINFOTYPE_SENSORCALIB, 
    } MI_LDC_MapInfoType_e ;
    
  • 成员

    成员名称 描述
    MI_LDC_MAPINFOTYPE_DISPMAP 置换图
    MI_LDC_MAPINFOTYPE_SENSORCALIB sensor 校准信息
  • 相关数据类型及接口

    MI_LDC_ChnAttr_t


3.7. MI_LDC_DisplacementMapInfo_t

  • 说明

    LDC置换图信息。

  • 定义

    typedef struct MI_LDC_DisplacementMapInfo_s
    {
        void *pXmapAddr;
        void *pYmapAddr;
        MI_U32 u32XmapSize;
        MI_U32 u32YmapSize;
    } MI_LDC_DisplacementMapInfo_t;
    
  • 成员

    成员名称 描述
    pXmapAddr x坐标映射表的起始地址
    pYmapAddr y坐标映射表的起始地址
    u32XmapSize x坐标的映射表大小
    u32YmapSize y坐标的映射表大小
  • 相关数据类型及接口

    MI_LDC_ChnAttr_t

    MI_LDC_ChnParam_t


3.8. MI_LDC_SensorCalibInfo_t

  • 说明

    LDC Sensor 校准信息。

  • 定义

    typedef struct MI_LDC_SensorCalibInfo_s
    {
        void *pCalibPolyBinAddr;
        MI_U32 u32CalibPolyBinSize;
    } MI_LDC_SensorCalibInfo_t;
    
  • 成员

    成员名称 描述
    pCalibPolyBinAddr 校准信息指针
    u32CalibPolyBinSize 校准信息大小
  • 相关数据类型及接口

    MI_LDC_ChnAttr_t

    MI_LDC_ChnParam_t


3.9. MI_LDC_ChnAttr_t

  • 说明

    LDC设备Channel 属性。

  • 定义

    typedef struct MI_LDC_ChnAttr_s
    {
        MI_LDC_WorkMode_e eMode;
    
        MI_BOOL bUseProjection3x3Matrix;
        MI_S32 as32Projection3x3Matrix[LDC_MAXTRIX_NUM];
        MI_U16 u16UserSliceNum;
        MI_U16 u16CropRatio;
        MI_U16 u16FocalLength;
    
        void *pConfigAddr;
        MI_U32 u32ConfigSize;
    
        MI_LDC_MapInfoType_e eInfoType;
        union
        {
            MI_LDC_DisplacementMapInfo_t stDispMapInfo;
            MI_LDC_SensorCalibInfo_t stCalibInfo;
    };
    } MI_LDC_ChnAttr_t;
    
  • 成员

    成员名称 描述
    eMode Channel 的工作模式
    bUseProjection3x3Matrix DIS 用户设置的3x3 Matrix信息,会被叠加到内部法获得的3x3 Matrix上
    as32Projection3x3Matrix DIS 3x3 Matrix信息
    u16UserSliceNum DIS 垂直方向上切分数量,主要用于Rolling Shutter相机的运动场景,每个Slice会有单独的3x3 Matrix
    u16CropRatio DIS 输出图像的裁剪比例,例如:输入图像1920x1080,裁剪比例配置为80,那么输出图像将左右上下各裁剪(1-80%)/2 = 10%,输出图像为1536x864,输出图像为对齐之后的图像。
    u16FocalLength DIS 焦距,单位mm
    pConfigAddr LDC 配置信息地址
    u32ConfigSize LDC 配置信息大小
    eInfoType LDC 映射信息类型
    stDispMapInfo/stCalibInfo LDC 置换表/sensor校准信息,包含畸变参数
  • 相关数据类型及接口

    MI_LDC_CreateChannel


3.10. MI_LDC_ChnParam_t

  • 说明

    LDC设备初始化参数。

  • 定义

    typedef struct MI_LDC_ChnParam_s
    {
        MI_BOOL bUseProjection3x3Matrix;
        MI_S32 as32Projection3x3Matrix[LDC_MAXTRIX_NUM];
        MI_U16 u16FocalLength;
        void *pConfigAddr;
        MI_U32 u32ConfigSize;
        union
        {
            MI_LDC_DisplacementMapInfo_t stDispMapInfo;
            MI_LDC_SensorCalibInfo_t stCalibInfo;
    };
    } MI_LDC_ChnParam_t;
    
  • 成员

    成员名称 描述
    bUseProjection3x3Matrix DIS 用户设置的3x3 Matrix信息,会被叠加到内部法获得的3x3 Matrix上
    as32Projection3x3Matrix DIS 3x3Matrix信息
    u16FocalLength DIS 焦距,单位mm
    pConfigAddr 配置信息地址
    u32ConfigSize 配置信息大小
    stDispMapInfo/ stCalibInfo LDC 置换表/sensor校准信息,包含畸变参数
  • 相关数据类型及接口

    MI_LDC_SetChnParam


3.11. 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.12. MI_LDC_DirectBuf_t

  • 说明

    LDC 输入buf类型。

  • 定义

    typedef struct MI_LDC_DirectBuf_s
    {
        MI_SYS_PixelFormat_e ePixelFormat;
        MI_U32 u32Width;
        MI_U32 u32Height;
        MI_U32 u32Stride[2];
        MI_PHY phyAddr[2];
    } MI_LDC_DirectBuf_t;
    
  • 成员

    成员名称 描述
    ePixelFormat 图像格式
    u32Width 图像宽度
    u32Height 图像高度
    u32Stride 图片每行所占字节数
    phyAddr 图像存储物理地址
  • 相关数据类型及接口

    MI_LDC_LutTaskAttr_t


3.13. MI_LDC_LutTaskAttr_t

  • 说明

    LDC 图像查找表任务类型。

  • 定义

    typedef struct MI_LDC_LutTaskAttr_s
    {
        struct MI_LDC_LutSrcBuf_s
        {
            MI_LDC_DirectBuf_t stTableX;
            MI_LDC_DirectBuf_t stTableY;
            MI_LDC_DirectBuf_t stTableWeight;
        } stSrcBuf;
    
    MI_LDC_DirectBuf_t stDstBuf;
    } MI_LDC_LutTaskAttr_t;
    
  • 成员

    成员名称 描述
    stSrcBuf 查找表的数据源以及权重表
    stDstBuf 存放查表之后的数据buf
  • 相关数据类型及接口

    MI_LDC_DoLutDirectTask


4. 错误码

错误代码 宏定义 描述
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 没有解绑