跳转至

MI ISP API


REVISION HISTORY

Revision No.
Description
Date
3.0
  • Initial release
  • 12/04/2020
    3.1
  • Added new API: MI_ISP_SetCustSegAttr, MI_ISP_GetCustSegAttr, MI_ISP_GetCustSegBuf, MI_ISP_PutCustSegBuf
  • Update API: MI_ISP_SetChnParam
  • 07/25/2021
  • Added PROCFS INTRODUCTION
  • 08/25/2021
    3.2
  • Added new API: MI_ISP_GetSubChnId
  • 11/23/2021
    3.3
  • Added Mochi Info
  • 02/17/2022
    3.4
  • Added Maruko info
  • 03/21/2022
    3.5
  • Added new API: MI_ISP_SetSubChnParam, MI_ISP_GetSubChnParam, MI_ISP_SetChnOverlapAttr, MI_ISP_GetChnOverlapAttr
  • Update API: MI_ISP_SetOutputPortParam
  • 05/23/2022
    3.6
  • In Section 5.2 add debug CMD:ptsth/sendoneframe/dnrlevel/resethw/crcmode/datagen/cmdqtimeout
  • 08/03/2022
    3.7
  • Added Opera Info
  • In Section 3.6 add new Hdr type E_MI_ISP_HDR_TYPE_DCG
  • 10/28/2022
    3.8
  • modify isp support max channel
  • 12/01/2022
    3.9
  • In Section 3.6 modify Hdr type MI_ISP_HDRType_e
  • 1/11/2023
    3.10
  • Added Souffle Info
  • 02/14/2023
    3.11
  • Added Pcupid Info
  • 04/10/2024
    3.12
  • Modify doc structure
  • 04/27/2025
    3.13
  • Added Ifackel Info
  • Add new API: MI_ISP_SetLdcAttr
  • 05/12/2025
    3.14
  • Added Jaguar1 Info
  • 05/12/2025
    3.15
  • Added Iford Info
  • 05/12/2025
    3.16
  • Section 2 add new api: MI_ISP_AiIspInit, MI_ISP_AiIspDeinit, MI_ISP_SetAiBnrAttr, MI_ISP_LoadAiBnrModel, MI_ISP_UnloadAiBnrModel, MI_ISP_SetAi3dnrAttr, MI_ISP_GetAi3dnrAttr, MI_ISP_LoadAi3dnrModel, MI_ISP_UnloadAi3dnrModel
  • Section 3 add new datatype: MI_ISP_AiBnrAttr_t, MI_ISP_AiBnrSourceType_e, MI_ISP_Ai3dnrAttr_t, MI_ISP_Ai3dnrModelParam_t
  • 05/15/2025
    3.17
  • Add new item for MI_ISP_ZoomEntry_t
  • 05/12/2025
    3.18
  • Added Ifliegen Info
  • 06/16/2025
    3.19
  • Update AIISP by merge the ai_isp doc to this file and remove cust seg
  • 10/11/2025
    3.20
  • Sync documents
  • 11/20/2025

    1. 概述

    1.1. 模块说明

    图像信号处理(Image Signal Processing),实现HDR、3D/2D降噪、3A算法、WDR等相关功能。

    关键字说明

    • Device

      硬件设备。

    • Channel

      Device上的分时复用通道。

    • DNR

      Digital Noise Reduction,数字降噪技术。

      2D降噪:将一个像素与其周围像素平均,平均后噪声降低,缺点是会造成画面模糊;

      3D降噪:增添了时域处理,2D降噪只考虑一帧图像,而3D降噪进一步考虑帧与帧之间的时域关系,对每个像素进行时域上的平均。

    • 3A算法

      AE (Auto Exposure,自动曝光)、AWB(Auto White Balance,自动白平衡)和AF(Auto Focus,自动对焦)。

    • IQ

      IQ(Image Quality,图像质量),对摄像头捕捉的图像的质量评价标准,涵盖了分辨率、色彩还原、对比度、噪声、动态范围、伽马校正、镜头畸变等多个方面。

    • HDR

      High-Dynamic Range,高动态范围图像。

      据不同的曝光时间的LDR(Low-Dynamic Range,低动态范围图像),并利用每个曝光时间相对应最佳细节的LDR图像来合成最终HDR图像。能够更好的反映出真实环境中的视觉效果。

    • WDR

      Wide Dynamic Range,宽动态范围。

      开启后场景中特别亮和特别暗的部位都能看得清楚。宽动态范围是图像能分辨的最亮的亮度信号值与最暗的亮光信号值的比值。

    • Rotation

      旋转,将原始图像绕中心点旋转0°/90°/180°/270°。

    • Mirror

      水平镜像翻转。

    • Flip

      上下镜像翻转。

    • Crop

      裁剪,对图像进行裁剪。

    • Seg

      分段模块,segment的缩写。

    • Compress

      压缩模式,对数据进行压缩传输,节省带宽。

    • IR

      RGBIR sensor的IR 数据。

    • AI ISP

      在ISP pipeline中的某个地方,使用AI(人工智能)算法对进行图像优化处理后,再重新给 ISP 继续处理,其目的是利用AI强大的计算能力作为 ISP 的补充,以获得质量更高的图像。

    1.2. 基本结构

    简单地说,ISP接收前端给的输入图像,经过ISP内部功能模块的处理,输出处理后的图像。

    图1-1 ISP基本架构框图

    输入阶段

    ISP的输入有两种形式:

    1. 前级IP硬件直连(例如VIF),直接把数据送入到ISP,这种模式称为 realtime。这种模式下,只支持前端一路数据进来,不支持多路数据。

    2. 以buffer的形式从系统内存中读取,buffer的数据来源可以是前级IP写入,或者是用户通过MI_SYS的接口直接灌进来,这种模式称为 framemode。这种模式下,可以支持前端多路数据同时输入,ISP通过分时复用的形式处理这多路数据。

    处理阶段

    1. ISP pipeline 是 ISP 的主要处理过程,其内部涉及多个硬件功能,而且每代芯片的功能不一致,所以这里没有详细展开,具体可以参考 1.3. 功能介绍1.5. 芯片差异

    2. CUS3A是运行3A算法的,其从ISP pipeline中获取图像的统计值数据,送给3A算法后得到结果,再送回ISP pipeline,这部分的具体内容请参考:[AE/AWB/AF Interface]

    3. IQ用于控制图像质量,用户通过特定的Tool来手动或者自动调整图像质量,其从ISP pipeline中获取参数,并把新的参数设定到ISP pipeline中,从而影响图像质量,这部分的具体内容请参考:[ISP软件开发参考] 和 [ISP API Tuning SOP]

    输出阶段

    ISP处理后的图像也有两种输出形式:

    1. 后级IP硬件直连(例如SCL或者LDC),也就是realtime,可以同时输出到多个后级IP。

    2. 以buffer的形式写入到系统内存,也就是 framemode,用户和后级模块可以直接从输出buffer中获取内容。

    注意,在输出的时候,realtime 和 framemode 可以同时使用。

    1.3. 功能介绍

    MI_ISP支持以下功能:

    1. 对图像做旋转(Rotation),翻转(Flip)和镜像(Mirror)

    2. 对图像做裁剪

    3. 对输入的长短曝图像做HDR融合

    4. 对图像进行时域和空域上的降噪(3DNR)

    5. 应用3A算法调整图像的效果

    6. 对图像进行WDR处理

    7. 通过调整IQ参数来获得不同的画质和效果

    8. 通过内置的1D-LDC对图像做畸变矫正

    9. 将输入的bayer格式的图像转为YUV格式

    注意,不是每代芯片都具备以上描述的所有功能,具体请查看1.5. 芯片差异

    1.4. 应用场景

    MI_ISP 可应用于以下场景:

    • Pure linux场景

      在linux环境下,可以基于MI_ISP提供的API接口进行开发。

    • Pure rtos场景

      在rtos环境下,应用程序可以基于MI_ISP提供的API接口进行开发。

    • Dualos场景

      在dualos环境下,在linux端运行的应用程序和在rtos端运行的应用程序可以基于MI_ISP API开发。

    1.5. 芯片差异

    当前文档描述的芯片是 Iford

    1.5.1. 规格说明

    ‘\’ 与 ‘N’ 均为不支持该功能。

    • 模块功能规格

      Function Tiramisu Mochi Muffin Maruko Opera Souffle Pcupid Ifackel Jaguar1 Iford Ifliegen
      Dev Number 1 1 2 1 1 1 1 1 1 1 1
      Chn Number 32 32 32 4 5 4 4 4 4 4 4
      Port Number 3 2 3 3 3 4 3 4 4 4 2
      DNR Range 0-2 0-7 0-2 0-6 0-2 0-5 0-2 0-5 0-5 0-6 0-6
      InputCrop Y Y Y Y Y Y Y Y Y Y Y
      3A Y N Y Y Y Y Y Y Y Y Y
      2F HDR Y N Y Y Y Y N Y Y Y Y
      3F HDR N N N N N Y N N N N N
      Rotation Y N Y Y Y Y N Y Y Y Y
      mirror Y N Y Y Y Y N Y Y Y Y
      flip Y N Y Y Y Y N Y Y Y Y
      WDR Y Y Y Y Y Y Y Y Y Y Y
      OutPutCrop Y Y Y Y Y Y Y Y Y Y Y
      IR Y N Y Y Y Y Y Y Y Y N
      Compress Y Y Y Y Y Y Y Y N N Y
      Max Pixel Rate 4K30 4K60 4K60 4K30 6M30 16M30 2M30 4K24 4K30 8M24 4K25
    • 输入规格

      </tr

      Input Tiramisu Mochi Muffin Maruko Opera Souffle Pcupid Ifackel Jaguar1 Iford Ifliegen
      Pixel yuv422 YUYV Y N Y Y N Y Y Y Y Y Y
      yuv422 UYVY Y Y Y Y Y Y Y Y Y Y Y
      Bayer Y N Y Y Y Y Y Y Y Y Y
      Compress NONE Y Y Y Y Y Y Y Y Y Y Y
      TO_8BIT Y N Y Y Y Y Y Y Y N Y
      TO_6BIT N Y N N N N N N N N N
      SFBC0 N Y N N N N N N N N N
      Crop Y Y Y Y Y Y Y Y Y Y Y
      resolution MAX 4208 3840 4068 3840 2688 4680 1920 3840 3840 3840 3840
      MIN 320x256(开AE)
      16x16(不开AE)
      16x16 320x256(开AE)
      16x16(不开AE)
      320x256(开AE)
      16x16(不开AE)
      320x256(开AE)
      16x16(不开AE)
      128x120(开AE)
      16x16(不开AE)
      320x256(开AE)
      16x16(不开AE)
      320x256 320x256 320x256(开AE)
      16x16(不开AE)
      320x256
      Pixel Alignment (WxH) 2x2 2x2 2x2 2x2 2x2 2x2 2x2 2x2 2x2 2x2 2x2 2x2

    • 输出规格

      Output Tiramisu Mochi Muffin Maruko Opera Souffle Pcupid Ifackel Jaguar1 Iford Ifliegen
      Pixel ARGB8888 N Y N Y Y Y Y Y Y N Y
      ABGR8888 N N N Y Y Y Y Y Y N Y
      BGRA8888 N N N Y Y Y Y Y Y N Y
      yuv420SP NV12 Y Y Y Y Y Y Y Y Y Y Y
      yuv420SP NV21 N Y N Y Y Y Y Y Y Y Y
      yuv420 Planer N Y N Y Y Y Y Y Y Y Y
      yuv422 YUYV Y Y Y Y Y Y Y Y Y Y Y
      yuv422 YVYU Y Y Y Y Y Y Y Y Y Y Y
      yuv422 VYUY Y Y Y Y Y Y Y Y Y Y Y
      yuv422 UYVY Y Y Y Y Y Y Y Y Y Y Y
      yuv422 SP N Y N Y Y Y Y Y Y Y Y
      yuv422 Planer N Y N Y Y Y Y Y Y Y Y
      Compress NONE Y Y Y Y Y Y Y Y Y Y Y
      10TO6 N Y N Y Y Y N Y N N N
      Crop Y Y Y Y Y Y Y Y Y Y Y
      IR Y N Y Y Y Y Y Y Y Y N
      Pixel Alignment (WxH) 2x2 2x2 2x2 2x2 2x2 2x2 2x2 2x2 2x2 2x2 2x2

    1.5.2. 芯片框图

    1.5.2.1. Tiramisu框图

    图1‑2 Tiramisu框图

    注意:

    • Tiramisu 只有一个Device0,每个Device最多支持16个channel。

    • 只支持YUV422_YUYV/UYVY 和bayer格式输入,只有bayer格式可以支持3DNR和3A功能。

    1.5.2.2. Muffin框图

    图1‑3 Muffin框图

    注意:

    • Muffin 有两个Device。Device0和Device1, 每个Device最多支持16个channel。
    • 只支持YUV422_YUYV/UYVY 和bayer格式输入。
    1.5.2.3. Mochi框图

    图1‑4 Mochi框图

    注意:

    • Mochi只有一个Device0, 每个Device最多支持16个channel。

    • 只支持YUV422_UYVY格式输入。

    • 不支持 HDR/Rotation/Mirror/Flip 功能。

    1.5.2.4. Maruko框图

    图1‑5 Maruko框图

    注意:

    • Maruko 只有一个Device0,每个Device最多支持16个channel。

    • 只支持YUV422_YUYV/YUV422_UYVY 和bayer格式输入,只有bayer格式可以支持3DNR/3A/Rot功能。

    1.5.2.5. Opera框图

    图1‑6 Opera框图

    注意:

    • Opera 只有一个Device0,每个Device最多支持5个channel。

    • 只支持YUV422_UYVY 和bayer格式输入,只有bayer格式可以支持3DNR/3A/Rot功能。

    1.5.2.6. Souffle框图

    图1‑7 Souffle框图

    注意:

    • Souffle 只有一个Device0,每个Device最多支持4个channel。
    • 只支持YUV422_UYVY / YUV422_YUYV 和 bayer 格式输入,只有 bayer 格式可以支持 3DNR/3A/Rot功能。
    1.5.2.7. Pcupid框图

    图1‑8 Pcupid框图

    注意:

    • Pcupid 只有一个Device0,每个Device最多支持4个channel。
    • 只支持 YUV422_UYVY / YUV422_YUYV 和 bayer 格式输入,只有 bayer 格式可以支持 3DNR/3A 功能。
    • 不支持 HDR/Rot/Mirror/Flip 功能。
    1.5.2.8. Ifackel框图

    图1‑9 Ifackel框图

    注意:

    • Ifackel 只有一个Device0,每个Device最多支持4个channel。
    • 只支持YUV422_UYVY / YUV422_YUYV 和 bayer 格式输入,只有 bayer 格式可以支持 3DNR/3A/Rot功能。
    1.5.2.9. Jaguar1框图

    图1‑10 Jaguar1框图

    注意:

    • Jaguar1 只有一个Device0,每个Device最多支持4个channel。
    • 只支持YUV422_UYVY / YUV422_YUYV 和 bayer 格式输入,启动Y2B功能的YUV422格式 與 bayer 格式可以支持 3DNR/3A/Rot功能
    1.5.2.10. Iford框图

    图1‑11 Iford框图

    注意:

    • Iford 只有一个Device0,每个Device最多支持4个channel。
    • 只支持YUV422_UYVY / YUV422_YUYV 和 bayer 格式输入,只有 bayer 格式可以支持 3DNR/3A/Rot功能。
    1.5.2.11. Ifliegen框图

    图1‑12 Ifliegen框图

    注意:

    • Ifliegen 只有一个Device0,每个Device最多支持4个channel。
    • 只支持YUV422_UYVY / YUV422_YUYV 和 bayer 格式输入,只有 bayer 格式可以支持 3DNR/3A/Rot功能。

    1.6. 工作原理

    NA

    1.7. 接口调用

    图1‑9 MI_ISP调用流程图

    MI_ISP的接口调用分为以下几步:

    1. 初始化 MI_SYS

    2. 创建 MI_ISP Device

    3. 创建 MI_ISP Channel

    4. 设置 MI_ISP Channel 的参数

    5. 启动 MI_ISP Channel

    6. 设置 MI_ISP Output port 参数

    7. 使能 MI_ISP Output port

    8. 设置 MI_ISP Output port depth

    9. 如果 MI_ISP 有前后级模块,调用 MI_SYS 接口将 MI_ISP 与前后级模块进行绑定

    10. 前级或 SYS 推流到 ISP,SYS从 ISP 取流或 ISP 推流到后级

    11. 禁用已使能的 MI_ISP Output port 端口

    12. 停止 MI_ISP Channel

    13. 销毁 MI_ISP Channel

    14. 销毁 MI_ISP Device

    15. 去初始化 MI_SYS

    1.8. 实例介绍

    1.8.1. 实例一

    第一个实例介绍 MI_ISP 模块的初始化流程和去初始化流程。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <signal.h>
    #include <unistd.h>
    
    #include "mi_sys.h"
    #include "mi_isp.h"
    
    #define ExecFunc(_func_,_ret_)                               \
        if((_func_) != (_ret_))                                  \
        {                                                        \
            printf("[ %d ] exec function is failed\n",__LINE__); \
            exit(-1);                                            \
        }                                                        \
        else                                                     \
        {                                                        \
            printf("[ %d ] exec function is success\n",__LINE__);\
        }
    
    
    MI_S32 IspModuleInit(MI_ISP_DEV ispDevId, MI_ISP_CHANNEL ispChnId, MI_ISP_PORT ispPortId)
    {
        // create isp device
        MI_ISP_DevAttr_t ispDevAttr;
        memset(&ispDevAttr, 0x0, sizeof(MI_ISP_DevAttr_t));
        ispDevAttr.u32DevStitchMask = 0;
    
        ExecFunc(MI_ISP_CreateDevice(ispDevId, &ispDevAttr), MI_SUCCESS);
    
        // create isp channel
        MI_ISP_ChannelAttr_t ispChnAttr;
        memset(&ispChnAttr, 0x0, sizeof(MI_ISP_ChannelAttr_t));
    
        ExecFunc(MI_ISP_CreateChannel(ispDevId, ispChnId, &ispChnAttr), MI_SUCCESS);
    
        // set isp channel param
        MI_ISP_ChnParam_t ispChnParam;
        memset(&ispChnParam, 0x0, sizeof(MI_ISP_ChnParam_t));
        ispChnParam.eHDRType = E_MI_ISP_HDR_TYPE_OFF;
        ispChnParam.e3DNRLevel = E_MI_ISP_3DNR_LEVEL1;
        ispChnParam.eRot = E_MI_SYS_ROTATE_90;
        ExecFunc(MI_ISP_SetChnParam(ispDevId, ispChnId, &ispChnParam), MI_SUCCESS);
    
        // start isp channel
        ExecFunc(MI_ISP_StartChannel(ispDevId, ispChnId), MI_SUCCESS);
    
        // set isp output port param
        MI_ISP_OutPortParam_t ispOutputParam;
        memset(&ispOutputParam, 0x0, sizeof(MI_ISP_OutPortParam_t));
        ispOutputParam.ePixelFormat = E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_420;
    
        ExecFunc(MI_ISP_SetOutputPortParam(ispDevId, ispChnId, ispPortId, &ispOutputParam), MI_SUCCESS);
    
        // enable isp output port
        ExecFunc(MI_ISP_EnableOutputPort(ispDevId, ispChnId, ispPortId), MI_SUCCESS);
    
        // set isp output port depth
        MI_SYS_ChnPort_t chnPort;
        chnPort.eModId = E_MI_MODULE_ID_ISP;
        chnPort.u32DevId = ispDevId;
        chnPort.u32ChnId = ispChnId;
        chnPort.u32PortId = ispPortId;
    
        ExecFunc(MI_SYS_SetChnOutputPortDepth(0, &chnPort, 1, 4), MI_SUCCESS);
    
        return MI_SUCCESS;
    }
    
    MI_S32 IspModuleDeinit(MI_ISP_DEV ispDevId, MI_ISP_CHANNEL ispChnId, MI_ISP_PORT ispPortId)
    {
        ExecFunc(MI_ISP_DisableOutputPort(ispDevId, ispChnId,ispPortId), MI_SUCCESS);
        ExecFunc(MI_ISP_StopChannel(ispDevId,ispChnId), MI_SUCCESS);
        ExecFunc(MI_ISP_DestroyChannel(ispDevId, ispChnId), MI_SUCCESS);
        ExecFunc(MI_ISP_DestoryDevice(ispDevId), MI_SUCCESS);
    
        return MI_SUCCESS;
    }
    
    MI_BOOL bExit = FALSE;
    
    void signalHandler(int signo)
    {
        printf("ctrl +c is input \n");
        bExit = TRUE;
        return;
    }
    
    int main(int argc, char **argv)
    {
        MI_ISP_DEV ispDevId = 0;
        MI_ISP_CHANNEL ispChnId = 0;
        MI_ISP_PORT ispPortId = 1;
    
        ExecFunc(MI_SYS_Init(0), MI_SUCCESS);
    
        ExecFunc(IspModuleInit(ispDevId, ispChnId, ispPortId), MI_SUCCESS);
    
        signal(SIGINT, signalHandler);
        while (!bExit)
        {
            sleep(1);
        }
    
        ExecFunc(IspModuleDeinit(ispDevId, ispChnId, ispPortId), MI_SUCCESS);
    
        ExecFunc(MI_SYS_Exit(0), MI_SUCCESS);
    
        return 0;
    }
    

    1.8.2. 实例二

    第二个实例串了一条经典的 pipeline,即 sensor -> vif -> isp -> scl,其中 vif->isp 之间采用了framemode连接,isp->scl 之间采用了 realitme 连接。对于前后级模块的流程这里只给出demo code,不做出过多解释,如需深入了解,请参考对应的文档:sensor, vif, scl

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <signal.h>
    #include <unistd.h>
    
    #include "mi_sensor.h"
    #include "mi_sensor_datatype.h"
    #include "mi_vif.h"
    #include "mi_isp.h"
    #include "mi_scl.h"
    #include "mi_sys.h"
    
    
    #define ExecFunc(_func_,_ret_)                               \
        if((_func_) != (_ret_))                                  \
        {                                                        \
            printf("[ %d ] exec function is failed\n",__LINE__); \
            exit(-1);                                            \
        }                                                        \
        else                                                     \
        {                                                        \
            printf("[ %d ] exec function is success\n",__LINE__);\
        }
    
    typedef struct
    {
        MI_SYS_ChnPort_t srcChnPort;
        MI_SYS_ChnPort_t dstChnPort;
        MI_U32 srcFrmrate;
        MI_U32 dstFrmrate;
        MI_SYS_BindType_e bindType;
        MI_U32 bindParam;
    } Sys_BindInfo_t;
    
    MI_S32 SysBind(Sys_BindInfo_t *pstBindInfo)
    {
        ExecFunc(MI_SYS_BindChnPort2(0, &pstBindInfo->srcChnPort, &pstBindInfo->dstChnPort,
            pstBindInfo->srcFrmrate, pstBindInfo->dstFrmrate, pstBindInfo->bindType, pstBindInfo->bindParam),
            MI_SUCCESS);
        printf("\n");
        printf("src(%d-%d-%d-%d)  dst(%d-%d-%d-%d)  %d...\n", pstBindInfo->srcChnPort.eModId, pstBindInfo->srcChnPort.u32DevId,
            pstBindInfo->srcChnPort.u32ChnId, pstBindInfo->srcChnPort.u32PortId,
            pstBindInfo->dstChnPort.eModId, pstBindInfo->dstChnPort.u32DevId, pstBindInfo->dstChnPort.u32ChnId,
            pstBindInfo->dstChnPort.u32PortId, pstBindInfo->bindType);
        printf("\n");
    
        return MI_SUCCESS;
    }
    
    MI_S32 SysUnBind(Sys_BindInfo_t *pstBindInfo)
    {
        ExecFunc(MI_SYS_UnBindChnPort(0, &pstBindInfo->srcChnPort, &pstBindInfo->dstChnPort), MI_SUCCESS);
    
        return MI_SUCCESS;
    }
    
    MI_S32 SnrModuleInit(MI_SNR_PADID snrPadId, MI_U8 resIdx, MI_BOOL useHdr)
    {
        MI_SNR_SetPlaneMode(snrPadId, useHdr);
        MI_SNR_SetRes(snrPadId, resIdx);
        MI_SNR_Enable(snrPadId);
    
        return 0;
    }
    
    MI_S32 SnrModuleDeInit(MI_SNR_PADID snrPadId)
    {
        MI_SNR_Disable(snrPadId);
    
        return 0;
    }
    
    MI_S32 VifModuleInit(MI_SNR_PADID snrPadId, MI_VIF_DEV vifDevId)
    {
        MI_U8 vifGroupId = vifDevId;
        MI_VIF_PORT vifPort = 0;
        MI_U32 planeId = 0;
    
        MI_SNR_PADInfo_t  snrPad0Info;
        MI_SNR_PlaneInfo_t snrPlane0Info;
        memset(&snrPad0Info, 0x0, sizeof(MI_SNR_PADInfo_t));
        memset(&snrPlane0Info, 0x0, sizeof(MI_SNR_PlaneInfo_t));
    
        MI_VIF_GroupAttr_t vifGroupAttr;
        memset(&vifGroupAttr, 0x0, sizeof(MI_VIF_GroupAttr_t));
    
        ExecFunc(MI_SNR_GetPadInfo(snrPadId, &snrPad0Info), MI_SUCCESS);
        ExecFunc(MI_SNR_GetPlaneInfo(snrPadId, planeId, &snrPlane0Info), MI_SUCCESS);
    
        vifGroupAttr.eIntfMode = (MI_VIF_IntfMode_e)snrPad0Info.eIntfMode;
        vifGroupAttr.eWorkMode = E_MI_VIF_WORK_MODE_1MULTIPLEX;
        vifGroupAttr.eHDRType = (MI_VIF_HDRType_e)snrPad0Info.eHDRMode;
        vifGroupAttr.eClkEdge = E_MI_VIF_CLK_EDGE_DOUBLE;
    
        ExecFunc(MI_VIF_CreateDevGroup(vifGroupId, &vifGroupAttr), MI_SUCCESS);
    
        MI_VIF_DevAttr_t vifDevAttr;
        memset(&vifDevAttr, 0x0, sizeof(MI_VIF_DevAttr_t));
    
        vifDevAttr.stInputRect.u16X = snrPlane0Info.stCapRect.u16X;
        vifDevAttr.stInputRect.u16Y = snrPlane0Info.stCapRect.u16Y;
        vifDevAttr.stInputRect.u16Width = snrPlane0Info.stCapRect.u16Width;
        vifDevAttr.stInputRect.u16Height = snrPlane0Info.stCapRect.u16Height;
        if(snrPlane0Info.eBayerId >= E_MI_SYS_PIXEL_BAYERID_MAX)
        {
            vifDevAttr.eInputPixel = snrPlane0Info.ePixel;
        }
        else
        {
            vifDevAttr.eInputPixel = (MI_SYS_PixelFormat_e)RGB_BAYER_PIXEL(snrPlane0Info.ePixPrecision, snrPlane0Info.eBayerId);
        }
    
        printf("setchnportattr (%d,%d,%d,%d) \n", vifDevAttr.stInputRect.u16X, vifDevAttr.stInputRect.u16Y, vifDevAttr.stInputRect.u16Width, vifDevAttr.stInputRect.u16Height);
        ExecFunc(MI_VIF_SetDevAttr(vifDevId, &vifDevAttr), MI_SUCCESS);
        ExecFunc(MI_VIF_EnableDev(vifDevId), MI_SUCCESS);
    
        MI_VIF_OutputPortAttr_t vifPortInfo;
        memset(&vifPortInfo, 0, sizeof(MI_VIF_OutputPortAttr_t));
    
        vifPortInfo.stCapRect.u16X = 0;
        vifPortInfo.stCapRect.u16Y = 0;
        vifPortInfo.stCapRect.u16Width =  snrPlane0Info.stCapRect.u16Width;
        vifPortInfo.stCapRect.u16Height = snrPlane0Info.stCapRect.u16Height;
        vifPortInfo.stDestSize.u16Width = snrPlane0Info.stCapRect.u16Width;
        vifPortInfo.stDestSize.u16Height = snrPlane0Info.stCapRect.u16Height;
        printf("sensor bayerid %d, bit mode %d \n", snrPlane0Info.eBayerId, snrPlane0Info.ePixPrecision);
        vifPortInfo.ePixFormat = vifDevAttr.eInputPixel;
        //stVifPortInfo.u32FrameModeLineCount for lowlantancy mode
        vifPortInfo.eFrameRate = E_MI_VIF_FRAMERATE_FULL;
    
        ExecFunc(MI_VIF_SetOutputPortAttr(vifDevId, vifPort, &vifPortInfo), MI_SUCCESS);
        ExecFunc(MI_VIF_EnableOutputPort(vifDevId, vifPort), MI_SUCCESS);
    
        MI_SYS_ChnPort_t chnPort;
        chnPort.eModId = E_MI_MODULE_ID_VIF;
        chnPort.u32DevId = vifDevId;
        chnPort.u32ChnId = 0;
        chnPort.u32PortId = 0;
    
        MI_SYS_SetChnOutputPortDepth(0, &chnPort, 1, 4);
    
        return MI_SUCCESS;
    }
    
    MI_S32 VifModuleDeinit(MI_VIF_DEV VifDevId)
    {
        MI_U8 u8VifGroupId = VifDevId;
        MI_VIF_PORT vifPort = 0;
    
        ExecFunc(MI_VIF_DisableOutputPort(VifDevId, vifPort), MI_SUCCESS);
        ExecFunc(MI_VIF_DisableDev(VifDevId), MI_SUCCESS);
        ExecFunc(MI_VIF_DestroyDevGroup(u8VifGroupId), MI_SUCCESS);
    
        return MI_SUCCESS;
    }
    
    MI_S32 IspModuleInit(MI_ISP_DEV ispDevId, MI_ISP_CHANNEL ispChnId, MI_ISP_PORT ispPortId, MI_SNR_PADID snrPadId)
    {
        // create isp device
        MI_ISP_DevAttr_t ispDevAttr;
        memset(&ispDevAttr, 0x0, sizeof(MI_ISP_DevAttr_t));
        ispDevAttr.u32DevStitchMask = 0;
    
        ExecFunc(MI_ISP_CreateDevice(ispDevId, &ispDevAttr), MI_SUCCESS);
    
        // create isp channel
        MI_ISP_ChannelAttr_t ispChnAttr;
        memset(&ispChnAttr, 0x0, sizeof(MI_ISP_ChannelAttr_t));
        ispChnAttr.u32SensorBindId = (1 << snrPadId);
    
        ExecFunc(MI_ISP_CreateChannel(ispDevId, ispChnId, &ispChnAttr), MI_SUCCESS);
    
        // set isp channel param
        MI_ISP_ChnParam_t ispChnParam;
        memset(&ispChnParam, 0x0, sizeof(MI_ISP_ChnParam_t));
        ispChnParam.eHDRType = E_MI_ISP_HDR_TYPE_OFF;
        ispChnParam.e3DNRLevel = E_MI_ISP_3DNR_LEVEL1;
        ispChnParam.eRot = E_MI_SYS_ROTATE_90;
        ExecFunc(MI_ISP_SetChnParam(ispDevId, ispChnId, &ispChnParam), MI_SUCCESS);
    
        // start isp channel
        ExecFunc(MI_ISP_StartChannel(ispDevId, ispChnId), MI_SUCCESS);
    
        // set isp output port param
        MI_ISP_OutPortParam_t ispOutputParam;
        memset(&ispOutputParam, 0x0, sizeof(MI_ISP_OutPortParam_t));
        ispOutputParam.ePixelFormat = E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_420;
    
        ExecFunc(MI_ISP_SetOutputPortParam(ispDevId, ispChnId, ispPortId, &ispOutputParam), MI_SUCCESS);
    
        // enable isp output port
        ExecFunc(MI_ISP_EnableOutputPort(ispDevId, ispChnId, ispPortId), MI_SUCCESS);
    
        // set isp output port depth
        MI_SYS_ChnPort_t chnPort;
        chnPort.eModId = E_MI_MODULE_ID_ISP;
        chnPort.u32DevId = ispDevId;
        chnPort.u32ChnId = ispChnId;
        chnPort.u32PortId = ispPortId;
    
        ExecFunc(MI_SYS_SetChnOutputPortDepth(0, &chnPort, 1, 4), MI_SUCCESS);
    
        return MI_SUCCESS;
    }
    
    MI_S32 IspModuleDeinit(MI_ISP_DEV ispDevId, MI_ISP_CHANNEL ispChnId, MI_ISP_PORT ispPortId)
    {
        ExecFunc(MI_ISP_DisableOutputPort(ispDevId, ispChnId,ispPortId), MI_SUCCESS);
        ExecFunc(MI_ISP_StopChannel(ispDevId,ispChnId), MI_SUCCESS);
        ExecFunc(MI_ISP_DestroyChannel(ispDevId, ispChnId), MI_SUCCESS);
        ExecFunc(MI_ISP_DestoryDevice(ispDevId), MI_SUCCESS);
    
        return MI_SUCCESS;
    }
    
    MI_S32 SclModuleInit(MI_SCL_DEV sclDevId, MI_SCL_CHANNEL sclChnId, MI_SYS_WindowSize_t *pDstSize)
    {
        MI_SCL_DevAttr_t sclDevAttr;
        MI_SCL_ChannelAttr_t  sclChnAttr;
        MI_SCL_ChnParam_t  sclChnParam;
        MI_SCL_OutPortParam_t  sclOutputParam;
    
        memset(&sclDevAttr, 0x0, sizeof(MI_SCL_DevAttr_t));
        memset(&sclChnAttr, 0x0, sizeof(MI_SCL_ChannelAttr_t));
        sclDevAttr.u32NeedUseHWOutPortMask = E_MI_SCL_HWSCL0;
        ExecFunc(MI_SCL_CreateDevice(sclDevId, &sclDevAttr), MI_SUCCESS);
        ExecFunc(MI_SCL_CreateChannel(sclDevId, sclChnId, &sclChnAttr), MI_SUCCESS);
    
        memset(&sclChnParam, 0x0, sizeof(MI_SCL_ChnParam_t));
        sclChnParam.eRot = E_MI_SYS_ROTATE_NONE;
        ExecFunc(MI_SCL_SetChnParam(sclDevId, sclChnId, &sclChnParam), MI_SUCCESS);
        ExecFunc(MI_SCL_StartChannel(sclDevId, sclChnId), MI_SUCCESS);
    
        memset(&sclOutputParam, 0x0, sizeof(MI_SCL_OutPortParam_t));
        memcpy(&sclOutputParam.stSCLOutputSize, pDstSize, sizeof(MI_SYS_WindowSize_t));
        sclOutputParam.ePixelFormat = E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_420;
        sclOutputParam.eCompressMode = E_MI_SYS_COMPRESS_MODE_NONE;
        sclOutputParam.bMirror = FALSE;
        sclOutputParam.bFlip = FALSE;
        ExecFunc(MI_SCL_SetOutputPortParam((MI_SCL_DEV)sclDevId, sclChnId, 0, &sclOutputParam), MI_SUCCESS);
    
        ExecFunc(MI_SCL_EnableOutputPort((MI_SCL_DEV)sclDevId, sclChnId, 0), MI_SUCCESS);
    
        MI_SYS_ChnPort_t chnPort;
        chnPort.eModId = E_MI_MODULE_ID_SCL;
        chnPort.u32DevId = sclDevId;
        chnPort.u32ChnId = sclChnId;
        chnPort.u32PortId = 0;
    
        ExecFunc(MI_SYS_SetChnOutputPortDepth(0, &chnPort, 1, 4), MI_SUCCESS);
    
        return MI_SUCCESS;
    }
    
    MI_S32 SclModuleDeinit(MI_SCL_DEV sclDevId, MI_SCL_CHANNEL sclChnId)
    {
        ExecFunc(MI_SCL_DisableOutputPort(sclDevId, sclChnId,0), MI_SUCCESS);
        ExecFunc(MI_SCL_StopChannel(sclDevId,sclChnId), MI_SUCCESS);
        ExecFunc(MI_SCL_DestroyChannel(sclDevId, sclChnId), MI_SUCCESS);
        ExecFunc(MI_SCL_DestroyDevice(sclDevId), MI_SUCCESS);
    
        return MI_SUCCESS;
    }
    
    MI_BOOL bExit = FALSE;
    
    void signalHandler(int signo)
    {
        printf("ctrl +c is input \n");
        bExit = TRUE;
        return;
    }
    
    int main(int argc, char **argv)
    {
        ExecFunc(MI_SYS_Init(0), MI_SUCCESS);
    
        MI_SNR_PADID snrPadId = 0;
        MI_U32 planeId = 0;
        MI_SNR_PlaneInfo_t snrPlaneInfo;
        memset(&snrPlaneInfo, 0, sizeof(MI_SNR_PlaneInfo_t));
    
        ExecFunc(SnrModuleInit(snrPadId, 0, FALSE), MI_SUCCESS);
        ExecFunc(MI_SNR_GetPlaneInfo(snrPadId, planeId, &snrPlaneInfo), MI_SUCCESS);
    
        MI_VIF_DEV vifDevId = 0;
        ExecFunc(VifModuleInit(snrPadId, vifDevId), MI_SUCCESS);
    
        MI_ISP_DEV ispDevId = 0;
        MI_ISP_CHANNEL ispChnId = 0;
        MI_ISP_PORT ispPortId = 0;
        ExecFunc(IspModuleInit(ispDevId, ispChnId, ispPortId, snrPadId), MI_SUCCESS);
    
        Sys_BindInfo_t vifIspBindInfo;
        memset(&vifIspBindInfo, 0x0, sizeof(Sys_BindInfo_t));
    
        vifIspBindInfo.srcChnPort.eModId = E_MI_MODULE_ID_VIF;
        vifIspBindInfo.srcChnPort.u32DevId = vifDevId;
        vifIspBindInfo.srcChnPort.u32ChnId = 0;
        vifIspBindInfo.srcChnPort.u32PortId = 0;
    
        vifIspBindInfo.dstChnPort.eModId = E_MI_MODULE_ID_ISP;
        vifIspBindInfo.dstChnPort.u32DevId = ispDevId;
        vifIspBindInfo.dstChnPort.u32ChnId = ispChnId;
        vifIspBindInfo.dstChnPort.u32PortId = 0;
    
        vifIspBindInfo.srcFrmrate = 30;
        vifIspBindInfo.dstFrmrate = 30;
        vifIspBindInfo.bindType = (MI_SYS_BindType_e)E_MI_SYS_BIND_TYPE_FRAME_BASE;
    
        ExecFunc(SysBind(&vifIspBindInfo), MI_SUCCESS);
    
        MI_SCL_DEV sclDevId = 0;
        MI_SCL_DEV sclChnId = 0;
        MI_SYS_WindowSize_t sclDstSize;
        sclDstSize.u16Width = snrPlaneInfo.stCapRect.u16Width;
        sclDstSize.u16Height = snrPlaneInfo.stCapRect.u16Height;
    
        SclModuleInit(sclDevId, sclChnId, &sclDstSize);
    
        Sys_BindInfo_t ispSclBindInfo;
    
        ispSclBindInfo.srcChnPort.eModId = E_MI_MODULE_ID_ISP;
        ispSclBindInfo.srcChnPort.u32DevId = ispDevId;
        ispSclBindInfo.srcChnPort.u32ChnId = ispChnId;
        ispSclBindInfo.srcChnPort.u32PortId = ispPortId;
    
        ispSclBindInfo.dstChnPort.eModId = E_MI_MODULE_ID_SCL;
        ispSclBindInfo.dstChnPort.u32DevId = sclDevId;
        ispSclBindInfo.dstChnPort.u32ChnId = sclChnId;
        ispSclBindInfo.dstChnPort.u32PortId = 0;
    
        ispSclBindInfo.srcFrmrate = 30;
        ispSclBindInfo.dstFrmrate = 30;
        ispSclBindInfo.bindType = E_MI_SYS_BIND_TYPE_REALTIME;
    
        ExecFunc(SysBind(&ispSclBindInfo), MI_SUCCESS);
    
        signal(SIGINT, signalHandler);
        while (!bExit)
        {
            sleep(1);
        }
    
        ExecFunc(SysUnBind(&ispSclBindInfo), MI_SUCCESS);
    
        ExecFunc(SclModuleDeinit(sclDevId, sclChnId), MI_SUCCESS);
    
        ExecFunc(SysUnBind(&vifIspBindInfo), MI_SUCCESS);
    
        ExecFunc(IspModuleDeinit(ispDevId, ispChnId, ispPortId), MI_SUCCESS);
    
        ExecFunc(VifModuleDeinit(vifDevId), MI_SUCCESS);
    
        ExecFunc(SnrModuleDeInit(snrPadId), MI_SUCCESS);
    
        ExecFunc(MI_SYS_Exit(0), MI_SUCCESS);
    
        return 0;
    }
    

    1.9. AIISP

    AI ISP是ISP在进行图像处理的过程中,数据流会进入到IPU,使用IPU的AI功能对图像进行降噪、融合等方面的处理,以得到更好的画质。

    1.9.1. Ai Bnr

    使用IPU在Bayer域对图像进行降噪,得到更好的画质效果,在功能上可以看作是ISP的一个模块。Ifackel上AI BNR的效果相对于传统ISP可以提升一档,信噪比提升6DB左右。

    目前AI BNR主要应用在星光,超星光,黑光等低照度或者极低照度的场景下。使用加大光圈或者sensor靶位的方式虽然能提升夜视效果,但是成本太高,而使用AI BNR的成本更低。

    1.9.2. Ai Wdr

    基于AI的调整图像显示动态范围的算法,它能在宽动态场景下,更好地保留亮暗区(尤其是逆光区域)的细节,同时提升整体对比度,从而提高成像设备在宽动态场景的细节捕获能力。

    1.9.3. 流程框图

    1.9.3.1. Ifackel Ai Isp框图

    图1‑1:Ifackel ai bnr框图

    1.9.3.2. Ifliegen Ai Isp框图

    图1‑2:Ifliegen ai bnr框图

    注意:

    • Ifliegen只支持 aibnr linear 和 aibnr hdr fusion,不支持 aibnr hdr long

    1.9.4. 关键字说明

    • AI BNR Source

      指 AI BNR 的模式。

      linear:线性模式下对isp fe之后的raw做aibnr。支持vif bind isp realtime & frame mode。

      fusion: hdr模式下针对hdr模块输出的raw做aibnr。支持vif bind isp realtime & frame mode。

      hdr long: hdr模式下针对hdr的长曝光, 在isp模块前做aibnr。仅支持vif bind isp frame mode。

      注意:

      • 在hdr long模式下,由于raw直接输入ipu,ipu吃的是fbc后的raw,所以vif侧需要打开fbc。
      • vif bind isp in frame mode时,如果开启AI BNR,需要同时为VIF侧配置AI BNR source type和STA配置,使用示意如2.1 demo所示。

    2. API参考

    该功能模块提供以下API:

    表 2‑1:API参考

    API名 功能
    MI_ISP_CreateDevice 创建一个 ISP 设备
    MI_ISP_DestroyDevice 销毁一个 ISP 设备
    MI_ISP_CreateChannel 创建一个 ISP 通道
    MI_ISP_DestroyChannel 销毁一个 ISP 通道
    MI_ISP_SetInputPortCrop 设定 ISP 输入端口裁剪参数
    MI_ISP_GetInputPortCrop 获取 ISP 输入端口裁剪参数
    MI_ISP_SetChnParam 设定 ISP 通道参数
    MI_ISP_GetChnParam 获取 ISP 通道参数
    MI_ISP_StartChannel 启动 ISP 通道
    MI_ISP_StopChannel 停止 ISP 通道
    MI_ISP_SetOutputPortParam 设定 ISP 输出端口参数
    MI_ISP_GetOutputPortParam 获取 ISP 输出端口参数
    MI_ISP_EnableOutputPort 启用 ISP 输出端口
    MI_ISP_DisableOutputPort 禁用 ISP 输出端口
    MI_ISP_Alloc_IQDataBuf 申请 IQ 数据缓存区
    MI_ISP_Free_IQDataBuf 释放 IQ 数据缓存区
    MI_ISP_CallBackTask_Register 注册 ISP 回调接口
    MI_ISP_CallBackTask_Unregister 注销 ISP 回调接口
    MI_ISP_SkipFrame 设定跳过 FrameNum
    MI_ISP_LoadPortZoomTable 载入 ISP 端口 Zoom Table
    MI_ISP_StartPortZoom 启动 ISP 端口 Zoom
    MI_ISP_StopPortZoom 停止 ISP 端口 Zoom
    MI_ISP_GetPortCurZoomAttr 获取 ISP 端口实时的 Zoom 属性
    MI_ISP_GetSubChnId 获取ISP的子通道号
    MI_ISP_SetSubChnParam 设置ISP的子通道参数
    MI_ISP_GetSubChnParam 获取ISP的子通道参数
    MI_ISP_SetChnOverlapAttr 设置ISP重叠属性
    MI_ISP_GetChnOverlapAttr 获取ISP重叠属性
    MI_ISP_SetLdcAttr 设置1D-LDC属性
    MI_ISP_AiIspInit 初始化 AI ISP
    MI_ISP_AiIspDeinit 去初始化 AI ISP
    MI_ISP_SetAiBnrAttr 设置 AI BNR 属性
    MI_ISP_GetAiBnrAttr 获取 AI BNR 的配置
    MI_ISP_LoadAiBnrModel 加载 AI BNR 模型
    MI_ISP_UnloadAiBnrModel 卸载 AI BNR 模型
    MI_ISP_SetAiWdrAttr 设置 AI WDR 属性
    MI_ISP_GetAiWdrAttr 获取 AI WDR 的配置
    MI_ISP_LoadAiWdrModel 加载 AI WDR 模型
    MI_ISP_UnloadAiWdrModel 卸载 AI WDR 模型
    MI_ISP_SetAi3dnrAttr 设置 AI 3dnr 属性
    MI_ISP_GetAi3dnrAttr 获取 AI 3dnr 属性
    MI_ISP_LoadAi3dnrModel 加载 AI 3dnr 模型
    MI_ISP_UnloadAi3dnrModel 卸载 AI 3dnr 模型

    2.1. MI_ISP_CreateDevice

    • 功能

      创建一个 ISP 设备。

    • 语法

      MI_S32 MI_ISP_CreateDevice(MI_ISP_DEV DevId, MI_ISP_DevAttr_t *pstDevAttr);
      
    • 形参

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

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

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

      • MI_ISP_CreateDevice 中,参数DevId = MI_ISP_CREATE_MULTI_DEV(MI_ISP_DEV0)时,表示multi device模式,Isp device 0, isp device 1同时工作。

      • 只有Muffin支持multi device模式。

      • Multi device模式时,调用除MI_ISP_DestroyDevice外的其他接口,参数DevId = MI_ISP_DEV0。

    • 举例

      MI_ISP 初始化:
      
      MI_S32 ST_IspModuleInit(MI_ISP_DEV IspDevId)
      {
      #define ST_MAX_ISP_OUTPORT_NUM (2)
          MI_ISP_CHANNEL IspChnId = 0;
          MI_ISP_PORT  IspOutPortId =0;
      
          MI_ISP_DevAttr_t stCreateDevAttr;
          memset(&stCreateDevAttr, 0x0, sizeof(MI_ISP_DevAttr_t));
          stCreateDevAttr.u32DevStitchMask = E_MI_ISP_DEVICE_ID0;
      
          MI_ISP_CreateDevice(IspDevId, &stCreateDevAttr);
      
          MI_ISP_ChannelAttr_t  stIspChnAttr;
          memset(&stIspChnAttr, 0x0, sizeof(MI_ISP_ChannelAttr_t));
          stIspChnAttr. u32SensorBindId = E_MI_ISP_SENSOR0;
          MI_ISP_CreateChannel(IspDevId, IspChnId, &stIspChnAttr);
      
          MI_SYS_WindowRect_t  stInputCropInfo;
          stInputCropInfo.u16x=0;
          stInputCropInfo.u16y=0;
          stInputCropInfo.u16width=0;
          stInputCropInfo.u16height=0;//width/height==0 no use crop.
          MI_ISP_SetInputPortCrop(IspDevId, IspChnId, &stInputCropInfo);
      
          MI_ISP_ChnParam_t  stChnParam;
          stChnParam.eHDRType = E_MI_ISP_HDR_TYPE_OFF;
          stChnParam.e3DNRLevel = E_MI_ISP_3DNR_LEVEL2;
          stChnParam.bMirror = FALSE;
          stChnParam.bFlip = FALSE;
          stChnParam.eRot = E_MI_SYS_ROTATE_NONE;
          //use rot or flip, 3dnr level must more than 0
          stChnParam.bY2bEnable = FALSE;
          MI_ISP_SetChnParam(IspDevId, IspChnId, &stChnParam);
      
          MI_ISP_StartChannel(IspDevId, IspChnId);
      
          for(IspOutPortId=0; IspOutPortId<ST_MAX_ISP_OUTPORT_NUM; IspOutPortId++)
          {
              MI_ISP_OutPortParam_t  stIspOutputParam;
              memset(&stIspOutputParam, 0x0, sizeof(MI_ISP_OutPortParam_t));
              stIspOutputParam.stCropRect.u16x=0;
              stIspOutputParam.stCropRect.u16y=0;
              stIspOutputParam.stCropRect.u16Width=0;
              stIspOutputParam.stCropRect.u16Height=0;//width/height use 0, not use crop
              stIspOutputParam.ePixelFormat = E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_YUV420;
              MI_ISP_SetOutputPortParam(IspDevId, IspChnId, IspOutPortId, &stIspOutputParam);
              MI_ISP_EnableOutputPort(IspDevId, IspChnId, IspOutPortId);
          }
      
          return MI_SUCCESS;
      }
      

      MI_ISP 去初始化:

      MI_S32 ST_IspModuleUnInit(MI_ISP_DEV IspDevId)
      {
      #define ST_MAX_ISP_OUTPORT_NUM (2)
      
          MI_ISP_CHANNEL IspChnId = 0;
          MI_ISP_PORT  IspOutPortId =0;
      
          for(IspOutPortId=0; IspOutPortId<ST_MAX_ISP_OUTPORT_NUM; IspOutPortId++)
          {
              MI_ISP_DisableOutputPort(IspDevId, IspChnId, IspOutPortId);
          }
      
          MI_ISP_StopChannel(IspDevId, IspChnId);
      
          MI_ISP_DestroyChannel(IspDevId, IspChnId);
      
          MI_ISP_DestroyDevice(IspDevId);
      
          return MI_SUCCESS;
      }
      
    • 相关主题

      MI_ISP_DestroyDevice

    2.2. MI_ISP_DestroyDevice

    • 功能

      销毁一个 ISP 设备。

    • 语法

      MI_S32 MI_ISP_DestroyDevice(MI_ISP_DEV DevId);
      
    • 形参

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

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      需要先禁用所有的输出端口,然后停下channel,销毁通道,才能销毁设备。

    • 举例

      参考MI_ISP_CreateDevice 举例。

    • 相关主题

      MI_ISP_CreateDevice

    2.3. MI_ISP_CreateChannel

    • 功能

      创建一个 ISP 通道。

    • 语法

      MI_S32 MI_ISP_CreateChannel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_ChannelAttr_t *pstChAttr);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      pstChAttr ISP 通道属性指针 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      需要先创建设备,才能创建通道。

    • 举例

      参考MI_ISP_CreateDevice 举例。

    • 相关主题

      MI_ISP_DestroyChannel

    2.4. MI_ISP_DestroyChannel

    • 功能

      销毁一个 ISP 通道。

    • 语法

      MI_S32 MI_ISP_DestroyChannel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      需要先禁用所有的输出端口, 然后停下channel,才能销毁通道。

    • 举例

      参考MI_ISP_CreateDevice 举例。

    • 相关主题

      MI_ISP_CreateChannel

    2.5. MI_ISP_SetInputPortCrop

    • 功能

      设定 ISP 输入端口裁剪参数。

    • 语法

      MI_S32 MI_ISP_SetInputPortCrop(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_SYS_WindowRect_t *pstCropInfo);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      pstCropInfo ISP 输入端口裁剪参数指针 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • 只有input 是Dram buffer 时,才支持input crop。

      • Crop x、Crop y、width、height 都是2对齐

      • Isp内部的3A 只会统计裁剪区域的信息,会影响到整个画面最终3A计算结果。

      • 当输入数据压缩模式不为E_MI_SYS_COMPRESS_MODE_NONE 时,输入数据不支持裁剪。

    2.6. MI_ISP_GetInputPortCrop

    • 功能

      获取 ISP 输入端口裁剪参数。

    • 语法

      MI_S32 MI_ISP_GetInputPortCrop(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_SYS_WindowRect_t *pstCropInfo);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      pstCropInfo ISP 输入端口裁剪参数指针 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    2.7. MI_ISP_SetChnParam

    • 功能

      设定 ISP 通道参数。

    • 语法

      MI_S32 MI_ISP_SetChnParam(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_ChnParam_t *pstChnParam);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      pstChnParam ISP 通道参数指针 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      建议在通道停止的情况下切换通道参数,避免通道内缓存的buffer和后端参数不匹配,导致异常。

    • 举例

      参考MI_ISP_CreateDevice 举例。

    • 相关主题

      MI_ISP_GetChnParam

    2.8. MI_ISP_GetChnParam

    • 功能

      获取 ISP 通道参数。

    • 语法

      MI_S32 MI_ISP_GetChnParam(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_ChnParam_t *pstChnParam);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      pstChnParam ISP 通道参数指针 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 相关主题

      MI_ISP_SetChnParam

    2.9. MI_ISP_StartChannel

    • 功能

      启动 ISP 通道。

    • 语法

      MI_S32 MI_ISP_StartChannel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 举例

      参考MI_ISP_CreateDevice 举例。

    • 相关主题

      MI_ISP_SetChnParam

    2.10. MI_ISP_StopChannel

    • 功能

      停止 ISP 通道。

    • 语法

      MI_S32 MI_ISP_StopChannel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      在通道创建的情况下,都可以停下通道,通道停下所有的输出端口都不会有数据输出。

    • 举例

      参考MI_ISP_CreateDevice 举例。

    2.11. MI_ISP_SetOutputPortParam

    • 功能

      设定 ISP 输出端口参数。

    • 语法

      MI_S32 MI_ISP_SetOutputPortParam(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_PORT PortId, MI_ISP_OutPortParam_t *pstOutPortParam);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      PortId ISP 端口号 输入
      pstOutPortParam ISP 输出端口参数指针 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • Output port0 只支持和MI_SCL realtime 绑定,输出区域和input 相同, 可以不调用此api设置。

      • Output port1 支持crop,需要指定size 输出。

      • Output port2 只支持输出RGBIR sensor的IR 数据,Output W/H固定为input W/H的各一半,可以不调用此api设置。

      • Output port3 只支持和MI_LDC realtime 绑定,输出区域和input 相同, 可以不调用此api设置。

    • 举例

      参考MI_ISP_CreateDevice 举例。

    2.12. MI_ISP_GetOutputPortParam

    • 功能

      获取 ISP 输出端口参数。

    • 语法

      MI_S32 MI_ISP_GetOutputPortParam(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_PORT PortId, MI_ISP_OutPortParam_t *pstOutPortParam);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      PortId ISP 端口号 输入
      pstOutPortParam ISP 输出端口参数指针 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 相关主题

      MI_ISP_SetOutputPortParam

    2.13. MI_ISP_EnableOutputPort

    • 功能

      启用 ISP 输出端口。

    • 语法

      MI_S32 MI_ISP_EnableOutputPort(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_PORT PortId);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      PortId ISP 端口号 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • Output port1 必须要在设置了output port属性的前提下才可以使能该端口。

      • Output port2 只有在使用RGBIR sensor的时候才可以使能。

    • 举例

      参考MI_ISP_CreateDevice 举例。

    • 相关主题

      MI_ISP_DisableOutputPort

    2.14. MI_ISP_DisableOutputPort

    • 功能

      禁用 ISP 输出端口。

    • 语法

      MI_S32 MI_ISP_DisableOutputPort(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_PORT PortId);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      PortId ISP 端口号 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    2.15. MI_ISP_Alloc_IQDataBuf

    • 功能

      申请 IQ API数据缓存区。

    • 语法

      MI_S32 MI_ISP_Alloc_IQDataBuf(MI_U32 u32Size,void **pUserVirAddr);
      
    • 形参

      参数名称 描述 输入/输出
      u32Size IQ 数据缓存区大小。 输入
      pUserVirAddr IQ 数据缓存区指针地址 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • 建议使用该api申请IQ api 数据,避免高频率调用造成cpu loading较高风险。

      • 一个线程申请一块isp data buffer,避免线程间buffer共用,导致线程之间buffer 互踩。

    • 举例

      #define  MI_ISP_MAX_DATA_SIZE  (80*1024)
      MI_ISP_Alloc_IQDataBuf(MI_ISP_MAX_DATA_SIZE, &pIspBuffer);
      MI_ISP_IQ_ColorToGrayType_t *pstColorToGray = (MI_ISP_IQ_ColorToGrayType_t *)pIspBuffer;
      MI_ISP_IQ_GetColorToGray( Channel, pstColorToGray);
      if(pstColorToGray->bEnable == SS_TRUE)
          pstColorToGray->bEnable = SS_FALSE;
      else
          pstColorToGray->bEnable = SS_TRUE;
      MI_ISP_IQ_SetColorToGray( Channel, pstColorToGray);
      
      MI_ISP_IQ_ContrastType_t *pstContrast = (MI_ISP_IQ_ContrastType_t *)pIspBuffer;
      MI_ISP_IQ_GetContrast( Channel, pstContrast);
      MI_ISP_IQ_SetContrast( Channel, pstContrast);
      
      MI_ISP_Free_IQDataBuf(pIspBuffer)
      
    • 相关主题

      MI_ISP_Free_IQDataBuf

    2.16. MI_ISP_Free_IQDataBuf

    • 功能

      释放 IQ 数据缓存区。

    • 语法

      MI_S32 MI_ISP_Free_IQDataBuf(void *pUserBuf);
      
    • 形参

      参数名称 描述 输入/输出
      pUserBuf IQ 申请的数据缓存区指针 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 举例

      参考MI_ISP_Alloc_IQDataBuf举例。

    2.17. MI_ISP_CallBackTask_Register

    • 功能

      注册 ISP 回调接口。

    • 语法

      MI_S32 MI_ISP_CallBackTask_Register(MI_ISP_DEV DevId, MI_ISP_CallBackParam_t *pstCallBackParam);
      
    • 形参

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

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

    • 举例

      MI_S32 _MI_ISP_vsync1(MI_U64 u64Data)
      {
          DBG_ERR("DATA %llu \n", u64Data);
          return 0;
      }
      
      MI_S32 _MI_ISP_vsync2(MI_U64 u64Data)
      {
          DBG_ERR("DATA %llu \n", u64Data);
          return 0;
      }
      
      static MS_S32 _MI_ISP_testRegCallback(void)
      {
          MI_ISP_CallBackParam_t stCallBackParam1;
          MI_ISP_CallBackParam_t stCallBackParam2;
          memset(&stCallBackParam1, 0x0, sizeof(MI_ISP_CallBackParam_t));
          memset(&stCallBackParam2, 0x0, sizeof(MI_ISP_CallBackParam_t));
          stCallBackParam1.eCallBackMode = E_MI_ISP _CALLBACK_ISR;
          stCallBackParam1. eIrqType = E_MI_ISP_IRQ_ISPVSYNC;
          stCallBackParam1.pfnCallBackFunc = _mi_ISP_vsync1;
          stCallBackParam1.u64Data = 12;
          MI_ISP_CallBackTask_Register(&stCallBackParam1);
          stCallBackParam2.eCallBackMode = E_MI_ISP_CALLBACK_ISR;
          stCallBackParam2. eIrqType = E_MI_ISP_IRQ_ISPVSYNC;
          stCallBackParam2.pfnCallBackFunc = _mi_ISP_vsync2;
          stCallBackParam2.u64Data = 23;
          MI_ISP_CallBackTask_Register(&stCallBackParam2);
          return 0;
      }
      
      static MS_S32 _MI_ISP_testUnRegCallback(void)
      {
          MI_ISP_CallBackParam_t stCallBackParam1;
          MI_ISP_CallBackParam_t stCallBackParam2;
          memset(&stCallBackParam1, 0x0, sizeof(MI_ISP_CallBackParam_t));
          memset(&stCallBackParam2, 0x0, sizeof(MI_ISP_CallBackParam_t));
          stCallBackParam1.eCallBackMode = E_MI_ISP_CALLBACK_ISR;
          stCallBackParam1.eIrqType = E_MI_ISP_IRQ_ISPVSYNC;
          stCallBackParam1.pfnCallBackFunc = _mi_ISP_vsync1;
          stCallBackParam1.u64Data = 12;
          MI_ISP_CallBackTask_Unregister(&stCallBackParam1);
          stCallBackParam2.eCallBackMode = E_MI_ISP_CALLBACK_ISR;
          stCallBackParam2.eIrqType = E_MI_ISP_IRQ_ISPVSYNC;
          stCallBackParam2.pfnCallBackFunc = _mi_ISP_vsync2;
          stCallBackParam2.u64Data = 23;
          MI_ISP_CallBackTask_Unregister(&stCallBackParam2);
          return 0;
      }
      
    • 相关主题

      MI_ISP_CallBackTask_Unregister

    2.18. MI_ISP_CallBackTask_Unregister

    • 功能

      注销回调接口。

    • 语法

      MI_S32 MI_ISP_CallBackTask_Unregister(MI_ISP_DEV DevId, MI_ISP_CallBackParam_t *pstCallBackParam);
      
    • 形参

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

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

    • 举例

      MI_ISP_CallBackTask_Register举例。

    2.19. MI_ISP_SkipFrame

    • 功能

      设定从调用该API开始跳过 Frame count。

    • 语法

      MI_S32 MI_ISP_SkipFrame(MI_ISP_DEV DevId,MI_ISP_CHANNEL ChnId, MI_U32 u32FrameNum);
      
    • 形参

      参数名称 描述 输入/输出
      ChnId ISP 通道号 输入
      u32FrameNum Frame 数量 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    2.20. MI_ISP_LoadPortZoomTable

    • 功能

      载入 ISP 端口 Zoom Table。

    • 语法

      MI_S32 MI_ISP_LoadPortZoomTable(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_ZoomTable_t *pZoomTable);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      pZoomTable Zoom Table参数 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • 通过该接口提前加载好zoom table, 可以每一帧frame依次应用table中的zoom参数,保证zoom效果平滑,对比应用循环call MI_ISP_SetOutputPortParam 设置crop,没有办法保证每一帧frame 生效设置,无法做到平滑效果。

        X0 Y0 W0 H0 SensorId=0
        X1 Y1 W1 H1 SensorId=0
        X2 Y2 W2 H2 SensorId=1
        X3 Y3 W3 H3 SensorId=1

        表中包含crop位置和对应sensorid 信息,sensorid信息以支持长短焦切换场景。

      • Zoom 功能由MI_ISP 和MI_SCL 配合完成,MI_ISP 负责zoom过程中3A效果和长短焦切换场景时通知sensor driver切换sensor。

      • MI_SCL 负责crop 和scaling up,所以在zoom场景中,MI_SCL不能再使用crop 功能。

      • Zoom运行过程中,不可以重复load table,需要先MI_ISP_StopPortZoom,再load table。

    2.21. MI_ISP_StartPortZoom

    • 功能

      启动 ISP端口Zoom。

    • 语法

      MI_S32 MI_ISP_StartPortZoom(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_ZoomAttr_t *pstZoomAttr);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      pstZoomAttr Zoom Table参数 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      X0 Y0 W0 H0 SensorId=0
      X1 Y1 W1 H1 SensorId=0
      X2 Y2 W2 H2 SensorId=1
      X3 Y3 W3 H3 SensorId=1
      • u32FromEntryIndex 和 u32ToEntryIndex 为table中index0~3 任意一个。

      • 当u32FromEntryIndex != u32ToEntryIndex,逐帧应用从u32FromEntryIndex到u32ToEntryIndex的crop 参数。

      • 当u32FromEntryIndex == u32ToEntryIndex,会停在当前u32FromEntryIndex参数。

      • 当MI内部检测到下一个entry的sensorid 和当前sensor id 不一致时,当前帧做完后会将sensirid通知给sensor driver,切换到对应sensor 上。

    • 相关主题

      MI_ISP_StopPortZoom

    2.22. MI_ISP_StopPortZoom

    • 功能

      停止 ISP端口Zoom。

    • 语法

      MI_S32 MI_ISP_StopPortZoom(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      MI_ISP_StartPortZoom成对调用。

    2.23. MI_ISP_GetPortCurZoomAttr

    • 功能

      获取 ISP 端口实时的 Zoom 属性。

    • 语法

      MI_S32 MI_ISP_GetPortCurZoomAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_ZoomAttr_t *pstZoomAttr);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      pstZoomAttr Zoom 属性状态 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    2.24. MI_ISP_GetSubChnId

    • 功能

      获取ISP的子通道号。

    • 语法

      MI_S32 MI_ISP_GetSubChnId(MI_ISP_DEV DevId, MI_ISP_CHANNEL MainChnId,
      MI_ISP_BindSnrId_e eSensorBindId, MI_U32 *pu32SubChnId);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      MainChnId ISP 通道号 输入
      eSensorBindId 子通道绑定的sensor号 输入
      pu32SubChnId ISP 子通道号 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • 在Stitch场景下,一个MI_ISP Channel会绑定多个Sensor,当IQ要控制对应Sensor时,需要输入MI_ISP DevId,MI_ISP ChannelId 和 SensorId,获取对应的SubChannelId,也就是IQ所使用的通道。

      • 其他情况下IQ所使用的通道和MI_ISP ChannelId一致。

    2.25. MI_ISP_SetSubChnParam

    • 描述

      设置ISP的子通道参数。

    • 语法

      MI_S32 MI_ISP_SetSubChnParam(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId,
      MI_ISP_SUB_CHANNEL SubChnId, MI_ISP_ChnParam_t *pstChnParam);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      SubChnId ISP 子通道号 输入
      pstChnParam ISP 子通道参数指针 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • 建议在通道停止的情况下切换子通道参数,避免通道内缓存的buffer和后端参数不匹配,导致异常。

      • 设置eRot时,需要保证子通道之间输入输出宽高一致。E_MI_SYS_ROTATE_90/ E_MI_SYS_ROTATE_270,或E_MI_SYS_ROTATE_NONE/ E_MI_SYS_ROTATE_180。

    2.26. MI_ISP_GetSubChnParam

    • 描述

      获取ISP的子通道参数。

    • 语法

      MI_S32 MI_ISP_GetSubChnParam(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId,
      MI_ISP_SUB_CHANNEL SubChnId, MI_ISP_ChnParam_t *pstChnParam);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      SubChnId ISP 子通道号 输入
      pstChnParam ISP 子通道参数指针 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    2.27. MI_ISP_SetChnOverlapAttr

    • 描述

      设置ISP重叠属性。

    • 语法

      MI_S32 MI_ISP_SetChnOverlapAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId,
      MI_ISP_Overlap_e eOverlap);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      eOverlap 重叠大小 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • Overlap的效果,是使左右拼合的两边图像过度平滑。

      • 只有调用MI_ISP_CreateDevice,参数DevId = MI_ISP_CREATE_MULTI_DEV(MI_ISP_DEV0),且MI_ISP_CreateChannel中参数pstChAttr-> u32SensorBindId,只设置一个sensor id时,Overlay才会生效。

      • E_MI_ISP_OVERLAP_128是多读128列pixel,E_MI_ISP_OVERLAP_256是多读256列pixel。

      • eOverlap = E_MI_ISP_OVERLAP_256时,效果如下图。

    2.28. MI_ISP_GetChnOverlapAttr

    • 描述

      获取ISP重叠属性。

    • 语法

      MI_S32 MI_ISP_GetChnOverlapAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId,
      MI_ISP_Overlap_e *peOverlap);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      peOverlap 重叠大小 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    2.29. MI_ISP_SetLdcAttr

    • 描述

      设置ISP 1D-LDC 属性。

    • 语法

      MI_S32 MI_ISP_SetLdcAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_LdcAttr_t *pstLdcAttr);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号 输入
      pstLdcAttr 1D-LDC 属性 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    2.30. MI_ISP_AiIspInit

    • 功能

      初始化 AI ISP

    • 语法

      MI_S32 MI_ISP_AiIspInit(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId);

    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号。 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • 在调用前要保证 ISP 设备处于使能状态。
    • 举例

      AI BNR初始化:

      ...
      stGroupAttr.stMetaDataAttr.u32MetaDataTypeMask       = E_MI_VIF_METADATA_AE_STAT | E_MI_VIF_METADATA_AF_STAT;
      stGroupAttr.stAiIspAttr.stVifAiBnrAttr.eAiSourceType = E_MI_VIF_AI_BNR_SOURCE_TYPE_LINEAR;
      stGroupAttr.stAiIspAttr.stVifAiHdrAttr.bAiHdrEn      = FALSE;
      STCHECKRESULT(MI_VIF_CreateDevGroup(groupId, &stGroupAttr));
      ...
      
      ...
      MI_ISP_SetChnParam(IspDevId, IspChnId, &stChnParam);
      
      MI_ISP_AiBnrAttr_t stAiBnrAttr = {0};
      MI_ISP_AiBnrModelParam_t stAiBnrModelParam = {0};
      stAiBnrAttr.eAiSourceType = E_MI_ISP_AI_BNR_SOURCE_TYPE_LINEAR;
      stAiBnrModelParam.u8ModelPath = "/customer/XXX.img";
      
      if(MI_SUCCESS != MI_ISP_AiIspInit(IspDevId, IspChnId))
      {
          printf("AI ISP init failed!\n");
      }
      
      if(MI_SUCCESS != MI_ISP_LoadAiBnrModel(IspDevId, IspChnId, &stAiBnrModelParam, &stAiBnrAttr.u32ModelId))
      {
          printf("AI ISP load model failed!\n");
      }
      printf("model id: 0x%x\n", stAiBnrAttr.u32ModelId);
      
      if(MI_SUCCESS != MI_ISP_SetAiBnrAttr(IspDevId,IspChnId,&stAiBnrAttr))
      {
          printf("AI ISP set attr failed!\n");
      }
      
      MI_ISP_StartChannel(IspDevId, IspChnId);
      ...
      

      AI BNR 去初始化:

      ...
      MI_ISP_StopChannel(IspDevId, IspChnId);
      MI_ISP_AiBnrAttr_t stAiBnrAttr {0};
      
      if(MI_SUCCESS != MI_ISP_GetAiBnrAttr(IspDevId,IspChnId,&stAiBnrAttr))
      {
          printf("AI ISP set attr failed!\n");
      }
      stAiBnrAttr.eAiSourceType = E_MI_ISP_AI_BNR_SOURCE_TYPE_NONE;
      
      if(MI_SUCCESS != MI_ISP_SetAiBnrAttr(IspDevId,IspChnId,&stAiBnrAttr))
      {
          printf("AI ISP set attr failed!\n");
      }
      
      if(MI_SUCCESS != MI_ISP_UnloadAiBnrModel(IspDevId, IspChnId, stAiBnrAttr.u32ModelId))
      {
          printf("AI ISP unload model failed!\n");
      }
      
      if(MI_SUCCESS != MI_ISP_AiIspDeinit(IspDevId, IspChnId))
      {
          printf("AI ISP deinit failed!\n");
      }
      MI_ISP_DestroyChannel(IspDevId, IspChnId);
      ...
      

    2.31. MI_ISP_AiIspDeinit

    • 功能

      反初始化 AI ISP。

    • 语法

      MI_S32 MI_ISP_AiIspDeinit(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId);

    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号。 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      需要先停下channel, 然后卸载model,设置AI BNR source为NONE,才能反初始化AI ISP。

    2.32. MI_ISP_SetAiBnrAttr

    • 功能

      配置 AI BNR。

    • 语法

      MI_S32 MI_ISP_SetAiBnrAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_AiBnrAttr_t *pstAiBnrAttr)

    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号。 输入
      pstAiBnrAttr ISP 输入端口AI BNR参数配置指针。 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    2.33. MI_ISP_GetAiBnrAttr

    • 功能

      获取 AI BNR 的配置。

    • 语法

      MI_S32 MI_ISP_GetAiBnrAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_AiBnrAttr_t *pstAiBnrAttr)

    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号。 输入
      pstAiBnrAttr ISP 输出端口AI BNR参数配置指针。 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    2.34. MI_ISP_LoadAiBnrModel

    • 功能

      载入 IPU 所需要的 model。

    • 语法

      MI_S32 MI_ISP_LoadAiBnrModel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_AiBnrModelParam_t *pstModelParam, MI_U32 *pu32ModelId)

    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号。 输入
      pstModelParam AI BNR model 配置参数指针。 输入
      pu32ModelId AI BNR model id 句柄。 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • 加载的model要和 AI BNR source 进行匹配,目前 AI BNR linear 和 hdr long 的model可以通用,hdr fusion 和前面两种模式的model不能通用。
      • 支持加载相同Ai Source的多个model。切换时调用MI_ISP_SetAiBnrAttr,把model id设置成目标model的model id。

    2.35. MI_ISP_UnloadAiBnrModel

    • 功能

      卸载之前载入的 model

    • 语法

      MI_S32 MI_ISP_UnloadAiBnrModel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_U32 u32ModelId)

    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号。 输入
      u32ModelId 指定卸载的 model id 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • 卸载的model不能是正在使用的model, 如果卸载正在使用的model会返回Error(E_MI_ERR_BUSY)。如果要卸载正在被使用的model,必须先切换model或者关闭AiBnr。

    2.36. MI_ISP_SetAiWdrAttr

    • 功能

      配置 AI WDR。

    • 语法

      MI_S32 MI_ISP_SetAiWdrAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_AiWdrAttr_t *pstAiWdrAttr)

    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号。 输入
      pstAiWdrAttr ISP 输入端口AI WDR参数配置指针。 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 举例

      AI WDR初始化:

      ...
      MI_ISP_SetChnParam(IspDevId, IspChnId, &stChnParam);
      
      MI_ISP_AiWdrAttr_t stAiWdrAttr = {0};
      MI_ISP_AiWdrModelParam_t stAiWdrModelParam = {0};
      stAiWdrAttr.u32AiWdrType = E_MI_ISP_AI_WDR_TYPE_LOCAL;
      stAiWdrModelParam.u8ModelPath = "/customer/XXX.img";
      stAiWdrModelParam.eAiWdrType = E_MI_ISP_AI_WDR_TYPE_LOCAL;
      
      if(MI_SUCCESS != MI_ISP_LoadAiWdrModel(IspDevId, IspChnId, &stAiWdrModelParam, &stAiWdrAttr.u32ModelId))
      {
          printf("AI ISP load model failed!\n");
      }
      printf("model id: 0x%x\n", stAiWdrAttr.u32ModelId);
      
      if(MI_SUCCESS != MI_ISP_SetAiWdrAttr(IspDevId,IspChnId,&stAiWdrAttr))
      {
          printf("AI ISP set attr failed!\n");
      }
      
      MI_ISP_StartChannel(IspDevId, IspChnId);
      ...
      

      AI WDR 去初始化:

      ...
      MI_ISP_StopChannel(IspDevId, IspChnId);
      MI_ISP_AiWdrAttr_t stAiWdrAttr = {0};
      
      if(MI_SUCCESS != MI_ISP_GetAiWdrAttr(IspDevId,IspChnId,&stAiWdrAttr))
      {
          printf("AI ISP set attr failed!\n");
      }
      stAiWdrAttr.u32AiWdrType = E_MI_ISP_AI_WDR_TYPE_NONE;
      
      if(MI_SUCCESS != MI_ISP_SetAiWdrAttr(IspDevId,IspChnId,&stAiWdrAttr))
      {
          printf("AI ISP set attr failed!\n");
      }
      
      if(MI_SUCCESS != MI_ISP_UnloadAiWdrModel(IspDevId, IspChnId, stAiWdrAttr.u32ModelId))
      {
          printf("AI ISP unload model failed!\n");
      }
      
      MI_ISP_DestroyChannel(IspDevId, IspChnId);
      ...
      

    2.37. MI_ISP_GetAiWdrAttr

    • 功能

      获取 AI WDR 的配置。

    • 语法

      MI_S32 MI_ISP_GetAiWdrAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_AiWdrAttr_t *pstAiWdrAttr)

    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号。 输入
      pstAiWdrAttr ISP 输出端口AI WDR参数配置指针。 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 举例

      参考MI_ISP_SetAiWdrAttr 举例。

    2.38. MI_ISP_LoadAiWdrModel

    • 功能

      载入 IPU 所需要的 AI WDR model。

    • 语法

      MI_S32 MI_ISP_LoadAiWdrModel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_AiWdrModelParam_t *pstModelParam, MI_U32 *pu32ModelId)

    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号。 输入
      pstModelParam AI WDR model 配置参数指针。 输入
      pu32ModelId AI WDR model id 句柄。 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • 加载的model要和 AI WDR type匹配。
      • 不支持加载多个model与动态切换。
    • 举例

      参考MI_ISP_SetAiWdrAttr 举例。

    2.39. MI_ISP_UnloadAiWdrModel

    • 功能

      卸载之前载入的 AI WDR model

    • 语法

      MI_S32 MI_ISP_UnloadAiWdrModel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_U32 u32ModelId)

    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号。 输入
      ChnId ISP 通道号。 输入
      u32ModelId 指定卸载的 model id 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a

    • 注意

      • 卸载的model不能是正在使用的model, 如果卸载正在使用的model会返回Error(E_MI_ERR_BUSY)。如果要卸载正在被使用的model,必须先关闭AI WDR。
    • 举例

      参考MI_ISP_SetAiWdrAttr 举例。

    2.40. MI_ISP_SetAi3dnrAttr

    • 描述

      设置 AI 3dnr 属性。

    • 语法

      MI_S32 MI_ISP_SetAi3dnrAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_Ai3dnrAttr_t *pstAi3dnrAttr);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号 输入
      ChnId ISP 通道号 输入
      pstAi3dnrAttr Ai 3dnr 属性指针 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a、libmi_ipu.a

    • 注意

      • 目前只支援 linear mode, 不支持 hdr mode。
    • 举例

      初始化:

      ...
      MI_ISP_SetChnParam(IspDevId, IspChnId, &stChnParam);
      MI_ISP_Ai3dnrModelParam_t stAi3dnrModelParam;
      MI_ISP_Ai3dnrAttr_t stAi3dnrAttr;
      
      stAi3dnrModelParam.u8ModelPath = model_path;
      stAi3dnrModelParam.bUpdate = TRUE;
      
      stAi3dnrAttr.bEnable = TRUE;
      
      MI_ISP_AiIspInit(IspDevId, IspChnId);
      MI_ISP_LoadAi3dnrModel(IspDevId, IspChnId, &stAi3dnrModelParam, &stAi3dnrAttr.u32ModelId);
      MI_ISP_SetAiBnrAttr(IspDevId,IspChnId, &stAiBnrAttr);
      MI_ISP_StartChannel(IspDevId, IspChnId);
      ...
      

      反初始化:

      ...
      MI_ISP_StopChannel(IspDevId, IspChnId);
      MI_ISP_Ai3dnrAttr_t stAi3dnrAttr;
      
      MI_ISP_UnloadAi3dnrModel(IspDevId, IspChnId, stAi3dnrAttr.u32ModelId);
      MI_ISP_AiIspDeinit(IspDevId, IspChnId);
      MI_ISP_DestroyChannel(IspDevId, IspChnId);
      ...
      

    2.41. MI_ISP_GetAi3dnrAttr

    • 描述

      获取 AI 3dnr 属性。

    • 语法

      MI_ISP_GetAi3dnrAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_Ai3dnrAttr_t *pstAi3dnrAttr);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号 输入
      ChnId ISP 通道号 输入
      pstAi3dnrAttr Ai 3dnr 属性指针 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a、libmi_ipu.a

    • 注意

      • 目前只支援 linear mode, 不支持 hdr mode。

    2.42. MI_ISP_LoadAi3dnrModel

    • 描述

      加载 AI 3dnr 模型。

    • 语法

      MI_S32 MI_ISP_LoadAi3dnrModel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_Ai3dnrModelParam_t *pstModelParam, MI_U32 *pu32ModelId);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号 输入
      ChnId ISP 通道号 输入
      pstModelParam AI 模型参数 输入
      pu32ModelId 模型ID 参数指针 输出
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a、libmi_ipu.a

    • 注意

      • AI 3dnr 模型决定分辨率,前端输入到 isp 的分辨率必须与模型一致。

      • AI 3dnr 模型决定支持的像素格式,前端输入到 isp 的像素格式必须满足模型要求。

      • 该 api 不可重复执行,在切换其他模型之前,必须呼叫 MI_ISP_UnloadAi3dnrModel 卸载之前的模型。

    2.43. MI_ISP_UnloadAi3dnrModel

    • 描述

      卸载 AI 3dnr 模型。

    • 语法

      MI_S32 MI_ISP_UnloadAi3dnrModel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_U32 u32ModelId);
      
    • 形参

      参数名称 描述 输入/输出
      DevId ISP 设备号 输入
      ChnId ISP 通道号 输入
      u32ModelId 模型ID 输入
    • 返回值

      • MI_SUCCESS(0) 成功。

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

    • 依赖

      • 头文件:mi_isp_datatype.h、mi_isp.h

      • 库文件:libmi_isp.a、libmi_ipu.a

    3. ISP数据类型

    视频输入相关数据类型定义如下:

    表 3‑1:ISP数据类型

    数据类型 描述
    MI_ISP_DEV 定义 ISP 设备的类型
    MI_ISP_CHANNEL 定义 ISP 通道的类型
    MI_ISP_PORT 定义 ISP 端口的类型
    MI_ISP_DevMaskId_e 定义 ISP 设备需要mask使用的设备ID
    MI_ISP_DevAttr_t 定义 ISP 设备属性参数
    MI_ISP_HDRType_e 定义 HDR 开关模式
    MI_ISP_3DNR_Level_e 定义 3DNR 设置等级
    MI_ISP_BindSnrId_e 定义 ISP 绑定sensor的ID
    MI_ISP_SYNC3A_e 定义同步各通道 3A 参数
    MI_ISP_IQApiHeader_t 定义IQ api 数据类型
    MI_ISP_VersionPara_t 定义ISP特殊参数版本
    MI_ISP_CustIQParam_t 定义ISP初始化参数
    MI_ISP_ChannelAttr_t 定义 ISP 通道静态属性参数
    MI_ISP_ChnParam_t 定义 ISP 通道动态属性参数
    MI_ISP_OutPortParam_t 定义 ISP 输出端口的参数
    MI_ISP_CALLBK_FUNC 定义回调函数类型
    MI_ISP_CallBackMode_e 定义回调模式
    MI_ISP_IrqType_e 定义硬件中断类型
    MI_ISP_CallBackParam_t 定义回调参数
    MI_ISP_ZoomEntry_t 定义 Zoom 单元条目类型
    MI_ISP_ZoomTable_t 定义 Zoom Table 类型
    MI_ISP_ZoomAttr_t 定义 Zoom 属性
    MI_ISP_BufferLayout_e buffer布局
    MI_ISP_Overlap_e 重叠属性
    MI_ISP_HDRExposureType_e 定义 HDR 曝光模式
    MI_ISP_HDRFusionType_e 定义 HDR 融合模式
    MI_ISP_LdcAttr_t 定义1D-LDC属性
    MI_ISP_AiBnrSourceType_e 定义 ISP AI BNR 抽点位置
    MI_ISP_AiBnrAttr_t 定义 AI BNR 属性参数
    MI_ISP_AiBnrModelParam_t 定义 ISP AI BNR model配置参数
    MI_ISP_AiWdrAttr_t 定义 AI WDR 属性参数
    MI_ISP_AiWdrType_e 定义 AI WDR 类型
    MI_ISP_AiWdrModelParam_t 定义 AI WDR model配置参数
    MI_ISP_Ai3dnrAttr_t 定义 AI 3dnr 属性参数
    MI_ISP_Ai3dnrModelParam_t 定义 AI 3dnr 模型参数

    3.1. MI_ISP_DEV

    • 说明

      定义 ISP 设备的类型。

    • 定义

      typedef MI_U32 MI_ISP_DEV;
      

    3.2. MI_ISP_CHANNEL

    • 说明

      定义 ISP 通道的类型。

    • 定义

      typedef MI_U32 MI_ISP_CHANNEL;
      

    3.3. MI_ISP_PORT

    • 说明

      定义 ISP 端口的类型。

    • 定义

      typedef MI_U32 MI_ISP_PORT;
      

    3.4. MI_ISP_DevMaskId_e

    • 说明

      定义 ISP 设备需要mask使用的设备ID。

    • 定义

      typedef enum
      {
      ​     E_MI_ISP_DEVICEMASK_ID0 = 0x0001,
      ​     E_MI_ISP_DEVICEMASK_ID1 = 0x0002,
      ​     E_MI_ISP_DEVICEMASK_ID_MAX = 0xffff
      } MI_ISP_DevMaskId_e;
      
    • 注意事项

      Tiramisu / Mochi / Maruko / Souffle / Pcupid / Iford / Ifackel / Ifliegen 系列芯片只有ISP E_MI_ISP_DEVICEMASK_ID0使用。

    • 相关数据类型及接口

      MI_ISP_CreateDevice

    3.5. MI_ISP_DevAttr_t

    • 说明

      定义 ISP 设备属性参数。

    • 定义

      typedef struct MI_ISP_DevAttr_s
      {
      ​     MI_U32  u32DevStitchMask; //multi ISP dev bitmask by MI_ISP_DevMaskId_e
      }MI_ISP_DevAtt_t;
      
    • 成员

      成员名称 描述
      u32DevStitchMask ISP DEV ID 掩码。
    • 注意事项

      u32DevStitchMask由MI_ISP_DevMaskId_e,bitmask组成。如果通道上的数据量一个isp device处理速度无法达到要求,可以通过该参数复用另外一个Device。复用之后不可以再创建另外一个Device。

    • 相关数据类型及接口

      MI_ISP_CreateDevice

    3.6. MI_ISP_HDRType_e

    • 说明

      定义 HDR 模式

    • 定义

      typedef enum
      {
      ​     E_MI_ISP_HDR_TYPE_OFF,
      ​     E_MI_ISP_HDR_TYPE_VC,
      ​     E_MI_ISP_HDR_TYPE_DOL,
      ​     E_MI_ISP_HDR_TYPE_COMP,
      ​     E_MI_ISP_HDR_TYPE_LI,
      ​     E_MI_ISP_HDR_TYPE_COMPVS,
      ​     E_MI_ISP_HDR_TYPE_DCG,
      ​     E_MI_ISP_HDR_TYPE_MAX
      } MI_ISP_HDRType_e;
      
    • 成员

      成员名称 描述
      E_MI_ISP_HDR_TYPE_OFF 不开HDR
      E_MI_ISP_HDR_TYPE_VC virtual channel mode HDR, vc0->long,vc1->short
      E_MI_ISP_HDR_TYPE_DOL Digital Overlap High Dynamic Range
      E_MI_ISP_HDR_TYPE_COMP sensor融合长曝和短曝,isp控制两张frame的gain值
      E_MI_ISP_HDR_TYPE_LI Line interlace HDR
      E_MI_ISP_HDR_TYPE_COMPVS compressed HDR + Very short
      E_MI_ISP_HDR_TYPE_DCG Dual conversion gain HDR
      E_MI_ISP_HDR_TYPE_MAX HDR 边界值
    • 注意事项

      • 具体使用的HDR Type 可以通过MI_SNR_GetPadInfo 接口获取。

      • HDR功能需要MI_VIF 和MI_ISP 模块配合完成,需要两边设置相同的HDR类型。

      • E_MI_ISP_HDR_TYPE_DCG 和 E_MI_ISP_HDR_TYPE_COMPVS暂不支持。

      • E_MI_ISP_HDR_TYPE_COMP opera系列芯片支持。

    • 相关数据类型及接口

      MI_ISP_ChnParam_t

    3.7. MI_ISP_3DNR_Level_e

    • 说明

      定义 3DNR 设置等级。

    • 定义

      typedef enum
      {
      ​     E_MI_ISP_3DNR_LEVEL_OFF,
      ​     E_MI_ISP_3DNR_LEVEL1,
      ​     E_MI_ISP_3DNR_LEVEL2,
      ​     E_MI_ISP_3DNR_LEVEL3,
      ​     E_MI_ISP_3DNR_LEVEL4,
      ​     E_MI_ISP_3DNR_LEVEL5,
      ​     E_MI_ISP_3DNR_LEVEL6,
      ​     E_MI_ISP_3DNR_LEVEL7,
      ​     E_MI_ISP_3DNR_LEVEL_NUM
      }MI_ISP_3DNR_Level_e;
      
    • 注意事项

      3DNR level 越高,降噪效果越好,消耗的buffer也越多。

      芯片 3DNR支持的最大等级
      Tiramisu E_MI_ISP_3DNR_LEVEL2
      Muffin E_MI_ISP_3DNR_LEVEL2
      Mochi E_MI_ISP_3DNR_LEVEL7
      Maruko E_MI_ISP_3DNR_LEVEL7
      Souffle E_MI_ISP_3DNR_LEVEL5
      Pcupid E_MI_ISP_3DNR_LEVEL2
      Iford E_MI_ISP_3DNR_LEVEL6
      Ifackel E_MI_ISP_3DNR_LEVEL5
      Ifliegen E_MI_ISP_3DNR_LEVEL5
    • 相关数据类型及接口

      MI_ISP_ChnParam_t

    3.8. MI_ISP_BindSnrId_e

    • 说明

      定义 ISP 绑定sensor的ID。

    • 定义

      typedef enum
      {
      ​     E_MI_ISP_SENSOR_INVALID = 0,
      ​     E_MI_ISP_SENSOR0 = 0x1,
      ​     E_MI_ISP_SENSOR1 = 0x2,
      ​     E_MI_ISP_SENSOR2 = 0x4,
      ​     E_MI_ISP_SENSOR3 = 0x8,
      ​     E_MI_ISP_SENSOR4 = 0x10,
      ​     E_MI_ISP_SENSOR5 = 0x20,
      ​     E_MI_ISP_SENSOR6 = 0x40,
      ​     E_MI_ISP_SENSOR7 = 0x80,
      ​     E_MI_ISP_SENSOR_MAX = 8
      }MI_ISP_BindSnrId_e;
      

    3.9. MI_ISP_SYNC3A_e

    • 说明

      定义同步各通道 3A 参数。

    • 定义

      typedef enum
      {
      ​     E_MI_ISP_SYNC3A_NONE = 0x00,
      ​     E_MI_ISP_SYNC3A_AE   = 0x01,
      ​     E_MI_ISP_SYNC3A_AWB  = 0x02,
      ​     E_MI_ISP_SYNC3A_IQ           = 0x04,
      ​     E_MI_ISP_SYNC3A_1ST_SNR_ONLY = 0x10
      }MI_ISP_SYNC3A_e;
      
    • 成员

      成员名称 描述
      E_MI_ISP_SYNC3A_NONE 不同步3A
      E_MI_ISP_SYNC3A_AE 同步自动曝光
      E_MI_ISP_SYNC3A_AWB 同步自动白平衡
      E_MI_ISP_SYNC3A_IQ 同步图像质量参数设置
      E_MI_ISP_SYNC3A_1ST_SNR_ONLY 只控制第一颗 Sensor

    3.10. MI_ISP_IQApiHeader_t

    • 说明

      定义设定IQ api 数据属性。

    • 定义

      typedef struct MI_ISP_IQApiHeader_s
      {
      ​     MI_U32 u32HeadSize;    //Size of MIIspApiHeader_t
      ​     MI_U32 u32DataLen;     //Data length;
      ​     MI_U32 u32CtrlID;      //Function ID
      ​     MI_U32 u32Channel;     //Isp channel number
      ​     MI_U32 u32DevId;       //Isp Device Id
      ​     MI_S32 s32Ret;         //Isp api retuen value
      } MI_ISP_IQApiHeader_t;
      
    • 成员

      成员名称 描述
      u32HeadSize MI_ISP_IQApiHeader_t struct占用空间
      u32DataLen 数据size
      u32CtrlID 功能对应control Id
      u32Channel Isp 通道Id
      u32DevId Isp 设备Id
      s32Ret 接口返回值

    3.11. MI_ISP_VersionPara_t

    • 说明

      定义ISP特殊参数版本。

    • 定义

      typedef struct MI_ISP_VersionPara_s
      {
      ​     MI_U32 u32Revision;
      ​     MI_U32 u32Size;
      ​     MI_U8 u8Data[VERSIONPARA_DATA_SIZE];
      }MI_ISP_VersionPara_t;
      
    • 成员

      成员名称 描述
      u32Revision 和IQ team 协商定义的对应版本号
      u32Size 数据对应有效size
      u8Data[VERSIONPARA_DATA_SIZE] 存储数据,VERSIONPARA_DATA_SIZE的值是64
    • 相关数据类型及接口

      MI_ISP_CustIQParam_t

    3.12. MI_ISP_CustIQParam_t

    • 说明

      定义ISP IQ初始化参数。

    • 定义

      typedef struct MI_ISP_CustIQParam_s
      {
      ​     MI_ISP_VersionPara_t  stVersion;
      }MI_ISP_CustIQParam_t;
      
    • 成员

      成员名称 描述
      stVersion 版本参数
    • 注意事项

      需要ISP 客制化处理的一些IQ初始化参数,可以通过该参数设置, 如果没有需求,可以都设置0。

    3.13. MI_ISP_ChannelAttr_t

    • 说明

      定义 ISP 通道静态属性参数。

    • 定义

      typedef struct MI_ISP_ChannelAttr_s
      {
      ​     MI_U32  u32SensorBindId; //bitmask by MI_ISP_BindSnrId_e
      ​     MI_ISP_CustIQParam_t stIspCustIqParam;
      ​     MI_U32  u32Sync3AType; //sync 3a bitmask by MI_ISP_SYNC3A_e
      }MI_ISP_ChannelAttr_t;
      
    • 成员

      成员名称 描述
      u32SensorBindId 通道绑定对应的sensor Id
      stIspCustIqParam Isp IQ初始化参数
      u32Sync3AType 同步通道内多组图像之间的3A/IQ 参数
    • 注意事项

      • 当多sensor拼接场景一个ISP channel 需要处理多个sensor 图像,需要通过u32SensorBindId 将多个sensor Id bitmask 起来设置,否则只设置对应sensor Id接口,如果不需要ISP做IQ/3A,或者前端数据源不是sensor,可以设置0。

      • 当多sensor拼接场景一个ISP channel 需要处理多个sensor 图像,通过u32Sync3AType 设置多个图像之间3A/IQ效果同步, 避免两个图像之间效果差别过大。

    • 相关数据类型及接口

      MI_ISP_CreateChannel

    3.14. MI_ISP_ChnParam_t

    3.15. MI_ISP_OutPortParam_t

    • 说明

      定义 ISP 输出端口的参数。

    • 定义

      typedef struct MI_ISP_OutPortParam_s
      {
      ​     MI_SYS_WindowRect_t stCropRect;
      ​     MI_SYS_PixelFormat_e  ePixelFormat;
      ​     MI_SYS_CompressMode_e eCompressMode;
      ​     MI_ISP_BufferLayout_e eBufLayout;
      }MI_ISP_OutPortParam_t;
      
    • 成员

      成员名称 描述
      stCropRect 输出裁剪区域
      ePixelFormat 像素格式
      eCompressMode 输出像素压缩模式
      eBufLayout 输出图像内存布局
    • 注意事项

      • eCompressMode 支持范围:

        芯片 支持的输出像素压缩模式
        Tiramisu E_MI_SYS_COMPRESS_MODE_NONE
        Muffin E_MI_SYS_COMPRESS_MODE_NONE
        Mochi E_MI_SYS_COMPRESS_MODE_NONE
        E_MI_SYS_COMPRESS_MODE_TO_6BIT
        Maruko E_MI_SYS_COMPRESS_MODE_TO_6BIT
        Soufffle E_MI_SYS_COMPRESS_MODE_NONE
        E_MI_SYS_COMPRESS_MODE_TO_6BIT
        Pcupid E_MI_SYS_COMPRESS_MODE_NONE
        Iford E_MI_SYS_COMPRESS_MODE_NONE
      • E_MI_SYS_COMPRESS_MODE_10TO6限制

        Output_Compress_10TO6 Mochi Maruko Soufffle
        Pixel yuv420SP NV12 Y Y Y
        yuv422 YUYV Y Y Y
        Pixel Alignment (WxH) yuv420SP NV12 2x2 2x2 2x2
        yuv422 YUYV 2x2 2x2 2x2

    3.16. MI_ISP_CALLBK_FUNC

    • 说明

      定义回调函数类型。

    • 定义

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

      MI_ISP_CallBackParam_t

    3.17. MI_ISP_CallBackMode_e

    • 说明

      定义回调模式。

    • 定义

      typedef enum
      {
      ​     E_MI_ISP_CALLBACK_ISR,
      ​     E_MI_ISP_CALLBACK_MAX,
      } MI_ISP_CallBackMode_e;
      
    • 成员

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

      目前只支持ISR 回调模式。

    • 相关数据类型及接口

      MI_ISP_CallBackParam_t

    3.18. MI_ISP_IrqType_e

    • 说明

      定义硬件中断类型。

    • 定义

      typedef enum
      {
      ​     E_MI_ISP_IRQ_ISPVSYNC,
      ​     E_MI_ISP_IRQ_ISPFRAMEDONE,
      ​     E_MI_ISP_IRQ_MAX,
      } MI_ISP_IrqType_e;
      
    • 成员

      成员名称 描述
      E_MI_ISP_IRQ_ISPVSYNC ISP Vsync 中断类型
      E_MI_ISP_IRQ_ISPFRAMEDONE ISP Frame done 中断类型
      E_MI_ISP_IRQ_MAX ISP 硬件中断类型最大值
    • 注意事项

      • E_MI_VPE_IRQ_ISPVSYNC: 每一帧第一个pixel的信号

      • E_MI_VPE_IRQ_ISPFRAMEDONE:isp 写出每一张结束的信号。

    • 相关数据类型及接口

      MI_ISP_CallBackParam_t

    3.19. MI_ISP_CallBackParam_t

    • 说明

      定义回调参数。

    • 定义

      typedef struct MI_ISP_CallBackParam_s
      {
      ​     MI_ISP_CallBackMode_e eCallBackMode;
      ​     MI_ISP_IrqType_e  eIrqType;
      ​     MI_ISP_CALLBK_FUNC  pfnCallBackFunc;
      ​     MI_U64    u64Data;
      } MI_ISP_CallBackParam_t;
      
    • 成员

      成员名称 描述
      eCallBackMode 回调模式
      eIrqType 硬件中断模式类型
      pfnCallBackFunc 回调接口指针
      u64Data 回调接口参数
    • 相关数据类型及接口

      MI_ISP_CallBackTask_Register

      MI_ISP_CallBackTask_Unregister

    3.20. MI_ISP_ZoomEntry_t

    • 说明

      定义 Zoom 单元条目类型。

    • 定义

      typedef struct MI_ISP_ZoomEntry_s
      {
      ​     MI_SYS_WindowRect_t stCropWin;
      ​     MI_U8 u8ZoomSensorId;
           MI_SYS_PixelFormat_e eSensorPixFormat;
           MI_SYS_WindowSize_t  stSensorRes;
      } MI_ISP_ZoomEntry_t;
      
    • 成员

      成员名称 描述
      stCropWin Crop位置参数
      u8ZoomSensorId Crop 参数对应的sensor Id
      eSensorPixFormat Crop 参数对应的sensor输出的format
      stSensorRes Crop 参数对应的sensor 输出分辨率
    • 注意事项

      u8ZoomSensorId和sensor driver中pCus_sensor_GetCurSwtichSensorId回调函数回传值对应。

      配置eSensorPixFormat和stSensorRes有限制条件,目前只支持VIF和ISP realtime绑定的时候,

      能够使用不同分辨率的sensor,如果是frame mode绑定不支持不同分辨率的sensor。

      若stSensorRes配置的宽和高为0,则忽略“支持不同分辨率sensor”。

      下面是一个伪代码,进攻说明参数用法参考:

      2688x1520,RG10BPP,the other:2560x1440,RG10BPP

      u8SnrPadId[2] = {0,1}
      eSensorPixFormat[2] = {32,32}
      stSensorRes[2] = {{0,0,2688,1520},{0,0,2560,1440}}
      pZoomTable->pVirTableAddr[i].u8ZoomSensorId = u8SnrPadId[u8SnrId];
      pZoomTable->pVirTableAddr[i].eSensorPixFormat = eSensorPixFormat[u8SnrId];
      pZoomTable->pVirTableAddr[i].stSensorRes.u16Width = stSensorRes[u8SnrId].u16Width;
      pZoomTable->pVirTableAddr[i].stSensorRes.u16Height = stSensorRes[u8SnrId].u16Height;
      
    • 相关数据类型及接口

      MI_ISP_ZoomTable_t

    3.21. MI_ISP_ZoomTable_t

    • 说明

      定义 Zoom Table 类型。

    • 定义

      typedef struct MI_ISP_ZoomTable_s
      {
      ​     MI_U32 u32EntryNum;
      ​     MI_ISP_ZoomEntry_t *pVirTableAddr;
      } MI_ISP_ZoomTable_t;
      
    • 成员

      成员名称 描述
      u32EntryNum Zoom Table 中包含条目数量
      pVirTableAddr Zoom Table Buffer Pointer
    • 相关数据类型及接口

      MI_ISP_LoadPortZoomTable

    3.22. MI_ISP_ZoomAttr_t

    • 说明

      定义 Zoom 属性。

    • 定义

      typedef struct MI_ISP_ZoomAttr_s
      {
      ​     MI_U32 u32FromEntryIndex;
      ​     MI_U32 u32ToEntryIndex;
      ​     MI_U32 u32CurEntryIndex;
      } MI_ISP_ZoomAttr_t;
      
    • 成员

      成员名称 描述
      u32FromEntryIndex 开始运行Zoom的条目索引
      u32ToEntryIndex 结束运行Zoom的条目索引
      u32CurEntryIndex 当前Zoom位置的索引
    • 相关数据类型及接口

      MI_ISP_StartPortZoom

      MI_ISP_GetPortCurZoomAttr

    3.23. MI_ISP_BufferLayout_e

    • 说明

      buffer布局。

    • 定义

      typedef enum
      {
      ​     E_MI_ISP_BUFFER_LAYOUT_ONE_FRAME,
      ​     E_MI_ISP_BUFFER_LAYOUT_MULTI_PLANE,
      ​     E_MI_ISP_BUFFER_LAYOUT_MAX,
      } MI_ISP_BufferLayout_e;
      
    • 成员

      成员名称 描述
      E_MI_ISP_BUFFER_LAYOUT_ONE_FRAME 布局在一个buffer
      E_MI_ISP_BUFFER_LAYOUT_MULTI_PLANE 布局在多个buffer
      E_MI_ISP_BUFFER_LAYOUT_MAX 布局的最大值
    • 注意事项

      • 只有stitch时,eBufLayout才能设置成E_MI_ISP_BUFFER_LAYOUT_MULTI_PLANE,此时output port输出E_MI_SYS_BUFDATA_MULTIPLANE类型的数据。否则输出E_MI_SYS_BUFDATA_FRAME 类型的数据。

      • 只有output port 1支持eBufLayout = E_MI_ISP_BUFFER_LAYOUT_MULTI_PLANE。

      • E_MI_SYS_BUFDATA_MULTIPLANE和E_MI_SYS_BUFDATA_FRAME的含义,请到 MI SYS API 中查看。

    • 相关数据类型及接口

      MI_ISP_SetOutputPortParam

      MI_ISP_GetOutputPortParam

    3.24. MI_ISP_Overlap_e

    • 说明

      重叠属性。

    • 定义

      typedef enum
      {
      ​     E_MI_ISP_OVERLAP_NONE,
      ​     E_MI_ISP_OVERLAP_128,
      ​     E_MI_ISP_OVERLAP_256,
      ​     E_MI_ISP_OVERLAP_MAX
      } MI_ISP_Overlap_e;
      
    • 成员

      成员名称 描述
      E_MI_ISP_OVERLAP_NONE 关闭overlap
      E_MI_ISP_OVERLAP_128 多读128列pixel
      E_MI_ISP_OVERLAP_256 多读256列pixel
      E_MI_ISP_OVERLAP_MAX Overlap最大值
    • 相关数据类型及接口

      MI_ISP_SetChnOverlapAttr

      MI_ISP_GetChnOverlapAttr

    3.25. MI_ISP_HDRExposureType_e

    • 说明

      定义 HDR 曝光模式。

    • 定义

      typedef enum
      {
      ​     E_MI_ISP_HDR_EXPOSURE_TYPE_NONE,
      ​     E_MI_ISP_HDR_EXPOSURE_TYPE_SHORT  = 0x1,
      ​     E_MI_ISP_HDR_EXPOSURE_TYPE_MEDIUM = 0x2,
      ​     E_MI_ISP_HDR_EXPOSURE_TYPE_LONG   = 0x4,
      ​     E_MI_ISP_HDR_EXPOSURE_TYPE_MAX
      } MI_ISP_HDRExposureType_e;
      
    • 成员

      成员名称 描述
      E_MI_ISP_HDR_EXPOSURE_TYPE_NONE 关闭曝光模式
      E_MI_ISP_HDR_EXPOSURE_TYPE_SHORT HDR 中的短曝
      E_MI_ISP_HDR_EXPOSURE_TYPE_MEDIUM HDR 中的中曝
      E_MI_ISP_HDR_EXPOSURE_TYPE_LONG HDR 中的长曝
      E_MI_ISP_HDR_EXPOSURE_TYPE_MAX 曝光模式的最大值
    • 相关数据类型及接口

      MI_ISP_ChnParam_t

      MI_ISP_SetChnParam

    3.26. MI_ISP_HDRFusionType_e

    • 说明

      定义 HDR 融合模式。

    • 定义

      typedef enum
      {
      ​     E_MI_ISP_HDR_FUSION_TYPE_NONE,
      ​     E_MI_ISP_HDR_FUSION_TYPE_2TO1,
      ​     E_MI_ISP_HDR_FUSION_TYPE_3TO1,
      ​     E_MI_ISP_HDR_FUSION_TYPE_MAX
      } MI_ISP_HDRFusionType_e;
      
    • 成员

      成员名称 描述
      E_MI_ISP_HDR_FUSION_TYPE_NONE 关闭融合模式
      E_MI_ISP_HDR_FUSION_TYPE_2TO1 2帧融合 HDR
      E_MI_ISP_HDR_FUSION_TYPE_3TO1 3帧融合 HDR
      E_MI_ISP_HDR_FUSION_TYPE_MAX 融合模式最大值
    • 相关数据类型及接口

      MI_ISP_ChnParam_t

      MI_ISP_SetChnParam

    3.27. MI_ISP_LdcAttr_t

    • 说明

      1D-LDC的属性。

    • 定义

      typedef struct MI_ISP_LdcAttr_s
      {
          MI_U32 u32CenterXOffset;
          MI_U32 u32CenterYOffset;
          MI_S32 s32Alpha;
          MI_S32 s32Beta;
          MI_U32 u32CropLeft;
          MI_U32 u32CropRight;
      } MI_ISP_LdcAttr_t;
      
    • 成员

      成员名称 描述
      u32CenterXOffset 光心坐标u0 [0, 2^15 - 1]
      u32CenterYOffset 光心坐标v0 [0, 2^15 - 1]
      s32Alpha 畸变矫正参数alpha,对距离x=0附近的图像矫正效果较明显,alpha越大,矫正强度越大,代表中心处畸变严重 [-2048, 2047]
      s32Beta 畸变矫正参数beta,对距离x=0较远,离图像左右边缘越近的图像矫正效果较明显,beta越大,矫正强度越大,代表边缘处畸变严重 [-2048, 2047]
      u32CropLeft 左边裁剪像素值,保证畸变后左侧无黑边 [0, 2^11 - 1]
      u32CropRight 右边裁剪像素值,保证畸变后右侧无黑边 [0, 2^11 - 1]
    • 相关数据类型及接口

      MI_ISP_SetLdcAttr

    3.28. MI_ISP_AiBnrSourceType_e

    • 说明

      定义 ISP AIBNR 抽点位置。

    • 定义

      typedef enum
      {
          E_MI_ISP_AI_BNR_SOURCE_TYPE_NONE,
          E_MI_ISP_AI_BNR_SOURCE_TYPE_LINEAR,
          E_MI_ISP_AI_BNR_SOURCE_TYPE_HDR_FUSION,
          E_MI_ISP_AI_BNR_SOURCE_TYPE_HDR_LONG,
          E_MI_ISP_AI_BNR_SOURCE_TYPE_MAX
      } MI_ISP_AiBnrSourceType_e;
      
    • 成员

      成员名称 描述
      E_MI_ISP_AI_BNR_SOURCE_TYPE_NONE 不开AI BNR
      E_MI_ISP_AI_BNR_SOURCE_TYPE_LINEAR AIBNR线性降噪模式
      E_MI_ISP_AI_BNR_SOURCE_TYPE_HDR_FUSION AI BNR HDR融合后降噪模式
      E_MI_ISP_AI_BNR_SOURCE_TYPE_HDR_LONG AI BNR HDR长曝降噪模式
      E_MI_ISP_AI_BNR_SOURCE_TYPE_MAX AI BNR source 边界值
    • 注意事项

      • AI BNR HDR 融合后降噪模式和 AI BNR HDR 长曝降噪模式需要 HDR 和 AI ISP 模块配合完成,需要两边都设置 HDR 开启。
    • 相关数据类型及接口

      MI_ISP_AiBnrAttr_t

    3.29. MI_ISP_AiBnrAttr_t

    • 说明

      定义 AI BNR 配置参数。

    • 定义

      typedef struct MI_ISP_AiBnrAttr_s
      {
          MI_ISP_AiBnrSourceType_e eAiSourceType;
          MI_U32                   u32ModelId;
      } MI_ISP_AiBnrAttr_t;
      
    • 成员

      成员名称 描述
      eAiSourceType ISP AI BNR 抽点位置。
      u32ModelId model的索引标识。
    • 相关数据类型及接口

      MI_ISP_AiBnrSourceType_e

      MI_ISP_SetAiBnrAttr

    3.30. MI_ISP_AiBnrModelParam_t

    • 说明

      定义 ISP AIBNR model配置参数。

    • 定义

      typedef struct MI_ISP_AiBnrModelParam_s
      {
          MI_U8   u8ModelPath[MAX_AI_MODEL_PATH_SIZE]; // Model Path
          MI_BOOL bUpdate;                             // FALSE: load model only, TRUE: load and enable new model.
      } MI_ISP_AiBnrModelParam_t;
      
    • 成员

      成员名称 描述
      u8ModelPath model路径
      bUpdate FALSE: 只加载model, TRUE: 可以加载model的同时使model生效
    • 注意事项

      • 当BNR开启后,如果再load model,model必须要和正在运行的model的类型一致。可以通过指定bUpdate为True来让model生效,当BNR没有开启时,bUpdate为True无效,仍需要在MI_ISP_SetAiBnrAttr接口的参数中设定正确的Model ID。
    • 相关数据类型及接口

      MI_ISP_LoadAiBnrModel

    3.31. MI_ISP_AiWdrAttr_t

    • 说明

      定义 AI WDR 配置参数。

    • 定义

      typedef struct MI_ISP_AiWdrAttr_s
      {
          MI_U32 u32AiWdrType;
          MI_U32 u32ModelId;
      } MI_ISP_AiWdrAttr_t;
      
    • 成员

      成员名称 描述
      u32AiWdrType ISP AI WDR 工作模式,由 MI_ISP_AiWdrType_e的bit mask来指定。
      u32ModelId model的索引标识。
    • 相关数据类型及接口

      MI_ISP_SetAiWdrAttr

      MI_ISP_GetAiWdrAttr

    3.32. MI_ISP_AiWdrType_e

    • 说明

      定义 ISP AI WDR的工作模式。

    • 定义

      typedef enum
      {
          E_MI_ISP_AI_WDR_TYPE_NONE  = 0x00,
          E_MI_ISP_AI_WDR_TYPE_LOCAL = 0x01,
          E_MI_ISP_AI_WDR_TYPE_MAX   = 0x02,
      } MI_ISP_AiWdrType_e;
      
    • 成员

      成员名称 描述
      E_MI_ISP_AI_WDR_TYPE_NONE 不开AI WDR
      E_MI_ISP_AI_WDR_TYPE_LOCAL AI WDR小背景模式
      E_MI_ISP_AI_WDR_TYPE_MAX AI WDR类型的枚举上限
    • 注意事项

      • AI WDR 开启需要 IQ 和 AI ISP 模块配合完成,需要两边都设置 AI WDR 开启。
    • 相关数据类型及接口

      MI_ISP_AiWdrAttr_t

    3.33. MI_ISP_AiWdrModelParam_t

    • 说明

      定义 ISP AI WDR model配置参数。

    • 定义

      typedef struct MI_ISP_AiWdrModelParam_s
      {
          MI_ISP_AiWdrType_e eAiWdrType;
          MI_U8              u8ModelPath[MAX_AI_MODEL_PATH_SIZE];
          MI_BOOL            bUpdate;
      } MI_ISP_AiWdrModelParam_t;
      
    • 成员

      成员名称 描述
      MI_ISP_AiWdrType_e model的AI WDR的类型
      u8ModelPath model路径
      bUpdate FALSE: 只加载model, TRUE: 可以加载model的同时使model生效
    • 注意事项

      • AI WDR不支持动态切换model。
    • 相关数据类型及接口

      MI_ISP_LoadAiWdrModel

    3.34. MI_ISP_Ai3dnrAttr_t

    • 说明

      定义 AI 3dnr 属性参数。

    • 定义

      typedef struct MI_ISP_Ai3dnrAttr_s
      {
          MI_BOOL bEnable;
          MI_U32 u32ModelId;
      } MI_ISP_Ai3dnrAttr_t;
      
    • 成员

      成员名称 描述
      bEnable AI 3dnr 使能
      u32ModelId AI 3dnr 模型 ID
    • 相关数据类型及接口

      MI_ISP_SetAi3dnrAttr

    3.35. MI_ISP_Ai3dnrModelParam_t

    • 说明

      定义 AI 3dnr 模型参数。

    • 定义

      typedef struct MI_ISP_Ai3dnrModelParam_s
      {
          MI_U8 u8ModelPath[MAX_AI_MODEL_PATH_SIZE];
          MI_BOOL bUpdate;
      } MI_ISP_Ai3dnrModelParam_t;
      
    • 成员

      成员名称 描述
      u8ModelPath AI 3dnr 模型路径
      bUpdate 加载模型及使能新模型
    • Related data type and interface

      MI_ISP_LoadAi3dnrModel

    4. ISP错误码

    API 错误码如下表所示。

    表 4‑1:API 错误码

    错误代码 宏定义 描述
    0xA0078001 MI_ERR_ISP_INVALID_CHNID 设备通道号无效
    0xA0078002 MI_ERR_ISP_INVALID_PORTID 设备端口号无效
    0xA0078003 MI_ERR_ISP_ILLEGAL_PARAM 非法参数
    0xA0078004 MI_ERR_ISP_EXIST 设备已经退出
    0xA0078005 MI_ERR_ISP_UNEXIST 设备还没有退出
    0xA0078006 MI_ERR_ISP_NULL_PTR 空指针参数
    0xA0078008 MI_ERR_ISP_NOT_SUPPORT 不支持
    0xA0078009 MI_ERR_ISP_NOT_PERM 操作不允许
    0xA007800C MI_ERR_ISP_NOMEM 分配内存失败
    0xA007800D MI_ERR_ISP_NOBUF 内存已经使用完
    0xA007800E MI_ERR_ISP_BUF_EMPTY 视频输入缓存为空
    0xA0078010 MI_ERR_ISP_NOTREADY 设备未初始化完成
    0xA0078012 MI_ERR_ISP_BUSY 设备系统繁忙

    5. PROCFS介绍

    5.1. cat

    • 调试信息

      # cat /proc/mi_modules/mi_isp/mi_isp0
      

    • 调试信息分析

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

    • 参数说明

      参数 描述
      ISP Dev info DevId Isp Dev Id
      CreChnNum 当前 Chn 数量
      DevMask Stitch Dev Mask
      cmdq Cmdq 指针
      En ISR 中断使能标志
      Mode ISR 中断模式
      num ISR ID
      VsyncCnt ISR ID
      FrameDoneCnt ISR Frame Done Cnt
      DropCnt ISR Frame Drop Cnt
      crcfailcnt input crc校验失败次数
      RdmaVfcFailCnt input VFC 解压fail cnt
      3dnrVfcFailCnt 3dnr VFC 解压fail cnt
      fifofullcnt 发生fifo full cnt
      rstcnt 发生reset hw cnt
      ISP Chn info DevId Isp Dev Id
      ChnId Isp Chn Id
      start Chn Start Flag
      SnrId Bind sensorId
      Sync3A Sync 3A type
      chnNum Muti chn Num
      Crop Input Crop Size
      InSize Input Size
      pixel Input pixel format
      compress Input compress type
      Stride Input Buffer Stride
      Atom 底层拿住 buffer 数量
      Atom0 释放 buffer 后底层没有 buffer 数量
      Rot Rotation 角度
      bMirror/Flip 水平/竖直 翻转
      3DNRLevel 3DNR Level
      HdrMode HDR mode
      CustMode AI ISP Cust Seg mode
      CustFrom AI ISP From Cust seg
      CustTo AI ISP to Cust
      PTMax/Cur 硬件处理所花最长时间/当前帧硬件处理所花时间
      PreCnt/EnqCnt/BarCnt/ checkin/checkout/DeqCnt Callback 接口执行次数
      MaxIv/MinIv callback 执行的间隔时间
      DropCnt drop task cnt
      EnqOTNull Enq 时 OutBuffer 为 Null 次数统计
      ISP OutPut Port info DevId Dev Id
      ChnId Plane id
      PortID Port Id
      Bindtype 与后级绑定模式
      Enable Port enable flag
      Pixel Port output pixel format
      compress Port output compress type
      PortCrop output Crop Size
      Stride Output Stride
      GetCnt 尝试获取 OutPut buffer 数量
      Failcnt 获取 OutPut buffer 失败数量
      FinishCnt 处理完 OutPut buffer 数量
      fps Output port frame rate

    5.2. echo

    # echo help > /proc/mi_modules/mi_isp/mi_isp0
    

    Echo help 查看可用命令

    功能
    Stop 指定 channel
    命令 echo stopchnl [ChnID] [ON/OFF] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 [ChnId] 通道号
    [ON/OFF] ON: stop chn OFF: start chn
    举例 echo stopchnl 0 ON > /proc/mi_modules/mi_isp/mi_isp0
    功能
    Dump选定channel的output数据,并保存在/path路径下
    命令 echo dumptaskfile [chnid, Cnt, /path/, bOnlyDumpResChange, bdumpport] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    Cnt: dump 数量
    Path: 存放dump出来文件的路径
    bOnlyDumpResChange: 有时候有些花图在切分辨率时产生,敲 dump 命令和切分辨率操作不好配合,可以先设置该参数,然后再切分辨率,当程序识别到分辨率变化时就会将分辨率变化后的那张 buffer dump 出来。 (非必选参数)
    Bdumpport: 只dump 某一个portid,默认是dump 所有在输出的port。 (非必选参数)
    举例 echo dumptaskfile 0 1 /mnt > /proc/mi_modules/mi_isp/mi_isp0
    功能
    设置Dev的atomvalue
    命令 echo setatom [chnid AtomValue] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 chnid: chnel id
    AtomValue: input realtime mode下Driver 最大持有buffer 数量
    举例 echo setatom 0 3 > /proc/mi_modules/mi_isp/mi_isp0
    注意:有时候底层卡住,可以尝试增大该atom,加塞一张buffer 给driver,重新trig,看是否可以恢复,或者掉帧的时候,加大是否可以满帧。
    功能
    清除指定channel port的input/output/done buffer
    命令 echo clearbuf [chnid, portid bClearInput, bclearoutput, bcleardonebuff] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    Portid: port id
    bClearInput: 清除input的buffer
    bclearoutput: 清除output的buffer
    bcleardonebuff: 清除done的buffer
    举例 echo clearbuf 0 0 1 0 0 > /proc/mi_modules/mi_isp/mi_isp0
    功能
    设置debug level
    命令 echo debuglv [level] >/proc/mi_modules/mi_isp/mi_isp0
    echo debuglv [chnid][level] >/proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    Level:
    单个level参数时: 1:isp api,2:flow,4:check irq done
    两个参数时: 1:check buffer,2:check loop,4:check frame pts,8:check fence done,16:check func time,32:check sidebandmsg,64:check zoominfo
    举例 echo debuglv 4 > /proc/mi_modules/mi_isp/mi_isp0 //打开check irq done 相关的MI打印
    echo debuglv 0 3 > /proc/mi_modules/mi_isp/mi_isp0 //打开channel0 level3的打印,打印buffer info和loop info
    功能
    主动drop frame 数量
    命令 echo skipframe [chnid, skipnum] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    skipnum: drop frame count
    举例 echo skipframe 0 60 > /proc/mi_modules/mi_isp/mi_isp0
    功能
    将 Bind Q 中缓存的 buffer 消耗掉
    命令 echo clearbindq [chnid bclear] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    bclear: 是否clear
    举例 echo clearbindq 0 1 > /proc/mi_modules/mi_isp/mi_isp0 //clear channel0 bindQ
    将 Bind Q 中缓存的 buffer 消耗掉。
    有时候前端拿不到 buffer,发现是ISP BindQ塞满,判断 ISP 是否拿的不够快,将bindQ清空,看BindQ中是否还会累加上来,如果还累加则说明ISP拿的不够快,如果不再增加,说明是之前一次异常塞在里面一直没有消耗掉。
    功能
    设置打印帧率,低于该值打印出来
    命令 echo fpsth [chnid portid fpsint fpsfloat] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    Portid: port id
    fpsint: 帧率整数位
    fpsfloat: 帧率小数位
    举例 echo fpsth 0 0 30 30 > /proc/mi_modules/mi_isp/mi_isp0 // channel0 port0中小于30.30的fps打印出来
    功能
    设置打印pts,超过区间值打印出来
    命令 echo ptsth [chnid portid minptsinterval maxptsinterval] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    Portid: port id
    minptsinterval: pts间隔的最小值
    maxptsinterval: pts间隔的最大值
    举例 echo ptsth 0 0 30000 40000 > /proc/mi_modules/mi_isp/mi_isp0 // channel0 port0中pts间隔小于30ms大于40ms的值打印出来
    功能
    设置port是否enable
    命令 echo enableport [chnid, portid, bEn] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    Portid: port id
    bEn: 1/0
    举例 echo enableport 0 0 1 > /proc/mi_modules/mi_isp/mi_isp0
    功能
    设置 output port 参数
    命令 echo outputparam pixel [chnid, portid pixelmode] > /proc/mi_modules/mi _isp/mi_isp0
    echo outputparam compress [chnid, portid compressmode] > /proc/mi_modules/mi_isp/mi_isp0
    echo outputparam crop [chnid, portid cropX cropY cropW cropH] > /proc/mi_modules/mi_isp/mi_isp0
    echo outputparam all [chnid, portid pixelmode compressmode cropX cropY cropW cropH] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    Portid: port id
    Pixelmode: 输出的pixel类型,填入MI_SYS_PixelFormat_e 中对应的数值
    Compressmode:输出的压缩模式,填入MI_SYS_CompressMode_e中对应的数值
    cropX:输出的端口裁剪X坐标
    cropY:输出的端口裁剪Y坐标
    cropW:输出的端口裁剪宽度
    cropH:输出的端口裁剪高度
    举例 echo outputparam pixel 0 1 11 > /proc/mi_modules/mi_isp/mi_isp0
    echo outputparam compress 0 1 5 > /proc/mi_modules/mi_isp/mi_isp0
    echo outputparam crop 0 1 0 0 1920 1080 > /proc/mi_modules/mi_isp/mi_isp0
    echo outputparam all 0 1 11 5 0 0 1920 1080 > /proc/mi_modules/mi_isp/mi_isp0
    功能
    设置始终送同一张画面
    命令 echo sendoneframe [chnid, bEn] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    bEn: 1/0
    举例 echo sendoneframe 0 1 > /proc/mi_modules/mi_isp/mi_isp0
    功能
    设置3dnr level
    命令 echo dnrlevel [chnid, level] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    level: 3dnr level, 值同MI_ISP_3DNR_Level_e
    举例 echo dnrlevel 0 1 > /proc/mi_modules/mi_isp/mi_isp0
    功能
    reset 整个isp 硬件
    命令 echo resethw > /proc/mi_modules/mi_isp/mi_isp0
    参数说明
    举例 echo resethw > /proc/mi_modules/mi_isp/mi_isp0
    功能
    设置output crc 校验
    命令 echo crcmode [chnid, bEn] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    bEn: 1/0
    举例 echo crcmode 0 1 > /proc/mi_modules/mi_isp/mi_isp0
    功能
    设置DataGen
    命令 echo datagen [chnid, bEn] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 Chnid: channel id
    bEn: 1/0
    举例 echo datagen 0 1 > /proc/mi_modules/mi_isp/mi_isp0
    功能
    设置发生cmdq timeout之后执行的命令抓取信息
    命令 echo cmdqtimeout [bEn, keyword, cmdline, path] > /proc/mi_modules/mi_isp/mi_isp0
    参数说明 bEn: 1/0
    keyword: 执行的命令
    cmdline: 执行的字符串
    path: 信息保存路径
    举例 echo 1 cat /proc/mi_modules/mi_isp/mi_isp0 /mnt/cmdqerr.txt > /proc/mi_modules/mi_isp/mi_isp0

    5.2.1. ctrlparam

    你可以通过echo命令来手动设定ctrlparam参数。

    如果你使用的模型是sgs的,那么其格式如下:

        # echo ctrlparam [chnid] [k] [s] [minNoiseRatio] [maxNoiseRatio] > /proc/mi_modules/mi_isp/debug_hal/isp_dbg
    

    如果你使用的是自定义的模型,那么也可以通过以上接口来设定 ctrlparam,参数个数由你的模型决定:

        # echo ctrlparam [chnid] [param_0] [param_1] [...] [param_n] > /proc/mi_modules/mi_isp/debug_hal/isp_dbg
    

    以上两种形式,如果你给的参数是-1,那么该位置的参数将恢复到默认计算的模式。

    6. MODPARAM.json介绍

    6.1. json文件内容

    {
    
        "E_MI_MODULE_ID_ISP" :
        {
            "u32DefaultDropNum": 10,
            "s32ForceOverlap": -1,
            "s32RotExtraBuf": -1,
            "s32BufLayout": -1,
            "bDefaultDropFifoBuffer": true,
            "bFlushBuffer": true,
            "s32ModuleTotalPlanenum": -1,
            "u32threadPriorityArray": [98],
            "u64PmTimeoutLatencyNS": [1000000000],
            "au8ChnMaxEnqTasks": [0,0,2],
            "bEnableSuspendWaitDone": true,
            "u32DevDbgLv": [0,0],
            "u32ChnDbgLv": [0,0,0,0],
            "isp_clk" : 288000000,
            "rootPath": "/config/iqfile",
            "bSeg1Hdrout": false,
            "bUseHwResetArray": false,
            "bCmdqTimeOutDbgArray": false,
            "u16CpuMaskAffinityArray": 0,
            "u32ChnMaxNumArray": 4,
            "bCrcEnableArray": 0,
            "u32BaseFrameIdxArray": 0
        }
    }
    

    modparam.json 文件在/config 目录下,该文件在ISP 初始化阶段会加载进去。


    6.2. ISP 常用参数以及参数解析

    参数名 默认值 支持chip 是否客户配置 作用
    u32DefaultDropNum 10 Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp 默认丢弃的帧数, 设置范围[0-U32MAX]
    s32ForceOverlap -1 Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp 强制重叠的范围, -1: 自适应,或者0/128/256/...
    s32RotExtraBuf -1 Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp rot 是否使用额外的buffer,-1:自适应,0(关闭),1(开启)
    s32BufLayout -1 Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp 数据存放方式,-1:自适应,0(一张),1(左右拼接),2(上下拼接),3(多张)
    bDefaultDropFifoBuffer true Maruko, Opera, Souffle, Pcupid以及后续的chip Y 设置 isp 是否默认丢弃缓存里的,false(关闭),true(开启)
    bFlushBuffer true Maruko, Opera, Souffle, Pcupid以及后续的chip Y 设置 isp 是否快速刷新buffer,false(关闭),true(开启)
    s32ModuleTotalPlanenum -1 Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp 最大平面数量,-1: 自适应, [0-U32MAX]
    u32threadPriorityArray [98] Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp dev 线程优先级,[0-U32MAX],需要按顺序设置每个dev的优先级
    u64PmTimeoutLatencyNS [1000000000] Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp dev 休眠最大等待时间,[0-U64MAX],需要按顺序设置每个dev的等待时间
    au8ChnMaxEnqTasks [0,0,2] Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp dev channel 最多 enque 的 task 数量。此参数3个为一组,每组参数依次为 dev, channel, taskNum [0-U8MAX]
    bEnableSuspendWaitDone true Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp 在进入suspend之前是否等待任务做完,false(关闭),true(开启)
    u32DevDbgLv [0,0] Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp dev 日志调式等级。此参数2个为一组,参数依次为 dev, dbglv [0-U32MAX]
    u32ChnDbgLv [0,0,0,0] Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp dev channel 日志调式等级。此参数4个为一组,参数依次为 dev, channel, passid, dbglv[0-U32MAX]
    isp_clk 0 Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp clock, [0-U32MAX],0: 使用设备树配置的值
    rootPath "" Maruko, Opera, Souffle, Pcupid以及后续的chip N 设置 isp iqfile的根目录,空字符串表示使用默认值:在linux下是 /config/iqfile,在dualos下是 /misc
    bSeg1Hdrout false Maruko, Opera, Souffle, Iford以及后续的chip Y 设置 isp seg1 的输出位置,0: 3dnr 之前,1: hdr 之后
    bUseHwResetArray false Maruko, Opera, Souffle, Iford以及后续的chip Y 设置 isp dev 是否开启复位机制,0(关闭),1(开启)
    bCmdqTimeOutDbgArray false Maruko, Opera, Souffle, Iford以及后续的chip N 设置 isp dev 是否开启复位调式机制,0(关闭),1(开启)
    u16CpuMaskAffinityArray 0 Maruko, Opera, Souffle, Iford以及后续的chip N 设置 isp dev CPU 亲和力,0(全部cpu),bit[0,3]对应 cpu[0,3]
    u32ChnMaxNumArray 4 Maruko, Opera, Souffle, Iford以及后续的chip N 设置 isp dev 最大 channel 数量,[0-U32MAX]
    bCrcEnableArray 0 Maruko, Opera, Souffle, Iford以及后续的chip N 设置 isp port crc 校验是否开启,0(关闭),1(开启)
    u32BaseFrameIdxArray 0 Maruko, Opera, Souffle, Iford以及后续的chip N 设置 isp port 基础帧ID, [0-U32MAX]

    7. 注意事项

    7.1. STA

    VIF和ISP frame mode绑定的时候,为了减少统计delay,VIF的硬件支持对输入的图像进行AE/AF的统计,但是它与ISP的STA统计只能二选一。并且,常常这两个地方容易混淆。对于使用者来说,简单记住以下条件即可。

    (1)使用ISP的STA

    modparam.json,ISP的节点配置了bUseVifSta为false

        "E_MI_MODULE_ID_ISP"
        {
            ...
            "bUseVifSta" : false,
            ...
        } ,
    

    配置VIF时,MI_VIF_CreateDevGroup的MI_VIF_GroupAttr_t参数要把u32MetaDataTypeMask配置为0

        MI_VIF_GroupAttr_t stGroupAttr;
        memset(&stGroupAttr, 0x0, sizeof(MI_VIF_GroupAttr_t));
        ...
        stGroupAttr.stMetaDataAttr.u32MetaDataTypeMask = 0;
        MI_VIF_CreateDevGroup(groupId, &stGroupAttr);
        ...
    

    (2)使用VIF的STA

    modparam.json,ISP的节点配置了bUseVifSta为true(或者不要去配置,默认就是为true)

        "E_MI_MODULE_ID_ISP"
        {
            ...
            "bUseVifSta" : true,  //或者没有显示配置
            ...
        } ,
    

    配置VIF时,MI_VIF_CreateDevGroup的MI_VIF_GroupAttr_t参数要把u32MetaDataTypeMask配置为20

        MI_VIF_GroupAttr_t stGroupAttr;
        memset(&stGroupAttr, 0x0, sizeof(MI_VIF_GroupAttr_t));
        ...
        stGroupAttr.stMetaDataAttr.u32MetaDataTypeMask = E_MI_VIF_METADATA_AE_STAT | E_MI_VIF_METADATA_AF_STAT;
        MI_VIF_CreateDevGroup(groupId, &stGroupAttr);
        ...
    

    如果发现统计值不对或者图像效果不对,可以看一下是不是统计值这部分的逻辑配置错误。

    7.2. 旋转

    使用AI BNR的时候,ISP做旋转(ROT)是有一些限制的,这是由于旋转和非旋转使用的AI模型是不一样的,因此如果要做旋转,需要在原先旋转流程的基础上增加重新load带旋转的AI模型(调用MI_ISP_LoadAiBnrModel)。

    7.3. 多路aibnr

    当你需要做以下任意行为的时候,需要额外配置modparam.json中的参数:

    • 跑单sensor且运行过程中会动态关闭或者开启aibnr

    • 跑多sensor且至少有一路可能会开启aibnr,无论是否需要动态切换

    参数说明:

    "E_MI_MODULE_ID_ISP" :
    {
        "bEnableAiBnrArray": [true, true],
        "s32ResolutionArray": [2560, 1440, 15, 2688, 1520, 15],
    },
    
    • bEnableAiBnrArray:数组,每一路是否有可能会开aibnr,只要有可能开就得配为 true

    • s32ResolutionArray:每一路的 width,height,fps,跑起来的时候需要能够匹配得上,否则会出错