以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
一、视频缓存池的概念
(1)视频的本质是多帧图片,图片的本质是RGB或rawRGB数据,视频要占用一段连续内存。
(2)视频的裁剪、缩放、修正处理等各种操作,本质上就是对内存中的数据进行运算。
(3)视频缓存池(VB,video buffer)就是一段很大而又被合理划分和管理的内存,用来做视频数据的暂存和运算场地。
(4)“公共视频缓存池”中的“公共”,可以理解为全局变量,也就是各个模块都能访问的一段内存。
(5)视频缓存块在各个模块之间流转,实际上并没有内存复制,而是指针在传递。
(6)视频缓存池的内存由MPP来维护,我们在系统启动时就把整个SDRAM分成了2部分:系统部分(由linux kernel来维护管理)和mpp部分(由mpp系统来维护管理)。见博文第一季6:海思方案中uboot、kernel和rootfs的烧写方法中的描述“硬件上的64M内存有两个用途,一部分给OS用,一部分给MPP使用。这里32M指的是OS使用的。(剩余32M给MPP用?)”
(7)公共缓存池需要几个,每个缓存池中包含几个缓存块,每个缓存块多大,都是可以由用户程序设置好参数,然后调用MPP的相应API来向MPP申请分配的。
(8)典型的公共视频缓存池数据流图如下。(图中有两个公共缓冲池A和B,其中A包括A1…An这些缓存块。)
二、有关的数据结构与API
1、结构体VB_CONF_S
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;
(1)u32MaxPoolCnt,表示缓存池的最大数目(与公共缓冲池的最大数目有什么区别?),需要根据实际情况来设置,最大不能超过VB_MAX_POOLS(这个宏的值为256)。
(2)u32BlkCnt,表示公共缓存池(上图中的A或B……)中有多少个缓存块,而u32BlkSize表示每个缓存块的大小。
(3)acMmzName[ ],表示公共缓存池(上图中的A或B……)的名字
(4)VB_MAX_COMM_POOLS,这个宏的值是16,表示最多有16个公共缓存池。
(5)根据业务的不同,公共缓存池的数量、缓存块的大小和数量不同。
2、HI_MPI_VB_SetConf
这是一个 API函数,在某个ko文件里。主要用来设置格式。(点单,返回值表示是否点单成功。)
3、HI_MPI_VB_Init
这是一个 API函数,在某个ko文件里。主要用来进行分配。(做菜,返回值表示是否做菜成功。)