参考自:《HiMPPV3.0媒体处理软件开发参考.pdf》
本文主要讲述HIMPP平台处理流程,以快速入门海思HI35xx平台音视频编解码编程。
该平台支持应用软件快速开发以下功能:输入视频捕获、H.264/MJPEG/JPEG/MPEG4编码、H.264/MJPEG/JPEG/MPEG4解码、视频输出显示、视频图像前处理(包括去燥、增强、锐化、Deinterlace)、编码码流叠加OSD、视频侦测分析、智能分析、音频捕获及输出、音频编解码等功能。
HIMPP平台主要是衔接了操作系统层与应用层,典型软件架构体系示意图如下:
1、硬件层硬件层由Hi35xx芯片加上必要的外围器件构成。外围器件包括Flash、DDR(DoubleData-Rate)、视频Sensor或AD、音频AD等。
2、操作系统层基于Linux的操作系统。
3、媒体处理平台层基于操作系统层,控制芯片完成相应的媒体处理功能。它对应用层屏蔽了硬件处理细节,并为应用层提供API接口完成相应功能。
4、其他驱动层除了媒体处理平台外,海思为HI35xx芯片的其他硬件处理单元提供了相应的驱动,包括GMAC、SDIO、I2C、USB、SSP等驱动。
5、应用层基于海思媒体处理平台及其他驱动,由用户开发的应用软件系统。
小结:从这个HIMPP平台典型架构中可以看出,在海思HI35xx平台音视频编解码编程我们只需要关心应用层逻辑和媒体软件处理平台就好了。
海思媒体处理平台主要流程分为视频处理及音频处理两条路线。
对于各个模块的解读:
了解上图有什么意义呢:
假设:有一个MPEG解码要实现播放MPEG样例视频的示例,可以走MPEG文件->HARDDISK->VDEC->VPSS->VO->显示器这个流程;不管怎样,流程一定要熟悉牢记,代码实现都是围绕这条主线来编写的。
视频处理路线起点包括AD和HARDDISK两种。
AD即前端对COMS或CDD传感器进行AD采集得到最原始的图像数据,至于如何采集并编码为H264或H265数据,HIMPP已经帮我们做好了,直接调用API就好,接着将H264或H265数据推至VI,这个模型适合实时预览应用场景开发;
音频的处理流程就比较简单,录音路线则由麦等模拟设备输入到AI,接着推送到AENC进行音频编码,如常用的G711、G726、ADPCM等格式。播放路线则反过来,由录音文件提供声音源,经过ADEC进行解码后形成音频流数据,再推送至AO进行播放。
音频的操作相对就简单很多,我们一般只关心音频采样频率的控制和音量调节等API,比如配置AI进行8K/16K/24K/32K/48K频率8位采样等。
小结,海思HI35xx平台音视频编解码编程一定要熟悉HIMPP各个模块的功用,并十分熟悉音视频处理流程,程序中也是需要严格按照此流程进行设计的。
系统控制根据Hi35xx芯片特性,完成硬件各个部件的复位、基本初始化工作,同时负责完成MPP(MediaProcessPlatform媒体处理平台)系统各个业务模块的初始化、去初始化以及管理MPP系统各个业务模块的工作状态、提供当前MPP系统的版本信息、提供大块物理内存管理等功能。应用程序启动MPP业务前,必须完成MPP系统初始化工作。同理,应用程序退出MPP业务后,也要完成MPP系统去初始化工作,释放资源。
由于MPP系统的正常运行依赖于缓存池,所以有关这个内容也需要掌握。
视频缓存池主要向媒体业务提供大块物理内存管理功能,负责内存的分配和回收,充分发挥内存缓存池的作用,让物理内存资源在各个媒体处理模块中合理使用。一组大小相同、物理地址连续的缓存块组成一个视频缓存池。
视频输入通道需要使用公共视频缓存池。所有的视频输入通道都可以从公共视频缓存池中获取视频缓存块用于保存采集的图像(如图中所示从公共视频缓存池B中获取视频缓存块Bm)。由于视频输入通道不提供创建和销毁公共视频缓存池功能,因此,在系统初始化之前,必须为视频输入通道配置公共视频缓存池。
根据业务的不同,公共缓存池的数量、缓存块的大小和数量不同。图中所示缓存块的生存期是指经过VPSS通道传给后续模块的情形(图实线路径)。如果该缓存块完全没有经过VPSS通道传给其他模块,则将在VPSS模块处理后被放回公共缓存池(图虚线路径)。
MPP提供系统绑定接口(HI_MPI_SYS_Bind),即:通过数据接收者绑定数据源来建立两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源生成的数据将自动发送给接收者。
目前MPP支持的绑定关系如表所示。
离/在线模式是针对VI/VPSS协作模式来说的。
VI和VPSS的协作模式分为离线模式与在线模式:
上述2种模式切换由load脚本参数控制,在API只能获取。对应sys模块参数vi_vpss_online。
需要注意的是:在线模式时,因为VI不写出数据到DDR,无法进行CoverEx、OverlayEx、Rotate、LDC等操作,需要在VPSS各通道写出后再进行Rotate/LDC等处理,而且有些功能只在离线下能支持,比如DIS。
视频输入(VI)模块实现的功能:将芯片外的视频数据通过ITU-RBT656/601/1120接口或DigitalCamera接口接收,存入到指定的内存区域。在此过程中,VI可以对接收到的原始视频图像数据进行裁剪(Crop)、水平垂直缩小(DownScaling)和水平垂直翻转(Mirror、Flip)等处理,并实现一路或多路原始视频图像输入,输出一路或多路视频图像功能。
重要概念:
VOU(VideoOutputUnit)模块主动从内存相应位置读取视频和图形数据,并通过相应的显示设备输出。重要概念:
VPSS(VideoProcessSub-System)支持对一幅输入图像进行统一预处理,如去噪、去隔行等,然后再对各通道分别进行缩放、锐化等处理,最后输出多种不同分辨率的图像。VPSS单元支持的具体图像处理功能包括FRC(FrameRateControl)、Crop、PreScale、NR(NoiseReduce)、DEI(De-interlace)、ES(EdgeSmooth)、IE(ImageEnhance)、DCI(DynamicContrastImprovement)、Cover/Overlay/Mosaic、Scale、LTI(LumaTransitionImprovement)/CTI(ChromaTransitionImprovement)、AspectRatio、Border等。