HiMPP V3.0 媒体处理软件笔记(二)

本文介绍MPP系统控制模块的功能,包括硬件复位、初始化、业务模块管理及版本信息获取等。详细阐述视频缓存池的管理机制,如何创建、分配和回收大块物理内存,以供媒体业务高效使用。

2.系统控制

2.1 概述

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

2.2 功能描述

2.2.1 视频缓存池

  视频缓存池主要向媒体业务提供大块物理内存管理功能,负责内存的分配和回收,充分发挥内存缓冲池的作用,让物理内存资源在各个媒体处理模块中合理使用。
  一组大小相同、物理地址连续的缓存块组成一个视频缓存池。
  视频输入通道需要使用公共视频缓存池。所有的视频输入通道都可以从公共视频缓存池中获取视频缓存块用于保存采集的图像(如图2-1中所示从公共视频缓存池A中获取视频缓存块Bm)。由于视频输入通道不提供创建和销毁公共视频缓存池功能,因此,在系统初始化之前,必须为视频输入通道配置公共视频缓存池。根据业务的不同,公共缓存池的数量、缓存块的大小和数量不同。图2-1中所示缓存块的生存期是指经过VPSS的通道以USERMODE方式传给后续模块的情形(图2-1实线路径)。如果该缓存块完全没有经过VOSS的通道透传给其他模块,则将在VPSS模块处理后被放回公共缓冲池(图2-1虚线路径)。
  图2-1 典型的公共视频缓存池数据流图
流程图

2.2.2系统绑定

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

表2-1 HiMPP支持的绑定关系

在这里插入图片描述

在这里插入图片描述

2.3 API参考

系统控制实现MPP(Media Process Platform)系统初始化、获取MPP版本号、视频缓存池初始化、创建视频缓存池等功能。
该功能模块提供以下MPI:
·  HI_MPI_SYS_SetConf:  配置系统控制参数
·  HI_MPI_SYS_GetConf:  获取系统控制参数
·  HI_MPI_SYS_Init:  初始化MPP系统
·  HI_MPI_SYS_Exit:  去初始化MPP系统
·  HI_MPI_SYS_Bind:  数据源到数据接收者绑定
·  HI_MPI_SYS_UnBind:  数据源到数据接收者解绑定
·  HI_MPI_SYS_GetBindbyDest:  获取绑定的源
·  HI_MPI_SYS_GetVersion:  获取MPP的版本号
·  HI_MPI_SYS_GetCurPts:  获取当前时间戳
·  HI_MPI_SYS_InitPtsBase:  初始化MPP时间戳
·  HI_MPI_SYS_SyncPts:  同步MPP时间戳
·  HI_MPI_SYS_Mmap:  存储映射接口
·  HI_MPI_SYS_MmapCache:  存储映射接口,映射成cache属性
·  HI_MPI_SYS_Munmap:  存储反映射接口
·  HI_MPI_SYS_MflushCache:  刷新cache里面的内容到内存并且使cache里的内容无效
·  HI_MPI_SYS_SetReg:  设置寄存器的值
·  HI_MPI_SYS_GetReg:  获取寄存器的值
·  HI_MPI_SYS_MmzAlloc:  在用户态申请MMZ内存
·  HI_MPI_SYS_MmzAlloc_Cached:  在用户态申请MMZ内存,该内存支持cache缓存
·  HI_MPI_SYS_MmzFlushCache:  刷新cache里的内容到内存并且使cache里的内容无效
·  HI_MPI_SYS_MmzFree:  在用户态释放MMZ内存
·  HI_MPI_SYS_SetMemConf:  设置模块设备通道使用内存的DDR名
·  HI_MPI_SYS_GetMemConf:  获取模块设备通道使用内存的DDR名
·  HI_MPI_SYS_CloseFd:  关闭所有SYS打开的日志、系统、内存Fd
·  HI_MPI_VB_SetConf:  设置MPP视频缓存池属性
·  HI_MPI_VB_GetConf:  获取MPP视频缓存池属性
·  HI_MPI_VB_Init:  初始化MPP视频缓存池
·  HI_MPI_VB_Exit:  去初始化MPP视频缓存池
·  HI_MPI_VB_CreatePool:  创建一个视频缓存池
·  HI_MPI_VB_DestoryPool:  销毁一个视频缓存池
·  HI_MPI_VB_GetBlock:  获取一个缓存块
·  HI_MPI_VB_ReleaseBlock:  释放一个已经获取的缓存块
·  HI_MPI_VB_Handle2PhysAddr:  获取一个缓存块的物理地址
·  HI_MPI_VB_Handle2PoolId::  获取一个缓存块所在缓存池的ID
·  HI_MPI_VB_MmapPool:  为一个视频缓存池映射用户态虚拟地址
·  HI_MPI_VB_GetBlkVirAddr:  获取一个视频缓存池中的缓存块的用户态虚拟地址
·  HI_MPI_VB_InitModCommPool:  初始化模块公共视频缓冲池
·  HI_MPI_VB_ExitModCommPool:  退出模块公共视频缓冲池
·  HI_MPI_VB_SetModPoolConf:  设置模块公共视频缓冲池属性
·  HI_MPI_VB_GetModPoolConf:  获取模块公共视频缓冲池属性

HI_MPI_SYS_SetConf
【描述】
配置系统控制参数
【语法】
HI_S32 HI_MPI_SYS_SetConf(const MPP_SYS_CONF_S *pstSysConf);
【参数】

参数名称描述输入/输出
pstSysConf系统控制参数指针。
静态属性(指只能在系统未初始化、未启动设备或通道时,才能设置的属性)。
输入

【返回值】

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

【需求】
·  头文件:hi_comm_sys.h、mpi_sys.h
·  库文件:libmpi.a
【注意】
只有在MPP整个系统都处于未初始化状态,才可调用此函数配置MPP系统,否则会配置失败。
【举例】

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;
struVnConf.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();
{
      return s32ret;
}

【相关主题】
HI_MPI_VB_GetConf

HI_MPI_SYS_GetConf
【描述】
获取系统控制参数。
【语法】
HI_S32 HI_MPI_SYS_GetConf(MPP_SYS_CONF_S *pstSysConf);
【参数】

参数名称描述输入/输出
pstSysConf系统控制参数指针。
静态属性。
输出

【返回值】

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

【需求】
·  头文件: hi_comm_sys.h、mpi_sys.h
·  库文件: libmpi.a
【注意】
必须先调用HI_MPI_SYS_SetConf成功后才能获取配置。
【举例】
无。

HI_MPI_SYS_Init
【描述】
初始化MPP系统。除了音频的编解码通道外,所有的音频输入输出、视频输入输出、视频编码、视频叠加区域、视频侦测分析等都会被初始化。
【语法】
HI_S32 HI_MPI_SYS_Init(HI_VOID)
【参数】
无。
【返回值】

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

【需求】
·  头文件: hi_comm_sys.h、mpi_sys.h
·  库文件: libmpi.a
【注意】
·  必须先调用HI_MPI_SYS_SetConf配置MPP系统后才能初始化,否则初始化会失败。
·  由于MPP系统的正常运行依赖于缓存池,因此必须先调用HI_MPI_VB_Init初始化缓存池,再初始化MPP系统。
·  如果多次初始化,仍会返回成功,但实际上系统不会对MPP的运行状态有任何影响。
·  只要有一个进程进行初始化即可,不需要所有的进程都做系统初始化的操作。
【举例】
请参见 HI_MPI_SYS_SetConf的举例
【相关主题】
HI_MPI_SYS_Exit

HI_MPI_SYS_Exit
【描述】
去初始化MPP系统。除了音频的编解码通道外,所有的音频输入输出、视频输入输出、视频编码、视频叠加区域、视频侦测分析通道等都会被销毁或者禁用。
【语法】
HI_S32 HI_MPI_SYS_Exit(HI_VOID);
【参数】
无。
【返回值】

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

【需求】
·  头文件: hi_comm_sys.h、mpi_sys.h
·  库文件: libmpi.a
【注意】
·  去初始化时,如果有阻塞在MPI上的用户进程,则去初始化会失败。如果所有阻塞在MPI上的调用都返回,则可以成功去初始化。
·  可以反复去初始化,不返回失败。
·  由于系统去初始化不会销毁音频的编解码通道,因此这些通道的销毁需要用户主动进行。如果创建这些通道的进程退出,则通道随之被销毁。
【举例】
请参见HI_MPI_SYS_SetConf的举例
【相关主题】
HI_MPI_SYS_Init

HI_MPI_SYS_Bind
【描述】
数据源到数据接收者绑定接口。
【语法】
HI_S32 HI_MPI_SYS_Bind(MPP_CHN_S *pstSrcChn,MPP_CHN_S *pstDestChn);
【参数】

参数名称描述输入/输出
pstSrcChn源通道指针输入
pstDestChn目的通道指针输入

【返回值】

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

【需求】
·  头文件:hi_comm_sys.h、mpi_sys.h
·  库文件:libmpi.a
【注意】
·  系统目前支持的绑定关系,请参见表2-1
·  同一个数据接收者只能绑定一个数据源
·  绑定是指数据源到绑定接收者建立关联关系。绑定后,数据源生成的数据将自动发送给接收者。
·  VI和VDEC作为数据源,是以通道为发送者,向其他模块发送数据,用户将设备号置为0,SDK不检查输入的设备号。
·  VO作为数据源发送回写(WBC)数据时,时以设备为发送者,向其他模块发送数据,用户将通道号置为0,SDK不检查输入的通道号。
·  VPSS作为数据接收者时,是以设备(GROUP)为接收者,接受其他模块发来的数据,用户将通道号置为0,SDK不检查输入的通道号。
·  VENC作为数据接收者时,是以通道号为接收者,接收其他模块发过来的数据,用户应将设备号置为0.
·  其他情况均需指定设备号和通道号
【举例】
HI_S32 s32Ret;
MPP_CHN_S stBindSrc;
MPP_CHN_S stBindDest;
stBindDest.enModId = HI_ID_VPSS;
stBindDest . s32ChnId = 0;
stBindDest . s32DevId = 0;

stBindSrc . enModId = HI_ID_VIU;
stBindSrc . s32ChnId = 0;
stBindSrc . s32DevId = 0;

s32Ret = HI_MPI_SYS_Bind(&stBindSrc , &stBindDest );
if ( s32Ret )
{
return HI_FALLURE;
}
【相关主题】
HI_MPI_SYS_UnBind

HI_MPI_SYS_UnBind
【描述】
数据源到数据接收者解绑定接口。
【语法】
HI_S32 HI_MPI_SYS_UnBind(MPP_CHN_S *pstSrcChn , MPP_CHN_S *pstDestChn);
【参数】

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

【需求】
·  头文件:hi_comm_sys.h、mpi_sys.h
·  库文件:libmpi.a
【注意】

【举例】
请参见sample的举例
【相关主题】
HI_MPI_SYS_Bind

HI_MPI_SYS_GetBindbyDest
【描述】
获取此通道上绑定的源通道的信息
【语法】
HI_S32 HI_MPI_SYS_GetBindbyDest ( MPP_CHN_S *pstDestChn , MPP_CHN_S *pstSrcChn );
【参数】

参数名称描述输入/输出
pstDestChn目的通道指针输入
pstSrcChn源通道指针输出

【返回值】

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

【需求】
·  头文件:hi_comm_sys.h、mpi_sys.h
·  库文件:libmpi.a
【注意】

【举例】

【相关主题】
·  HI_MPI_SYS_Bind
·  HI_MPI_SYS_UnBind

HI_MPI_SYS_GetVersion
【描述】
获取MPP的版本号
【语法】
HI_S32 HI_MPI_SYS_GetVersion (MPP_VERSION_S *pstVersion);
【参数】

参数名称描述输入/输出
pstVersion版本号描述指针。
动态属性(指在任何时刻都可以设置的属性)
输出

【返回值】

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

【需求】
·  头文件:hi_comm_sys.h、mpi_sys.h
·  库文件:libmpi.a
【注意】

【举例】
HI_S32 s32ret;
MPP_VERSION_S stVersion;
s32ret = HI_MPI_SYS_GetVersion ( &stVersion );
if ( HI_SUCCESS != s32ret )
{
return s32ret;
}
printf( “mpi version is $s\n” , stVersion . aVersion );
【相关主题】

HI_MPI_SYS_GetCurPts
【描述】
获取MPP的当前时间戳
【语法】
HI_S32 HI_MPI_SYS_GetCurPts(HI_U64 *pu64CurPts);
【参数】

参数名称描述输入/输出
pu64CurPts当前时间戳指针输出

【返回值】

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

·  头文件:hi_comm_sys.h、mpi_sys.h
·  库文件:libmpi.a
【注意】

【举例】

【相关主题】

HI_MPI_SYS_InitPtsBase
【描述】
初始化MPP的时间戳基准
【语法】
HI_S32 HI_MPI_SYS_InitPtsBase ( HI_U64 u64PtsBase );
【参数】

参数名称描述输入/输出
u64PtsBase时间戳基准输入

【返回值】
上同
【需求】
上同
【注意】
初始化时间戳基本会将当前系统的时间戳强制置成u64PtsBase,与系统原有时间戳没有任何约束。因此,建议在媒体业务没有启动时(例如操作系统刚启动),调用这个接口。如果媒体业务已经启动,建议调用HI_MPI_SYS_SyncPts进行时间戳微调。
【举例】

【相关主题】

HI_MPI_SYS_SyncPts
【描述】
同步MPP的时间戳
【语法】
HI_S32 HI_MPI_SYS_SyncPts( HI_U64 u64PtsBase );

【参数】

参数名称描述输入/输出
u64PtsBase时间戳基准输入

【返回值】
同上
【需求】
同上
【注意】
对当前系统时间戳进行微调,微调后不会出现时间戳回退现象。在多片之间做同步时,由于单板的时钟源误差可能比较大,建议一秒钟进行一次时间戳微调。
【举例】

【相关主题】

HI_MPI_SYS_Mmap
【描述】
存储映射接口
【语法】
HI_VOID * HI_MPI_SYS_Mmap( HI_U32 u32PhyAddr , HI_U32 u32Size );
【参数】

参数名称描述输入/输出
u32PhyAddr需映射的内存单元起始地址输入
u32Size映射的字节数输入

【返回值】

返回值描述
0无效地址
非0有效地址

【需求】
同上
【注意】
· 等同于LINUX系统mmap函数
· 输入的地址需为合法的物理地址
【举例】

【相关主题】
HI_MPP_SYS_Munmap

HI_MPI_SYS_MmapCache
【描述】
存储映射接口,映射成cache属性。
【语法】
HI_VOID * HI_MPI_SYS_MmapCache( HI_U32 u32PhyAddr , HI_U32 u32Size );
【参数】

参数名称描述输入/输出
u32PhyAddr需映射的内存单元起始地址输入
u32Size映射的字节数输入

【返回值】

返回值描述
0无效地址
非0有效地址

【需求】
同上
【注意】
· 等同于LINUX系统mmap函数
· 输入的地址需为合法的物理地址
【举例】

【相关主题】
HI_MPI_SYS_Munmap

HI_MPI_SYS_Munmap
【描述】
存储反映射接口
【语法】
HI_S32 HI_MPI_SYS_Munmap ( HI_VOID * pVirAddr , HI_U32 u32Size );
【参数】

参数名称描述输入/输出
pVirAddrmmap后返回的地址输入
u32Size映射区的字节长度输入

【返回值】

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

【需求】
同上
【注意】
等同于LINUX系统munmap函数
【举例】

【相关主题】
HI_MPI_SYS_Mmap

HI_MPI_SYS_MflushCache
【描述】
刷新cache里的内容到内存并且是cache里的内容无效
【语法】
HI_S32 HI_MPI_SYS_MflushCache (HI_U32 u32PhyAddr , HI_VOID *pVirAddr , HI_U32 u32Size );
【参数】

参数名称描述输入/输出
u32PhyAddr待操作数据的起始物理地址。
需要4字节对齐 。
输入
pVirtAddr待操作数据的起始虚拟地址指针。
必须为用户态地址,且不能为空。
虚拟地址必须为物理地址映射的地址。
输入
u32Size待操作数据的大小。
不能为0。
输入

【返回值】

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

【需求】
同上
【注意】
· 当cache里的数据为最新数据时,为了保证不能直接访问cache的硬件(如ive)在访问内存时能够得到正确的数据,此时需要先调用此接口将cache里的内容更新到内存,这样,当硬件访问内存时,保证了数据的一致性和正确性。
· 此接口应与HI_MPI_SYS_MmapCache接口配套使用。
· 用户需要确保传入参数的合法性。
【相关主题】
HI_MPI_SYS_MmapCache

HI_MPI_SYS_SetReg
【描述】
设置寄存器的值
【语法】
HI_S32 HI_MPI_SYS_SetReg( HI_U32 u32Addr , HI_U32 u32Value );
【参数】

参数名称描述输入/输出
u32Addr写入的地址输入
u32Value写入的值输入

【返回值】

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

【需求】
同上
【注意】
输入的地址必须为有效的物理地址。
【举例】

【相关主题】
HI_MPI_SYS_GetReg

HI_MPI_SYS_GetReg
【描述】
获取寄存器的值
【语法】
HI_S32 HI_MPI_SYS_GetReg( HI_U32 u32Addr , HI_U32 *pu32Value );
【参数】

参数名称描述输入/输出
u32Addr物理地址输入
pu32Value此内存地址中的值输出

【返回值】

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

【需求】
同上
【注意】
输入的地址必须为有效的物理地址
【举例】

【相关主题】
HI_MPI_SYS_SetReg

HI_MPI_SYS_MmzAlloc
【描述】
在用户态申请MMZ内存
【语法】
HI_S32 HI_MPI_SYS_MmzAlloc ( HI_U32 *pu32PhyAddr , HI_VOID **ppVirtAddr , const HI_CHAR *pstrMmb , const HI_CHAR *pstrZone , HI_U32 u32Len );
【参数】

参数名称描述输入/输出
pu32PhyAddr物理地址指针输出
ppVirtAddr指向虚拟地址指针的指针输出
pstrMmbMmb名称的字符串指针输入
pstrZoneMMZ zone名称的字符串指针输入
u32Len内存块大小输入

【返回值】

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

【需求】
同上
【注意】
MMZ分为许多区域(Zone),每个区域下有多个Mmb,调用此接口在MMZ的名为pstrZone的区域中分配一个名为pstrMmb的内存块,大小为u32Len,并返回物理地址和用户态虚拟地址指针。如果MMZ中有名为anonymous的区域,pstrZone可设为NULL。如果pstrMmb设为NULL,创建的Mmb分块为”’<null>“。
【举例】

【相关主题】

HI_MPI_SYS_MmzAlloc_Cached
【描述】
在用户态申请MMZ内存,该内存支持cache缓存。
【语法】
HI_S32 HI_MPI_SYS_MmzAlloc_Cached ( HI_U32 *pu32PhyAddr , HI_VOID **ppvirtAddr , const HI_CHAR *pstrMmb , const HI_CHAR *pstrZone , HI_U32 u32Len );
【参数】

参数名称描述输入/输出
pu32PhyAddr物理地址指针。输出
ppVirtAddr指向虚拟地址指针的指针。输出
pstrMmbMmb名称的字符串指针输入
pstrZoneMMZ zone 名称的字符串指针。输入
u32Len内存块大小输入

【返回值】

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

【需求】
同上
【注意】
· 本接口与HI_MPI_SYS_MmzAlloc接口的区别:通过本接口分配的内存支持cache缓存,对于频繁使用的内存,最好使用本接口分配内存,这样可以提高cpu读写的效率,提升系统性能,如用户在使用ive算子时,就存在大量数据频繁读写,此时使用此接口来分配内存,就能很好的提高cpu 的效率。
· 当cpu访问此接口分配的内存时,会将内存中的数据放在cache中,而硬件设备(如ive)只能访问物理内存,不能访问cache 的内容,对于这种cpu和硬件会共同操作的内存,需调用HI_MPI_SYS_MmzFlushCache做好数据同步。
【举例】

【相关主题】
· HI_MPI_SYS_MmzAlloc
· HI_MPI_SYS_MmzFlushCache

HI_MPI_SYS_MmzFlushCache
【描述】
刷新cache里的内容到内存并且使cache里的内容无效
【语法】
HI_S32 HI_MPI_SYS_MmzFlushCache ( HI_U32 u32PhyAddr , HI_VOID *pVirtAddr , HI_U32 u32Size );
【参数】

参数名称描述输入/输出
u32PhyAddr待操作数据的起始物理地址输入
pVirtAddr待操作数据的起始虚拟地址指针 输入
u32Size待操作数据的大小输入

【返回值】
同上
【需求】
同上
【注意】
· 当cache里的数据为最新数据时,为了保证不能直接访问的硬件(如ive)在访问内存时能够得到正确的数据,此时需要先调用此接口将cache里的内容更新到内存,这样,当硬件访问内存时,保证了数据的一致性和正确性。
· 此接口应与HI_MPI_SYS_MmzAlloc_Cached接口配套使用。
· 若将u32PhyAddr设为0,则表示操作整个cache区域。
· 用户需要确保传入参数的合法性。
【举例】

【相关主题】
HI_MPI_SYS_MmzAlloc_Cached

HI_MPI_SYS_MmzFree
【描述】
在用户态释放MMZ内存
【语法】
HI_S32 HI_MPI_SYS_MmzFree(HI_U32 u32PhyAddr , HI_VOID *pVirtAddr);
【参数】

参数名称描述输入/输出
u32PhyAddr物理地址输入
pVirtAddr虚拟地址指针输入

【返回值】
同上
【需求】
同上
【注意】
输入的地址必须为有效的物理地址,虚拟地址指针可以置为NULL。
【举例】

【相关主题】
HI_MPI_SYS_MmzAlloc

HI_MPI_SYS_SetMemConf
【描述】
配置内存参数,设置模块设备通道使用内存的DDR名
【语法】
HI_S32 HI_MPI_SYS_SetMemConf ( MPP_CHN_S *pstMppChn , const HI_CHAR *pcMmzName);
【参数】

参数名称描述输入/输出
pstMppChn模块设备通道信息输入
pcMmzName内存所在DDR的名字输入

【返回值】
同上
【需求】
同上
【注意】
· 输入的DDR名字必须是已经存在的DDR名。例如
有两块DDR,其中一块没有命名(无无名NULL),另一块为DDR1,则输入pcMmzName必须为NULL或 ”DDR1“,该函数常用于均分内存。
· 对VO模块做均分内存策略时
用户需保证同一设备号下的通道内存在同一个DDR上。如果不一致,SDK默认从该设备的通道0设置的DDR分配内存。
【举例】

HI_S32 i,s32Ret;
HI_CHAR *pcMmzName;
MPP_CHN_S stMppChnVI;

/* 为16D1均分内存 */
for(i=0;i<16;i++)
{
    stMppChnVI.enModId = HI_ID_VIU;
    stMppChnVI.s32DevId = 0;
    stMppChnVI.s32ChnId = i;
   
    if(0 == (i%2))
    {
       pcMmzName = NULL;
    }
    else
    {
       pcMmzName = "ddr1";
    }
    
    s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnVI,pcMmzName);
    if(HI_SUCCESS != s32ret)
    {
      printf(“SetMemConf ERR !\n”);
      return s32ret;
    }
}

【相关主题】
HI_MPI_SYS_GetMemConf

HI_MPI_SYS_GetMemConf
【描述】
获取模块设备通道使用内存的DDR名
【语法】
HI_S32 HI_MPI_SYS_GetMemConf ( MPP_CHN_S *pstMppChn , HI_CHAR *pcMmzName );
【参数】

参数名称描述输入/输出
pstMppChn模块设备通道信息输入
pcMmzName内存所在DDR的名字输出

【返回值】
同上

【需求】
同上
【注意】

【相关主题】
HI_MPI_SYS_SetMemConf

HI_MPI_SYS_CloseFd
【描述】
关闭所有SYS打开的日志、系统、内存Fd
【语法】
HI_S32 HI_MPI_SYS_CloseFd( HI_VOID );
【参数】

【返回值】
同上
【需求】
同上
【注意】
该接口必须在所有模块都禁用后使用
【举例】

【相关主题】

HI_MPI_VB_SetConf
【描述】
设置MPP视频缓存池属性。
【语法】
HI_S32 HI_MPI_VB_SetConf (const VB_CONF_S *pstVbConf);
【参数】

参数名称描述输入/输出
pstVbConf视频缓存池属性指针。
静态属性
输入

【返回值】
同上
【需求】
·  头文件:hi_comm_vb.h、mpi_vb.h
·  库文件:libmpi.a
【注意】
·  只能在系统处于未初始化的状态下,才可以设置缓存池属性,否则会返回失败。
·  video buf根据不同的应用场景需要不同的配置。配置规则参见”2.2.1视频缓存池“
【举例】

HI_S32 s32ret;
VB_CONF_S stVbConf;

memset(&stVbConf,0,sizeof(VB_CONF_S));
stVbConf.u32MaxPoolCnt = 128;
stVbConf.astCommPool[0].u32BlkSize = 768*576*2;
stVbConf.astCommPool[0].u32BlkCnt = 20;
stVbConf.astCommPool[1].u32BlkSize = 384*288*2;
stVbConf.astCommPool[1].u32BlkCnt = 40;

s32ret = HI_MPI_VB_SetConf(&stVbConf);
if(HI_SUCCESS != s32ret)
{
   printf("set vb err:0x%x\n",s32ret);
   return s32ret;
}

s32ret = HI_MPI_VB_Init();
if(HI_SUCCESS != s32ret)
{
   printf("init vb err:0x%x\n", s32ret);
   return s32ret;
}

/*... ... */

(void) HI_MPI_VB_Exit();

【相关主题】
HI_MPI_VB_GetConf

HI_MPI_VB_GetConf
【描述】
获取MPP视频缓存池属性
【语法】
HI_S32 HI_MPI_VB_GetConf (VB_CONF_S *pstVbConf)
【参数】

参数名称描述输入/输出
pstVbConf视频缓存池属性指针。
静态属性
输出

【返回值】
同上
【需求】
·  头文件:hi_comm_vb.h、mpi_vb.h
·  库文件:libmpi.a
【注意】
必须先调用HI_MPI_VB_SetConf设置MPP视频缓存池属性,再获取属性。
【举例】

【相关主题】
HI_MPI_VB_SetConf

HI_MPI_VB_Init
【描述】
初始化MPP视频缓存池
【语法】
HI_S32 HI_MPI_VB_Init (HI_VOID)
【参数】

【返回值】
同上
【需求】
·  头文件:hi_comm_vb.h、mpi_vb.h
·  库文件:libmpi.a
【注意】
·  必须先调用HI_MPI_VB_SetConf配置缓存池属性,再初始化缓存池,否则会失败。
·  可反复初始化,不返回失败。
【举例】
请参见HI_MPI_VB_SetConf的举例。
【相关主题】
HI_MPI_VB_Exit

HI_MPI_VB_Exit
【描述】
去初始化MPP视频缓存池
【语法】
HI_S32 HI_MPI_VB_Exit(HI_VOID);
【参数】

【返回值】
同上
【需求】
·  头文件:hi_comm_vb.h、mpi_vb.h
·  库文件:libmpi.a
【注意】
·  必须先调用HI_MPI_SYS_Exit去初始化MPP系统,再去初始化缓存池,否则返回失败。
·  可以反复去初始化,不返回失败。
·  去初始化不会清除先前对缓存池的配置。
【举例】
请参见HI_MPI_VB_SetConf的举例
【相关主题】
HI_MPI_VB_Init

HI_MPI_VB_CreatePool
【描述】
创建一个视频缓存池
【语法】
VB_POOL HI_MPI_VB_CreatePool(HI_U32 u32BlkSize , HI_U32 u32BlkCnt , const HI_CHAR *pcMmzName);

【参数】

参数名称描述输入/输出
u32BlkSize缓存池中每个缓存块的大小
取值范围:(0,2^32),以byte为单位
输入
u32BlkCnt缓存池中缓存块的个数
取值范围:(0,2^32)
输入
pcMmzName缓存池所在DDR的名字输入

【返回值】

返回值描述
非VB_INVALID_POOLID有效的缓存池ID号
VB_INVALID_POOLID创建缓存池失败,可能是参数非法或者保存内存不够。

【需求】
·  头文件:hi_comm_vb.h、mpi_vb.h
·  库文件:libmpi.a
【注意】
·  该缓存池是从空闲MMZ内存中分配,一个缓存池包含若干个大小相同的缓存块。如果该缓存池的大小超过了保留内存中的空闲空间,则创建缓存池会失败。
·  用户需保证输入的DDR名字已经存在,如果输入不存在的DDR的名字,会造成分不到内存。

【举例】

VB_POOL VbPool;
VB_BLK VbBlk;
HI_U32 u32BlkSize = 768*576*2;
HI_U32 u32BlkCnt = 15;
HI_U32 u32Addr;

/*create a video buffer pool */
VbPool = HI_MPI_VB_CreatePool(u32BlkSize,u32BlkCnt,"ddr1");
if( VB_INVALID_POOLID == VbPool )
{
   printf("create vb err\n");
   return HI_FALLURE;
}

/* get a buffer block from pool */
VnBlk = HI_MPI_VB_GetBlock(VbPool,u32BlkSize,"ddr1");
if(VB_INVALID_HANDLE == VbBlk)
{
   printf("get vb block err\n");
   (void)HI_MPI_VB_DestroyPool(VbPool);
   return HI_FALLURE;
}

/* use this address do something ...*/

/* then release the buffer block */
(void) HI_MPI_VB_ReleaseBlock(VbBlk);

/* destory video buffer pool */
(void)HI_MPI_VB_DestoryPool(VbPool);

【相关主题】
HI_MPI_VB_DestoryPool

HI_MPI_VB_DestoryPool
【描述】
销毁一个视频缓存池
【语法】
HI_S32 HI_MPI_VB_DestoryPool( VB_POOL Pool );
【参数】

参数名称描述输入/输出
Pool缓存池ID号。
取值范围:[0,VB_MAX_POOLS]。
输入

【返回值】
同上
【需求】
·  头文件:hi_comm_vb.h、mpi_vb.h
·  头文件:libmpi.a
【注意】
·  销毁一个不存在的缓存池,则返回HI_ERR_VB_UNEXIST。
·  在去初始化MPP缓存池时,所有的缓存池都将被销毁,包括用户态的缓存池。
【举例】
请参见HI_MPI_VB_CreatePool的举例。
【相关主题】
HI_MPI_VB_CreatePool

HI_MPI_VB_GetBlock
【描述】
用户态获取一个缓存块
【语法】
VB_BLK HI_MPI_VB_GetBlock( VB_POOL Pool , HI_U32 u32BlkSize , const HI_CHAR *pcMmzName );
【参数】

参数名称描述输入/输出
Pool缓存池ID号。
取值范围:[0,VB_MAX_POOLS]。
输入
u32BlkSize缓存块大小
取值范围:(0,2^32),以byte为单位
输入
pcMmzName缓存池所在DDR的名字。输入

【返回值】

返回值描述
非VB_INVALID_HANDLE有效的缓存块句柄。
VB_INVALID_HANDLE获取缓存块失败。

【错误码】

【需求】
·  头文件:hi_comm_vb.h、mpi_vb.h
·  库文件:libmpi.a
【注意】
·  用户可以在创建一个缓存池之后,调用本接口从该缓存池中获取一个缓存块;即将第一个参数Pool设置为创建的缓存池ID(第二个参数u32BlkSize不用设置);获取的缓存块的大小即为用户创建缓存时指定的缓存块大小。从指定缓存池获取缓存块时,参数pcMmzName无效。
·  如果用户需要从任意一个公共缓存池中获取一块指定大小的缓存块,则可以将第一个参数Pool设置为无效ID号(VB_INVALID_POOLID),将第二个参数u32BlkSize设置为需要的缓存块大小,并指定要从哪个DDR上的公共缓存池获取缓存块。如果指定的DDR上并没有公共缓存池,那么将获取不到缓存块。
·  公共缓存池主要用来存放VIU的捕获图像,因此,对公共缓存池的不当操作(如占用过多的缓存块)会影响MPP系统的正常运行。
【举例】
请参见HI_MPI_VB_CreatePool的举例。
【相关主题】
HI_MPI_VB_ReleaseBlock

HI_MPI_VB_ReleaseBlock
【描述】
用户态释放一个已经获取的缓存块。

【语法】
HI_S32 HI_MPI_VB_ReleaseBlock( VB_BLK Block );
【参数】

参数名称描述输入/输出
Block缓存块句柄。输入

【返回值】
同上
【需求】
同上
【注意】
获取的缓存块使用完后,应该调用此接口释放缓存块。
【举例】
请参见HI_MPI_VB_CreatePool的举例
【相关主题】
HI_MPI_VB_GetBlock

HI_MPI_VB_Handle2PhysAddr
【描述】
用户态获取一个缓存块的物理地址
【语法】
HI_U32 HI_MPI_VB_Handle2PhysAddr(VB_BLK Block);
【参数】

参数名称描述输入/输出
Block缓存块句柄输入

【返回值】

返回值描述
0无效返回值,缓存块句柄非法。
非0有效物理地址。

【错误码】

【需求】
同上
【注意】
指定的缓存块应该是从MPP视频
缓存池中获取的有效缓存块。
【举例】
参见HI_MPI_VB_CreatePool的举例
【相关主题】

HI_MPI_VB_Handle2PoolId
【描述】
用户态获取一个帧缓存块所在缓存池的ID。
【语法】
VB_POOL HI_MPI_VB_Handle2PoolId( VB_BLK Block );
【参数】

参数名称描述输入/输出
Block缓存块句柄。输入

【返回值】

返回值描述
非负数有效的缓存池ID号
负数无效的缓存池ID号

【错误码】

【需求】
·  头文件:hi_comm_vb.h、mpi_vb.h
·  库文件:libmpi.a
【注意】
指定的缓存块应该是从MPP视频缓存池中获取的有效缓存块。
【举例】

VB_POOL VbPool;
VB_BLK VbBlk; /* get vb blk id from somewhere */

/* get pool id */
VbPool = HI_MPI_VB_Handle2PoolId(VbBlk);
if( VB_INVALID_POOLID != VbPool )
{
   printf("pool id is %d\n",VbPool);
   /* use pool id do something ...*/
}

【相关主题】

HI_MPI_VB_MmapPool
【描述】
为一个视频缓存池映射用户态虚拟地址。
【语法】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值