HI3519V101的mpp中sample总体分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangdapao12138/article/details/82534865

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的配置和编译,重点注意很多环境变量,目录结构不要乱动。

2MPP的功能模块

海思提供的媒体处理软件平台(Media Process Platform,简称 MPP),可支持应用软件快速开发。该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软件直接提供MPIMPP 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 )模块采集的图像直接发送到编码模块

至此仅作为了解。

猜你喜欢

转载自blog.csdn.net/wangdapao12138/article/details/82534865