海思(MPP)媒体处理软件平台(2)—–视频缓存池

概述

系统控制根据 Hi35xx 芯片特性,完成硬件各个部件的复位、基本初始化工作,同时负
责完成 MPP(Media Process Platform 媒体处理平台)系统各个业务模块的初始化、去
初始化以及管理 MPP 系统各个业务模块的工作状态、提供当前 MPP 系统的版本信
息、提供大块物理内存管理等功能。
应用程序启动 MPP 业务前,必须完成 MPP 系统初始化工作。同理,应用程序退出
MPP 业务后,也要完成 MPP 系统去初始化工作,释放资源。

视频缓存池

视频缓存池主要向媒体业务提供大块物理内存管理功能,负责内存的分配和回收,充
分发挥内存缓存池的作用,让物理内存资源在各个媒体处理模块中合理使用。

一组大小相同、物理地址连续的缓存块组成一个视频缓存池。

视频输入通道需要使用公共视频缓存池。所有的视频输入通道都可以从公共视频缓存
池中获取视频缓存块用于保存采集的图像(如图 2-1 中所示从公共视频缓存池 B 中获
取视频缓存块 Bm)。由于视频输入通道不提供创建和销毁公共视频缓存池功能,因
此,在系统初始化之前,必须为视频输入通道配置公共视频缓存池
。根据业务的不
同,公共缓存池的数量、缓存块的大小和数量不同。图 2-1 中所示缓存块的生存期是
指经过 VPSS 的通道以 USERMODE 方式传给后续模块的情形(图 2-1 实线路径)。如
果该缓存块完全没有经过 VPSS 的通道透传给其他模块,则将在 VPSS 模块处理后被放
回公共缓存池(图 2-1 虚线路径)。

海思(MPP)媒体处理软件平台(2)-----视频缓存池
海思(MPP)媒体处理软件平台(2)-----视频缓存池
如表所示,压缩指 256byte 段式压缩(目前仅支持此压缩模式)。另外,要求宽 16
对齐,高 2 对齐。压缩头 stride 为 16。压缩时,图像压缩头大小可以直接调用宏定义
VB_PIC_HEADER_SIZE 得到,图像总大小可以直接调用宏定义 VB_PIC_BLK_SIZE
得到,这两个宏定义皆位于 hi_define.h 头文件中。
CEILING_2_POWER
#define CEILING_2_POWER(x,a) ( ((x) + ((a) – 1) ) & ( ~((a) – 1) ) )//字节对齐
【注意】
只有在 MPP 整个系统处于未初始化状态,才可调用此函数配置 MPP 系统,否则会配置失败。

关于视频帧方面请参考文章 Android Camera 采样和存储常见数据格式

HI_MPI_VB_SetConf

海思(MPP)媒体处理软件平台(2)-----视频缓存池

VB视频缓存池和通用缓冲区的公共缓存区别: 海思(MPP)媒体处理软件平台(2)-----视频缓存池

假设我们的图片格式大小类型为PIC_HD1080那stSize为1920 * 1080 (pstSize->u32Width = 1920;pstSize->u32Height = 1080;)

2、宽高对齐

CEILING_2_POWER(x,a) ceiling x to multiple of a(a must be power of 2)
CEILING_2_POWER(x,a) ( ((x) + ((a) – 1) ) & ( ~((a) – 1) ) )
意思就是u32Width (stSize.u32Width = 1080 的最近的上限值)必须是u32AlignWidth = 16 的整数倍 那就是1088 ,1088/16 = 68.即是16的整数倍做对齐操作。
依次计算出宽高。

3、根据像素格式计算缓存块大小

(PIXEL_FORMAT_YUV_SEMIPLANAR_420 和PIXEL_FORMAT_YUV_SEMIPLANAR_422 )

我们的是PIXEL_FORMAT_YUV_SEMIPLANAR_420 所以我们的缓存块大小是u32BlkSize = u32Width * u32Height * 3 / 2;个字节
这个格式的数据量跟YUV420 Planar的一样,但是U、V是交叉存放的,一个像素点对应一个Y,一个2X2的小方块对应一个U和V。
width * hight =Y(总和)
U = Y / 4
V = Y / 4
所以YUV420 数据在内存中的长度是 width * hight * 3 / 2,实际上Y U V 各占一个字节。

PIXEL_FORMAT_YUV_SEMIPLANAR_420 ,一个像素点对应一个Y,2个Y对应一个U和V。
width * hight =Y(总和)
U = Y / 2
V = Y / 2
所以YUV420 数据在内存中的长度是 width * hight (Y+Y/2+Y/2)=width * hight *2。

4、填充VB_CONF_S缓存池配置结构体

stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = 20;
u32BlkCnt 需要根据具体的帧率来设定。
然后传入上述使用过程的api就完成申请了。这样内部mpp就可以使用到你已经配置好的缓存池了。

5、使用示例

视频像素格式为PIXEL_FORMAT_YUV_SEMIPLANAR_420
分辨率为PIC_HD1080(1920*1080)

参考链接: link.

来源:Doctor夫妇

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年4月5日
下一篇 2020年4月5日

相关推荐