系统控制 (SYS)
概述
系统控制模块实现 ZMEDIA MPI 通用功能接口,提供系统相关功能、大块物理内存管理等功能。
功能描述
内存缓存池
内存缓存池主要向媒体业务提供内存管理功能,负责内存的分配和回收,充分发挥内存缓存池的作⽤,让内存资源在各个媒体处理模块中合理使⽤。
⼀组⼤⼩相同的内存缓存块组成⼀个内存缓存池。根据业务的不同,申请的缓存池的数量、缓存块的⼤⼩和数量不同。
ZH 提供四种内存缓存池模式(详⻅ MB_SOURCE_E):私有缓冲池(MB_SOURCE_PRIVATE)、公有缓冲池(MB_SOURCE_COMMON)、模块缓冲池(MB_SOURCE_MODULE)和⽤⼾缓冲池(MB_SOURCE_USER)。
注意:
并⾮所有模块都⽀持这⼏种模式,详细请看各模块描述。未描述时,默认模块使⽤私有缓冲池。
私有缓冲池
私有缓冲池模式下,内存缓存池由模块各通道⾃⾏申请,申请⼤⼩,个数由通道内部根据所设参数及默认参数⾃⾏决定。
VPSS 通道内按需分配私有缓冲池,VPSS 从私有缓冲池中获取内存块后将⽬标图像输出⾄该内存块,送⾄ VO 显⽰,VO 显⽰完毕后释放回私有缓冲池。典型的私有缓冲池数据流图如下所示。

公共缓冲池
所有的视频输⼊通道都可以从公共视频缓存池中获取视频缓存块⽤于保存采集的图像。
假设 VPSS 通道的⼯作模式是 USER,则 VPSS 通道 0 从公共视频缓存池 A 中获取缓存块 Ai 作为输出图像缓存 buffer 发送给 VENC,VPSS 通道 1 从公共视频缓存池 B 中获取缓存块 Bi 作为输出图像缓存 buffer 发送给 VO ,Ai 经 VENC 编码完之后释放回公共视频缓存池,Bi 经 VO 显⽰完之后释放回公共视频缓存池。典型的公共缓冲池数据流图如下所示。
用户缓冲池
⽤⼾内存缓冲池由⽤⼾通过模块的 attach pool 接⼝注⼊外部内存缓存池。典型的⽤⼾缓冲池数据流图如下所示。

内存池单块 MB 大小计算规则
为了保证注⼊的内存池可被正常使⽤,内存池内存计算需要满⾜⼀定规则,直接参考 zh_mpi_cal.h。
zh_mpi_cal.h 定义了内存⼤⼩计算接⼝,图像 buffer ⼤⼩及虚宽⾼计算⽅法及接⼝介绍如下:
| 接口名 | 用途 |
|---|---|
| ZH_MPI_CAL_COMM_GetPicBufferSize | 计算通用的图像 buffer 大小(不被单独列出接口的模块均可以使用该接口确认大小)。 |
| ZH_MPI_CAL_TDE_GetPicBufferSize | 计算 TDE 输出所需图像 buffer 大小。 |
| ZH_MPI_CAL_VGS_GetPicBufferSize | 计算 VGS、VPSS 输出所需图像 buffer 大小。 |
| ZH_MPI_CAL_VDEC_GetPicBufferSize | 计算 VDEC 输出所需图像 buffer 大小。 |
| ZH_MPI_CAL_VGS_GetPicVirWidth | 获取 VGS 输出图像像素对齐后的宽度,以像素为单位。 |
| ZH_MPI_CAL_VGS_GetPicVirHeight | 获取 VGS 输出图像像素对齐后的高度,以像素为单位。 |
| ZH_MPI_CAL_VDEC_GetVirWidth | 获取 VDEC 输出图像像素对齐后的宽度,以像素为单位。 |
| ZH_MPI_CAL_VDEC_GetVirHeight | 获取 VDEC 输出图像像素对齐后的高度,以像素为单位。 |
| ZH_MPI_CAL_COMM_GetHorStride | 实现虚宽(以像素为单位)到 Stride (以字节为单位)的转换。 |
| ZH_MPI_CAL_COMM_GetVirWidth | 实现 Stride(以字节为单位)到虚宽(以像素为单位)的转换。 |
DMA 内存与 Cache 的一致性
在应⽤调试及功能实现的过程中,经常会涉及到 CPU 与 GPU、VDEC 等多个硬件模块对同⼀个 DMA 内存数据的读写,此时通常情况会引⼊ cache ⼀致性问题(如果申请的 non cache 的 DMA 内存则不存在该问题,但实际上这种内存读写效率较低,在有 CPU 参与访问数据的情况下,通常不使⽤)。
在对 DMA 内存读写过程中,通过 DDR 控制器对 DDR 存储器进⾏访问,为了加快访问速度,常常将⼀批数据缓存在 cache 中。 好处是下次访问速度会加快,但 cache 数据发⽣变化时,不能⻢上反映到 DDR 中,反之亦然。当通过 GPU、RGA 等硬件 IP 修改 DDR 数据时,CPU 可能获取的还是 cache 中没有修改的数据,导致读写数据的错误。
CPU 与 GPU、RGA 等硬件 IP 对 DDR 数据交互如图所⽰。
基于上述 cache 特点,使⽤ DMA 内存进⾏数据读写需要满⾜以下准则:
- 当 CPU 往 DMA 内存写数据后,若 GPU、RGA 等其他硬件 IP 需要访问该 DMA 内存时,需先调⽤ ZH_MPI_SYS_MmzFlushCache,将 cache 写⽅向 flush,将 CPU 端的 Cache 数据 flush 到 DDR 中。
- 当 CPU 从 DMA 内存读数据前,若在此之前有 GPU、RGA 等其他硬件 IP 有修改该 DMA 内存时,若需要先调⽤ ZH_MPI_SYS_MmzFlushCache,将 cache 读⽅向 flush,将 Cache 置为失效,保证与 DDR 中数据⼀致性。
系统绑定
MPI 提供系统绑定接⼝(ZH_MPI_SYS_Bind),即通过数据接收者绑定数据源来建⽴两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源⽣成的数据将⾃动发送给接收者。⽬前⽀持的绑定关系如下表:
| 数据源 | 数据接收者 |
|---|---|
| VI | VO |
| VI | VENC |
| VI | VPSS |
| VI | AVS |
| AVS | VENC |
| AVS | VO |
| AVS | VPSS |
| AVS | AVS |
| VPSS | AVS |
| VPSS | VO |
| VPSS | VENC |
| VPSS | VPSS |
| VDEC | VENC |
| VDEC | VPSS |
| VDEC | VO |
| WBC | VENC |
| WBC | VO |
| WBC | VPSS |
| VENC | VDEC |
| AI | AO |
| AI | AENC |
| ADEC | AO |
帧率控制
模块帧率控制属性包括输入帧率和输出帧率两部分,同时会根据输入帧率控制是否允许帧输入,例如输入帧率为 30 时,每 33.33ms 才允许输入一帧。
减帧模式
当输入帧率大于或等于输出帧率时,会根据设定值均匀丢弃某些帧。例如,输入帧率为 30,输出帧率为 15 时,每 2 帧将会丢弃一帧,具体减帧模式⽰意如图所示:

增帧模式
当输入帧率小于输出帧率时,会根据设定值均匀插入相同图像帧。例如,输入帧率为 15,输出帧率为 30 时,每两帧之间会插入相同的图像帧,具体增帧模式⽰意如图所示:

帧率控制功能支持列表
| 模块 | 增帧模式 | 减帧模式 | 送帧控制方式 |
|---|---|---|---|
| VI | 支持 | 支持 | 阻塞式 |
| VENC | 支持 | 支持 | 阻塞式 |
| VPSS (组) | 支持 | 支持 | 阻塞式 |
| VPSS (通道) | 不支持 | 支持 | 非阻塞式 |
| VO | 不支持 | 支持 | 非阻塞式 |
API参考
系统控制实现 MPI 系统绑定解绑、创建视频缓存池、提供系统时钟、内存管理等功能。该功能模块提供以下 API:
-
系统控制 API
- ZH_MPI_SYS_Init:初始化 ZH MPI 系统。
- ZH_MPI_SYS_Exit:反初始化 ZH MPI 系统。
- ZH_MPI_SYS_Bind:数据源到数据接收者绑定。
- ZH_MPI_SYS_UnBind:数据源到数据接收者解绑定。
- ZH_MPI_SYS_MmzAlloc:在⽤⼾态分配 MMZ 内存。
- ZH_MPI_SYS_MmzAlloc_Cached:在⽤⼾态分配 MMZ 内存,该内存⽀持 cache 缓存。
- ZH_MPI_SYS_MmzAllocEx:在⽤⼾态分配 MMZ 内存,可配置内存标志,如是否带 cache/是否是物理连续内存。
- ZH_MPI_SYS_MmzFree:在⽤⼾态释放 MMZ 内 存。
- ZH_MPI_SYS_MmzFlushCache:刷新 cache ⾥的内容到内存并且使 cache ⾥的内容⽆效。
- ZH_MPI_SYS_Malloc:申请 malloc 内存。
- ZH_MPI_SYS_Free:释放 malloc 申请的内存。
- ZH_MPI_SYS_CreateMB:创建⼀个内存缓存块。
- ZH_MPI_SYS_GetCurPTS:获取当前时间戳。
- ZH_MPI_SYS_InitPTSBase:初始化 ZH MPI 时间戳。
- ZH_MPI_SYS_SyncPTS:同步 ZH MPI 时间戳。
- ZH_MPI_SYS_SetChnInputMode:设置通道输入(接收)流模式。
-
内存缓存池 API
- ZH_MPI_MB_CreatePool:创建⼀个内存缓存池。
- ZH_MPI_MB_DestroyPool:销毁⼀个内存缓存池。
- ZH_MPI_MB_GetMB:获取⼀个缓存块。
- ZH_MPI_MB_ReleaseMB:释放⼀个已经获取的缓存块。
- ZH_MPI_MB_Handle2PhysAddr:获取⼀个缓存块的物理地址。
- ZH_MPI_MB_Handle2VirAddr:获取⼀个内存缓存池中的缓存块的⽤⼾态虚拟地址。
- ZH_MPI_MB_Handle2UniqueId:获取⼀个缓存块的系统全局唯⼀ ID。
- ZH_MPI_MB_Handle2Fd: ⽤⼾态通过缓存块的句柄。
- ZH_MPI_MB_Handle2PoolId:获取⼀个缓存块所在缓存池的 ID。
- ZH_MPI_MB_GetSize:获取⼀个缓存块的内存⼤⼩。
- ZH_MPI_MB_GetLength:获取⼀个缓存块的实际数据⼤小。
- ZH_MPI_MB_GetOffset:获取⼀个缓存块的实际内存偏移⼤小。
- ZH_MPI_MB_SetOffset:设置⼀个缓存块的内存偏移⼤⼩。
- ZH_MPI_MB_VirAddr2Handle:根据虚拟地址获取对应的缓存块。
- ZH_MPI_MB_UniqueId2Fd:根据系统全局唯⼀ ID 映射出 fd。
- ZH_MPI_MB_InquireUserCnt:查询缓存块使⽤计数信息。
- ZH_MPI_MB_SetModPoolConfig:设置模块公共视频缓存池属性。
- ZH_MPI_MB_GetModPoolConfig:获取模块公共视频缓存池属性。
- ZH_MPI_MB_SetConfig:设置视频公共缓存池属性。
- ZH_MPI_MB_GetConfig:获取视频公共缓存池属性。
- ZH_MPI_MB_Init:初始化视频公共缓冲池。
- ZH_MPI_MB_Exit:反初始化视频公共缓冲池。
- ZH_MPI_MB_SetBufferStride:设置缓存块⽤于存储图像时该图像的虚宽⾼ Stride。
ZH_MPI_SYS_Init
描述
初始化 ZH MPI 系统。
语法
ZH_S32 ZH_MPI_SYS_Init(ZH_VOID);
参数
无。
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
注意事项
- 运行 ZH MPI 系统前必须调用该接口进行初始化。
- 避免多次调用该接口,多次调用仍会返回成功,需与 ZH_MPI_SYS_Exit 成对使用。
- 多个进程暂无法共享资源使用各模块,仅 MB 模块相关接口可多进程使用。
ZH_MPI_SYS_Exit
描述
反初始化 ZH MPI 系统。
语法
ZH_S32 ZH_MPI_SYS_Exit(ZH_VOID);
参数
无。
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
注意事项
- 退出 ZH MPI 系统前必须调用该函数。
- 多次调用仍会返回成功,需与 ZH_MPI_SYS_Init 成对使用,否则会造成泄漏。
ZH_MPI_SYS_Bind
描述
数据源到数据接收者绑定的接⼝。
语法
ZH_S32 ZH_MPI_SYS_Bind(const MPP_CHN_S *pstSrcChn, const MPP_CHN_S *pstDestChn);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pstSrcChn | const MPP_CHN_S* | 源通道指针。 | 输入 |
| pstDestChn | const MPP_CHN_S* | 目的通道指针。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
注意事项
- 系统目前支持的绑定关系,请参见系统绑定章节。
- 同一个数据接收者只能绑定一个数据源。
- 绑定是指数据源和数据接收者建立关联关系。绑定后,数据源生成的数据将自动 发送给接收者。
- VI 和 VDEC 作为数据源,是以通道为发送者,向其他模块发送数据,用户将设备号置为 0,SDK 不检查输入的设备号。
- VPSS 作为数据接收者时,是以设备(GROUP)为接收者,接收其他模块发来的数据,用户将通道号置为 0。
- 模块作为数据发送者时,未设置图像队列深度(DEPTH)的模块,绑定后无法调用自身模块的接口获取图像;能够设置图像深度的模块,必须图像深度不为 0 才可手动获取图像。
ZH_MPI_SYS_UnBind
描述
数据源到数据接收者解绑定。
语法
ZH_S32 ZH_MPI_SYS_UnBind(const MPP_CHN_S *pstSrcChn, const MPP_CHN_S *pstDestChn);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pstSrcChn | const MPP_CHN_S* | 源通道指针。 | 输入 |
| pstDestChn | const MPP_CHN_S* | 目的通道指针。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
注意事项
pstDestChn 如果找不到绑定的源通道,或者找到了绑定的源通道但是绑定的源通道和 pstSrcChn 不匹配,则返回失败。
ZH_MPI_SYS_MmzAlloc
描述
在用户态分配 MMZ 内存。
语法
ZH_S32 ZH_MPI_SYS_MmzAlloc(MB_BLK pBlk, const ZH_CHAR *pstrMmb, const ZH_CHAR *pstrZone, ZH_U32 u32Len);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pBlk | MB_BLK | 缓存块指针。 | 输出 |
| pstrMmb | const ZH_CHAR* | Mmb 名称的字符串指针。填写 ZH_NULL。 | 输入 |
| pstrZone | const ZH_CHAR* | MMZ zone 名称的字符串指针。填写 ZH_NULL。 | 输入 |
| u32Len | ZH_U32 | 缓存块大小。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_SYS_MmzAlloc_Cached
描述
在用户 态分配 MMZ 内存,该内存支持 cache 缓存。
语法
ZH_S32 ZH_MPI_SYS_MmzAlloc_Cached(MB_BLK pBlk, const ZH_CHAR *pstrMmb, const ZH_CHAR *pstrZone, ZH_U32 u32Len);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pBlk | MB_BLK | 缓存块指针。 | 输出 |
| pstrMmb | const ZH_CHAR* | Mmb 名称的字符串指针。填写 ZH_NULL。 | 输入 |
| pstrZone | const ZH_CHAR* | MMZ zone 名称的字符串指针。填写 ZH_NULL。 | 输 入 |
| u32Len | ZH_U32 | 缓存块大小。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_SYS_MmzAllocEx
描述
在用户态分配 MMZ 内存,可配置内存标志,如是否带 cache/是否是物理连续内存。
语法
ZH_S32 ZH_MPI_SYS_MmzAllocEx(MB_BLK pBlk, const ZH_CHAR *pstrMmb, const ZH_CHAR *pstrZone, ZH_U32 u32Len, ZH_U32 u32HeapFlags);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pBlk | MB_BLK | 缓存块指针。 | 输出 |
| pstrMmb | const ZH_CHAR* | Mmb 名称的字符串指针。填写 ZH_NULL。 | 输入 |
| pstrZone | const ZH_CHAR* | MMZ zone 名称的字符串指针。填写 ZH_NULL。 | 输入 |
| u32Len | ZH_U32 | 缓存块大小。 | 输入 |
| u32HeapFlags | ZH_U32 | 内存标志,可同时带上多个标记。当前支持如下标志:
| 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_SYS_MmzFree
描述
在用户态释放 MMZ 内存。
语法
ZH_S32 ZH_MPI_SYS_MmzFree(MB_BLK blk);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| blk | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_SYS_MmzFlushCache
描述
刷新 cache 里的内容到内存并且使 cache 里的内容无效。
语法
ZH_S32 ZH_MPI_SYS_MmzFlushCache(MB_BLK blk, ZH_BOOL bReadOnly);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| blk | MB_BLK | 缓存块 ID。 | 输入 |
| bReadOnly | ZH_BOOL | True:cache 写回内存。 False:cache 无效。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_SYS_Malloc
描述
申请 malloc 内存。
语法
ZH_S32 ZH_MPI_SYS_Malloc(MB_BLK *pBlk, ZH_U32 u32Len);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pBlk | MB_BLK* | 缓存块指针。 | 输出 |
| u32Len | ZH_U32 | 缓存块大小。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_SYS_Free
描述
释放 malloc 申请的内存。
语法
ZH_S32 ZH_MPI_SYS_Free(MB_BLK blk);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| blk | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_SYS_CreateMB
描述
创建⼀个内存缓存块。
语法
ZH_S32 ZH_MPI_SYS_CreateMB(MB_BLK pBlk, MB_EXT_CONFIG_S *pstMbExtConfig);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pBlk | MB_BLK | 缓存块指针。 | 输出 |
| pstMbExtConfig | MB_EXT_CONFIG_S* | 缓存块参数配置信息。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_SYS_GetCurPTS
描述
获取当前时间戳。
语法
ZH_S32 ZH_MPI_SYS_GetCurPTS(ZH_U64 *pu64CurPTS);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pu64CurPTS | ZH_U64* | 当前时间戳指针。单位:微秒。 | 输出 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_SYS_InitPTSBase
描述
初始化 ZH MPI 时间戳。
语法
ZH_S32 ZH_MPI_SYS_InitPTSBase(ZH_U64 u64PTSBase);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| u64PTSBase | ZH_U64 | 时间戳基准。单位:微秒。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
注意事项
初始化时间戳基准会将当前系统的时间戳强制置成 u64PTSBase,与系统原有时间戳无关联。因此,建议在媒体业务未启动时(例如操作系统刚启动),调用此接口。
ZH_MPI_SYS_SyncPTS
描述
同步 ZH MPI 时间戳。
语法
ZH_S32 ZH_MPI_SYS_SyncPTS(ZH_U64 u64PTSBase);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| u64PTSBase | ZH_U64 | 时间戳基准。单位:微秒。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请 参见 SYS 错误码。 |
ZH_MPI_SYS_SetChnInputMode
描述
设置通道输入(接收)流模式。用户可根据需要配置通道输入(接收)流模式,可选择保留最新一帧或丢弃。
当用户启用某模块通道时,未绑定下级模块且未消耗通道数据,将导致 buffer 无法正常轮转使用,此时可将通道输入流模式配置为丢弃模式,保证通道 buffer 正常轮转。
语法
ZH_S32 ZH_MPI_SYS_SetChnInputMode(const MPP_CHN_S *pstChn, CHN_INPUT_MODE_E mode);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pstChn | const MPP_CHN_S* | 通道指针。 | 输入 |
| mode | CHN_INPUT_MODE_E | 通道输入流模式。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_MB_CreatePool
描述
创建⼀个内存缓存池。
语法
MB_POOL ZH_MPI_MB_CreatePool(MB_POOL_CONFIG_S *pstMbPoolCfg);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pstMbPoolCfg | MB_POOL_CONFIG_S* | 缓存池配置属性参数 指针。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 非 MB_INVALID_POOLID | 有效的缓存池 ID 号。 |
| MB_INVALID_POOLID | 创建缓存池失败,可能是参数非法或者保留内存不足。 |
ZH_MPI_MB_DestroyPool
描述
销毁⼀个内存缓存池。
语法
ZH_S32 ZH_MPI_MB_DestroyPool(MB_POOL pool);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pool | MB_POOL | 缓存池 ID。取值范围:[0, MB_MAX_POOLS)。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错 误码。 |
注意事项
GROUP 必须已创建。
ZH_MPI_MB_GetMB
描述
获取⼀个缓存块。
语法
MB_BLK ZH_MPI_MB_GetMB(MB_POOL pool, ZH_U64 u64Size, ZH_BOOL block = ZH_FALSE);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pool | MB_POOL | 缓存池 ID。取值范围:[0, MB_MAX_POOLS)。 | 输入 |
| u64Size | ZH_U64 | 缓存块大小。取值范围:数据类型全范围,以 byte 为单位。 | 输入 |
| block | ZH_BOOL | 获取缓存块是否等待缓存块使用完毕返回缓存池。 ZH_TRUE:阻塞。ZH_FALSE:非阻塞。默认非阻塞。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 非 MB_INVALID_HANDLE | 有效的缓存块句柄。 |
| MB_INVALID_HANDLE | 获取缓存块失败。 |
ZH_MPI_MB_ReleaseMB
描述
释放⼀个已经获取的缓存块。
语法
ZH_S32 ZH_MPI_MB_ReleaseMB(MB_BLK mb);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_MB_Handle2PhysAddr
描述
获取⼀个缓存块的物理地址。
语法
ZH_U64 ZH_MPI_MB_Handle2PhysAddr(MB_BLK mb);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 失败。 |
| 非 0 | 物理地址。 |
注意事项
- 默认使用非连续物理内存,不支持物理地址获取。
- 若要支持物理地址获取,需预先配置 CMA 物理连续内存;在创建 MB/MB_POOL 时,需指定类型为 MB_DMA_TYPE_CMA。
ZH_MPI_MB_Handle2VirAddr
描述
获取⼀个内存缓存池中的缓存块的用户态虚拟地址。
语法
ZH_VOID *ZH_MPI_MB_Handle2VirAddr(MB_BLK mb);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| ZH_NULL | 获取虚拟地址失败。 |
| 非 ZH_NULL | 有效的虚拟地址。 |
ZH_MPI_MB_Handle2UniqueId
描述
获取⼀个缓存块的系统全局唯一 ID,可用于跨进程操作。
语法
ZH_S32 ZH_MPI_MB_Handle2UniqueId(MB_BLK mb);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 负数 | 获取系统全局唯一 ID 失败。 |
| 非负数 | 有效的系统全局唯一 ID。 |
注意事项
- 仅支持 MMZ 缓存块获取唯一 ID。
- 通过 ZH_MPI_SYS_CreateMB 创建的 MB_BLK 无法获取系统全局唯一 ID。
- 获取的唯一 ID 可以通过跨进程传输到另一进程中,再通过 ZH_MPI_MB_UniqueId2Fd 转为 fd 使用,然后 map 出虚拟地址进行操作。详细看下列示例。
示例代码
-
源进程示例:
MB_BLK MbBlk = MB_INVALID_HANDLE;
ZH_S32 s32Ret = ZH_SUCCESS;
ZH_S32 s32UniqueId = -1;
ZH_S32 s32Size = 4 * 1024 * 1024;
s32Ret = ZH_MPI_SYS_MmzAlloc_Cached(&MbBlk, ZH_NULL, ZH_NULL, s32Size);
if (s32Ret != ZH_SUCCESS) {
return s32Ret;
}
s32UniqueId = ZH_MPI_MB_Handle2UniqueId(MbBlk);
if (s32UniqueId < 0) {
return ZH_FAILURE;
}
// send unique id cross process
s32Ret = send_info_to_dst_process(s32UniqueId, s32Size);
if (s32Ret != ZH_SUCCESS) {
return s32Ret;
} -
⽬标进程⽰例:
ZH_S32 s32UniqueId = -1;
ZH_S32 s32DupFd = -1;
ZH_VOID *pVirtAddr = ZH_NULL;
ZH_S32 s32Ret = ZH_SUCCESS;
s32Ret = recv_info_by_src_process(&s32UniqueId, &s32Size);
if (s32Ret != ZH_SUCCESS) {
return s32Ret;
}
s32DupFd = ZH_MPI_MB_UniqueId2Fd(s32UniqueId);
if (s32DupFd < 0) {
return ZH_FAILURE;
}
pVirtAddr = mmap64(NULL, s32Size, PROT_READ | PROT_WRITE, MAP_SHARED, s32DupFd, 0);
if (pVirtAddr == ZH_NULL) {
return ZH_FAILURE;
}
ZH_MPI_MB_Handle2Fd
描述
⽤⼾态通过缓存块的句柄。
语法
ZH_S32 ZH_MPI_MB_Handle2Fd(MB_BLK mb);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 负数 | 获取缓存块句柄失败。 |
| 非负数 | 有效的缓存块句柄。 |
注意事项
缓存块句柄只有内存类型为 DMA 时才可获取有效的句柄。
ZH_MPI_MB_Handle2PoolId
描述
获取⼀个缓存块所在缓存池的 ID。
语法
MB_POOL ZH_MPI_MB_Handle2PoolId(MB_BLK mb);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 非 MB_INVALID_POOLID | 有效的缓存池 ID 号。 |
| MB_INVALID_POOLID | 无效的缓存池 ID 号。 |
注意事项
指定的缓存块应该是从 ZH MPI 内存缓存池中获取的有效缓存块,否则⽆法获取到缓存池 ID 号。
ZH_MPI_MB_GetSize
描述
获取⼀个缓存块的内存⼤⼩。
语法
ZH_U64 ZH_MPI_MB_GetSize(MB_BLK mb);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 任意值 | 缓存块的内存大小。 |
ZH_MPI_MB_GetLength
描述
获取⼀个缓存块的实际数据⼤⼩。
语法
ZH_U64 ZH_MPI_MB_GetLength(MB_BLK mb);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 任意值 | 缓存块的实际数据大小。 |
ZH_MPI_MB_GetOffset
描述
获取⼀个缓存块的实际内存偏移⼤⼩。
语法
ZH_U32 ZH_MPI_MB_GetOffset(MB_BLK mb);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 非负数 | 缓存块的实际内存偏移大小。 |
ZH_MPI_MB_SetOffset
描述
设置⼀个缓存块的内存偏移⼤⼩。
语法
ZH_S32 ZH_MPI_MB_SetOffset(MB_BLK mb, ZH_U32 u32Offset);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
| u32Offset | ZH_U32 | 内存偏移大小。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_MB_VirAddr2Handle
描述
根据虚拟地址获取对应的缓存块。
语法
MB_BLK ZH_MPI_MB_VirAddr2Handle(ZH_VOID *pstVirAddr);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pstVirAddr | ZH_VOID* | 虚拟地址。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| MB_INVALID_HANDLE | 获取缓存块 ID 失败。 |
| 非MB_INVALID_HANDLE | 有效的缓存块 ID。 |
注意事项
⽬前仅⽀持 DMA 内存从虚拟地址查找到缓存块。
ZH_MPI_MB_UniqueId2Fd
描述
获取⼀个缓存块的系统全局唯⼀ ID。
语法
ZH_S32 ZH_MPI_MB_UniqueId2Fd(ZH_S32 s32UniqueId);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| s32UniqueId | ZH_S32 | 系统全局唯一 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 负值 | 获取句柄失败。 |
| 非负值 | 有效的句柄。 |
ZH_MPI_MB_InquireUserCnt
描述
查询缓存块使⽤计数信息。
语法
ZH_S32 ZH_MPI_MB_InquireUserCnt(MB_BLK mb);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 非负数 | 获取缓存块的使用计数。 |
| 负数 | 无效的缓存块计数。 |
ZH_MPI_MB_SetModPoolConfig
描述
设置模块公共视频缓存池属性。
语法
ZH_S32 ZH_MPI_MB_SetModPoolConfig(MB_UID_E enMbUid, const MB_CONFIG_S *pstMbConfig);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| enMbUid | MB_UID_E | 使用模块公共视频缓冲池的模块 ID。 | 输入 |
| pstMbConfig | const MB_CONFIG_S* | 模块公共视频缓存池属性指针。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
注意事项
需要在调⽤ ZH_MPI_SYS_Init 前设置该属性。
ZH_MPI_MB_GetModPoolConfig
描述
获取模块公共视频缓存池属性。
语法
ZH_S32 ZH_MPI_MB_GetModPoolConfig(MB_UID_E enMbUid, MB_CONFIG_S *pstMbConfig);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| enMbUid | MB_UID_E | 使用模块公共视频缓冲池的模块 ID。 | 输入 |
| pstMbConfig | MB_CONFIG_S* | 模块公共视 频缓存池属性指针。 | 输出 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
ZH_MPI_MB_SetConfig
描述
设置视频公共缓存池属性。
语法
ZH_S32 ZH_MPI_MB_SetConfig(const MB_CONFIG_S *pstMbConfig);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pstMbConfig | const MB_CONFIG_S* | 视频缓冲池设置属性。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
注意事项
- 只能在系统处于未初始化的状态下,才可以设置缓存池属性,否则会返回失败。
- 公共缓存池中每个缓存块的⼤⼩应根据当前图像像素格式以及图像是否压缩⽽有所不同。具体分配⼤⼩请参考内存池单块 MB ⼤⼩计算规则中的描述。
ZH_MPI_MB_GetConfig
描述
获取视频公共缓存池属性。
语法
ZH_S32 ZH_MPI_MB_GetConfig(MB_CONFIG_S *pstMbConfig);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| pstMbConfig | MB_CONFIG_S* | 视频缓冲池设置属性。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
注意事项
必须先调⽤ ZH_MPI_MB_SetConfig 设置公共视频缓存池属性,才能再获取属性,否则返回 ZH_ERR_MB_NOT_PERM。
ZH_MPI_MB_Init
描述
初始化视频公共缓存池。
语法
ZH_S32 ZH_MPI_MB_Init();
参数
无
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
注意事项
- 必须先调⽤ ZH_MPI_MB_SetConfig 配置缓存池属性,再初始化缓存池,否则返回 ZH_ERR_MB_NOT_PERM。
- 可反复初始化,不返回失败。
- 初始化成功后再次设置 ZH_MPI_MB_SetConfig 会保存设置参数,但不会⽴即⽣效。
ZH_MPI_MB_Exit
描述
反初始化视频公共缓存池。
语法
ZH_S32 ZH_MPI_MB_Exit();
参数
无
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
注意事项
- 初始化缓存池成功后,必须再调⽤该接⼝ ZH_MPI_SYS_Exit 去初始化 MPP 系统,再去初始化缓存池,否则返回失败。
- 可以反复反初始化,不返回失败。
- 反初始化不会清除先前对缓存池的配置。
ZH_MPI_MB_SetBufferStride
描述
设置缓存块⽤于存储图像时该图像的虚宽⾼ Stride。
语法
ZH_S32 ZH_MPI_MB_SetBufferStride(MB_BLK mb, ZH_U32 u32HorStride, ZH_U32 u32VerStride);
参数
| 参数名 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| mb | MB_BLK | 缓存块 ID。 | 输入 |
| u32HorStride | ZH_U32 | 图像虚宽,以字节为单位。 | 输入 |
| u32VerStride | ZH_U32 | 图像虚高,以字节为单位。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,请参见 SYS 错误码。 |
数据类型
数据类型定义如下:
- MOD_ID_E:模块 ID 枚举类型。
- MB_UID_E:媒体内存缓冲池的模块 ID 枚举类型。
- ZH_CODEC_ID_E:⾳视频编码类型枚举。
- ROTATION_E:旋转⻆度枚举。
- POINT_S:坐标信息结构体。
- RECT_S:矩形区域信息结构体。
- CROP_INFO_S:CROP 属性结构体。
- ROTATION_EX_S:任意⻆度旋转属性。
- VIDEO_PROC_DEV_TYPE_E:定义硬件设备类型枚举。
- MB_SOURCE_E:MB 来源选择。
- MPP_CHN_S:模块设备通道结构体。
- CHN_INPUT_MODE_E:通道输⼊流模式。
- MB_POOL:定义 MB 内存池的句柄。
- MB_BLK:MB 内存的句柄。
- MB_POOL_CONFIG_S:内存缓存池属性结构体。
- MB_REMAP_MODE_E:MB 内核态虚拟地址映射模式。
- MB_DMA_TYPE_E:申请的物理内存类型。
- MB_ALLOC_TYPE_E:MB 申请的内存类型。
- MB_EXT_CONFIG_S:定义申请外部 MB 内存的信息。
- MB_CONFIG_S:定义媒体内存缓存池属性结构体。
公共数据类型
typedef unsigned char ZH_UCHAR;
typedef uint8_t ZH_U8;
typedef uint16_t ZH_U16;
typedef uint32_t ZH_U32;
typedef uintptr_t ZH_UINTPTR_T;
typedef char ZH_CHAR;
typedef int8_t ZH_S8;
typedef int16_t ZH_S16;
typedef int32_t ZH_S32;
typedef float ZH_FLOAT;
typedef double ZH_DOUBLE;
typedef uint64_t ZH_U64;
typedef int64_t ZH_S64;
typedef uint32_t ZH_SIZE_T;
typedef uint32_t ZH_LENGTH_T;
typedef unsigned int ZH_HANDLE;
typedef enum {
ZH_FALSE = 0,
ZH_TRUE = 1,
} ZH_BOOL;
#ifndef NULL
#define NULL 0L
#endif
#define ZH_NULL 0L
#define ZH_SUCCESS 0
#define ZH_FAILURE (-1)
#define ZH_VOID void
MOD_ID_E
描述
模块 ID 枚举类型。
定义
typedef enum zhMOD_ID_E{
ZH_ID_CMPI = 0,
ZH_ID_MB = 1,
ZH_ID_SYS = 2,
ZH_ID_RGN = 3,
ZH_ID_VENC = 4,
ZH_ID_VDEC = 5,
ZH_ID_VPSS = 6,
ZH_ID_VGS = 7,
ZH_ID_VI = 8,
ZH_ID_VO = 9,
ZH_ID_AI = 10,
ZH_ID_AO = 11,
ZH_ID_AENC = 12,
ZH_ID_ADEC = 13,
ZH_ID_TDE = 14,
ZH_ID_ISP = 15,
ZH_ID_BUTT,
} MOD_ID_E;
MB_UID_E
描述
媒体内存缓冲池的模块 ID 枚举类型。
定义
typedef enum zhMB_UID_E {
MB_UID_VI = 0,
MB_UID_VO = 1,
MB_UID_VGS = 2,
MB_UID_VENC = 3,
MB_UID_VDEC = 4,
MB_UID_VPSS = 5,
MB_UID_AI = 6,
MB_UID_AENC = 7,
MB_UID_ADEC = 8,
MB_UID_AVS = 9,
MB_UID_BUTT = 10
} MB_UID_E;
ZH_CODEC_ID_E
描述
⾳视频编码类型枚举。
定义
typedef enum zhCODEC_ID_E {
ZH_VIDEO_ID_Unused, /**< Value when coding is N/A */
ZH_VIDEO_ID_AutoDetect, /**< Autodetection of coding type */
ZH_VIDEO_ID_MPEG1VIDEO,
ZH_VIDEO_ID_MPEG2VIDEO, /**< AKA: H.262 */
ZH_VIDEO_ID_H263, /**< H.263 */
ZH_VIDEO_ID_MPEG4, /**< MPEG-4 */
ZH_VIDEO_ID_WMV, /**< Windows Media Video (WMV1,WMV2,WMV3) */
ZH_VIDEO_ID_RV, /**< all versions of Real Video */
ZH_VIDEO_ID_AVC, /**< H.264/AVC */
ZH_VIDEO_ID_MJPEG, /**< Motion JPEG */
ZH_VIDEO_ID_VP8, /**< VP8 */
ZH_VIDEO_ID_VP9, /**< VP9 */
ZH_VIDEO_ID_HEVC, /**< ITU H.265/HEVC */
ZH_VIDEO_ID_DolbyVision, /**< Dolby Vision */
ZH_VIDEO_ID_ImageHEIC, /**< HEIF image encoded with HEVC */
ZH_VIDEO_ID_VC1 = 0x01000000, /**< Windows Media Video (WMV1,WMV2,WMV3) */
ZH_VIDEO_ID_FLV1, /**< Sorenson H.263 */
ZH_VIDEO_ID_DIVX3, /**< DIVX3 */
ZH_VIDEO_ID_VP6,
ZH_VIDEO_ID_AVSPLUS, /**< AVS+ profile=0x48 */
ZH_VIDEO_ID_AVS, /**< AVS profile=0x20 */
ZH_VIDEO_ID_KhronosExtensions = 0x25000000, /**< Reserved region for introducing Khronos Standard Extensions */
ZH_VIDEO_ID_VendorStartUnused = 0x35000000, /**< Reserved region for introducing Vendor Extensions */
ZH_VIDEO_ID_Max = 0x3FFFFFFF,
ZH_AUDIO_ID_Unused = 0x40000000, /**< Placeholder value when coding is N/A */
ZH_AUDIO_ID_AutoDetect, /**< auto detection of audio format */
ZH_AUDIO_ID_PCM_ALAW, /**< g711a */
ZH_AUDIO_ID_PCM_MULAW, /**< g711u */
ZH_AUDIO_ID_PCM_S16LE, /**< Any variant of PCM_S16LE coding */
ZH_AUDIO_ID_PCM_S24LE, /**< Any variant of PCM_S24LE coding */
ZH_AUDIO_ID_PCM_S32LE, /**< Any variant of PCM_S32LE coding */
ZH_AUDIO_ID_ADPCM_G722, /**< Any variant of ADPCM_G722 encoded data */
ZH_AUDIO_ID_ADPCM_G726, /**< Any variant of ADPCM_G726 encoded data */
ZH_AUDIO_ID_ADPCM_IMA_QT, /**< Any variant of ADPCM_IMA encoded data */
ZH_AUDIO_ID_AMR_NB, /**< Any variant of AMR_NB encoded data */
ZH_AUDIO_ID_AMR_WB, /**< Any variant of AMR_WB encoded data */
ZH_AUDIO_ID_GSMFR, /**< Any variant of GSM fullrate (i.e. GSM610) */
ZH_AUDIO_ID_GSMEFR, /**< Any variant of GSM Enhanced Fullrate encoded data */
ZH_AUDIO_ID_GSMHR, /**< Any variant of GSM Halfrate encoded data */
ZH_AUDIO_ID_PDCFR, /**< Any variant of PDC Fullrate encoded data */
ZH_AUDIO_ID_PDCEFR, /**< Any variant of PDC Enhanced Fullrate encoded data */
ZH_AUDIO_ID_PDCHR, /**< Any variant of PDC Halfrate encoded data */
ZH_AUDIO_ID_TDMAFR, /**< Any variant of TDMA Fullrate encoded data (TIA/EIA-136-420) */
ZH_AUDIO_ID_TDMAEFR, /**< Any variant of TDMA Enhanced Fullrate encoded data (TIA/EIA-136-410) */
ZH_AUDIO_ID_QCELP8, /**< Any variant of QCELP 8kbps encoded data */
ZH_AUDIO_ID_QCELP13, /**< Any variant of QCELP 13kbps encoded data */
ZH_AUDIO_ID_EVRC, /**< Any variant of EVRC encoded data */
ZH_AUDIO_ID_SMV, /**< Any variant of SMV encoded data */
ZH_AUDIO_ID_G729, /**< Any variant of G.729 encoded data */
ZH_AUDIO_ID_AAC, /**< Any variant of AAC encoded data */
ZH_AUDIO_ID_MP3, /**< Any variant of MP3 encoded data */
ZH_AUDIO_ID_SBC, /**< Any variant of SBC encoded data */
ZH_AUDIO_ID_VORBIS, /**< Any variant of VORBIS encoded data */
ZH_AUDIO_ID_WMA, /**< Any variant of WMA encoded data */
ZH_AUDIO_ID_RA, /**< Any variant of RA encoded data */
ZH_AUDIO_ID_MIDI, /**< Any variant of MIDI encoded data */
ZH_AUDIO_ID_FLAC, /**< Any variant of FLAC encoded data */
ZH_AUDIO_ID_APE = 0x50000000,
ZH_AUDIO_CodingKhronosExtensions = 0x67000000, /**< Reserved region for introducing Khronos Standard Extensions */
ZH_AUDIO_CodingVendorStartUnused = 0x75000000, /**< Reserved region for introducing Vendor Extensions */
ZH_AUDIO_ID_WMAV1,
ZH_AUDIO_ID_WMAV2,
ZH_AUDIO_ID_WMAPRO,
ZH_AUDIO_ID_WMALOSSLESS,
ZH_AUDIO_ID_MP1,
ZH_AUDIO_ID_MP2,
ZH_AUDIO_ID_DTS, /**< add audio bitstream Codec ID define for RT */
ZH_AUDIO_ID_AC3,
ZH_AUDIO_ID_EAC3,
ZH_AUDIO_ID_DOLBY_TRUEHD,
ZH_AUDIO_ID_MLP,
ZH_AUDIO_ID_DTS_HD,
ZH_AUDIO_CodingMax = 0x7FFFFFFF,
/* subtitle codecs */
ZH_SUB_ID_Unused = 0x80000000, /**< A dummy ID pointing at the start of subtitle codecs */
ZH_SUB_ID_DVD,
ZH_SUB_ID_DVB,
ZH_SUB_ID_TEXT, /**< raw UTF-8 text */
ZH_SUB_ID_XSUB,
ZH_SUB_ID_SSA,
ZH_SUB_ID_MOV_TEXT,
ZH_SUB_ID_HDMV_PGS,
ZH_SUB_ID_DVB_TELETEXT,
ZH_SUB_ID_SRT,
ZH_SUB_ID_MICRODVD = 0x80000800,
ZH_SUB_ID_EIA_608,
ZH_SUB_ID_JACOSUB,
ZH_SUB_ID_SAMI,
ZH_SUB_ID_REALTEXT,
ZH_SUB_ID_STL,
ZH_SUB_ID_SUBVIEWER1,
ZH_SUB_ID_SUBVIEWER,
ZH_SUB_ID_SUBRIP,
ZH_SUB_ID_WEBVTT,
ZH_SUB_ID_MPL2,
ZH_SUB_ID_VPLAYER,
ZH_SUB_ID_PJS,
ZH_SUB_ID_ASS,
ZH_SUB_ID_HDMV_TEXT,
ZH_SUB_CodingMax
} ZH_CODEC_ID_E;
ROTATION_E
描述
旋转⻆度枚举。
定义
typedef enum zhROTATION_E{
ROTATION_0 = 0,
ROTATION_90 = 1,
ROTATION_180 = 2,
ROTATION_270 = 3,
ROTATION_BUTT
} ROTATION_E;
POINT_S
描述
坐标信息结构体。
定义
typedef struct zhPOINT_S{
ZH_S32 s32X;
ZH_S32 s32Y;
} POINT_S;
成员
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| s32X | ZH_S32 | 横坐标。 |
| s32Y | ZH_S32 | 纵坐标。 |
RECT_S
描述
矩形区域信息结构体。
定义
typedef struct zhRECT_S {
ZH_S32 s32X;
ZH_S32 s32Y;
ZH_U32 u32Width;
ZH_U32 u32Height;
} RECT_S;
成员
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| s32X | ZH_S32 | 横坐标。 |
| s32Y | ZH_S32 | 纵坐标。 |
| u32Width | ZH_U32 | 宽度。 |
| u32Height | ZH_U32 | 高度。 |
CROP_INFO_S
描述
CROP 属性结构体。
定义
typedef struct zhCROP_INFO_S {
ZH_BOOL bEnable;
RECT_S stRect;
} CROP_INFO_S;
成员
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| bEnable | ZH_BOOL | Crop 使能开关。 |
| stRect | RECT_S | Crop 起始位置与宽高信息。 |
ROTATION_EX_S
描述
任意⻆度旋转属性。
定义
typedef struct zhROTATION_EX_S {
/** RW; Range: [0, 2]; Rotation mode */
ROTATION_VIEW_TYPE_E enViewType;
/** RW; Range: [0,360]; Rotation Angle:[0,360] */
ZH_U32 u32Angle;
/** RW; Range: [-511, 511]; Horizontal offset of the image distortion center relative to image center */
ZH_S32 s32CenterXOffset;
/** RW; Range: [-511, 511]; Vertical offset of the image distortion center relative to image center */
ZH_S32 s32CenterYOffset;
/** RW; Dest size of any angle rotation */
SIZE_S stDestSize;
} ROTATION_EX_S;
成员
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| enViewType | ROTATION_VIEW_TYPE_E | 任意角度旋转的旋转模式,裁剪模式、全模式和典型模式。 |
| u32Angle | ZH_U32 | 旋转角度。范围:[0, 360]。 |
| s32CenterXOffset | ZH_S32 | 旋转中心点相对图像中心点水平偏移。范围:[-511, 511]。 |
| s32CenterYOffset | ZH_S32 | 旋转中心点相对图像中心点垂直偏移。范围:[-511, 511]。 |
| stDestSize | SIZE_S | 旋转后图像的目标大小。 |
VIDEO_PROC_DEV_TYPE_E
描述
定义硬件设备类型枚举。
定义
typedef enum zhVIDEO_PROC_DEV_TYPE_E {
VIDEO_PROC_DEV_GPU = 0x0, /**< GPU device */
VIDEO_PROC_DEV_RGA = 0x1, /**< RGA device */
VIDEO_PROC_DEV_ISP = 0x2, /**< ISP device */
VIDEO_PROC_DEV_VPSS = 0x3, /**< VPSS device */
VIDEO_PROC_DEV_BUTT
} VIDEO_PROC_DEV_TYPE_E;
成员
| 成员名称 | 描述 |
|---|---|
| VIDEO_PROC_DEV_GPU | GPU |
| VIDEO_PROC_DEV_RGA | RGA |
| VIDEO_PROC_DEV_ISP | ISP |
| VIDEO_PROC_DEV_VPSS | VPSS |
注意事项
模块 VPSS ⽀持配置 GPU / RGA / ISP / VPSS 作为其视频图像处理实现的硬件设备,具体描述请参考视频处理⼦系统,相关调⽤接⼝ ZH_MPI_VPSS_SetVProcDev 和 ZH_MPI_VPSS_GetVProcDev。
MB_SOURCE_E
描述
MB 来源选择。
定义
typedef enum zhMB_SOURCE_E{
MB_SOURCE_COMMON = 0,
MB_SOURCE_MODULE = 1,
MB_SOURCE_PRIVATE = 2,
MB_SOURCE_USER = 3,
MB_SOURCE_BUTT
} MB_SOURCE_E;
成员
| 成员名称 | 描述 |
|---|---|
| MB_SOURCE_COMMON | 公共缓冲池。 |
| MB_SOURCE_MODULE | 模块公共缓冲池。 |
| MB_SOURCE_USER | 用户缓冲池。 |
| MB_SOURCE_PRIVATE | 私有缓冲池。 |
注意事项
详细描述请⻅内存缓冲池。
MPP_CHN_S
描述
模块设备通道结构体。
定义
typedef struct zhMPP_CHN_S {
MOD_ID_E enModId;
ZH_S32 s32DevId;
ZH_S32 s32ChnId;
} MPP_CHN_S;
成员
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| enModId | MOD_ID_E | 模块号。 |
| s32DevId | ZH_S32 | 设备号。 |
| s32ChnId | ZH_S32 | 通道号。 |
CHN_INPUT_MODE_E
描述
通道输⼊流模式。
定义
typedef enum zhCHN_INPUT_MODE_E {
CHN_INPUT_MODE_NORMAL, /**< CHN receive all packet */
CHN_INPUT_MODE_REMAIN_NEWEST, /**< CHN remain newest packet */
CHN_INPUT_MODE_DROP_ALWAYS, /**< CHN drop all packet */
CHN_INPUT_MODE_BUTT
} CHN_INPUT_MODE_E;
成员
| 成员名称 | 描述 |
|---|---|
| CHN_INPUT_MODE_NORMAL | 通道接收所有数据包。 |
| CHN_INPUT_MODE_REMAIN_NEWEST | 通道保留最新数据包。 |
| CHN_INPUT_MODE_DROP_ALWAYS | 通道丢弃所有数据包。 |
MB_POOL
描述
定义 MB 内存池的句柄。
定义
typedef ZH_HANDLE MB_POOL;
MB_BLK
描述
MB 内存的句柄。
定义
typedef ZH_HANDLE MB_BLK;
MB_POOL_CONFIG_S
描述
内存缓存池属性结构体。
定义
typedef struct zhMB_POOL_CONFIG_S{
ZH_U64 u64MBSize;
ZH_U32 u32MBCnt;
MB_REMAP_MODE_E enRemapMode;
MB_ALLOC_TYPE_E enAllocType;
MB_DMA_TYPE_E enDmaType;
ZH_BOOL bPreAlloc;
} MB_POOL_CONFIG_S;
成员
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| u64MBSize | ZH_U64 | 缓存块大小,以 Byte 为单位。 |
| u32MBCnt | ZH_U32 | 每个缓存池的缓存块个数。取值范围:(0,10240]。 |
| enRemapMode | MB_REMAP_MODE_E | 内核态虚拟地址映射模式。 |
| enAllocType | MB_ALLOC_TYPE_E | 申请的内存类型。 |
| enDmaType | MB_DMA_TYPE_E | 申请的 DMA 物理内存类型,如配置是否物理连续。 |
| bPreAlloc | ZH_BOOL | 是否在缓存池创建时申请好缓存块。 |
MB_REMAP_MODE_E
描述
MB 内核态虚拟地址映射模式。
定义
typedef enum zhMB_REMAP_MODE_E {
MB_REMAP_MODE_NONE = 0, /* no remap */
MB_REMAP_MODE_NOCACHE = 1 << 8, /* no cache remap */
MB_REMAP_MODE_CACHED = 1 << 9, /* cache remap, if you use this mode, you should flush cache by yourself */
MB_REMAP_MODE_BUTT
} MB_REMAP_MODE_E;
成员
| 成员名称 | 描述 |
|---|---|
| MB_REMAP_MODE_NOCACHE | MB 映射 nocache 属性的内核态虚拟地址。 |
| MB_REMAP_MODE_CACHED | MB 映射 cached 属性的内核态虚拟地址。 |
MB_DMA_TYPE_E
描述
申请的物理内存类型。
定义
typedef enum zhMB_DMA_TYPE_E {
MB_DMA_TYPE_NONE = 0, /**< Physically Non-Continuous memory default */
MB_DMA_TYPE_CMA = 1 << 12, /**< Physically Continuous memory */
MB_DMA_TYPE_BUTT
} MB_DMA_TYPE_E;
成员
| 成员名称 | 描述 |
|---|---|
| MB_DMA_TYPE_NONE | 申请的物理内存为非连续物理地址内存。 |
| MB_DMA_TYPE_CMA | 申请的物理内存为连续物理地址内存。 |
MB_ALLOC_TYPE_E
描述
MB 申请的内存类型。
定义
typedef enum zhMB_ALLOC_TYPE_E {
MB_ALLOC_TYPE_UNUSED = -1,
MB_ALLOC_TYPE_DMA = 0,
MB_ALLOC_TYPE_MALLOC,
MB_ALLOC_TYPE_MAX
} MB_ALLOC_TYPE_E;
成员
| 成员名称 | 描述 |
|---|---|
| MB_ALLOC_TYPE_DMA | 申请内核态可用的 DMA 内存。 |
| MB_ALLOC_TYPE_MALLOC | 申请 malloc 内存。 |
MB_EXT_CONFIG_S
描述
定义申请外部 MB 内存的信息。
定义
typedef struct zhMB_EXT_CONFIG_S {
ZH_U8 *pu8VirAddr;
ZH_U64 u64PhyAddr;
ZH_S32 s32Fd;
ZH_U64 u64Size;
ZH_MPI_MB_FREE_CB pFreeCB;
ZH_VOID *pOpaque;
} MB_EXT_CONFIG_S;
成员
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| pu8VirAddr | ZH_U8* | 外部申请的虚拟地址。 |
| u64PhyAddr | ZH_U64 | 外部申请的物理地址。 |
| s32Fd | ZH_S32 | 外部申请的内存句柄。 |
| u64Size | ZH_U64 | 外部申请的内存大小。 |
| pFreeCB | ZH_MPI_MB_FREE_CB | 申请内存的释放回调方法。 |
| pOpaque | ZH_VOID* | 申请内存的释放回调所需的上下文。 |
注意事项
使用此结构体时,建议先将结构体 memset 为 0 后使用。
MB_CONFIG_S
描述
定义媒体内存缓存池属性结构体。
定义
typedef struct zhMB_CONFIG_S {
ZH_U32 u32MaxPoolCnt;
MB_POOL_CONFIG_S astCommPool[MB_MAX_COMM_POOLS];
} MB_CONFIG_S;
成员
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| u32MaxPoolCnt | ZH_U32 | 整个系统中可容纳的缓存池个数。 静态属性。 保留属性,目前未生效。 |
| astCommPool | MB_POOL_CONFIG_S | 公共缓存池属性结构体。 静态属性。 |
注意事项
- u64MBSize 等于 0 或 u32MBCnt 等于 0,则对应的缓存池不会被创建。
- 建议整个结构体先 memset 为 0 再按需赋值,否则出现随机值内部无法完全过滤。
SYS错误码
系统控制SYS错误码
系统控制API SYS错误码如下所示:
| 错误代码 | 宏定义 | 描述 |
|---|---|---|
| 0xA0028006 | ZH_ERR_SYS_NULL_PTR | 空指针错误。 |
| 0xA0028010 | ZH_ERR_SYS_NOTREADY | 系统控制属性未配置。 |
| 0xA0028009 | ZH_ERR_SYS_NOT_PERM | 操作不允许。 |
| 0xA002800C | ZH_ERR_SYS_NOMEM | 分配内存失败,如系统内存不足。 |
| 0xA0028003 | ZH_ERR_SYS_ILLEGAL_PARAM | 参数设置无效。 |
| 0xA0028012 | ZH_ERR_SYS_BUSY | 系统忙。 |
| 0xA0028008 | ZH_ERR_SYS_NOT_SUPPORT | 不支持的功能。 |
内存缓存池SYS错误码
| 错误代码 | 宏定义 | 描述 |
|---|---|---|
| 0xA0018003 | ZH_ERR_MB_ILLEGAL_PARAM | 参数设置无效。 |
| 0xA0018005 | ZH_ERR_MB_UNEXIST | 内存缓存池不存在。 |
| 0xA0018006 | ZH_ERR_MB_NULL_PTR | 参数空指针错误。 |
| 0xA0018009 | ZH_ERR_MB_NOT_PERM | 操作不允许。 |
| 0xA001800C | ZH_ERR_MB_NOMEM | 分配内存失败。 |
| 0xA001800D | ZH_ERR_MB_NOBUF | 分配缓存失败。 |
| 0xA0018010 | ZH_ERR_MB_NOTREADY | 系统控制属性未配置。 |
| 0xA0018012 | ZH_ERR_MB_BUSY | 系统忙。 |
| 0xA0018013 | ZH_ERR_MB_SIZE_NOT_ENOUGH | MB 块大小不够。 |
| 0xA0018040 | ZH_ERR_MB_2MPOOLS | 创建缓存池太多。 |