跳到主要内容
版本:2.9.0

系统控制 (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 数据交互如图所⽰。

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),即通过数据接收者绑定数据源来建⽴两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源⽣成的数据将⾃动发送给接收者。⽬前⽀持的绑定关系如下表:

数据源数据接收者
VIVO
VIVENC
VIVPSS
VIAVS
AVSVENC
AVSVO
AVSVPSS
AVSAVS
VPSSAVS
VPSSVO
VPSSVENC
VPSSVPSS
VDECVENC
VDECVPSS
VDECVO
WBCVENC
WBCVO
WBCVPSS
VENCVDEC
AIAO
AIAENC
ADECAO

帧率控制​

模块帧率控制属性包括输入帧率和输出帧率两部分,同时会根据输入帧率控制是否允许帧输入,例如输入帧率为 30 时,每 33.33ms 才允许输入一帧。

减帧模式​

当输入帧率大于或等于输出帧率时,会根据设定值均匀丢弃某些帧。例如,输入帧率为 30,输出帧率为 15 时,每 2 帧将会丢弃一帧,具体减帧模式⽰意如图所示:

减帧模式⽰意图

增帧模式​

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

增帧模式⽰意图

帧率控制功能支持列表​

模块增帧模式减帧模式送帧控制方式
VI支持支持阻塞式
VENC支持支持阻塞式
VPSS (组)支持支持阻塞式
VPSS (通道)不支持支持非阻塞式
VO不支持支持非阻塞式

API参考​

系统控制实现 MPI 系统绑定解绑、创建视频缓存池、提供系统时钟、内存管理等功能。该功能模块提供以下 API:


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);

参数

参数名数据类型描述输入/输出
pstSrcChnconst MPP_CHN_S*源通道指针。输入
pstDestChnconst 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);

参数

参数名数据类型描述输入/输出
pstSrcChnconst MPP_CHN_S*源通道指针。输入
pstDestChnconst 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);

参数

参数名数据类型描述输入/输出
pBlkMB_BLK缓存块指针。输出
pstrMmbconst ZH_CHAR*Mmb 名称的字符串指针。填写 ZH_NULL。输入
pstrZoneconst ZH_CHAR*MMZ zone 名称的字符串指针。填写 ZH_NULL。输入
u32LenZH_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);

参数

参数名数据类型描述输入/输出
pBlkMB_BLK缓存块指针。输出
pstrMmbconst ZH_CHAR*Mmb 名称的字符串指针。填写 ZH_NULL。输入
pstrZoneconst ZH_CHAR*MMZ zone 名称的字符串指针。填写 ZH_NULL。输入
u32LenZH_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);

参数

参数名数据类型描述输入/输出
pBlkMB_BLK缓存块指针。输出
pstrMmbconst ZH_CHAR*Mmb 名称的字符串指针。填写 ZH_NULL。输入
pstrZoneconst ZH_CHAR*MMZ zone 名称的字符串指针。填写 ZH_NULL。输入
u32LenZH_U32缓存块大小。输入
u32HeapFlagsZH_U32内存标志,可同时带上多个标记。当前支持如下标志:
  • MB_REMAP_MODE_NOCACHE:不支持 Cache 缓存。
  • MB_REMAP_MODE_CACHED:支持 Cache 缓存。
  • MB_DMA_TYPE_CMA:带上此标志表示申请物理连续内存,物理连续内存需要内核提前配置预留媒体专用内存,当前默认 SDK 不支持。
输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

ZH_MPI_SYS_MmzFree​

描述

在用户态释放 MMZ 内存。

语法

ZH_S32 ZH_MPI_SYS_MmzFree(MB_BLK blk);

参数

参数名数据类型描述输入/输出
blkMB_BLK缓存块 ID。输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

ZH_MPI_SYS_MmzFlushCache​

描述

刷新 cache 里的内容到内存并且使 cache 里的内容无效。

语法

ZH_S32 ZH_MPI_SYS_MmzFlushCache(MB_BLK blk, ZH_BOOL bReadOnly);

参数

参数名数据类型描述输入/输出
blkMB_BLK缓存块 ID。输入
bReadOnlyZH_BOOLTrue:cache 写回内存。
False:cache 无效。
输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

ZH_MPI_SYS_Malloc​

描述

申请 malloc 内存。

语法

ZH_S32 ZH_MPI_SYS_Malloc(MB_BLK *pBlk, ZH_U32 u32Len);

参数

参数名数据类型描述输入/输出
pBlkMB_BLK*缓存块指针。输出
u32LenZH_U32缓存块大小。输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

ZH_MPI_SYS_Free​

描述

释放 malloc 申请的内存。

语法

ZH_S32 ZH_MPI_SYS_Free(MB_BLK blk);

参数

参数名数据类型描述输入/输出
blkMB_BLK缓存块 ID。输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

ZH_MPI_SYS_CreateMB​

描述

创建⼀个内存缓存块。

语法

ZH_S32 ZH_MPI_SYS_CreateMB(MB_BLK pBlk, MB_EXT_CONFIG_S *pstMbExtConfig);

参数

参数名数据类型描述输入/输出
pBlkMB_BLK缓存块指针。输出
pstMbExtConfigMB_EXT_CONFIG_S*缓存块参数配置信息。输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

ZH_MPI_SYS_GetCurPTS​

描述

获取当前时间戳。

语法

ZH_S32 ZH_MPI_SYS_GetCurPTS(ZH_U64 *pu64CurPTS);

参数

参数名数据类型描述输入/输出
pu64CurPTSZH_U64*当前时间戳指针。单位:微秒。输出

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

ZH_MPI_SYS_InitPTSBase​

描述

初始化 ZH MPI 时间戳。

语法

ZH_S32 ZH_MPI_SYS_InitPTSBase(ZH_U64 u64PTSBase);

参数

参数名数据类型描述输入/输出
u64PTSBaseZH_U64时间戳基准。单位:微秒。输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

注意事项

初始化时间戳基准会将当前系统的时间戳强制置成 u64PTSBase,与系统原有时间戳无关联。因此,建议在媒体业务未启动时(例如操作系统刚启动),调用此接口。


ZH_MPI_SYS_SyncPTS​

描述

同步 ZH MPI 时间戳。

语法

ZH_S32 ZH_MPI_SYS_SyncPTS(ZH_U64 u64PTSBase);

参数

参数名数据类型描述输入/输出
u64PTSBaseZH_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);

参数

参数名数据类型描述输入/输出
pstChnconst MPP_CHN_S*通道指针。输入
modeCHN_INPUT_MODE_E通道输入流模式。输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

ZH_MPI_MB_CreatePool​

描述

创建⼀个内存缓存池。

语法

MB_POOL ZH_MPI_MB_CreatePool(MB_POOL_CONFIG_S *pstMbPoolCfg);

参数

参数名数据类型描述输入/输出
pstMbPoolCfgMB_POOL_CONFIG_S*缓存池配置属性参数指针。输入

返回值

返回值描述
非 MB_INVALID_POOLID有效的缓存池 ID 号。
MB_INVALID_POOLID创建缓存池失败,可能是参数非法或者保留内存不足。

ZH_MPI_MB_DestroyPool​

描述

销毁⼀个内存缓存池。

语法

ZH_S32 ZH_MPI_MB_DestroyPool(MB_POOL pool);

参数

参数名数据类型描述输入/输出
poolMB_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);

参数

参数名数据类型描述输入/输出
poolMB_POOL缓存池 ID。取值范围:[0, MB_MAX_POOLS)。输入
u64SizeZH_U64缓存块大小。取值范围:数据类型全范围,以 byte 为单位。输入
blockZH_BOOL获取缓存块是否等待缓存块使用完毕返回缓存池。
ZH_TRUE:阻塞。ZH_FALSE:非阻塞。默认非阻塞。
输入

返回值

返回值描述
非 MB_INVALID_HANDLE有效的缓存块句柄。
MB_INVALID_HANDLE获取缓存块失败。

ZH_MPI_MB_ReleaseMB​

描述

释放⼀个已经获取的缓存块。

语法

ZH_S32 ZH_MPI_MB_ReleaseMB(MB_BLK mb);

参数

参数名数据类型描述输入/输出
mbMB_BLK缓存块 ID。输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

ZH_MPI_MB_Handle2PhysAddr​

描述

获取⼀个缓存块的物理地址。

语法

ZH_U64 ZH_MPI_MB_Handle2PhysAddr(MB_BLK mb);

参数

参数名数据类型描述输入/输出
mbMB_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);

参数

参数名数据类型描述输入/输出
mbMB_BLK缓存块 ID。输入

返回值

返回值描述
ZH_NULL获取虚拟地址失败。
非 ZH_NULL有效的虚拟地址。

ZH_MPI_MB_Handle2UniqueId​

描述

获取⼀个缓存块的系统全局唯一 ID,可用于跨进程操作。

语法

ZH_S32 ZH_MPI_MB_Handle2UniqueId(MB_BLK mb);

参数

参数名数据类型描述输入/输出
mbMB_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);

参数

参数名数据类型描述输入/输出
mbMB_BLK缓存块 ID。输入

返回值

返回值描述
负数获取缓存块句柄失败。
非负数有效的缓存块句柄。

注意事项

缓存块句柄只有内存类型为 DMA 时才可获取有效的句柄。


ZH_MPI_MB_Handle2PoolId​

描述

获取⼀个缓存块所在缓存池的 ID。

语法

MB_POOL ZH_MPI_MB_Handle2PoolId(MB_BLK mb);

参数

参数名数据类型描述输入/输出
mbMB_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);

参数

参数名数据类型描述输入/输出
mbMB_BLK缓存块 ID。输入

返回值

返回值描述
任意值缓存块的内存大小。

ZH_MPI_MB_GetLength​

描述

获取⼀个缓存块的实际数据⼤⼩。

语法

ZH_U64 ZH_MPI_MB_GetLength(MB_BLK mb);

参数

参数名数据类型描述输入/输出
mbMB_BLK缓存块 ID。输入

返回值

返回值描述
任意值缓存块的实际数据大小。

ZH_MPI_MB_GetOffset​

描述

获取⼀个缓存块的实际内存偏移⼤⼩。

语法

ZH_U32 ZH_MPI_MB_GetOffset(MB_BLK mb);

参数

参数名数据类型描述输入/输出
mbMB_BLK缓存块 ID。输入

返回值

返回值描述
非负数缓存块的实际内存偏移大小。

ZH_MPI_MB_SetOffset​

描述

设置⼀个缓存块的内存偏移⼤⼩。

语法

ZH_S32 ZH_MPI_MB_SetOffset(MB_BLK mb, ZH_U32 u32Offset);

参数

参数名数据类型描述输入/输出
mbMB_BLK缓存块 ID。输入
u32OffsetZH_U32内存偏移大小。输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

ZH_MPI_MB_VirAddr2Handle​

描述

根据虚拟地址获取对应的缓存块。

语法

MB_BLK ZH_MPI_MB_VirAddr2Handle(ZH_VOID *pstVirAddr);

参数

参数名数据类型描述输入/输出
pstVirAddrZH_VOID*虚拟地址。输入

返回值

返回值描述
MB_INVALID_HANDLE获取缓存块 ID 失败。
非MB_INVALID_HANDLE有效的缓存块 ID。

注意事项

⽬前仅⽀持 DMA 内存从虚拟地址查找到缓存块。


ZH_MPI_MB_UniqueId2Fd​

描述

获取⼀个缓存块的系统全局唯⼀ ID。

语法

ZH_S32 ZH_MPI_MB_UniqueId2Fd(ZH_S32 s32UniqueId);

参数

参数名数据类型描述输入/输出
s32UniqueIdZH_S32系统全局唯一 ID。输入

返回值

返回值描述
负值获取句柄失败。
非负值有效的句柄。

ZH_MPI_MB_InquireUserCnt​

描述

查询缓存块使⽤计数信息。

语法

ZH_S32 ZH_MPI_MB_InquireUserCnt(MB_BLK mb);

参数

参数名数据类型描述输入/输出
mbMB_BLK缓存块 ID。输入

返回值

返回值描述
非负数获取缓存块的使用计数。
负数无效的缓存块计数。

ZH_MPI_MB_SetModPoolConfig​

描述

设置模块公共视频缓存池属性。

语法

ZH_S32 ZH_MPI_MB_SetModPoolConfig(MB_UID_E enMbUid, const MB_CONFIG_S *pstMbConfig);

参数

参数名数据类型描述输入/输出
enMbUidMB_UID_E使用模块公共视频缓冲池的模块 ID。输入
pstMbConfigconst 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);

参数

参数名数据类型描述输入/输出
enMbUidMB_UID_E使用模块公共视频缓冲池的模块 ID。输入
pstMbConfigMB_CONFIG_S*模块公共视频缓存池属性指针。输出

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

ZH_MPI_MB_SetConfig​

描述

设置视频公共缓存池属性。

语法

ZH_S32 ZH_MPI_MB_SetConfig(const MB_CONFIG_S *pstMbConfig);

参数

参数名数据类型描述输入/输出
pstMbConfigconst MB_CONFIG_S*视频缓冲池设置属性。输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

注意事项

  • 只能在系统处于未初始化的状态下,才可以设置缓存池属性,否则会返回失败。
  • 公共缓存池中每个缓存块的⼤⼩应根据当前图像像素格式以及图像是否压缩⽽有所不同。具体分配⼤⼩请参考内存池单块 MB ⼤⼩计算规则中的描述。

ZH_MPI_MB_GetConfig​

描述

获取视频公共缓存池属性。

语法

ZH_S32 ZH_MPI_MB_GetConfig(MB_CONFIG_S *pstMbConfig);

参数

参数名数据类型描述输入/输出
pstMbConfigMB_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);

参数

参数名数据类型描述输入/输出
mbMB_BLK缓存块 ID。输入
u32HorStrideZH_U32图像虚宽,以字节为单位。输入
u32VerStrideZH_U32图像虚高,以字节为单位。输入

返回值

返回值描述
0成功。
非 0失败,请参见 SYS 错误码。

数据类型​

数据类型定义如下:


公共数据类型​

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;

成员

成员名称数据类型描述
s32XZH_S32横坐标。
s32YZH_S32纵坐标。

RECT_S​

描述

矩形区域信息结构体。

定义

typedef struct zhRECT_S {
ZH_S32 s32X;
ZH_S32 s32Y;
ZH_U32 u32Width;
ZH_U32 u32Height;
} RECT_S;

成员

成员名称数据类型描述
s32XZH_S32横坐标。
s32YZH_S32纵坐标。
u32WidthZH_U32宽度。
u32HeightZH_U32高度。

CROP_INFO_S​

描述

CROP 属性结构体。

定义

typedef struct zhCROP_INFO_S {
ZH_BOOL bEnable;
RECT_S stRect;
} CROP_INFO_S;

成员

成员名称数据类型描述
bEnableZH_BOOLCrop 使能开关。
stRectRECT_SCrop 起始位置与宽高信息。

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;

成员

成员名称数据类型描述
enViewTypeROTATION_VIEW_TYPE_E任意角度旋转的旋转模式,裁剪模式、全模式和典型模式。
u32AngleZH_U32旋转角度。范围:[0, 360]。
s32CenterXOffsetZH_S32旋转中心点相对图像中心点水平偏移。范围:[-511, 511]。
s32CenterYOffsetZH_S32旋转中心点相对图像中心点垂直偏移。范围:[-511, 511]。
stDestSizeSIZE_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_GPUGPU
VIDEO_PROC_DEV_RGARGA
VIDEO_PROC_DEV_ISPISP
VIDEO_PROC_DEV_VPSSVPSS

注意事项

模块 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;

成员

成员名称数据类型描述
enModIdMOD_ID_E模块号。
s32DevIdZH_S32设备号。
s32ChnIdZH_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;

成员

成员名称数据类型描述
u64MBSizeZH_U64缓存块大小,以 Byte 为单位。
u32MBCntZH_U32每个缓存池的缓存块个数。取值范围:(0,10240]。
enRemapModeMB_REMAP_MODE_E内核态虚拟地址映射模式。
enAllocTypeMB_ALLOC_TYPE_E申请的内存类型。
enDmaTypeMB_DMA_TYPE_E申请的 DMA 物理内存类型,如配置是否物理连续。
bPreAllocZH_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_NOCACHEMB 映射 nocache 属性的内核态虚拟地址。
MB_REMAP_MODE_CACHEDMB 映射 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;

成员

成员名称数据类型描述
pu8VirAddrZH_U8*外部申请的虚拟地址。
u64PhyAddrZH_U64外部申请的物理地址。
s32FdZH_S32外部申请的内存句柄。
u64SizeZH_U64外部申请的内存大小。
pFreeCBZH_MPI_MB_FREE_CB申请内存的释放回调方法。
pOpaqueZH_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;

成员

成员名称数据类型描述
u32MaxPoolCntZH_U32整个系统中可容纳的缓存池个数。 静态属性。 保留属性,目前未生效。
astCommPoolMB_POOL_CONFIG_S公共缓存池属性结构体。 静态属性。

注意事项

  • u64MBSize 等于 0 或 u32MBCnt 等于 0,则对应的缓存池不会被创建。
  • 建议整个结构体先 memset 为 0 再按需赋值,否则出现随机值内部无法完全过滤。

SYS错误码​

系统控制SYS错误码​

系统控制API SYS错误码如下所示:

错误代码宏定义描述
0xA0028006ZH_ERR_SYS_NULL_PTR空指针错误。
0xA0028010ZH_ERR_SYS_NOTREADY系统控制属性未配置。
0xA0028009ZH_ERR_SYS_NOT_PERM操作不允许。
0xA002800CZH_ERR_SYS_NOMEM分配内存失败,如系统内存不足。
0xA0028003ZH_ERR_SYS_ILLEGAL_PARAM参数设置无效。
0xA0028012ZH_ERR_SYS_BUSY系统忙。
0xA0028008ZH_ERR_SYS_NOT_SUPPORT不支持的功能。

内存缓存池SYS错误码​

错误代码宏定义描述
0xA0018003ZH_ERR_MB_ILLEGAL_PARAM参数设置无效。
0xA0018005ZH_ERR_MB_UNEXIST内存缓存池不存在。
0xA0018006ZH_ERR_MB_NULL_PTR参数空指针错误。
0xA0018009ZH_ERR_MB_NOT_PERM操作不允许。
0xA001800CZH_ERR_MB_NOMEM分配内存失败。
0xA001800DZH_ERR_MB_NOBUF分配缓存失败。
0xA0018010ZH_ERR_MB_NOTREADY系统控制属性未配置。
0xA0018012ZH_ERR_MB_BUSY系统忙。
0xA0018013ZH_ERR_MB_SIZE_NOT_ENOUGHMB 块大小不够。
0xA0018040ZH_ERR_MB_2MPOOLS创建缓存池太多。