背景
参考自:《HiMPP V3.0 媒体处理软件开发参考.pdf》
由于在音视频处理领域,海思芯片占有全球市场的很大份额。当我们选择使用海思芯片开发时,程序开发模型主要是围绕HIMPP(Hisi Media Process Platform)提供的API进行。这里围绕主角HIMPP详细介绍与它相关的专业词汇与背景知识,对HIMPP有充分了解之后,我们就可以利用它实现音视频编解码等业务逻辑。
本文主要讲述HIMPP平台处理流程,以快速入门海思HI35xx平台音视频编解码编程。
HIMPP平台架构简介
海思提供的媒体处理软件平台(Hisi Media Process Platform,简称HIMPP),可支持软件快速开发。该平台对应用软件屏蔽了芯片相关复杂的底层原理,并对应用软件直接提供MPI(MPPProgram Interface)接口完成相应功能。
该平台支持应用软件快速开发以下功能:输入视频捕获、H.264/MJPEG/JPEG/MPEG4编码、H.264/MJPEG/JPEG/MPEG4解码、视频输出显示、视频图像前处理(包括去燥、增强、锐化、Deinterlace)、编码码流叠加OSD、视频侦测分析、智能分析、音频捕获及输出、音频编解码等功能。
HIMPP平台典型架构 分层
HIMPP平台主要是衔接了操作系统层与应用层,典型软件架构体系示意图如下:
应用层 | |
媒体软件处理平 | 其他驱动 |
操作系统层 | |
硬件层 |
1、硬件层
硬件层由Hi35xx芯片加上必要的外围器件构成。外围器件包括Flash、DDR(Double Data-Rate)、视频Sensor或AD、音频AD等。
2、操作系统层
基于Linux的操作系统。
系统版本号 | 芯片 |
Linux 3.10.y | Hi3536/Hi3521A/Hi3520DV300/Hi3531A |
Linux 3.18.y | Hi3536CV100/Hi3531DV100/Hi3521DV100 |
Linux 4.9.y | Hi3536DV100 |
3、媒体处理平台层
基于操作系统层,控制芯片完成相应的媒体处理功能。它对应用层屏蔽了硬件处理细节,并为应用层提供API接口完成相应功能。
4、其他驱动层
除了媒体处理平台外,海思为HI35xx芯片的其他硬件处理单元提供了相应的驱动,包括GMAC、SDIO、I2C、USB、SSP等驱动。
5、应用层
基于海思媒体处理平台及其他驱动,由用户开发的应用软件系统。
小结:从这个HIMPP平台典型架构中可以看出,在海思HI35xx平台音视频编解码编程我们只需要关心应用层逻辑和媒体软件处理平台就好了。
HIMPP平台业务逻辑处理流程
海思媒体处理平台主要流程分为视频处理及音频处理两条路线。
这里还有必要了解一下与HIMPP内容相关的专业名词,主要部分分为:
- 视频输入(VI)、视频处理子系统(VPSS)、视频编码(VENC)、视频解码(VDEC)、视频输出(VO)、视频侦测分析(VDA)等模块
- 音视频输入(AI)、音视频输出(AO)、音频编码(AENC)、音视频解码(ADEC)等模块
- 区域管理(REGION)模块
对于各个模块的解读:
- VI 模块捕获视频图像,可对其做剪切、缩放、镜像等处理,并输出多路不同分辨率的图像数据。
- VDEC 解码模块对编码后的视频码流进行解码,并将解析后的图像数据送 VPSS 进行图像处理或直接送 VO 显示。可对 H.264/H.265/VC1/MPEG4/MPEG2/AVS 格式的视 频码流进行解码。
- VPSS 模块接收 VI 和解码模块发送过来的图像,可对图像进行去噪、图像增强、锐化等处理,并实现同源输出多路不同分辨率的图像数据用于编码、预览或抓拍。
- VENC 编码模块接收 VI 捕获并经 VPSS 处理后输出的图像数据,可叠加用户通过 Region 模块设置的 OSD 图像,然后按不同协议进行编码并输出相应码流。
- VDA 模块接收 VI 的输出图像,并进行移动侦测和遮挡侦测,最后输出侦测分析结果。
- VO 模块接收 VPSS 处理后的输出图像,可进行播放控制等处理,最后按用户配置 的输出协议输出给外围视频设备。
- AI 模块捕获音频数据,然后 AENC 模块支持按多种音频协议对其进行编码,最后 输出音频码流。
- 用户从网络或外围存储设备获取的音频码流可直接送给 ADEC 模块,ADEC 支持 解码多种不同的音频格式码流,解码后数据送给 AO 模块即可播放声音。
了解上图有什么意义呢:
假设:有一个MPEG解码要实现播放MPEG样例视频的示例,可以走
MPEG文件->HARD DISK->VDEC->VPSS->VO->显示器
这个流程;不管怎样,流程一定要熟悉牢记,代码实现都是围绕这条主线来编写的。
视频处理路线
视频处理路线起点包括AD和HARD DISK两种。
AD即前端对COMS或CDD传感器进行AD采集得到最原始的图像数据,至于如何采集并编码为H264或H265数据,HIMPP已经帮我们做好了,直接调用API就好,接着将H264或H265数据推至VI,这个模型适合实时预览应用场景开发;
而 HARD DISK 则源于我们已经保存在硬盘的录好视频文件,我们需要的操作是读取文件然后将数据推至 VDEC 进行解码,这个模型则适合监控回放场景开发。VPSS作为编解码的中转站,可以实现对图像数据进行处理,其中最重要的就是不同分辨率的裁剪以及抓拍,调用VPSS相关的API可以实现对图像视频进行操控,经过VPSS可以输出到REGION、VDA、VO处理,这里重点讲述VO,VO作为联系视频流与显示的纽带,它接收VPSS的数据然后推送至HDMI或VGA进行显示。VO是多图层设备,基于此可以时间用户GUI操作与视频层分离,也可以实现画中画等功能,VO的配置还包括图像输出刷新频率、图像颜色效果等。
音频处理
音频的处理流程就比较简单,录音路线则由麦等模拟设备输入到AI,接着推送到AENC进行音频编码,如常用的G711、G726、ADPCM等格式。播放路线则反过来,由录音文件提供声音源,经过ADEC进行解码后形成音频流数据,再推送至AO进行播放。
音频的操作相对就简单很多,我们一般只关心音频采样频率的控制和音量调节等API,比如配置AI进行8K/16K/24K/32K/48K频率8位采样等。
小结,海思HI35xx平台音视频编解码编程一定要熟悉HIMPP各个模块的功用,并十分熟悉音视频处理流程,程序中也是需要严格按照此流程进行设计的。
系统控制
系统控制根据 Hi35xx 芯片特性,完成硬件各个部件的复位、基本初始化工作,同时负责完成 MPP(Media Process Platform 媒体处理平台)系统各个业务模块的初始化、去初始化以及管理 MPP 系统各个业务模块的工作状态、提供当前 MPP 系统的版本信息、提供大块物理内存管理等功能。
应用程序启动 MPP 业务前,必须完成 MPP 系统初始化工作。同理,应用程序退出 MPP 业务后,也要完成 MPP 系统去初始化工作,释放资源。
视频缓存池
由于 MPP 系统的正常运行依赖于缓存池,所以有关这个内容也需要掌握。
视频缓存池主要向媒体业务提供大块物理内存管理功能,负责内存的分配和回收,充分发挥内存缓存池的作用,让物理内存资源在各个媒体处理模块中合理使用。
一组大小相同、物理地址连续的缓存块组成一个视频缓存池。
视频输入通道需要使用公共视频缓存池。所有的视频输入通道都可以从公共视频缓存池中获取视频缓存块用于保存采集的图像(如图中所示从公共视频缓存池 B 中获取视频缓存块 Bm)。由于视频输入通道不提供创建和销毁公共视频缓存池功能,因此,在系统初始化之前,必须为视频输入通道配置公共视频缓存池。
根据业务的不同,公共缓存池的数量、缓存块的大小和数量不同。 图中所示缓存块的生存期是指经过 VPSS 通道传给后续模块的情形(图 实线路径)。如果该缓存块完全没有经过 VPSS 通道传给其他模块,则将在 VPSS 模块处理后被放回公共缓存池(图 虚线路径)。
系统绑定
MPP 提供系统绑定接口(HI_MPI_SYS_Bind),即:通过数据接收者绑定数据源来建立两者之间的关联关系(只允许数据接收者绑定数据源)。
绑定后,数据源生成的数据将自动发送给接收者。
目前 MPP 支持的绑定关系如表所示。
数据源 | 数据接收者 |
VI | VO 、VENC、VDA 、VPSS、PCIV |
VPSS | VO、VENC、VDA 、VPSS 、PCIV |
VDEC | VPSS 、VO(只能是标清设备或 single 模式分割) 、VDA 、PCIV |
VO(WBC) | VO 、VENC 、VPSS 、PCIV |
AI | AENC 、AO |
ADEC | AO |
VI/VPSS 离/在线模式
离/在线模式是针对 VI/VPSS 协作模式 来说的。
VI 和 VPSS 的协作模式分为 离线模式 与 在线模式:
上述2种模式切换由 load 脚本参数控制,在API 只能 获取。对应 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。
视频输入
视频输入(VI)模块实现的功能:将芯片外的视频数据通过 ITU-R BT656/601/1120 接口或 Digital Camera 接口接收,存入到指定的内存区域。在此过程中,VI 可以对接收 到的原始视频图像数据进行裁剪(Crop)、水平垂直缩小(Down Scaling)和水平垂直翻转(Mirror、Flip)等处理,并实现一路或多路原始视频图像输入,输出一路或多路 视频图像功能。
重要概念 :
- 视频输入设备:支持标准 BT.656、标准 BT.1120、自定义时序等若干种时序输入, 负责对时序进行解析。
- 视频物理通道 :负责将输入设备解析后得到的视频数据输出到 DDR。在真正将数据 输出到 DDR 之前,它可以实现裁剪、遮挡、水平垂直缩小和水平垂直翻转等功 能,具体功能见各芯片的详细描述。
- 掩码用于指示 VI 设备的视频数据来源。
- 级联:指芯片的视频输出端通过 BT1120 时序将视频数据传送到另一颗芯片的视频输 入端。
视频输出
VOU(Video Output Unit)模块主动从内存相应位置读取视频和图形数据,并通过相应的显示设备输出。
重要概念 :
- 高清和标清显示设备 :SDK 将高清和标清显示设备分别标示为 DHDx 和 DSDx。其中,x 为索引号,从 0 开始取值,表示第几路高清/标清显示设备,例如第 0 路高清设备标示为 DHD0, 第 0 路标清显示设备标示为 DSD0。所有高清和标清显示设备又可分别简称为 HD 和 SD 设备。高清设备上可能会同时绑定两个视频层。
- 视频层: 对于固定在每个设备上面对应的视频层,SDK 也对应采取 VHDx 和 VSDx 来标 示,对于可以动态绑定视频层,用 PIP 来表示。
- 通道: SDK 将通道归属于视频层管理。对于一个视频层,它上面的通道都是独立的。同时,不同的视频层上的通道也是独立的。对于通道的排号上面不存在跨层的连 续。例如,处理电子放大的场景时,视频层 VHD0 上面的通道 0 作为电子放大的 显示的画面,视频层 PIP 上面的通道 0 作为全场景显示的画面。这两个通道没有 关联。对于系统绑定,应该用视频层和通道号来进行绑定配置;同时,对于回写的图像 作为绑定源时,需要将回写内容所在的设备号和 0 通道号作为绑定源设置。
视频处理子系统
VPSS(Video Process Sub-System)支持对一幅输入图像进行统一预处理,如去噪、去隔行等,然后再对各通道分别进行缩放、锐化等处理,最后输出多种不同分辨率的图像。
VPSS 单元支持的具体图像处理功能包括 FRC(Frame Rate Control)、Crop、PreScale、 NR(Noise Reduce) 、DEI(De-interlace)、ES(Edge Smooth)、IE(Image Enhance) 、 DCI(Dynamic Contrast Improvement)、Cover/Overlay/Mosaic、Scale、LTI(Luma Transition Improvement)/CTI(Chroma Transition Improvement)、Aspect Ratio、Border 等。
如果说我的文章对你有用,只不过是我站在巨人的肩膀上再继续努力罢了。
若在页首无特别声明,本篇文章由 Schips 经过整理后发布。