MI JPD API¶
REVISION HISTORY¶
| Revision No. | Description |
Date |
|---|---|---|
| 2.00 | 12/17/2020 | |
| 08/25/2021 | ||
| 06/28/2022 | ||
| 06/29/2021 | ||
| 2.01 | 07/15/2022 | |
MI_JPD_StreamBuf_t MI_JPD_DirectInputBuf_t |
10/25/2022 | |
MI_JPD_StreamBuf_t |
11/10/2022 | |
| 12/01/2022 | ||
| 01/09/2023 | ||
| 03/13/2023 | ||
| 03/13/2023 | ||
| 04/12/2023 | ||
| 2.02 | 08/26/2024 | |
| 2.03 | 01/10/2025 | |
| 2.04 | 02/27/2025 | |
| 2.05 | 11/12/2025 | |
| 2.06 | 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成对使用,否则返回失败。
-
-
相关主题
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成对使用,否则返回失败。
-
-
相关主题
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; } -
相关主题
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; } -
相关主题
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的举例。
-
相关主题
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的举例。
-
相关主题
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; } -
相关主题
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 的举例。
-
相关主题
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 的举例。
-
相关主题
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的举例。
-
相关主题
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; } -
相关主题
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; } -
相关主题
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_PauseChn和MI_JPD_StepChn的举例。
实现暂停时电子放大功能,常见应用场景举例:假设MI_DISP在预览模式下输出分辨率为1920x1080,4通道都为1080P的源码流同时解码预览时,每个通道输出分辨率设置为960x540输出显示。如果暂停解码,然后将通道2切换至全屏预览,MI_DISP会将960x540的图像拉伸至1920x1080全屏显示,此时图像数据会失真。此时可以通过调用MI_JPD_RefreshChn获取到当前暂停的数据帧的1920x1080的图像进行无失真显示输出。

通道要实现暂停电子放大功能,依赖于 MI_JPD_PauseChn,MI_JPD_RefreshChn,MI_JPD_ResumeChn以及MI_JPD_GetStreamBuf和MI_JPD_PutStreamBuf组合,目的是为相同的码流数据帧能获得不同分辨率的图像的功能,如下,图像3需要重复输出4次。
API组合调用时序:
Step 1:调用MI_JPD_GetStreamBuf和MI_JPD_PutStreamBuf推送数据帧‘1’和‘2’的码流数据。
Step 2:调用MI_JPD_PauseChn暂停解码器,进入解码输出重复图像帧模式。
Step 3:调用MI_JPD_GetStreamBuf和MI_JPD_PutStreamBuf推送需要重复输出图像‘3’的码流数据到解码器。
Step 4:重复调用MI_JPD_RefreshChn,重复输出图像‘3’,每调用1次将输出1帧图像,调用次数无限制。当前示例调用4次。
Step 5:调用MI_JPD_ResumeChn退出重复解码相同图像帧模式。
Step 6:调用MI_JPD_GetStreamBuf和MI_JPD_PutStreamBuf推送数据帧‘4’和‘5’的码流数据。


-
相关主题
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_PauseChn和MI_JPD_StepChn的举例。
-
相关主题
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; } -
相关主题
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 保留。 -
相关数据类型及接口
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 解码图像最大高。 -
相关数据类型及接口
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说明。 -
相关数据类型及接口
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 解码错误码信息。 -
相关数据类型及接口
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 码流包的时间戳,以微秒为单位。 -
注意事项
-
底层码流缓存示意图可能有如下几种情况:
-
此时底层stream buffer都是空闲的,如果Free1的长度满足于期望长度u32RequiredLength,底层会将stream buffer的start_addr赋值给pu8HeadVirtAddr,u32RequiredLength赋值给u32HeadLength。
-
此时底层stream buffer首部存储着一块先前送入但还未解码的JPG码流,如果Free1的长度满足于期望长度u32RequiredLength,底层会将stream buffer的start_addr_free1赋值给pu8HeadVirtAddr,u32RequiredLength赋值给u32HeadLength。
-
此时底层stream buffer的中间存储着一块先前送入但还未解码的JPG码流,两边都是空闲缓存,如果Free1的长度满足期望长度u32RequiredLength,底层会将stream buffer的start_addr_free1赋值给pu8HeadVirtAddr,u32RequiredLength赋值给u32HeadLength。
-
此时底层stream buffer的末尾存储着一块先前送入但还未解码的JPG码流,如果Free1的长度满足期望长度u32RequiredLength,底层会将stream buffer的start_addr赋值给pu8HeadVirtAddr,u32RequiredLength赋值给u32HeadLength。
-
此时底层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。
-
-
相关数据类型及接口
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的值。
-
-
相关数据类型及接口
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_GetStreamBuf 获得,而是要通过系统申请。
-
如果一直是以这种方式送流解码,MI_JPD_CreateChn中的参数u32StreamBufSize可设置为0,这样内部就不会分配stream buffer。
-
通过MI_JPD_DirectBufDecode接口达到同步解码目的。通过MI_JPD_GetStreamBuf/ MI_JPD_PutStreamBuf为异步解码过程。
-
-
相关数据类型及接口
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_CreateChn接口说明。
-
相关数据类型及接口
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_jpdNN表示不同的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目录下 |