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);
-
相关主题
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 举例.
-
相关主题
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 举例.
-
相关主题
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 举例.
-
相关主题
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举例.
-
相关主题
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举例.
-
相关主题
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;
-
相关数据类型及接口
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指针 -
相关数据类型及接口
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 当前配置的大小 -
相关数据类型及接口
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: 128x256flip 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 |