跳转至

MI JPD API


REVISION HISTORY

Revision No.
Description
Date
2.00
  • Initial release
  • 12/17/2020
  • 新增章节PROCFS介绍
  • 08/25/2021
  • 新增最大解码分辨率介绍
  • 06/28/2022
  • 新增Opera解码流程图
  • 06/29/2021
    2.01
  • 新增API用于暂停解码后解码重复帧,单帧播放等功能: MI_JPD_PauseChn, MI_JPD_RefreshChn, MI_JPD_ResumeChn, MI_JPD_StepChn
  • 07/15/2022
  • 优化结构体用于兼容32/64位地址
    MI_JPD_StreamBuf_t
    MI_JPD_DirectInputBuf_t
  • 10/25/2022
  • 优化结构体用于支持PTS参数设定
    MI_JPD_StreamBuf_t
  • 11/10/2022
  • 更新procfs调试信息
  • 12/01/2022
  • 修改MI_PTR64 u64Reserved变量描述
  • 01/09/2023
  • 修改MI_SYS_PixelFormat_e ePixelFormat变量描述
  • 03/13/2023
  • 增加realtime mode使用限制说明
  • 03/13/2023
  • 新增模块参数说明
  • 04/12/2023
    2.02
  • 更新iFackel/iBopper芯片信息,更新支持modparam配置的参数信息
  • 08/26/2024
    2.03
  • 更新jaguar1芯片信息
  • 01/10/2025
    2.04
  • modparam新增支持maxChnNum参数配置
  • 02/27/2025
    2.05
  • 更新mhera芯片信息
  • 11/12/2025
    2.06
  • modparam新增支持maxChnId参数配置
  • 05/25/2026

    1. 概述


    1.1. 模块简介

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

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

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

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

      表 1-1 芯片解码规格

      芯片 支持最大通道数 通道号范围 支持协议 分辨率范围 最大性能
      Tiramisu 16 [0, 16) JPEG max 8192x8192, min 16x8 3840x2160@20fps
      Muffin 16*4 [0, 16) JPEG max 8192x8192, min 16x8 3840x2160@20fps
      Mochi 16*2 [0, 16) JPEG max 8192x8192, min 16x8 3840x2160@20fps
      Opera 16 [0, 16) JPEG max 8192x8192, min 16x8 1920x1080@60fps
      Souffle 64 [0, 64) JPEG max 8192x8192, min 16x8 3840x2160@15fps
      iFackel 64 [0, 64) JPEG max 8192x8192, min 16x16 1920x1080@60fps
      iBopper 64 [0, 64) JPEG max 8192x8192, min 16x16 1920x1080@60fps
      jaguar1 64 [0, 64) JPEG max 8192x8192, min 16x16 1920x1080@30fps
      mhera 64*2 [0, 128) JPEG max 8192x8192, min 16x16 3840x2160@20fps

    注意:

    通道号范围用于描述解码通道号的合法取值区间,单个JPD设备可创建的总通道数受其最大支持通道数的约束。


    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.2.3. Mochi解码流程图

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

    1.2.4. Opera解码流程图

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

    1.2.5. Souffle解码流程图

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

    1.2.6. iFackel解码流程图

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

    1.2.7. iBopper解码流程图

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

    1.2.8. jaguar1解码流程图

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

    1.2.9. mhera解码流程图

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


    1.3. 关键词说明

    • JPG/JPEG

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

    • JPD

      JPG Decoder:JPG解码器

    • STR

      Suspend To RAM:指系统关机或进入省电模式后,除内存外其他硬件断电,达到兼容低功耗的同时快速重开机的效果。

    • APP

      Application:应用。


    1.4. modparam

    • jpd支持通过modparam修改部分参数配置,用户可以根据需要进行修改。各参数具体信息如下表:

      参数名 默认值 支持平台 是否支持客户配置 作用
      jpd_clock 0 iFackel/iBopper/jaguar1/mhera Y JPD硬件时钟,不设置或设置为0时内部会使用默认值
      maxChnNum 16/16/16/64 iFackel/iBopper/jaguar1/mhera Y 单个JPD设备可创建的最大通道数,有效范围[1,N],N参考表 1-1 芯片解码规格;不设置或设置超过有效范围时内部会使用默认值
      maxChnId 64 mhera Y 单个JPD通道可创建的最大通道号,有效范围[1,N),N参考表 1-1 芯片解码规格;不设置或设置超过有效范围时内部会使用默认值
    • 模块参数通过文件modparam.json进行配置和修改,该文件一般放在板端/config目录下。参数配置可参照如下方式:

      "E_MI_MODULE_ID_JPD" :
      {
          "maxChnNum" : 16,
          "maxChnId" : 64,
          "jpd_clock" : 0
      }
      
    • 模块参数也可通过echo命令导入修改后的配置,流程如下:

      • 新建或者从/config目录下拷贝一份json文件,并按照要求的格式进行修改。以参数jpd_clock为例,新建文件命名为jpd_clock.json,内容如下:

        "E_MI_MODULE_ID_JPD" :
        {
            "maxChnNum" : 64,
            "maxChnId" : 16,
            "jpd_clock": 384000000
        }
        
      • 使用echo命令导入json配置

        echo jpd_clock.json > /proc/mi_modules/mi_common/modparam
        
      • 运行应用程序或者调用JPD相关API

    • 注意

      • 模块参数在insmod mi_jpd.ko时生效。JPD模块启动后,再输入修改命令则无效。

      • 每次系统重启后,模块参数将被重置为默认值,用户需要重新配置模块参数。


    2. API参考


    该功能模块提供以下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_GetStreamBuf所取到的码流缓存,与MI_JPD_PutStreamBuf互斥调用。
    MI_JPD_QueryStreamInfo 从解码通道获取码流信息。
    MI_JPD_DirectBufDecode 解码通道直接按APP指定的输入和输出缓存解码。
    MI_JPD_PauseChn 暂停通道解码。
    MI_JPD_RefreshChn 刷新通道,再次解码当前帧。
    MI_JPD_ResumeChn 恢复通道解码。
    MI_JPD_StepChn 通道单帧解码。

    2.1. 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_SUCCESS:失败,详情参照错误码

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

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

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

    • 相关主题

      MI_JPD_DestroyDev


    2.2. MI_JPD_DestroyDev

    • 功能

      销毁设备。

    • 定义

      MI_S32 MI_JPD_DestroyDev(MI_JPD_DEV JpdDev);
      
    • 形参

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

      • MI_SUCCESS:成功。

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

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

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

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

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

    • 相关主题

      MI_JPD_CreateDev


    2.3. 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_SUCCESS:失败,详情参照错误码

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

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

      • 用户可以在调用MI_JPD_CreateChn时,通过ePixelFormat参数设置输出像素格式。

        芯片名 最大解码通道数 输出像素格式
        Tiramisu 16 YUYV
        Muffin 16 YUYV
        Mochi 16 YUYV
        Opera 16 YUYV
        Souffle 64 YUYV,NV12
        iFackel 16(默认值。若设定模块参数maxChnNum,则由maxChnNum确定) YUYV,NV12
        iBopper 16(默认值。若设定模块参数maxChnNum,则由maxChnNum确定) YUYV
        jaguar1 16(默认值。若设定模块参数maxChnNum,则由maxChnNum确定) YUYV,NV12
        mhera 64(默认值。若设定模块参数maxChnNum,则由maxChnNum确定) YUYV,NV12
      • 用户可以在调用MI_JPD_CreateChn时,通过u32StreamBufSize参数设置码流缓存Buffer的大小。用户可根据实际需求,选择合理的值设置,按照经验值,配置大小可参照如下:

        分辨率范围 Buffer Size
        [min,720x576] 512KB
        (720x576,1920x1080] 1MB
        (1920x1080,max] 4MB

        其中,min和max可参看芯片解码规格

      • 同一个device创建多个通道且绑定SCL模块时,绑定模式只能设为E_MI_SYS_BIND_TYPE_FRAME_BASE或者E_MI_SYS_BIND_TYPE_REALTIME其中一种,不支持同时存在。

    • 举例

      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;
          stChnCreatConf.ePixelFormat = E_MI_SYS_PIXEL_FRAME_YUV422_YUYV;
          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.4. MI_JPD_DestroyChn

    • 功能

      销毁解码通道。

    • 定义

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

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

      • MI_SUCCESS:成功。

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

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.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.5. 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_SUCCESS:失败,详情参照错误码

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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


    2.6. MI_JPD_StartChn

    • 功能

      通道开始接收码流。

    • 定义

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

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

      • MI_SUCCESS:成功。

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

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

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

      • 如果MI_JPD有后级模块,推荐先调用MI_SYS接口将MI_JPD与后级模块绑定,再启动接收码流。

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

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

    • 举例

      请参见MI_JPD_CreateChn的举例。

    • 相关主题

      MI_JPD_StopChn


    2.7. MI_JPD_StopChn

    • 功能

      解码通道停止接收码流。

    • 定义

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

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

      • MI_SUCCESS:成功。

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

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

      • 如果MI_JPD有后级模块,推荐先停止解码通道,再调用MI_SYS接口将MI_JPD与后级模块解绑定。

      • 调用此接口后,调用发送码流接口 MI_JPD_GetStreamBuf /MI_JPD_PutStreamBuf 会返回失败。

      • 重复调用停止接收码流接口时,返回MI_ERR_JPD_CHN_NOT_START。

    • 举例

      请参见MI_JPD_DestroyChn的举例。

    • 相关主题

      MI_JPD_StartChn


    2.8. 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_SUCCESS:失败,详情参照错误码

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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


    2.9. MI_JPD_ResetChn

    • 功能

      复位解码通道。

    • 定义

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

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

      • MI_SUCCESS:成功。

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

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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


    2.10. 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_SUCCESS:失败,详情参照错误码

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.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.11. 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_SUCCESS:失败,详情参照错误码

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

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

      请参见MI_JPD_GetStreamBuf 的举例。

    • 相关主题

      MI_JPD_GetStreamBuf


    2.12. MI_JPD_DropStreamBuf

    • 功能

      通知解码通道送流失败,解码通道会释放对应通过MI_JPD_GetStreamBuf所取到的码流缓存。

    • 定义

      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_SUCCESS:失败,详情参照错误码

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

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

      请参见[MI_JPD_GetStreamBuf 的举例。

    • 相关主题

      MI_JPD_GetStreamBuf


    2.13. 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_SUCCESS:失败,详情参照错误码

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

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

      请参见MI_JPD_DirectBufDecode的举例。

    • 相关主题

      MI_JPD_DirectBufDecode


    2.14. 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_SUCCESS:失败,详情参照错误码

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

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

      • 该接口设置的图像输出像素存储格式需要与MI_JPD_CreateChn接口设置的图像输出像素存储格式的值保持一致。

    • 举例

      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;
          // get jpeg stream information and use it to configure output buffer
          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;
          }
      
          // set output pixel format to 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;
          }
      
          // decoding is triggered directly by the specified input and output buffer
          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


    2.15. MI_JPD_PauseChn

    • 功能

      暂停通道解码。

    • 定义

      MI_S32 MI_JPD_PauseChn(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn);
      
    • 形参

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

      • MI_SUCCESS:成功。

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

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

      • 调用该接口后,解码器停止解码;此时,上层可以继续送流,但是码流buffer满时,调用MI_JPD_GetStreamBuf会返回错误码MI_ERR_JPD_BUF_FULL。

      • 该接口可以重复调用,不会报错。

    • 举例

      MI_S32 PauseChn(void)
      {
          MI_S32 s32Ret = MI_ERR_JPD_FAILED;
          MI_JPD_DEV JpdDev  = 0;
          MI_JPD_CHN JpdChn  = 0;
          MI_U32 u32RefreshCnt = 0;
      
          //While decoding...
      
          s32Ret = MI_JPD_PauseChn(JpdDev, JpdChn);
          if (MI_SUCCESS != s32Ret)
          {
              printf("MI_JPD_PauseChn failed, s32Ret: 0x%x.\n", s32Ret);
              return s32Ret;
          }
      
          //refresh 10 times
          while (u32RefreshCnt < 10)
          {
              s32Ret = MI_JPD_RefreshChn(JpdDev, JpdChn);
              if(MI_SUCCESS != s32Ret)
              {
                  printf("MI_JPD_RefreshChn failed, s32Ret: 0x%x.\n", s32Ret);
                  break;
              }
              u32RefreshCnt ++;
              usleep(100*1000);
          }
      
          s32Ret = MI_JPD_ResumeChn(JpdDev, JpdChn);
          if (MI_SUCCESS != s32Ret)
          {
              printf("MI_JPD_ResumeChn failed, s32Ret: 0x%x.\n", s32Ret);
              return s32Ret;
          }
          return MI_SUCCESS;
      }
      
    • 相关主题

      MI_JPD_ResumeChn


    2.16. MI_JPD_RefreshChn

    • 功能

      刷新通道,再次解码当前帧。

    • 定义

      MI_S32 MI_JPD_RefreshChn(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn);
      
    • 形参

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

      • MI_SUCCESS:成功。

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

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

      • 调用该接口时,需要保证已调用MI_JPD_PauseChn停止解码,否则会报错误码MI_ERR_JPD_NOT_DISABLE。

      • 每调用一次该接口,会触发解码器再次解码当前帧;可以多次调用,同时可以配合MI_SCL模块调整缩放倍数,以适应不同的场景需求。

      • 用户在调用该接口时,需要保证码流buffer中还有待解码的数据,否则不能完成refresh动作。

      • 用户连续多次调用该接口时,如果上一次的refresh或step task未完成,则接口会返回错误码MI_ERR_JPD_BUSY。

    • 举例

      请参见MI_JPD_PauseChnMI_JPD_StepChn的举例。

      实现暂停时电子放大功能,常见应用场景举例:假设MI_DISP在预览模式下输出分辨率为1920x1080,4通道都为1080P的源码流同时解码预览时,每个通道输出分辨率设置为960x540输出显示。如果暂停解码,然后将通道2切换至全屏预览,MI_DISP会将960x540的图像拉伸至1920x1080全屏显示,此时图像数据会失真。此时可以通过调用MI_JPD_RefreshChn获取到当前暂停的数据帧的1920x1080的图像进行无失真显示输出。

      通道要实现暂停电子放大功能,依赖于 MI_JPD_PauseChnMI_JPD_RefreshChnMI_JPD_ResumeChn以及MI_JPD_GetStreamBufMI_JPD_PutStreamBuf组合,目的是为相同的码流数据帧能获得不同分辨率的图像的功能,如下,图像3需要重复输出4次。

      API组合调用时序:

      Step 1:调用MI_JPD_GetStreamBufMI_JPD_PutStreamBuf推送数据帧‘1’和‘2’的码流数据。

      Step 2:调用MI_JPD_PauseChn暂停解码器,进入解码输出重复图像帧模式。

      Step 3:调用MI_JPD_GetStreamBufMI_JPD_PutStreamBuf推送需要重复输出图像‘3’的码流数据到解码器。

      Step 4:重复调用MI_JPD_RefreshChn,重复输出图像‘3’,每调用1次将输出1帧图像,调用次数无限制。当前示例调用4次。

      Step 5:调用MI_JPD_ResumeChn退出重复解码相同图像帧模式。

      Step 6:调用MI_JPD_GetStreamBufMI_JPD_PutStreamBuf推送数据帧‘4’和‘5’的码流数据。

    • 相关主题

      MI_JPD_PauseChn

      MI_JPD_ResumeChn


    2.17. MI_JPD_ResumeChn

    • 功能

      恢复通道解码。

    • 定义

      MI_S32 MI_JPD_ResumeChn(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn);
      
    • 形参

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

      • MI_SUCCESS:成功。

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

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

      • 调用该接口时,需要保证通道已创建,否则会报通道未创建的错误码MI_ERR_JPD_CHN_UNEXIST。

      • 调用该接口时,需要保证通道已使能,否则会报通道未使能的错误码MI_ERR_JPD_CHN_NOT_START。

      • 允许重复调用该接口。

      • 调用该接口时,如果还有refresh或step task未完成,则接口会返回错误码MI_ERR_JPD_BUSY。

    • 举例

      请参见MI_JPD_PauseChnMI_JPD_StepChn的举例。

    • 相关主题

      MI_JPD_PauseChn


    2.18. MI_JPD_StepChn

    • 功能

      通道单帧解码。

    • 定义

      MI_S32 MI_JPD_StepChn(MI_JPD_DEV JpdDev, MI_JPD_CHN JpdChn);
      
    • 形参

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

      • MI_SUCCESS:成功。

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

    • 依赖

      • 头文件:mi_jpd.h、mi_jpd_datatype.h

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

    • 注意

      • 每调用一次该接口,会触发解码器解码下一帧;可以多次调用,同时可以配合MI_SCL模块调整缩放倍数,以适应不同的场景需求。

      • 用户在调用该接口时,需要保证码流buffer中还有待解码的数据,否则不能完成step动作。

      • 用户连续多次调用该接口时,如果上一次的refresh或step task未完成,则接口会返回错误码MI_ERR_JPD_BUSY。

    • 举例

      Case 1: 单独step功能

      MI_S32 StepChn(void)
      {
          MI_S32 s32Ret = MI_ERR_JPD_FAILED;
          MI_JPD_DEV JpdDev  = 0;
          MI_JPD_CHN JpdChn  = 0;
          MI_JPD_StreamBuf_t stRetStreamBuf;
      
          //While decoding...
      
          s32Ret = MI_JPD_PauseChn(JpdDev, JpdChn);
          if (MI_SUCCESS != s32Ret)
          {
              printf("MI_JPD_PauseChn failed, s32Ret: 0x%x.\n", s32Ret);
              return s32Ret;
          }
      
          memset(&stRetStreamBuf, 0x0, sizeof(MI_JPD_StreamBuf_t));
          u32RequiredLength = u32FrameLen; //实际码流帧长度
          s32TimeOutMs = 0;
          /// 此处送流过程也可以用另起独立的线程处理
          s32Ret = MI_JPD_GetStreamBuf(JpdDev, JpdChn, u32RequiredLength, &stRetStreamBuf, s32TimeOutMs);
          if (MI_SUCCESS != s32Ret)
          {
              printf("MI_JPD_GetStreamBuf failed, s32Ret: 0x%x.\n", s32Ret);
              return s32Ret;
          }
      
          //用户拷贝数据到码流buffer
      
          s32Ret = MI_JPD_PutStreamBuf(JpdDev, JpdChn, &stRetStreamBuf);
          if (MI_SUCCESS != s32Ret)
          {
              printf("MI_JPD_PutStreamBuf failed, s32Ret: 0x%x.\n", s32Ret);
              return s32Ret;
          }
      
          s32Ret = MI_JPD_StepChn(JpdDev, JpdChn);
          if(MI_SUCCESS != s32Ret)
          {
              printf("MI_JPD_StepChn failed, s32Ret: 0x%x.\n", s32Ret);
              return s32Ret;
          }
          usleep(20*1000);
      
          s32Ret = MI_JPD_ResumeChn(JpdDev, JpdChn);
          if (MI_SUCCESS != s32Ret)
          {
              printf("MI_JPD_ResumeChn failed, s32Ret: 0x%x.\n", s32Ret);
              return s32Ret;
          }
          return MI_SUCCESS;
      }
      

      Case 2: step和refresh组合功能

      MI_S32 refresh_and_step_chn(void)
      {
          MI_S32 s32Ret = MI_ERR_JPD_FAILED;
          MI_JPD_DEV JpdDev  = 0;
          MI_JPD_CHN JpdChn  = 0;
          MI_U32 u32LoopCnt = 0;
          MI_JPD_StreamBuf_t stRetStreamBuf;
      
          //While decoding...
      
          s32Ret = MI_JPD_PauseChn(JpdDev, JpdChn);
          if (MI_SUCCESS != s32Ret)
          {
              printf("MI_JPD_PauseChn failed, s32Ret: 0x%x.\n", s32Ret);
              return s32Ret;
          }
      
          memset(&stRetStreamBuf, 0x0, sizeof(MI_JPD_StreamBuf_t));
          u32RequiredLength = u32FrameLen; //实际码流帧长度
          s32TimeOutMs = 0;
          /// 此处送流过程也可以用另起独立的线程处理
          s32Ret = MI_JPD_GetStreamBuf(JpdDev, JpdChn, u32RequiredLength, &stRetStreamBuf, s32TimeOutMs);
          if (MI_SUCCESS != s32Ret)
          {
              printf("MI_JPD_GetStreamBuf failed, s32Ret: 0x%x.\n", s32Ret);
              return s32Ret;
          }
      
          //用户拷贝数据到码流buffer
      
          s32Ret = MI_JPD_PutStreamBuf(JpdDev, JpdChn, &stRetStreamBuf);
          if (MI_SUCCESS != s32Ret)
          {
              printf("MI_JPD_PutStreamBuf failed, s32Ret: 0x%x.\n", s32Ret);
              return s32Ret;
          }
      
          /*Loop 10 times*/
          While(u32LoopCnt < 10)
          {
              s32Ret = MI_JPD_RefreshChn(JpdDev, JpdChn);
              if(MI_SUCCESS != s32Ret)
              {
                  printf("MI_JPD_RefreshChn failed, s32Ret: 0x%x.\n", s32Ret);
                  return s32Ret;
              }
              usleep(20*1000);
      
              memset(&stRetStreamBuf, 0x0, sizeof(MI_JPD_StreamBuf_t));
              u32RequiredLength = u32FrameLen; //实际码流帧长度
              s32TimeOutMs = 0;
              /// 此处送流过程也可以用另起独立的线程处理
              s32Ret = MI_JPD_GetStreamBuf(JpdDev, JpdChn, u32RequiredLength, &stRetStreamBuf, s32TimeOutMs);
              if (MI_SUCCESS != s32Ret)
              {
                  printf("MI_JPD_GetStreamBuf failed, s32Ret: 0x%x.\n", s32Ret);
                  return s32Ret;
              }
      
              //用户拷贝数据到码流buffer
      
              s32Ret = MI_JPD_PutStreamBuf(JpdDev, JpdChn, &stRetStreamBuf);
              if (MI_SUCCESS != s32Ret)
              {
                  printf("MI_JPD_PutStreamBuf failed, s32Ret: 0x%x.\n", s32Ret);
                  return s32Ret;
              }
      
              s32Ret = MI_JPD_StepChn(JpdDev, JpdChn);
              if(MI_SUCCESS != s32Ret)
              {
                  printf("MI_JPD_StepChn failed, s32Ret: 0x%x.\n", s32Ret);
                  return s32Ret;
              }
              usleep(20*1000);
              u32LoopCnt ++;
          }
      
          s32Ret = MI_JPD_ResumeChn(JpdDev, JpdChn);
          if (MI_SUCCESS != s32Ret)
          {
              printf("MI_JPD_ResumeChn failed, s32Ret: 0x%x.\n", s32Ret);
              return s32Ret;
          }
          return MI_SUCCESS;
      }
      
    • 相关主题

      MI_JPD_PauseChn

      MI_JPD_ResumeChn


    3. 数据类型


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

    数据结构 说明
    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.1. MI_JPD_DEV

    • 说明

      定义JPD设备ID类型。

    • 定义

      typedef MI_S32 MI_JPD_DEV;
      

    3.2. MI_JPD_CHN

    • 说明

      定义JPD通道ID类型。

    • 定义

      typedef MI_S32 MI_JPD_CHN;
      

    3.3. 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.4. MI_JPD_InitParam_t

    • 说明

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

    • 定义

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

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

      MI_JPD_InitDev


    3.5. MI_JPD_ChnCreatConf_t

    • 说明

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

    • 定义

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

      成员名称 描述
      u32StreamBufSize 码流缓存总长度。
      ePixelFormat 输出图像像素格式,参考MI_JPD_CreateChn接口说明。
      u32MaxPicWidth 解码图像最大宽。
      u32MaxPicHeight 解码图像最大高。
    • 相关数据类型及接口

      MI_JPD_CreateChn


    3.6. 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_StreamInfo_t说明。
    • 相关数据类型及接口

      MI_JPD_GetChnAttr


    3.7. 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_GetChnStatus


    3.8. MI_JPD_StreamBuf_t

    • 说明

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

    • 定义

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

      成员名称 描述
      pu8HeadVirtAddr 头部码流缓存虚拟地址。
      u64Reserved 预留,兼容32位和64位地址长度。(不可使用)
      u64HeadPhyAddr 头部码流缓存物理地址。
      u32HeadLength 头部码流缓存长度。
      pu8TailVirtAddr 尾部码流缓存虚拟地址。(不可使用)
      u64Reserved2 预留,兼容32位和64位地址长度。(不可使用)
      u64TailPhyAddr 尾部码流缓存物理地址。(不可使用)
      u32TailLength 尾部码流缓存长度。(不可使用)
      u32ContentLength 码流实际有效数据长度。
      u64Pts 码流包的时间戳,以微秒为单位。
    • 注意事项

      • 底层码流缓存示意图可能有如下几种情况:

        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。

      • 对于如下底层码流缓存示意图:

        此时中间存储着先前送入但还没解码的JPG码流,Free1的长度不满足期望长度u32RequiredLength,底层stream buffer首部还有一块空闲缓存,如果Free2的长度满足期望长度u32RequiredLength,底层会将stream buffer的start_addr赋值给pu8HeadVirtAddr,u32RequiredLength赋值给u32HeadLength,否则,由于当前底层空闲缓存长度小于上层期望得到的码流缓存长度,上层获取期望长度的底层码流缓存失败。

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

    • 相关数据类型及接口

      MI_JPD_GetStreamBuf

      MI_JPD_PutStreamBuf

      MI_JPD_DropStreamBuf


    3.9. 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 图像输入像素存储格式,支持YUV444,YUV440,YUV422,YUV420,YUV411,YUV400等多种YUV格式编码的码流。参考MI_SYS_PixelFormat_e说明。
      u32BufWidth 输出缓存实际宽。
      u32BufHeight 输出缓存实际高。
    • 注意事项

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

      • 目前不支持获取参数ePixelFormat的值。

    • 相关数据类型及接口

      MI_JPD_ChnAttr_t

      MI_JPD_QueryStreamInfo


    3.10. MI_JPD_DirectInputBuf_t

    • 说明

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

    • 定义

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

      成员名称 描述
      pu8InputJPGRawFrameDataVirtAddr 存储JPG码流数据的虚拟地址。
      u64Reserved 预留,兼容32位和64位地址长度。(不可使用)
      phyAddr 可选,存储JPG码流数据的物理地址,默认为0。
      u32Length 码流数据长度。
    • 注意事项

    • 相关数据类型及接口

      MI_JPD_QueryStreamInfo

      MI_JPD_DirectBufDecode


    3.11. 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 图像输出像素存储格式,参考MI_JPD_CreateChn接口说明。
      u32Width 图像输出缓存实际宽。
      u32Height 图像输出缓存实际高。
      u32Stride u32Stride[0]:Y数据stride;
      u32Stride[1]:UV数据stride。
      phyAddr phyAddr[0]:Y数据的起始物理地址;
      phyAddr[1]:UV数据的起始物理地址。
    • 注意事项

    • 相关数据类型及接口

      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 模块已成功加载
    0xA0202017 MI_ERR_JPD_NOT_ENABLE 解码器未使能
    0xA0202018 MI_ERR_JPD_NOT_DISABLE 解码器未禁用
    0xA020201C MI_ERR_JPD_CHN_NO_CONTENT 通道无数据
    0xA020201F MI_ERR_JPD_FAILED 失败

    5. PROCFS介绍


    5.1. cat

    • 调试信息

      #cat /proc/mi_modules/mi_jpd/mi_jpdN
      

      N表示不同的device,不同chip的N取值如下:

      Chip N
      Tiramisu 0
      Muffin 0~3
      Mochi 0~1
      Opera 0
      Souffle 0
      iFackel 0
      iBopper 0
      jaguar1 0
      mhera 0~1

      查看jpd device 0:

      # cat /proc/mi_modules/mi_jpd/mi_jpd0
      

    • 调试信息分析

      打印分为两部分,使用Private JpdN Info分隔开。上半部分为common信息,下半部分为jpd模块信息。主要记录解码通道的使用情况及配置属性,可用于检查属性配置和当前通道的工作状态,便于debug。

    • 参数说明

      参数 描述
      DEV info DevID 硬件设备号
      WorkingTaskCnt 该设备正在处理的task个数
      CHN Info ChnID 通道号
      Start 使能状态:
      0:不使能
      1:使能
      DecState 解码状态:
      0:解析header
      1:解码
      2:解码结束
      Width 当前解码图像宽度
      Height 当前解码图像高度
      BufW 当前解码图像需要分配的output buffer width
      BufH 当前解码图像需要分配的output buffer height
      StreamBufSize 码流input buffer pool size,单位:byte
      MinAllocSize 允许成功分配的input buffer min size
      WorkingTaskCnt 该通道正在处理的task个数
      IsrDoneCnt done类型的isr count
      IsrOtherCnt other类型的isr count
      Poll 执行OnPollingAsyncOutputTaskConfig的时间点,单位:ms
      Enque 执行EnqueueAsyncOutputTask的时间点,单位:ms
      Isr 执行isr的时间点,单位:ms
      Check 执行CheckOutputTaskStatus的时间点,单位:ms
      Dequeue 执行DequeueOutputTask的时间点,单位:ms
      P->E Poll到Enque的耗时,单位:ms
      E->I Enque到Isr的耗时,单位:ms
      I->C Isr到Check的耗时,单位:ms
      C->D Check到Dequeue的耗时,单位:ms
      P->D Poll到Dequeue的耗时,单位:ms
      SmoothDecodeTime 平均解码时间,单位:ms
      CHN INPUT Info ChnID  通道号
      SendCnt App输入stream总个数
      LeftCnt Input buffer pool堆积的stream个数
      SendStreamSize App输入stream的总size
      LeftStreamBytes Input buffer pool堆积的stream size
      EnqueueCnt 执行EnqueueAsyncOutputTask成功的总次数
      DirectCnt 调用MI_JPD_DirectBufDecode触发解码的次数
      DropCnt 执行EnqueueAsyncOutputTask失败的总次数
      RewindCnt 执行EnqueueAsyncOutputTask rewind的总次数
      ifps App输入stream的帧率
      MinIntvl APP输入stream的最小间隔,单位ms
      MaxIntvl APP输入stream的最大间隔,单位ms
      SumIntvl APP输入stream的累加间隔,单位ms
      AvgIntvl APP输入stream的平均间隔,单位ms
      Diff APP输入stream的当前间隔,单位ms
      CHN OUTPUT Info ChnID  通道号
      DecCnt 解码成功的总次数
      DirectCnt 调用MI_JPD_DirectBufDecode解码成功的总次数
      DropCnt 解码失败的总次数
      ofps 输出帧率
      MinIntvl 输出的最小间隔,单位ms
      MaxIntvl 输出的最大间隔,单位ms
      SumIntvl 输出的累加间隔,单位ms
      AvgIntvl 输出的平均间隔,单位ms
      Diff 输出的当前间隔,单位ms


    5.2. echo

    功能 将指定通道的bitstream buffer存储到指定路径
    命令 echo dumpsb [chn] [bEnable] [path] > /proc/mi_modules/mi_jpd/mi_jpd[dev]
    参数说明 [chn]:通道号
    [bEnable]:1:开启dump; 0:停止dump
    [path]:保存文件的路径
    [dev]:设备号
    举例 echo dumpsb 3 1 /mnt > /proc/mi_modules/mi_jpd/mi_jpd0
    dump通道3的bitstream buffer到/mnt目录下
    功能 将指定通道解码后的输出数据帧存储到指定路径
    命令 echo dumpfb [chn] [bEnable] [path] > /proc/mi_modules/mi_jpd/mi_jpd[dev]
    参数说明 [chn]:通道号
    [bEnable]:1:开启dump; 0:停止dump
    [path]:保存文件的路径
    [dev]:设备号
    举例 echo dumpfb 3 1 /mnt > /proc/mi_modules/mi_jpd/mi_jpd0
    dump 通道3的输出数据帧到/mnt目录下