MI JPD API

Version 3.0


1. 概述


1.1. 模块简介

JPD解码模块提供创建解码通道、控制解码及传送码流等功能。

JPD模块的输入源主要是两类:

  • APP读取码流文件向解码模块发送数据;

  • APP将网络接收到的码流数据直接发送到解码模块。

表 1-1 芯片解码规格

芯片 支持最大通道数 支持协议 分辨率范围 最大性能
Tiramisu 16 JPEG max 8192x8192, min 16x8 3840x2160@20fps
Muffin 16*4 JPEG max 8192x8192, min 16x8 3840x2160@20fps

1.2. 解码流程图

1.2.1. Tiramisu 解码流程图

Tiramisu平台只支持1个device,device id为0。

1.2.2. Muffin 解码流程图

Muffin平台支持4个device,device id分别为0、1、2、3。


1.3. 关键词说明

  • JPG/JPEG

    Joint Photographic Experts Group:联合摄影专家组,该标准由该组织制定。

  • JPD

    JPG Decoder:JPG解码器

  • STR

    Suspend To RAM:挂起到内存,指系统关机或进入省电模式后,将重新启动所需的数据都储存在内存里。

  • APP

    Application:应用。


2. API参考


2.1. 功能模块API

API名 功能
MI_JPD_CreateDev 创建设备。
MI_JPD_DestroyDev 销毁设备。
MI_JPD_CreateChn 创建解码通道。
MI_JPD_DestroyChn 销毁解码通道。
MI_JPD_GetChnAttr 获取解码通道属性。
MI_JPD_StartChn 解码通道开始接收码流。
MI_JPD_StopChn 解码通道停止接收码流。
MI_JPD_GetChnStatus 获取解码通道状态。
MI_JPD_ResetChn 重置解码通道。
MI_JPD_GetStreamBuf 从解码通道获取指定长度的码流缓存。
MI_JPD_PutStreamBuf 通知解码通道送流成功,解码通道开始解码。
MI_JPD_DropStreamBuf 通知解码通道送流失败,解码通道会释放对应的码流缓存。
MI_JPD_QueryStreamInfo 从解码通道获取码流信息。
MI_JPD_DirectBufDecode 解码通道直接按APP指定的输入和输出缓存解码。

2.2. MI_JPD_CreateDev

  • 功能

    创建设备。

  • 定义

    MI_S32 MI_JPD_CreateDev(MI_JPD_DEV JpdDev, MI_JPD_InitParam_t *pstInitParam);
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    pstInitParam 初始化参数,目前未起实际作用,保留为方便未来扩展。请参考MI_JPD_InitParam_t 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INITED 设备已经初始化。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so

  • 注意

    • 此函数可以不调用,但MI_JPD_CreateChn需要指定有效的device id,内部会创建相应的device。

    • 本接口不可重复调用,需要和MI_JPD_DestroyDev成对使用,否则返回失败。

  • 相关主题

    MI_JPD_DestroyDev


2.3. MI_JPD_DestroyDev

  • 功能

    销毁设备。

  • 定义

    MI_S32 MI_JPD_DestroyDev(MI_JPD_DEV JpdDev);
    
  • 形参

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_NOT_INIT 设备未初始化。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so

  • 注意

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

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

    • 本接口不可重复调用,需要和MI_JPD_CreateDev成对使用,否则返回失败。

  • 相关主题

    MI_JPD_CreateDev


2.4. MI_JPD_CreateChn

  • 功能

    创建视频解码通道。

  • 定义

    MI_S32 MI_JPD_CreateChn(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn,
    MI_JPD_ChnCreatConf_t *pstChnCreatConf)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 解码通道号。 输入
    pstChnCreatConf 解码通道属性指针,请参考MI_JPD_ChnCreatConf_t 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_NOT_INIT 设备未初始化。
    MI_ERR_JPD_ILLEGAL_PARAM 非法参数,如输入参数超过通道解码能力。
    MI_ERR_JPD_CHN_EXIST 试图创建已经存在的通道。
    MI_ERR_JPD_NOMEM 分配内存失败(如系统内存不足)。
    MI_ERR_JPD_NULL_PTR 输入参数为空指针。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so

  • 芯片差异

    芯片名 最大解码通道号
    Tiramisu 16
    Muffin 16
  • 注意

    通道号不能超出最大的通道号范围。

  • 举例

    MI_S32 StartJpd(void)
    {
    MI_S32 s32Ret = MI_ERR_JPD_FAILED;
    MI_JPD_DEV JpdDev = 0;
        MI_JPD_CHN JpdChn = 0;
    MI_JPD_ChnCreatConf_t stChnCreatConf;
    
        memset(&stChnCreatConf, 0x0, sizeof(MI_JPD_ChnCreatConf_t));
        stChnCreatConf.u32StreamBufSize = 0x100000;
        stChnCreatConf.u32MaxPicWidth = 1920;
        stChnCreatConf.u32MaxPicHeight = 1080;
        s32Ret = MI_JPD_CreateChn(JpdDev, JpdChn, & stChnCreatConf);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_JPD_CreateChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
        s32Ret = MI_JPD_StartChn(JpdDev, JpdChn);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_JPD_StartChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
    }
    
    return s32Ret;
    }
    
  • 相关主题

    MI_JPD_DestroyChn


2.5. MI_JPD_DestroyChn

  • 功能

    销毁视频解码通道。

  • 定义

    MI_S32 MI_JPD_DestroyChn(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 视频解码通道号。 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_CHN_NOT_STOP 停止接收码流前不允许关闭通道。
    MI_ERR_JPD_CHN_UNEXIST 通道不存在。
    MI_ERR_JPD_NOT_INIT 设备未初始化。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so

  • 注意

    销毁前需停止接收码流。

  • 举例

    MI_S32 StopJpd(void)
    {
    MI_S32 s32Ret = MI_ERR_JPD_FAILED;
    MI_JPD_DEV JpdDev = 0;
        MI_JPD_CHN JpdChn = 0;
    
    // Destroy send stream thread
    
        s32Ret = MI_JPD_StopChn(JpdDev, JpdChn);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_JPD_StopChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        s32Ret = MI_JPD_DestroyChn(JpdDev, JpdChn);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_JPD_DestroyChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        return s32Ret;
    }
    
  • 相关主题

    MI_JPD_CreateChn


2.6. MI_JPD_GetChnAttr

  • 功能

    获取视频解码通道属性。

  • 定义

    MI_S32 MI_JPD_GetChnAttr(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn, MI_JPD_ChnAttr_t *pstChnAttr)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 视频解码通道号。 输入
    pstChnAttr 解码通道属性指针。请参考MI_JPD_ChnAttr_t 输出
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_ILLEGAL_PARAM 非法参数。
    MI_ERR_JPD_CHN_UNEXIST 通道不存在。
    MI_ERR_JPD_NOT_INIT 设备未初始化。
    MI_ERR_JPD_NULL_PTR 输入参数为空指针。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so


2.7. MI_JPD_StartChn

  • 功能

    解码通道开始接收码流。

  • 定义

    MI_S32 MI_JPD_StartChn(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 视频解码通道号。 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_CHN_UNEXIST 通道未创建或者已销毁。
    MI_ERR_JPD_NOT_INIT 设备未初始化。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so

  • 注意

    • 启动接收码流前必须保证通道已创建,否则会返回通道未创建的错误码 MI_ERR_JPD_CHN_UNEXIST。

    • 启动接收码流之后,才能调用 MI_JPD_GetStreamBuf /MI_JPD_PutStreamBuf
      发送码流。

    • 重复调用启动接收码流接口时,返回成功。

  • 举例

    请参见MI_JPD_CreateChn的举例。

  • 相关主题

    MI_JPD_StopChn


2.8. MI_JPD_StopChn

  • 功能

    解码通道停止接收码流。

  • 语法

    MI_S32 MI_JPD_StopChn(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 视频解码通道号。 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_CHN_NOT_START 通道未使能。
    MI_ERR_JPD_CHN_UNEXIST 通道未创建或者已销毁。
    MI_ERR_JPD_NOT_INIT 设备未初始化。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so

  • 注意

  • 举例

    请参见MI_JPD_DestroyChn的举例。

  • 相关主题

    MI_JPD_StartChn


2.9. MI_JPD_GetChnStatus

  • 功能

    查询解码通道状态。

  • 语法

    MI_S32 MI_JPD_GetChnStatus(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn,
    MI_JPD_ChnStatus_t *pstChnStatus)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 解码通道号。 输入
    pstChnStatus 解码通道状态结构体指针。请参考MI_JPD_ChnStatus_t 输出
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_CHN_UNEXIST 通道未创建或已销毁。
    MI_ERR_JPD_ILLEGAL_PARAM 非法参数。
    MI_ERR_JPD_NULL_PTR 输入参数为空指针。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so


2.10. MI_JPD_ResetChn

  • 功能

    复位解码通道。

  • 定义

    MI_S32 MI_JPD_ResetChn(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 视频解码通道号。 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_CHN_NOT_START 通道未使能。
    MI_ERR_JPD_CHN_UNEXIST 通道未创建或已销毁。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so


2.11. MI_JPD_GetStreamBuf

  • 功能

    从解码通道获取指定长度的码流缓存。

  • 语法

    MI_S32 MI_JPD_GetStreamBuf(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn, MI_U32
    u32RequiredLength, MI_JPD_StreamBuf_t *pstRetStreamBuf, MI_S32
    s32MilliSecToWait)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 视频解码通道号。 输入
    u32RequiredLength 期望申请到的码流缓存长度。 输入
    pstRetStreamBuf 底层返回分配成功的码流缓存指针。请参考MI_JPD_StreamBuf_t 输出
    s32MilliSecToWait 设定请求超时时间参数。
    取值范围:
    -1:阻塞。
    0:非阻塞。
    正值:超时时间,单位为毫秒。
    输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_ILLEGAL_PARAM 非法参数。
    MI_ERR_JPD_CHN_NOT_START 通道未使能。
    MI_ERR_JPD_CHN_UNEXIST 通道未创建或者已销毁。
    MI_ERR_JPD_BUF_FULL 底层的码流缓冲区已满。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so

  • 注意

    • 调用该接口成功后,将对应JPG码流拷贝到该接口返回的地址空间,如果成功,最后需要调用MI_JPD_PutStreamBuf;如果失败,最后需要调用MI_JPD_DropStreamBuf

    • 目前只支持Frame送流方式,即每次送完整的一帧JPG码流。

  • 举例

    MI_S32 JpdSendStreamThreadFunc(void)
    {
    MI_S32 s32Ret = MI_ERR_JPD_FAILED;
    MI_JPD_DEV JpdDev = 0;
    MI_JPD_CHN JpdChn = 0;  
    MI_U32 u32RequiredLength = 0;
        MI_S32 s32MilliSec = 0;
        MI_JPD_StreamBuf_t stRetStreamBuf;
    
        do {
            //Check if you need stop sending stream
            if (g_bStop)
            {
                break;
            }
    
            //get one stream from file or ipc, then assign u32RequiredLength to the size of the current stream
    
            memset(&stRetStreamBuf, 0x0, sizeof(MI_JPD_StreamBuf_t));
            s32MilliSec = 30;  //timeout is 30ms
            s32Ret = MI_JPD_GetStreamBuf(JpdDev, JpdChn, u32RequiredLength, &stRetStreamBuf, s32MilliSec);
            if (MI_SUCCESS != s32Ret)
            {
                printf("MI_JPD_GetStreamBuf failed, s32Ret: 0x%x.\n", s32Ret);
                continue;
    }
    
            if (stRetStreamBuf.u32HeadLength+stRetStreamBuf.u32TailLength < u32RequiredLength)
            {
                //something wrong happen
                printf("MI_JPD_GetStreamBuf return wrong value: HeadLen%u TailLen%u RequiredLength%u\n",
    stRetStreamBuf.u32HeadLength, stRetStreamBuf.u32TailLength, u32RequiredLength);
                s32Ret = MI_JPD_DropStreamBuf(JpdDev, JpdChn, &stRetStreamBuf);
                if (MI_SUCCESS != s32Ret)
                {
                    printf("MI_JPD_DropStreamBuf failed, s32Ret: 0x%x.\n", s32Ret);
                    continue;
                }
    }
    else
    {
        memcpy(stRetStreamBuf.pu8HeadVirtAddr, addr_of_stream, min(stRetStreamBuf.u32HeadLength, u32RequiredLength));
        if (stRetStreamBuf.u32TailLength > 0)
            memcpy(stRetStreamBuf.pu8TailVirtAddr, addr_of_stream+stRetStreamBuf.u32HeadLength,
    min(stRetStreamBuf.u32TailLength, u32RequiredLength-stRetStreamBuf.u32HeadLength));
    }
    
            stRetStreamBuf.u32ContentLength = u32RequiredLength;
            s32Ret = MI_JPD_PutStreamBuf(JpdDev, JpdChn, &stRetStreamBuf);
            if (MI_SUCCESS != s32Ret)
            {
                printf("MI_JPD_PutStreamBuf failed, s32Ret: 0x%x.\n", s32Ret);
                continue;
            }
        }while(!g_bStop);
    
        return MI_SUCCESS;
    }
    
  • 相关主题

    MI_JPD_PutStreamBuf

    MI_JPD_DropStreamBuf


2.12. MI_JPD_PutStreamBuf

  • 功能

    通知解码通道送流成功,解码通道开始解码

  • 定义

    MI_S32 MI_JPD_PutStreamBuf(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn,
    MI_JPD_StreamBuf_t *pstRetStreamBuf)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 视频解码通道号。 输入
    pstRetStreamBuf 先前MI_JPD_GetStreamBuf 获取到的缓存指针。请参考MI_JPD_StreamBuf_t 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_CHN_NOT_START 通道未使能。
    MI_ERR_JPD_CHN_UNEXIST 通道未创建或已销毁。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so

  • 注意

  • 举例

    请参见MI_JPD_GetStreamBuf 的举例。

  • 相关主题

    MI_JPD_GetStreamBuf


2.13. MI_JPD_DropStreamBuf

  • 功能

    通知解码通道送流失败,解码通道会释放对应的码流缓存。

  • 定义

    MI_S32 MI_JPD_DropStreamBuf(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn,
    MI_JPD_StreamBuf_t *pstRetStreamBuf)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 视频解码通道号。 输入
    pstRetStreamBuf 先前MI_JPD_GetStreamBuf 获取到的缓存指针。请参考MI_JPD_StreamBuf_t 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_CHN_NOT_START 通道未使能。
    MI_ERR_JPD_CHN_UNEXIST 通道未创建或已销毁。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so

  • 注意

  • 举例

    请参见[MI_JPD_GetStreamBuf 的举例。

  • 相关主题

    MI_JPD_GetStreamBuf


2.14. MI_JPD_QueryStreamInfo

  • 功能

    从解码通道获取码流信息。

  • 定义

    MI_S32 MI_JPD_QueryStreamInfo(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn,
    MI_JPD_DirectInputBuf_t *pstInputBuf, MI_JPD_StreamInfo_t
    *pstStreamInfo)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 视频解码通道号。 输入
    pstInputBuf 存放输入缓存的指针。请参考MI_JPD_DirectInputBuf_t 输入
    pstStreamInfo 存放码流信息的指针。请参考MI_JPD_StreamInfo_t 输出
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_CHN_NOT_START 通道未使能。
    MI_ERR_JPD_CHN_UNEXIST 通道未创建或已销毁。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so

  • 注意

    • u32BufWidth/u32BufHeight指的是输出缓存的实际宽/高,而u32CurPicWidth/u32CurPicHeight则是指图像的有效宽/高。
  • 举例

    请参见MI_JPD_DirectBufDecode的举例。

  • 相关主题

    MI_JPD_DirectBufDecode


2.15. MI_JPD_DirectBufDecode

  • 功能

    解码通道直接按APP指定的输入和输出缓存解码。

  • 定义

    MI_S32 MI_JPD_DirectBufDecode(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn,
    MI_JPD_DirectInputBuf_t *pstInputBuf, MI_JPD_DirectOutputBuf_t
    *pstOutputBuf)
    
  • 形参

    参数名称 描述 输入/输出
    JpdDev 设备号。 输入
    JpdChn 视频解码通道号。 输入
    pstInputBuf 存放输入缓存的指针。请参考MI_JPD_DirectInputBuf_t 输入
    pstOutputBuf 存放输出缓存的指针。请参考MI_JPD_DirectOutputBuf_t 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_JPD_FAILED 失败。
    MI_ERR_JPD_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_JPD_CHN_NOT_START 通道未使能。
    MI_ERR_JPD_CHN_UNEXIST 通道未创建或已销毁。
  • 依赖

    • 头文件:mi_jpd.h

    • 库文件:libmi_jpd.a/libmi_jpd.so

  • 注意

    • 如果不清楚输出缓存的大小,APP在调用该接口之前需要先调用MI_JPD_QueryStreamInfo,输出缓存的大小是通过MI_JPD_StreamInfo_t中的u32BufWidth/u32BufHeight计算得出,而u32CurPicWidth/u32CurPicHeight则是指图像的实际有效宽高。
  • 举例

    MI_S32 directBufDecode(void)
    {
        MI_S32 s32Ret = MI_SUCCESS;
        MI_JPD_DEV JpdDev = 0;
        MI_JPD_CHN JpdChn = 0;
        MI_U8 *pu8Buf = NULL;
        MI_U32 u32LengthCurStream = 0;
        MI_JPD_DirectInputBuf_t stInputBuf;
        MI_JPD_DirectOutputBuf_t stOutputBuf;
        MI_JPD_StreamInfo_t stStreamInfo;
        MI_U32 u32OutputBufSize = 0;
    
        //get one jpg stream from file or ipc, assign its length to u32LengthCurStream
        pu8Buf = malloc(u32LengthCurStream);
        //copy one jpg stream from file or ipc to pu8Buf
    
        memset(&stInputBuf, 0, sizeof(MI_JPD_DirectInputBuf_t));
        memset(&stOutputBuf, 0, sizeof(MI_JPD_DirectOutputBuf_t));
        memset(&stStreamInfo, 0, sizeof(MI_JPD_StreamInfo_t));
    
        stInputBuf.pu8InputJPGRawFrameDataVirtAddr = pu8Buf;
        stInputBuf.phyAddr = 0;
        stInputBuf.u32Length = u32LengthCurStream;
        s32Ret = MI_JPD_QueryStreamInfo(JpdDev, JpdChn, &stInputBuf, &stStreamInfo);
        if (MI_SUCCESS != s32Ret)
        {
            printf("MI_JPD_QueryStreamInfo failed, s32Ret: 0x%x.\n", s32Ret);
            goto RETURN_FREE;
        }
        printf("stream info: w:%d h:%d format:%d bufW:%d bufH:%d\n", stStreamInfo.u32CurPicWidth, stStreamInfo.u32CurPicHeight, stStreamInfo.ePixelFormat, stStreamInfo.u32BufWidth,
    stStreamInfo.u32BufHeight);
    
        // only support output pixel format YUYV422
        stOutputBuf.ePixelFormat = E_MI_SYS_PIXEL_FRAME_YUV422_YUYV;
        stOutputBuf.u32Width = stStreamInfo.u32BufWidth;
        stOutputBuf.u32Height = stStreamInfo.u32BufHeight;
        stOutputBuf.u32Stride[0] = stOutputBuf.u32Width * 2;
        u32OutputBufSize = stOutputBuf.u32Stride[0] * stOutputBuf.u32Height;
        s32Ret = MI_SYS_MMA_Alloc(NULL, u32OutputBufSize, &stOutputBuf.phyAddr[0]);
        if (MI_SUCCESS != s32Ret)
        {
            printf("MI_SYS_MMA_Alloc failed, s32Ret: 0x%x.\n", s32Ret);
            goto RETURN_FREE;
        }
    
        s32Ret = MI_JPD_DirectBufDecode(JpdDev, JpdChn, &stInputBuf, &stOutputBuf);
        if (MI_SUCCESS != s32Ret)
        {
            printf("MI_JPD_DirectBufDecode failed, s32Ret: 0x%x.\n", s32Ret);
            goto RETURN_FREE;
        }
    
    RETURN_FREE:
        free(pu8Buf);
        return s32Ret;
    }
    
  • 相关主题

    MI_JPD_QueryStreamInfo


3. 数据类型


3.1. 视频解码数据类型及结构定义

数据结构 说明
MI_JPD_DEV 定义JPD设备ID类型。
MI_JPD_CHN 定义JPD通道ID类型。
MI_JPD_ErrCode_e 定义码流错误码枚举体。
MI_JPD_InitParam_t 定义设备初始化参数结构体
MI_JPD_ChnCreatConf_t 定义通道初始化参数结构体。
MI_JPD_ChnAttr_t 定义通道属性结构体。
MI_JPD_ChnStatus_t 定义通道状态结构体。
MI_JPD_StreamBuf_t 定义码流缓存参数结构体。
MI_JPD_StreamInfo_t 定义码流信息结构体。
MI_JPD_DirectInputBuf_t 定义输入码流缓存参数结构体。
MI_JPD_DirectOutputBuf_t 定义输出图像缓存参数结构体。

3.2. MI_JPD_DEV

  • 说明

    定义JPD设备ID类型。

  • 定义

    #define MI_JPD_DEV MI_U32
    

3.3. MI_JPD_CHN

  • 说明

    定义JPD通道ID类型。

  • 定义

    #define MI_JPD_CHN MI_U32
    

3.4. MI_JPD_ErrCode_e

  • 说明

    定义码流错误码枚举体。

  • 定义

    typedef enum
    
    {
    
        E_MI_JPD_ERR_CODE_UNKNOW = 0x0,
    
        E_MI_JPD_ERR_CODE_ILLEGAL_ACCESS,
    
        E_MI_JPD_ERR_CODE_DEC_TIMEOUT,
    
        E_MI_JPD_ERR_CODE_OUT_OF_MEMORY,
    
        E_MI_JPD_ERR_CODE_MAX
    
    } MI_JPD_ErrCode_e;
    
  • 成员

    成员名称 描述
    E_MI_JPD_ERR_CODE_UNKNOW 未知错误。
    E_MI_JPD_ERR_CODE_ILLEGAL_ACCESS 不可访问,例如:未初始化或硬件出问题。
    E_MI_JPD_ERR_CODE_DEC_TIMEOUT 解帧超时
    E_MI_JPD_ERR_CODE_OUT_OF_MEMORY 内存不足

3.5. MI_JPD_InitParam_t

  • 说明

    定义设备初始化参数结构体。

  • 定义

    typedef struct MI_JPD_InitParam_s
    
    {
    
        MI_U32 u32Reserved;
    
    } MI_JPD_InitParam_t;
    
  • 成员

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

    MI_JPD_InitDev


3.6. MI_JPD_ChnCreatConf_t

  • 说明

    定义通道初始化参数结构体。

  • 定义

    typedef struct MI_JPD_ChnCreatConf_s
    
    {
    
        MI_U32 u32StreamBufSize; MI_U32 u32MaxPicWidth;
    
        MI_U32 u32MaxPicHeight;
    
    } MI_JPD_ChnCreatConf_t;
    
  • 成员

    成员名称 描述
    u32StreamBufSize 码流缓存总长度。
    u32MaxPicWidth 解码图像最大宽。
    u32MaxPicHeight 解码图像最大高。
  • 相关数据类型及接口

    MI_JPD_CreateChn


3.7. MI_JPD_ChnAttr_t

  • 说明

    定义通道属性结构体。

  • 定义

    typedef struct MI_JPD_ChnAttr_s
    
    {
    
        MI_U32 u32StreamBufSize;
    
        MI_JPD_StreamInfo_t stStreamInfo;
    
    } MI_JPD_ChnAttr_t;
    
  • 成员

    成员名称 描述
    u32StreamBufSize 码流缓存总长度。
    stStreamInfo 码流信息。
  • 相关数据类型及接口

    MI_JPD_GetChnAttr


3.8. MI_JPD_ChnStatus_t

  • 说明

    定义通道状态结构体。

  • 定义

    typedef struct MI_JPD_ChnStatus_s
    
    {
    
        MI_U32 u32LeftStreamBytes;
    
        MI_U32 u32LeftStreamFrames;
    
        MI_U32 u32LeftPics;
    
        MI_U32 u32RecvStreamFrames;
    
        MI_U32 u32DecodeStreamFrames;
    
        MI_BOOL bChnStart;
    
        MI_JPD_ErrCode_e eErrCode;
    
    } MI_JPD_ChnStatus_t;
    
  • 成员

    成员名称 描述
    u32LeftStreamBytes 码流缓存中待解码的byte数。
    u32LeftStreamFrames 码流缓存中待解码的帧数。
    u32LeftPics 图像缓存中剩余的pic数目。
    u32RecvStreamFrames 码流缓存中已接收码流帧数。
    u32DecodeStreamFrames 码流缓存中已解码帧数。
    bChnStart 解码器是否已经启动接收码流。
    eErrCode 解码错误码信息。
  • 相关数据类型及接口

    MI_JPD_ChnStatus_t


3.9. MI_JPD_StreamBuf_t

  • 说明

    定义码流缓存参数结构体。

  • 定义

    t typedef struct MI_JPD_StreamBuf_s
    
    {
    
        MI_U8 *pu8HeadVirtAddr;//ring buffer first part user mode VA
    
        MI_PHY u64HeadPhyAddr;//ring buffer first part PA
    
        MI_U32 u32HeadLength;//ring buffer first part Length
    
        MI_U8 *pu8TailVirtAddr;//ring buffer 2nd part user mode VA
    
        MI_PHY u64TailPhyAddr;//ring buffer 2nd part PA
    
        MI_U32 u32TailLength;//ring buffer 2nd part length
    
        MI_U32 u32ContentLength;//current used content length
    
    }MI_JPD_StreamBuf_t;
    
  • 成员

    成员名称 描述
    pu8HeadVirtAddr 头部码流缓存虚拟地址。
    u64HeadPhyAddr 头部码流缓存物理地址。
    u32HeadLength 头部码流缓存长度。
    pu8TailVirtAddr 尾部码流缓存虚拟地址。
    u64TailPhyAddr 尾部码流缓存物理地址。
    u32TailLength 尾部码流缓存长度。
    u32ContentLength 码流实际有效数据长度。
  • 注意事项

    • 如果u32TailLength为0,说明底层只返回了一块缓存pu8HeadVirtAddr,其长度不小于上层期望得到的码流缓存长度,上层需要将该帧码流拷贝到pu8HeadVirtAddr。此时底层码流缓存示意图可能有如下几种情况:

      1. 此时底层stream buffer都是空闲的,如果Free1的长度满足于期望长度u32RequiredLength,底层会将stream buffer的start_addr赋值给pu8HeadVirtAddr,u32RequiredLength赋值给u32HeadLength。

      2. 此时底层stream buffer首部存储着一块先前送入但还未解码的JPG码流,如果Free1的长度满足于期望长度u32RequiredLength,底层会将stream buffer的start_addr_free1赋值给pu8HeadVirtAddr,u32RequiredLength赋值给u32HeadLength。

      3. 此时底层stream buffer的中间存储着一块先前送入但还未解码的JPG码流,两边都是空闲缓存,如果Free1的长度满足期望长度u32RequiredLength,底层会将stream buffer的start_addr_free1赋值给pu8HeadVirtAddr,u32RequiredLength赋值给u32HeadLength。

      4. 此时底层stream buffer的末尾存储着一块先前送入但还未解码的JPG码流,如果Free1的长度满足期望长度u32RequiredLength,底层会将stream buffer的start_addr赋值给pu8HeadVirtAddr,u32RequiredLength赋值给u32HeadLength。

      5. 此时底层stream buffer只有中间一大块空闲缓存,如果Free1的长度满足期望长度u32RequiredLength,底层会将stream buffer的start_addr_free1赋值给pu8HeadVirtAddr,u32RequiredLength赋值给u32HeadLength。

    • 如果u32TailLength不为0,说明底层返回了两块缓存,两者相加的总长度才满足于期望长度u32RequiredLength,上层需要将一帧码流按序拷贝到pu8HeadVirtAddr和pu8TailVirtAddr。此时底层码流缓存示意图可能如下所示:

      中间存储着先前送入但还没解码的JPG码流,头尾两块空闲缓存的总长度加起来才满足期望长度,底层会将stream buffer的start_addr_free1赋值给pu8HeadVirtAddr,len_free1赋值给u32HeadLength,start_addr赋值给pu8TailVirtAddr,(u32RequiredLength-u32HeadLength)赋值给u32TailLength。

    • u32ContentLength表示码流实际有效数据长度,如果APP实际传送的码流长度小于MI_JPD_GetStreamBuf 中的期望长度u32RequiredLength,需要将u32ContentLength赋值成实际长度,再去调用MI_JPD_PutStreamBuf

  • 相关数据类型及接口

    MI_JPD_GetStreamBuf

    MI_JPD_PutStreamBuf

    MI_JPD_DropStreamBuf


3.10. MI_JPD_StreamInfo_t

  • 说明

    定义码流信息结构体。

  • 定义

    typedef struct MI_JPD_StreamInfo_s
    
    {
    
        MI_U32 u32CurPicWidth;
    
        MI_U32 u32CurPicHeight;
    
        MI_SYS_PixelFormat_e ePixelFormat;
    
        MI_U32 u32BufWidth;
    
        MI_U32 u32BufHeight;
    
    } MI_JPD_StreamInfo_t;
    
  • 成员

    成员名称 描述
    u32CurPicWidth 当前解码图像有效宽。
    u32CurPicHeight 当前解码图像有效高。
    ePixelFormat 图像输入像素存储格式,目前支持semi plannar YUV420(即NV12)/YUYV422。
    u32BufWidth 输出缓存实际宽。
    u32BufHeight 输出缓存实际高。
  • 注意事项

    调用MI_JPD_DirectBufDecode时,需要知道输出缓存的大小,该大小是通过u32BufWidth/u32BufHeight计算得出,而u32CurPicWidth/u32CurPicHeight则是指图像的实际有效宽高。

  • 相关数据类型及接口

    MI_JPD_ChnAttr_t

    MI_JPD_QueryStreamInfo


3.11. MI_JPD_DirectInputBuf_t

  • 说明

    定义输入码流缓存参数结构体。

  • 定义

    typedef struct MI_JPD_DirectInputBuf_s
    
    {
    
        MI_U8 *pu8InputJPGRawFrameDataVirtAddr;
    
        MI_PHY phyAddr;
    
        MI_U32 u32Length;
    
    }MI_JPD_DirectInputBuf_t;
    
  • 成员

    成员名称 描述
    pu8InputJPGRawFrameDataVirtAddr 存储JPG码流数据的虚拟地址。
    phyAddr 可选,存储JPG码流数据的物理地址,默认为0。
    u32Length 码流数据长度。
  • 注意事项

    • 该输入码流缓存不能从MI_JPD_GetStreamBuf 获得,而是要通过系统申请。

    • 如果一直是以这种方式送流解码,MI_JPD_CreateChn中的参数u32StreamBufSize可设置为0,这样内部就不会分配stream buffer。

  • 相关数据类型及接口

    MI_JPD_QueryStreamInfo

    MI_JPD_DirectBufDecode


3.12. MI_JPD_DirectOutputBuf_t

  • 说明

    定义输出图像缓存参数结构体。

  • 定义

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

    成员名称 描述
    ePixelFormat 图像输出像素存储格式,目前只支持YUYV422。
    u32Width 图像输出缓存实际宽。
    u32Height 图像输出缓存实际高。
    u32Stride u32Stride[0]:Y数据stride;
    u32Stride[1]:UV数据stride。
    phyAddr phyAddr[0]:Y数据的起始物理地址;
    phyAddr[1]:UV数据的起始物理地址。
  • 注意事项

    • 图像输出像素存储格式,目前只支持输出YUYV422。
  • 相关数据类型及接口

    MI_JPD_DirectBufDecode


4. 错误码

视频解码错误码如下表所示:

错误代码 宏定义 描述
0xA0202001 MI_ERR_JPD_INVALID_DEVID 设备ID超出合法范围
0xA0202002 MI_ERR_JPD_INVALID_CHNID 通道ID超出合法范围
0xA0202003 MI_ERR_JPD_ILLEGAL_PARAM 非法参数或输入参数超过通道解码能力
0xA0202004 MI_ERR_JPD_CHN_EXIST 试图创建已经存在的通道
0xA0202005 MI_ERR_JPD_CHN_UNEXIST 通道不存在
0xA0202006 MI_ERR_JPD_NULL_PTR 输入参数为空指针
0xA0202007 MI_ERR_JPD_NOT_CONFIG 使用前未配置
0xA0202008 MI_ERR_JPD_NOT_SUPPORT 该操作或者功能不支持
0xA0202009 MI_ERR_JPD_NOT_PERM 非法操作
0xA020200C MI_ERR_JPD_NOMEM 分配内存失败,如系统内存不足
0xA020200D MI_ERR_JPD_NOBUF 分配缓存失败,如申请的数据缓冲区太大
0xA020200E MI_ERR_JPD_BUF_EMPTY 缓冲区中无数据
0xA020200F MI_ERR_JPD_BUF_FULL 缓冲区中数据满
0xA0202010 MI_ERR_JPD_SYS_NOTREADY 系统没有初始化或者相关 依赖的模块没有加载
0xA0202011 MI_ERR_JPD_BADADDR 地址错误
0xA0202012 MI_ERR_JPD_BUSY 系统忙
0xA0202013 MI_ERR_JPD_CHN_NOT_START 通道未使能
0xA0202014 MI_ERR_JPD_CHN_NOT_STOP 通道未禁用
0xA0202015 MI_ERR_JPD_NOT_INIT 模块没有成功加载
0xA0202016 MI_ERR_JPD_INITED 模块已成功加载
0xA020201C MI_ERR_JPD_CHN_NO_CONTENT 通道无数据
0xA020201F MI_ERR_JPD_FAILED 失败