MI JPD API
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成对使用,否则返回失败。
-
-
相关主题
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成对使用,否则返回失败。
-
-
相关主题
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; }
-
相关主题
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; }
-
相关主题
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的举例。
-
相关主题
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_GetStreamBuf /MI_JPD_PutStreamBuf 会返回失败。
-
重复调用停止接收码流接口时,返回MI_ERR_JPD_CHN_NOT_START。
-
-
举例
请参见MI_JPD_DestroyChn的举例。
-
相关主题
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; }
-
相关主题
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 成功后,将对应JPG码流拷贝到该接口返回的地址空间,如果成功,最后需要调用MI_JPD_PutStreamBuf;如果失败,最后需要调用MI_JPD_DropStreamBuf。
-
举例
请参见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 成功后,将对应JPG码流拷贝到该接口返回的地址空间,如果成功,最后需要调用MI_JPD_PutStreamBuf;如果失败,最后需要调用MI_JPD_DropStreamBuf。
-
举例
请参见[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的举例。
-
相关主题
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; }
-
相关主题
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 作保留用。 -
相关数据类型及接口
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 解码图像最大高。 -
相关数据类型及接口
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 码流信息。 -
相关数据类型及接口
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 解码错误码信息。 -
相关数据类型及接口
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。此时底层码流缓存示意图可能有如下几种情况:
-
此时底层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。
-
-
如果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。
-
-
相关数据类型及接口
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则是指图像的实际有效宽高。
-
相关数据类型及接口
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。
-
-
相关数据类型及接口
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。
-
相关数据类型及接口
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 | 失败 |