1、官方mmpsample程序总体分析
首先先将sample程序导入到source insight中,这样方便我们学习代码,导入的时候记得将include文件也导入进去。
sample里面不止一个程序。例如hifb文件夹,里面是和framebuff有关的,hi3519v101在做摄像头的时候,也可以使用这个程序,用于拍照时候实时显示用的。
common文件夹是其他代码共同需要的代码。 这个文件夹是个库,每个例程都要调用。
我们主要研究venc文件夹里面的,这个文件夹里面的程序用于编码的,然后调用很多海思封装好的库函数。
整个venc程序的基本框架是:venc中的main函数调用venc内部功能函数,内部功能函数再调用mpp中的API,这里面的API则被海思封装在ko里面,以驱动方式来实现的,但是这些源码我们看不到,所以就得看海思提供的文档。
在下载的海思sdk包里面的Hi3519V101R001C02SPC030 \01.software\board\ HiMPP IPC V3.0 媒体处理软件开发参考,这个文档有1400多页。
注意:sample的配置和编译,重点注意很多环境变量,目录结构不要乱动。
2.MPP的功能模块
海思提供的媒体处理软件平台(Media Process Platform,简称 MPP),可支持应用软件快速开发。该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软件直接提供MPI(MPP Programe Interface)接口完成相应功能。该平台支持应用软件快速开发以下功能:输入视频捕获、H.265/H.264/MJPEG/JPEG/MPEG4 编码、H.264/MPEG4/MPEG2
解码、视频输出显示、视频图像前处理(包括去噪、增强、锐化、Deinterlace)、编码码流叠加 OSD、视频侦测分析、智能分析、音频捕获及输出、音频编解码等功能。
>>VI 模块捕获视频图像,可对其做剪切、缩放等处理,并输出多路不同分辨率的图像数据。
>>解码模块对编码后的视频码流进行解码,并将解析后的图像数据送 VPSS 进行图像处理或直接送 VO 显示。可对 H264/MPEG4/MPEG2 格式的视频码流进行解码。
>>VPSS 模块接收 VI 和解码模块发送过来的图像,可对图像进行去噪、图像增强、锐化等处理,并实现同源输出多路不同分辨率的图像数据用于编码、预览或抓拍。
>> 编码模块接收 VI 捕获并经 VPSS 处理后输出的图像数据,可叠加用户通过 Region模块设置的 OSD 图像,然后按不同协议进行编码并输出相应码流。
>>VDA 模块接收 VI 的输出图像,并进行移动侦测和遮挡侦测,最后输出侦测分析结果。
>>VO 模块接收 VPSS 处理后的输出图像,可进行播放控制等处理,最后按用户配置的输出协议输出给外围视频设备。
>>AI 模块捕获音频数据,然后 AENC 模块支持按多种音频协议对其进行编码,最后输出音频码流。
>>用户从网络或外围存储设备获取的音频码流可直接送给 ADEC 模块,ADEC 支持解码多种不同的音频格式码流,解码后数据送给 AO 模块即可播放声音。
3.MPP功能模块
int app_main(int argc, char *argv[]) //比如我们输入sample_venc 0
s32Ret = SAMPLE_VENC_NORMALP_CLASSIC();
(1)PAYLOAD_TYPE_E
(2)PIC_SIZE_E
(3)VB_CONF_S
4.视频缓存池
(1)视频的本质是多帧图片,图片的本质是RGB或rawRGB数据,要占用一段连续内存
(2)视频的裁剪、缩放、修正处理等各种操作,本质上就是对内存中的数据进行运算
(3)视频缓存池(VB, video buffer)就是一段很大,又被合理划分和管理的内存,用来做视频数据的暂存和运算场地
(4)公共视频缓存池的公共2字,可以理解为全局变量,也就是各个模块都能访问的一段内存
(5)看似视频缓存块在各个模块之间流转,实际上并没有内存复制,而是指针在传递
(6)视频缓存池的内存由MPP来维护,我们在系统启动时就把整个SDRAM分成了2部分:系统部分(由linux kernel来维护管理)和mpp部分(由mpp系统来维护管理)
(7)缓存池需要几个,每个中包含几个缓存块,每个缓存块多大,都是可以由用户程序设置好参数,然后调用MPP的相应API来向MPP申请分配的。
(1)VB_CONF_S
(2)HI_MPI_VB_SetConf
(3)HI_MPI_VB_Init
2、海思venc代码学习
(1)得理解很多基础概念,譬如图像采集原理、模拟数字、通道、绑定等等
(2)得从宏观上理解整个视频采集、内部传递、处理、编码输出、网络传输等的过程。
(3)得反复看代码,熟才能生巧,才能帮助理解整个代码。
(4)得查阅mpp手册,熟悉海思这一套API的规矩和一般用法。
从main函数的阅读开始,首先就是开始获取我们传入的参数,如果一开始我们运行编译好的代码的时候没传参数,就会直接调用 SAMPLE_VENC_Usage(argv[0])函数,这个函数主要是用来打印使用方法的。
VENC 模块,即视频编码模块。本模块支持多路实时编码,且每路编码彼此独立,编
码协议和编码profile 可以不同。本模块支持视频编码同时,调度 Region 模块对编码图
像内容进行叠加和遮挡。本模块的输入源包括三类:第一类是用户态读取图像文件向
编码模块发送数据;第二类是视频输入(VIU )模块采集的图像经视频处理子系统
(VPSS)发送到编码模块;第三类是视频输入(VIU )模块采集的图像直接发送到编码模块
至此仅作为了解。