1.申请缓冲池 把地址给打出来
利用相关数据结构和API实操
(1).设置缓冲池的信息
用到的API参考海思提供sample代码
VB_CONF_S
HI_MPI_VB_SetConfig
HI_MPI_VB_Init
(2).初始化
(3).获取地址
(4).退出
设置缓冲池信息主要是配置VB_CONFIG_S结构体,必须包含hi_comm_vb.h、mpi_vb.h
头文件。
(1).VB_POOL_CONFIG_S的第3个参数hiVB_REMAP_MODE_E是枚举类型,hiVB_REMAP_MODE_E
4种模式可选为不映射,不映射到cache, 映射到cache, 预留。不映射是指申请完缓冲块不需要对地址进行映射,普通映射指物理地址映射成虚拟地址,物理地址指给内核态直接访问的一块地址,虚拟地址是用户态访问的地址,用户态不会直接访问物理地址,这时需要地址页表映射。也就是说这里的VB_REMAP_MODE_NOCACHE = 1, /* no cache remap */不映射到cache但是它映射到虚拟地址。
(2).映射到cache是指已经通过两步已经映射到虚拟地址,再映射到cache上,作用是访问快。
(3)HI_CHAR acMmzName[MAX_MMZ_NAME_LEN]表示每个缓存块的名字。
tvbParamConf.astCommPool[0].u64BlkSize 计算大小 海思提供一套计算大小接口
HI_U32 u32Width, HI_U32 u32Height为分辨率, PIXEL_FORMAT_E enPixelFormat图像格式这里是yvu420sp内部排列yyyyyyyyyvuvuvuvu交错排列。
DATA_BITWIDTH_E enBitWidth
指内存对齐,选择8字节对齐。
COMPRESS_MODE_E enCmpMode
暂时没有用处COMPRESS_MODE_NONE不对它进行设置
HI_U32 u32Align
刚才是8字节对齐所以这里就写为这个宏#define DEFAULT_ALIGN 8
海思内部封装为8。
4.如何判断接口调的成功呢?
函数类型为HI_S32,所以定义一个HI_S32 nRet变量。
i
f(nRet)
{
printf("HI_MPI_VB_SetConfig failed,nRet=0x%x", nRet);/*打印出16进制错误码
return -1;
}
5.接下来是初始化视频缓冲池
6.接下来是初始化MPP系统但是之前必须先调用 HI_MPI_SYS_SetConfig后才能初始化
注意:
*必须先调用 HI_MPI_SYS_SetConfig 配置 MPP 系统后才能初始化,否则初始化会
失败。
*由于 MPP 系统的正常运行依赖于缓存池,因此需要先调用 HI_MPI_VB_Init 初始
化缓存池,再初始化 MPP 系统,否则会导致业务运行异常。
如果多次初始化,仍会返回成功,但实际上系统不会对 MPP 的运行状态有任何影
响。
只要有一个进程进行初始化即可,不需要所有的进程都做系统初始化的操作。
由于音频模块依赖用户态属性,故音频不支持多进程操作。用户需要保证音频的
相关操作和 HI_MPI_SYS_Init 在同一个进程中。
7.变量命名规则 s32 为有符号的32位 n前缀,U64 qw前缀,U32 dw前缀
HI_S32 nRet;
HI_U32 qwBlkSize;
qwBlkSize = COMMON_GetPicBufferSize(1920, 1080,
PIXEL_FORMAT_YVU_SEMIPLANAR_420,
DATA_BITWIDTH_8, COMPRESS_MODE_NONE
DEFAULT_ALIGN);
printf(" qwBlkSize = %ld\n", qwBlkSize);
tvbParamConf.astCommPool[0