MI DIVP API

Version 2.07


1. 概述


1.1. 模块说明

DIVP支持对一幅输入图像进行预处理,如裁剪等,然后再对各通道分别进行缩放处理,最后输出多种不同分辨率的图像。

DIVP支持的具体图像处理功能包括:

  • 图像的裁剪

  • 图像像素格式转换

  • 图像的旋转

  • 图像的镜像操作

  • 图像的拉伸和缩放


1.2. 流程框图

注意:不支持图像旋转的芯片列有Macaron、Taiyaki、Takoyaki、Ispahan系列。


1.3. 关键字说明

关键字 说明
crop 图像剪裁
rotate 图像旋转
scaling up/down 图像拉伸和缩放
Mirror/flip 图像镜像操作
Pixel format convert 图像像素格式转换

2. API 参考


2.1. 功能模块API

API名 功能
MI_DIVP_CreateChn 创建一个 DIVP channel
MI_DIVP_DestroyChn 销毁一个 DIVP channel
MI_DIVP_SetChnAttr 设置 DIVP channel的属性
MI_DIVP_GetChnAttr 获取 DIVP channel的属性
MI_DIVP_StartChn 开启一个通道
MI_DIVP_StopChn 禁用一个通道
MI_DIVP_SetOutputPortAttr 设置 DIVP output port的属性
MI_DIVP_GetOutputPortAttr 获取 DIVP output port的属性
MI_DIVP_RefreshChn 在暂停的状态下刷新某个channel
MI_DIVP_StretchBuf 缩放、拉伸、裁剪指定内存中的图像数据
MI_DIVP_InitDev 初始化DIVP设备
MI_DIVP_DeInitDev 反初始化DIVP设备
MI_DIVP_StretchBufEx 缩放、拉伸、裁剪指定内存区域中的图像数据,并输出到目标内存

2.2. MI_DIVP_CreateChn

  • 功能

    创建一个新的DIVP channel。

  • 语法

    MI_S32 MI_DIVP_CreateChn (
    
    MI_DIVP_CHN DivpChn,
    
    MI_DIVP_ChnAttr_t * pstAttr);
    
  • 形参

    参数名称 描述 输入/输出
    DivpChn 返回被创建的DIVP通道的ID,DIVP最多支援6个通道,取值范围[0,5] 输入
    pstAttr DVIP通道属性的指针,用于设定被创建的通道的属性 输入
  • 返回值

    • MI_SUCCESS 成功创建一个新的DIVP通道。

    • MI_DIVP_ERR_FAILED 创建DIVP通道失败

    • MI_DIVP_ERR_NO_RESOUCE 系统资源不足,创建DIVP通道失败

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so

  • 注意

    DIVP 模块最多支援6个channel,当上层创建的channel总数大于6个或者系统资源不足时会创建失败。

  • 举例

    MI_DIVP_CHN u32ChnId = 0;
    
    MI_DIVP_ChnAttr_t stDivpChnAttr;
    
    MI_DIVP_OutputPortAttr_t stDivpOutputPortAttr;
    
    memset(&stDivpChnAttr,0,sizeof(MI_DIVP_ChnAttr_t));
    
    memset(&stDivpOutputPortAttr,0,sizeof(MI_DIVP_OutputPortAttr_t));
    
    stDivpChnAttr.bHorMirror = false;
    
    stDivpChnAttr.bVerMirror = false;
    
    stDivpChnAttr.eDiType = E_MI_DIVP_DI_TYPE_OFF;
    
    stDivpChnAttr.eRotateType = E_MI_SYS_ROTATE_90;
    
    stDivpChnAttr.eTnrLevel = E_MI_DIVP_TNR_LEVEL_OFF;
    
    stDivpChnAttr.stCropRect.u16X = 0;
    
    stDivpChnAttr.stCropRect.u16Y = 0;
    
    stDivpChnAttr.stCropRect.u16Width = 1280;
    
    stDivpChnAttr.stCropRect.u16Height = 720;
    
    stDivpChnAttr.u32MaxWidth = 1920;
    
    stDivpChnAttr.u32MaxHeight = 1080;
    
    MI_DIVP_CreateChn(u32ChnId,&stDivpChnAttr);
    
    MI_DIVP_GetChnAttr(u32ChnId,&stDivpChnAttr);
    
    stDivpChnAttr.stCropRect.u16X = 0;
    
    stDivpChnAttr.stCropRect.u16Y = 0;
    
    stDivpChnAttr.stCropRect.u16Width = 1920;
    
    stDivpChnAttr.stCropRect.u16Height = 1080;
    
    MI_DIVP_SetChnAttr(u32ChnId,&stDivpChnAttr);
    
    stDivpOutputPortAttr.eCompMode = E_MI_SYS_COMPRESS_MODE_NONE;
    
    stDivpOutputPortAttr.ePixelFormat = E_MI_SYS_PIXEL_FRAME_YUV422_YUYV;
    
    stDivpOutputPortAttr.u32Width = 1920;
    
    stDivpOutputPortAttr.u32Height = 1080;
    
    MI_DIVP_SetOutputPortAttr(u32ChnId,&stDivpOutputPortAttr);
    
    MI_DIVP_StartChn(u32ChnId);
    
    //exit flow
    
    MI_DIVP_StopChn(u32ChnId);
    
    MI_DIVP_DestroyChn(u32ChnId);
    
  • 相关主题

    MI_DIVP_DestroyChn


2.3. MI_DIVP_DestroyChn

  • 功能

    销毁一个 DIVP通道。

  • 语法

    MI_S32 MI_DIVP_DestroyChn(MI_DIVP_CHN DivpChn);
    
  • 形参

    参数名称 描述 输入/输出
    DivpChn 被销毁的DVIP通道的ID 输入
  • 返回值

    • MI_SUCCESS 成功销毁DVIP通道。

    • MI_DIVP_ERR_FAILED 销毁DVIP通道失败。

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so

  • 相关主题

    MI_DIVP_CreateChn


2.4. MI_DIVP_SetChnAttr

  • 功能

    设置 DIVP channel的属性。

  • 语法

    MI_S32 MI_DIVP_SetChnAttr(
    
    MI_DIVP_CHN DivpChn,
    
    MI_DIVP_ChnAttr_t * pstAttr);
    
  • 形参

    参数名称 描述 输入/输出
    DivpChn DIVP 通道的ID 输入
    pstAttr 设定的DVIP通道的属性的结构体指针 输入
  • 返回值

    • MI_SUCCESS 成功设定DIVP通道的属性

    • MI_DIVP_ERR_FAILED 设置DIVP通道的属性失败,MI_ERR_INVALID_PARAMETER 传入的参数有问题,请参考MI_DIVP_ChnAttr_t

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so

  • 注意

    通道属性结构体成员中输入图像的最大宽度与最大高度为静态属性,通道创建后不能改变。

  • 相关主题

    MI_DIVP_GetChnAttr


2.5. MI_DIVP_GetChnAttr

  • 功能

    获取 DIVP channel的属性。

  • 语法

    MI_S32 MI_DIVP_GetChnAttr(
    
    MI_DIVP_CHN DivpChn,
    
    MI_DIVP_ChnAttr_t * pstAttr);
    
  • 形参

    参数名称 描述 输入/输出
    DivpChn DIVP 通道的ID 输入
    pstAttr 传回的DVIP通道的属性的结构体指针 输出
  • 返回值

    • MI_SUCCESS 成功获取DIVP通道的属性。

    • MI_DIVP_ERR_FAILED 获取DIVP通道的属性失败。

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so

  • 注意

    第一次获取时返回创建时的初始值。

  • 相关主题

    MI_DIVP_SetChnAttr


2.6. MI_DIVP_StartChn

  • 功能

    开启一个通道。

  • 语法

    MI_S32 MI_DIVP_StartChn(MI_DIVP_CHN DivpChn);
    
  • 形参

    参数名称 描述 输入/输出
    DivpChn DIVP 通道的ID 输入
  • 返回值

    • MI_SUCCESS 成功启用DIVP通道。

    • MI_DIVP_ERR_FAILED 启用DIVP通道失败。

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so

  • 注意

    通道必须已经被创建,且没有被销毁。

  • 相关主题

    MI_DIVP_StopChn


2.7. MI_DIVP_StopChn

  • 功能

    禁用一个通道。

  • 语法

    MI_S32 MI_DIVP_StopChn(MI_DIVP_CHN  DivpChn);
    
  • 形参

    参数名称 描述 输入/输出
    DivpChn DIVP 通道的ID 输入
  • 返回值

    • MI_SUCCESS 成功禁用DIVP通道。

    • MI_DIVP_ERR_FAILED 禁用DIVP通道失败。

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so

  • 注意

    重复禁用一个通道会返回MI_SUCCESS。

  • 相关主题

    MI_DIVP_StartChn


2.8. MI_DIVP_SetOutputPortAttr

  • 功能

    DIVP 通道上output port的属性。

  • 语法

    MI_S32 MI_DIVP_SetOutputPortAttr (
    
    MI_DIVP_CHN DivpChn,
    
    MI_DIVP_OutputPortAttr_t* pstOutputPortAttr);
    
  • 形参

    参数名称 描述 输入/输出
    DivpChn DIVP 通道的ID 输入
    pstOutputPortAttr Output port的属性的指针 输入
  • 返回值

    • MI_SUCCESS 成功设定DIVP通道绑定的output port的属性。

    • MI_DIVP_ERR_FAILED 设定DIVP通道绑定的output port的属性失败。

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so

  • 相关主题

    MI_DIVP_GetOutputPortAttr


2.9. MI_DIVP_GetOutputPortAttr

  • 功能

    获取 DIVP output port的属性。

  • 语法

    MI_S32 MI_DIVP_GetOutputPortAttr(
    
    MI_DIVP_CHN DivpChn,
    
    MI_DIVP_OutputPortAttr_t* pstOutputPortAttr);
    
  • 形参

    参数名称 描述 输入/输出
    DivpChn DIVP 通道的ID 输入
    pstOutputPortAttr Output port的属性的指针 输出
  • 返回值

    • MI_SUCCESS 成功获取DIVP通道绑定的output port的属性。

    • MI_DIVP_ERR_FAILED 获取DIVP通道绑定的output port的属性失败。

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so

  • 相关主题

    MI_DIVP_SetOutputPortAttr


2.10. MI_DIVP_RefreshChn

  • 功能

    暂停状态下刷新DIVP channel。

  • 语法

    MI_S32 MI_DIVP_RefreshChn (
    
    MI_DIVP_CHN DivpChn);
    
  • 形参

    参数名称 描述 输入/输出
    DivpChn 被刷新的channel的ID 输入
  • 返回值

    • MI_SUCCESS 成功刷新DIVP的channel。

    • MI_DIVP_ERR_NO_CONTENT 该通道没有内容。

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so

  • 注意

    该接口适用于channel在暂停的状态下重新刷新。

  • 举例

    DIVP绑定VDEC的场景下,调用该接口,DIVP可以保留VDEC停止送流后的最后一帧画面,并重复处理然后送给后端,直到VDEC重新开始送流,DIVP才会处理新的画面。


2.11. MI_DIVP_StretchBuf

  • 功能

    缩放、拉伸、裁剪指定内存区域中的图像数据,并输出到目标内存。

  • 语法

    MI_S32 MI_DIVP_StretchBuf(MI_DIVP_DirectBuf_t *pstSrcBuf, MI_SYS_WindowRect_t *pstSrcCrop, MI_DIVP_DirectBuf_t *pstDstBuf);
    

2.12. MI_DIVP_InitDev

  • 描述

    初始化divp设备。

  • 语法

    MI_S32 MI_DIVP_InitDev(MI_DIVP_InitParam_t *pstInitParam);
    
  • 参数

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

    • MI_OK 成功

    • 非M_OK 失败,参照错误码

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so


2.13. MI_DIVP_DeInitDev

  • 描述

    反初始divp设备。

  • 语法

    MI_S32 MI_DIVP_DeInitDev(void);
    
  • 返回值

    • MI_OK 成功。

    • 非MI_OK 失败,参照错误码

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so

  • 注意

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

    • 如果本接口在app退出前没有调用,内部会自动反初始化设备。

  • 形参

    |参数名称|描述|输入/输出| |---|---|---|---| |pstSrcBuf| 用来存放待处理图像内存信息的结构体指针,不可以为NULL| 输入| |pstSrcCrop |图像裁剪相关信息的结构体指针,如果不需要做裁剪,可以传NULL| 输入| |pstDstBuf| 保存处理后图像内存信息的结构体指针,不可以为NULL| 输入|

  • 返回值

    • MI_SUCCESS 图像处理成功。

    • MI_DIVP_ERR_FAILED 图像处理失败。

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so

  • 注意

    该接口只支持YUV420SP或者ARGB8888的像素格式。

  • 举例

    #define SRC_WIDTH 1280
    #define SRC_HEIGHT 720
    #define SRC_BUFF_STRIDE (ALIGN_UP(SRC_WIDTH,16))
    #define SRC_BUFF_SIZE (SRC_BUFF_STRIDE*SRC_HEIGHT*3/2)
    
    #define DST_WIDTH 640
    #define DST_HEIGHT 480
    #define DST_BUFF_STRIDE (ALIGN_UP(DST_WIDTH,16))
    #define DST_BUFF_SIZE (DST_BUFF_STRIDE*DST_HEIGHT*3/2)
    
    #define CROP_X 200
    #define CROP_Y 100
    #define CROP_W 68
    #define CROP_H 48
    
    int main(void)
    {
        MI_PHY phySrcBufAddr = 0;
        MI_PHY phyDstBufAddr = 0;
        MI_DIVP_DirectBuf_t stSrcBuf;
        MI_DIVP_DirectBuf_t stDstBuf;
        MI_SYS_WindowRect_t stSrcCrop;
    
        MI_SYS_MMA_Alloc(NULL, SRC_BUFF_SIZE, &phySrcBufAddr);
        MI_SYS_MMA_Alloc(NULL, DST_BUFF_SIZE, &phyDstBufAddr);
    
        stSrcBuf.ePixelFormat = E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_420;
        stSrcBuf.u32Width = SRC_WIDTH;
        stSrcBuf.u32Height = SRC_HEIGHT;
        stSrcBuf.u32Stride[0] = SRC_BUFF_STRIDE;
        stSrcBuf.u32Stride[1] = SRC_BUFF_STRIDE;
        stSrcBuf.phyAddr[0] = phySrcBufAddr;
        stSrcBuf.phyAddr[1] = stSrcBuf.phyAddr[0] + SRC_BUFF_STRIDE*SRC_HEIGHT;
        stDstBuf.ePixelFormat = E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_420;
        stDstBuf.u32Width = DST_WIDTH;
        stDstBuf.u32Height = DST_HEIGHT;
        stDstBuf.u32Stride[0] = DST_BUFF_STRIDE;
        stDstBuf.u32Stride[1] = DST_BUFF_STRIDE;
        stDstBuf.phyAddr[0] = phyDstBufAddr;
        stDstBuf.phyAddr[1] = stDstBuf.phyAddr[0] + DST_BUFF_STRIDE*DST_HEIGHT;
    
        stSrcCrop.u16X = CROP_X;
        stSrcCrop.u16Y = CROP_Y;
        stSrcCrop.u16Width = CROP_W;
        stSrcCrop.u16Height = CROP_H;
    
        if(FillSrcBuf("./1280x720_yuv420.yuv", &stSrcBuf))
        return NULL;
        if(MI_SUCCESS == MI_DIVP_StretchBuf(&stSrcBuf, &stSrcCrop, &stDstBuf))
        {
            if(DumpDstBuf(&stDstBuf))
            return NULL;
        }
    
        MI_SYS_MMA_Free(phySrcBufAddr);
        MI_SYS_MMA_Free(phyDstBufAddr);
    }
    
    //fill src buff with yuv420/argb8888 image data
    static int FillSrcBuf(const char* FilePath,MI_DIVP_DirectBuf_t *pstDirectSrcBuf)
    {
        int ret = 0;
        FILE *fp;
        void *pVirSrcBufAddr = NULL;
        int LineIdx = 0;
        int ReadSize = 0;
    
        fp = fopen(FilePath,"r");
        if(!fp)
        {
            divp_ut_dbg("open file[%s] failed\n",FilePath);
            ret = -1;
            goto EXIT;
        }
    
        MI_SYS_Mmap(pstDirectSrcBuf->phyAddr[0], SRC_BUFF_SIZE, &pVirSrcBufAddr, FALSE);
        if(!pVirSrcBufAddr)
        {
            divp_ut_dbg("mmap dst buff failed\n");
            ret = -1;
            goto EXIT;
        }
    
        for(LineIdx = 0; LineIdx < SRC_HEIGHT*3/2; LineIdx++)
        {
            ReadSize += fread(pVirSrcBufAddr+LineIdx*SRC_BUFF_STRIDE, 1, SRC_WIDTH, fp);
        }
        if(ReadSize < SRC_WIDTH*SRC_HEIGHT*3/2)
        {
            fseek(fp, 0, SEEK_SET);
            ReadSize = 0;
            for(LineIdx = 0; LineIdx < SRC_HEIGHT*3/2; LineIdx++)
            {
                ReadSize += fread(pVirSrcBufAddr+LineIdx*SRC_BUFF_STRIDE, 1, SRC_WIDTH, fp);
            }
            if(ReadSize < SRC_WIDTH*SRC_HEIGHT*3/2)
            {
                divp_ut_dbg("read file failed, read size:%d\n",ReadSize);
                ret = -1;
                goto EXIT;
            }
        }
    
    EXIT:
        if(fp)
            fclose(fp);
        if(pVirSrcBufAddr)
            MI_SYS_Munmap(pVirSrcBufAddr, SRC_BUFF_SIZE);
    
        return ret;
    }
    
    //image processing result is stored in dst buff
    static int DumpDstBuf(MI_DIVP_DirectBuf_t *pstDirectDstBuf)
    {
        int ret = 0;
        FILE *fp;
        void *pVirDstBufAddr = NULL;
        int LineIdx = 0;
        int WriteSize = 0;
        char outputfile[128];
        struct timeval timestamp;
    
        gettimeofday(&timestamp, 0);
        sprintf(outputfile, "output_%dx%d_%d_%08d.yuv",pstDirectDstBuf->u32Width,pstDirectDstBuf->u32Height,(int)timestamp.tv_sec,(int)timestamp.tv_usec);
    
        fp = fopen(outputfile,"w+");
        if(!fp)
        {
            divp_ut_dbg("open file[%s] failed\n",outputfile);
            ret = -1;
            goto EXIT;
        }
    
        MI_SYS_Mmap(pstDirectDstBuf->phyAddr[0], DST_BUFF_SIZE, &pVirDstBufAddr, FALSE);
        if(!pVirDstBufAddr)
        {
            divp_ut_dbg("mmap dst buff failed\n");
            ret = -1;
            goto EXIT;
        }
    
        for(LineIdx = 0; LineIdx < DST_HEIGHT*3/2; LineIdx++)
        {
            WriteSize += fwrite(pVirDstBufAddr+LineIdx*DST_BUFF_STRIDE, 1, DST_WIDTH, fp);
        }
        if(WriteSize < DST_WIDTH*DST_HEIGHT*3/2)
        {
            divp_ut_dbg("write file failed, write size:%d\n",WriteSize);
        }
        fflush(fp);
        sync();
        divp_ut_dbg("save stretch dst buff to[%s]\n",outputfile);
    
    EXIT:
        if(fp)
            fclose(fp);
        if(pVirDstBufAddr)
            MI_SYS_Munmap(pVirDstBufAddr, DST_BUFF_SIZE);
    
        return 0;
    }
    

2.14. MI_DIVP_StretchBufEx

  • 描述

    缩放、拉伸、裁剪指定内存区域中的图像数据,并输出到目标内存。

  • 语法

    MI_S32 MI_DIVP_StretchBufEx(MI_DIVP_DirectBuf_t *pstSrcBuf, MI_SYS_WindowRect_t *pstSrcCrop, MI_DIVP_DirectBuf_t *pstDstBuf, MI_DIVP_FilterType_e eFilterType);
    
  • 参数

    参数名称 描述 输入/输出
    pstSrcBuf 源buffer信息指针 输入
    pstSrcCrop Crop信息指针 输入
    pstDstBuf 目标buffer信息指针 输入
    eFilterType 做scaling的filter type。 输入
  • 返回值

    • MI_OK 成功

    • 非M_OK 失败,参照错误码

  • 依赖

    • 头文件:mi_divp.h、mi_divp_datatype.h

    • 库文件:libmi_divp.so


3. DIVP 数据类型


3.1. 数据类型定义

数据类型 定义
MI_DIVP_DiType_e 定义 DIVP 的deinterlace的类型
MI_DIVP_TnrLevel_e 定义 DIVP TNR的等级
MI_DIVP_FilterType_e 定义 DIVP scaling filter type
MI_DIVP_OutputPortAttr_t 定义 DIVP 绑定的output port的属性参数
MI_DIVP_ChnAttr_t 定义 DIVP 通道的属性参数
MI_DIVP_DirectBuf_t 用于图像处理的内存信息结构体
MI_DIVP_InitParam_t 定义DIVP设备初始化参数

注:本节已涵盖各重要的数据类型,部分未列出数据类型请参见 mi_divp_datatype.h


3.2. MI_DIVP_DiType_e

  • 说明

    定义 DIVP 的deinterlace的类型。

  • 定义

    typedef enum
    
    {
    
        E_MI_DIVP_DITYPE_OFF,//off
    
        E_MI_DIVP_DITYPE_2D,///2.5D DI
    
        E_MI_DIVP_DITYPE_3D,///3D DI
    
        E_MI_DIVP_DITYPE_NUM,
    
    } MI_DIVP_DiType_e;
    
  • 成员

    成员 描述
    E_MI_DIVP_DITYPE_OFF DIVP通道上关闭deinterlace
    E_MI_DIVP_DITYPE_2D DIVP通道上开启2.5D deinterlace
    E_MI_DIVP_DITYPE_3D DIVP通道上开启3D deinterlace
    E_MI_DIVP_DITYPE_NUM DIVP通道上deinterlace类型个数
  • 注意事项

    • 开启DI时必须开TNR,MSR930只能支援3D DI,TNR level设定为E_MI_DIVP_TNRLEVEL_MIDDLE。

    • 3D DI与rotation冲突,两个功能不能同时打开。

    • 不支持DI功能的chip如下:

      • Pretzel

      • Macaron

      • Taiyaki/Takoyaki

      • Pudding

      • Ispahan

      • Ikayaki


3.3. MI_DIVP_TnrLevel_e

  • 说明

    定义 DIVP TNR的等级。

  • 定义

    typedef enum
    
    {
    
        E_MI_DIVP_TNRLEVEL_OFF,
    
        E_MI_DIVP_TNRLEVEL_LOW,
    
        E_MI_DIVP_TNRLEVEL_MIDDLE,
    
        E_MI_DIVP_TNRLEVEL_HIGH,
    
        E_MI_DIVP_TNRLEVEL_NUM,
    
    } MI_DIVP_TnrLevel_e;
    
  • 成员

    成员 描述
    E_MI_DIVP_TNRLEVEL_OFF DIVP通道上关闭TNR
    E_MI_DIVP_TNRLEVEL_LOW DIVP通道上开启弱等级的TNR
    E_MI_DIVP_TNRLEVEL_MIDDLE DIVP通道上开启中等等级的TNR
    E_MI_DIVP_TNRLEVEL_HIGH DIVP通道上开启强等级的TNR
    E_MI_DIVP_TNRLEVEL_NUM DIVP通道上TNR等级的数量
  • 注意事项

    • MSR930支持TNR,但是不支持调节TNR level。

    • 不支持TNR功能的chip如下:

      • Pretzel

      • Macaron

      • Taiyaki/Takoyaki

      • Pudding

      • Ispahan

      • Ikayaki


3.4. MI_DIVP_FilterType_e

  • 说明

    定义 DIVP scaling filter type 。

  • 定义

    typedef enum
    {
        E_MI_DIVP_FILTER_TYPE_AUTO,
        E_MI_DIVP_FILTER_TYPE_BYPASS,
        E_MI_DIVP_FILTER_TYPE_BILINEAR,
        E_MI_DIVP_FILTER_TYPE_FILTER,
    } MI_DIVP_FilterType_e;
    
  • 成员

    成员 描述
    E_MI_DIVP_FILTER_TYPE_AUTO Auto模式,会自动选择bypass或bilinear。
    E_MI_DIVP_FILTER_TYPE_BYPASS Bypass模式。
    E_MI_DIVP_FILTER_TYPE_BILINEAR Bilinear模式。
    E_MI_DIVP_FILTER_TYPE_FILTER Filter type数目。
  • 注意事项

    不做scaling默认是E_MI_DIVP_FILTER_TYPE_BYPASS filter type。

  • 相关数据类型及接口

    MI_DIVP_StretchBufEx


3.5. MI_DIVP_OutputPortAttr_t

  • 说明

    定义 DIVP 绑定的output port的属性参数。

  • 定义

    typedef struct MI_DIVP_OutputPortAttr_s
    
    {
    
        MI_U32 u32Width;//output width
    
        MI_U32 u32Height;//output height
    
        MI_SYS_PixelFormat_e ePixelFormat;
    
        MI_SYS_CompressMode_e eCompMode;//compress mode
    
    }MI_DIVP_OutputPortAttr_t;
    
  • 成员

    成员名称 描述
    u32Width DIVP 通道输出画面的宽度
    u32Height DIVP 通道输出画面的高度
    ePixelFormat DIVP 通道输出画面的像素格式
    eCompMode DIVP 通道输出图像的压缩格式,DIVP通道只能输出非压缩格式的图像
  • 注意事项

    各系列chip DIVP输出属性差异


    芯片系列\输出属性 Output Pixel format Output Stride alignment Output Width alignment Output Height alignment Output Min size Output Max size
    MSR930 YUV422/YUV420(NV12)/ARGB8888/ ABGR8888/ARGB1555/MST420 32 2 2 128x64 4096x4096
    Pretzel YUV422 32 2 2 64x4 3840x3840
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64
    RGB565 32
    Macaron YUV422 32 2 2 64x4 2688x2688
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64
    RGB565 32
    Taiyaki/Takoyaki YUV422 32 2 2 64x4 1920x1920
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64
    RGB565 32
    Pudding YUV422 32 2 2 Rotate:16x2
    No rotate:32x4
    3840x3840
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64
    RGB565 32
    Ispahan YUV422 32 2 2 64x4 2688x2688
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64
    RGB565 32
    Ikayaki YUV422 32 2 2 Rotate:16x16
    No rotate:16x2
    1920x1920
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64
    RGB565 32


3.6. MI_DIVP_ChnAttr_t

  • 说明

    定义 DIVP 通道的属性参数。

  • 定义

    typedef struct MI_DIVP_ChnAttr_s
    
    {
    
        MI_U32 u32MaxWidth;//support max input width
    
        MI_U32 u32MaxHeight;//support max input height
    
        MI_DIVP_TnrLevel_e  eTnrLevel;//TNR level
    
        MI_DIVP_DiType_e eDiType;//DI type
    
        MI_SYS_Rotate_e eRotateType;//rotate angle
    
        MI_SYS_WindowRect_t stCropRect;//crop information
    
        MI_BOOL bHorMirror;//horizontal mirror
    
        MI_BOOL bVerMirror;//vertical mirror
    
    }MI_DIVP_ChnAttr_t;
    
  • 成员

    成员名称 描述
    u32MaxWidth DIVP通道支援的input的最大宽度
    u32MaxHeight DIVP通道支援的input的最大高度
    eTnrLevel DIVP通道上TNR的等级
    eDiType DIVP通道上DI的类型
    eRotateType DIVP通道上画面旋转的角度
    stCropRect DIVP通道上的crop信息
    bHorMirror DIVP通道上水平方向翻转
    bVerMirror DIVP通道上垂直方向翻转
  • 注意事项


    芯片系列\输入属性 Input Pixel format Input Stride alignment Input Width alignment Input Height alignment Input Min size Input Max size
    MSR930 YUV422/YUV420(NV12)/ARGB8888/ ABGR8888/ARGB1555/Tile Mode 32 YUV422:16
    NV12:32
    2 128x64 4096x4096
    Pretzel YUV422 32 2 2 64x4 3840x3840
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64
    RGB565 32
    Macaron YUV422 32 2 2 64x4 2688x2688
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64
    RGB565 32
    Taiyaki/Takoyaki YUV422 32 2 2 64x4 1920x1920
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64
    RGB565 32
    Pudding YUV422 32 2 2 Rotate:128x128
    No rotate:32x4
    3840x3840
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64
    RGB565 32
    Ispahan YUV422 32 2 2 64x4 2688x2688
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64
    RGB565 32
    Ikayaki YUV422 32 16 2 Rotate:16x16
    No rotate:16x2
    1920x1920
    YUV420(NV12) 16
    ARGB8888/ABGR8888 64


3.7. MI_DIVP_DirectBuf_t

  • 说明

    定义用于图像处理的内存信息

  • 定义

    typedef struct MI_DIVP_DirectBuf_s
    
    {
    
        MI_SYS_PixelFormat_e ePixelFormat; //YUV420SP or ARGB888 only
    
        MI_U32 u32Width;
    
        MI_U32 u32Height;
    
        MI_U32 u32Stride[3];
    
        MI_PHY phyAddr[3];
    
    }MI_DIVP_DirectBuf_t;
    
  • 成员

    成员名称 描述
    ePixelFormat 图像的像素格式
    u32Width 图像画面的宽度
    u32Height 图像画面的高度
    u32Stride 图像每行所占字节数
    phyAddr Buffer的起始物理地址
  • 注意事项

    • 只支持YUV420SP或者ARGB8888的图像像素格式

    • u32Stride不能小于64

  • 相关数据类型及接口

    MI_DIVP_StretchBuf


3.8. MI_DIVP_InitParam_t

  • 说明

    DIVP设备初始化参数

  • 定义

    typedef struct MI_DIVP_InitParam_s
    
    {
    
        MI_U32 u32DevId;
    
        MI_U8 *u8Data;
    
    } MI_DIVP_InitParam_t;
    
  • 成员

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

    MI_DIVP_InitDev


4. DIVP 错误码

表4-1 DIVP API 返回值

错误代码 宏定义 描述
0x0 MI_SUCCESS succeeded
0xa00c2002 MI_DIVP_ERR_INVALID_CHNID 无效的channel ID
0xa00c2003 MI_DIVP_ERR_INVALID_PARAM 传入的参数无效
0xa00c2006 MI_DIVP_ERR_NULL_PTR 空指针异常
0xa00c201c MI_DIVP_ERR_FAILED DIVP的操作失败
0xa00c2005 MI_DIVP_ERR_NO_RESOUCE 无资源可以使用
0xa00c201c MI_DIVP_ERR_NO_CONTENT 通道中无显示内容