2 海思Hi3518E视频缓存池

应用程序启动 MPP 业务前,必须完成 MPP 系统初始化工作。同理,应用程序退出MPP 业务后,也要完成 MPP 系统去初始化工作,释放资源。
整个系统架构为

视频缓存池


视频缓存池主要向媒体业务提供大块物理内存管理功能,负责内存的分配和回收,充分发挥内存缓存池的作用,让物理内存资源在各个媒体处理模块中合理使用。
一组大小相同、物理地址连续的缓存块组成一个视频缓存池。
视频输入通道需要使用公共视频缓存池。所有的视频输入通道都可以从公共视频缓存池中获取视频缓存块用于保存采集的图像(如图中所示从公共视频缓存池 B 中获取视频缓存块 Bm)。由于视频输入通道不提供创建和销毁公共视频缓存池功能,因此,在系统初始化之前,必须为视频输入通道配置公共视频缓存池。

根据业务的不同,公共缓存池的数量、缓存块的大小和数量不同。 图中所示缓存块的生存期是指经过 VPSS 通道传给后续模块的情形(图 实线路径)。如果该缓存块完全没有经过 VPSS 通道传给其他模块,则将在 VPSS 模块处理后被放回公共缓存池(图虚线路径)。
              典型的公共视频缓存池数据流图

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;

【成员】

【注意事项】
公共缓存池中每个缓存块的大小应根据当前图像像素格式以及图像是否压缩而有所不
同。如表所示。
视频帧内存 Size 计算表

如表 2-2 所示,压缩指 256byte 段式压缩(目前仅支持此压缩模式)。另外,要求宽 16
对齐,高 2 对齐。压缩头 stride 为 16。压缩时,图像压缩头大小可以直接调用宏定义
VB_PIC_HEADER_SIZE 得到,图像总大小可以直接调用宏定义 VB_PIC_BLK_SIZE
得到,这两个宏定义皆位于 hi_define.h 头文件中。
 

实例代码:

HI_S32 s32ret;
VB_CONF_S struVbConf;
MPP_SYS_CONF_S struSysConf;
memset(&struVbConf,0,sizeof(VB_CONF_S));
struVbConf.u32MaxPoolCnt = 64;
struVbConf.astCommPool[0].u32BlkSize = 1920*1088*2;
struVbConf.astCommPool[0].u32BlkCnt = 15;
memset(struVbConf.astCommPool[0].acMmzName,0,sizeof(struVbConf.astCommPool[0].acMmzName));
s32ret = HI_MPI_VB_SetConf(&struVbConf);
if (HI_SUCCESS != s32ret)
{
	return s32ret;
}
s32ret = HI_MPI_VB_Init();
if (HI_SUCCESS != s32ret)
{
	return s32ret;
}
struSysConf.u32AlignWidth = 16;
/* set config of mpp system*/
s32ret = HI_MPI_SYS_SetConf(&struSysConf);
if (HI_SUCCESS != s32ret)
{
	printf("Set mpp sys config failed!\n");
	return s32ret;
}
/* init system*/
s32ret = HI_MPI_SYS_Init();
if (HI_SUCCESS != s32ret)
{
	printf("Mpi init failed!\n");
	return s32ret;
}
/* ...... */
/* exit system*/
s32ret = HI_MPI_SYS_Exit();
if (HI_SUCCESS != s32ret)
{
	printf("Mpi exit failed!\n");
	return s32ret;
}
s32ret = HI_MPI_VB_Exit();
if (HI_SUCCESS != s32ret)
{
	return s32ret;
}

【注意】
只有在 MPP 整个系统处于未初始化状态,才可调用此函数配置 MPP 系统,否则会配置失败。
 

系统绑定


MPP 提供系统绑定接口(HI_MPI_SYS_Bind),即通过数据接收者绑定数据源来建立两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源生成的数据将自动发送给接收者。目前 MPP 支持的绑定关系如表所示。

VI/VPSS 离/在线模式

VI 和 VPSS 的协作模式分为以下 2 种(模式切换由 load 脚本参数控制,对应 sys 模块参数 vi_vpss_online):
VI/VPSS 离线模式是指 VI 进行时序解析后将图像数据写出到 DDR, VPSS 从DDR 中载入 VI 采集的数据进行图像处理,是传统 Hi3518/Hi3520D 等芯片的VI/VPSS 的协作模式。


VI/VPSS 在线模式是指 VI 进行时序解析后直接在芯片内部将数据传递到 VPSS,中间无 DDR 写出的过程。在线模式可以省一定的带宽和内存,降低端到端的延时。需要注意的是,在线模式时,因为 VI 不写出数据到 DDR,无法进行CoverEx、 OverlayEx、 Rotate、 LDC 等操作,需要在 VPSS 各通道写出后再进行Rotate/LDC 等处理,而且有些功能只在离线下能支持,比如 DIS。
相关函数:

HI_MPI_SYS_GetViVpssMode
【描述】
获取 ViVpss 离/在线模式。
【语法】

HI_S32 HI_MPI_SYS_GetViVpssMode(HI_U32* pu32Mode);

【参数】

参数名称描述输入/输出
pu32Mode离/在线模式。
0:离线;
1:在线。
输出

【返回值】

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

【注意】

离/在线模式,在 load 脚本中控制,此处只提供获取接口。

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值