什么是视频缓存池?
1.视频的本质是多帧图片,图片的本质的是RGB或者rawRGB数据,要占用一段连续内存
2.视频的裁剪、缩放、修正处理等各种操作,本质上就是对内存中的数据进行运算
3.视频缓冲池(VB:video buffer)就是一段很大,又被合理划分和管理的内存,用来做视频数据的暂存和运算场地
4.公共视频缓存池的【公共】可以理解为全局变量,也就是各个模块都能访问的一段内存
5.看似视频缓冲块在各个模块之间流转,实际上并没有内存复制,而是指针在传递
6.视频缓存池的内存有MPP维护,我们在系统启动时就把整个SDRAM分成了2部分:系统部分(由linux kernel来维护管理)和mpp部分(由mpp系统来维护管理)
7.缓存池需要几个,每个包含几个缓存块,每个缓存块多大,都是可以由用户程序设置好参数,然后调用mpp的相关api来向mpp申请分配的
相关数据结构和api
1.VB_CONF_S:定义视频缓存池属性结构体
typedef struct hiVB_CONF_S { HI_U32 u32MaxPoolCnt; /* max count of pools, (0,VB_MAX_POOLS] */ struct hiVB_CPOOL_S { HI_U32 u32BlkSize;//每个缓存池的缓存块大小 HI_U32 u32BlkCnt;//缓存块的数量 HI_CHAR acMmzName[MAX_MMZ_NAME_LEN];//缓存块的名字 }astCommPool[VB_MAX_COMM_POOLS]; } VB_CONF_S;
2.HI_MPI_VB_SetConf:设置 MPP 视频缓存池属性
3.HI_MPI_VB_Init:初始化 MPP 视频缓存池
/****************************************************************************** * function : vb init & MPI system init ******************************************************************************/ HI_S32 SAMPLE_COMM_SYS_Init(VB_CONF_S* pstVbConf) { MPP_SYS_CONF_S stSysConf = {0}; HI_S32 s32Ret = HI_FAILURE; HI_MPI_SYS_Exit(); HI_MPI_VB_Exit(); if (NULL == pstVbConf) { SAMPLE_PRT("input parameter is null, it is invaild! "); return HI_FAILURE; } s32Ret = HI_MPI_VB_SetConf(pstVbConf); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("HI_MPI_VB_SetConf failed! "); return HI_FAILURE; } s32Ret = HI_MPI_VB_Init(); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("HI_MPI_VB_Init failed! "); return HI_FAILURE; } stSysConf.u32AlignWidth = SAMPLE_SYS_ALIGN_WIDTH; s32Ret = HI_MPI_SYS_SetConf(&stSysConf); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("HI_MPI_SYS_SetConf failed "); return HI_FAILURE; } s32Ret = HI_MPI_SYS_Init(); if (HI_SUCCESS != s32Ret) { SAMPLE_PRT("HI_MPI_SYS_Init failed! "); return HI_FAILURE; } return HI_SUCCESS; }