姓名:张猛
【嵌牛导读】:对于Hi33518e网络摄像头的一些概况性、流程性的东西的总结,大原理,大思路的提炼,具体的函数就暂时忽略。
【嵌牛鼻子】:流程 vpss 绑定 通道
【嵌牛提问】:对于网络摄像头调试软件层次的一些整体把握
【嵌牛正文】
1.开发环境
1.1 概述
嵌入式系统通常是一个资源受限的系统,直接在嵌入式系统的硬件平台上编写软件比较困难,甚至是不可能的,通常采用宿主机、目标机的开发模式。在宿主机上编写程序,交叉编译生成目标板上可以执行的二进制文件,通过文件系统,将二进制代码放在特定目录下,在目标板上运行。
宿主机:VMware\ubuntu
环境:交叉开发工具包,nfs
目标机:hi3518e
1.2 安装
一般官方的SDK会有比较详细的说明
2.开发流程
首先要有这样一个意识,对开发板进行配置,是以我们的需求为基础的。
所需的函数同一由MPP(媒体处理平台)提供接口。MPP封装实现了基本功能函数,屏蔽掉了对底层的操作。
sample_venc.c为完成视频采集编码一系列操作的代码。代码总结
1.函数返回值为状态码,用以判断函数是否执行成功。
2.函数需要传出的值通过全局变量或地址传出。
现在以函数先后顺序(视频采集编码处理流程)对个步骤说明。
2.1 配置视频缓冲池:
视频缓存池主要向媒体业务提供大块物理内存管理功能,负责内存的分配和回收,充分发挥内存缓存池的作用,让物理内存资源在各个媒体处理模块中合理使用。一组大小相同、物理地址连续的缓存块组成一个视频缓存池。对于视频输入通道,则需要使用公共视频缓存池。所有的视频输入通道都可以从公共视频缓存池中获取视频缓存块用于保存采集的图像(如图2-1中所示从公共视频缓存池A中获取视频缓存块Bm)。由于视频输入通道不提供创建和销毁公共视频缓存池功能,因此,在系统初始化之前,必须为视频输入通道配置公共视频缓存池。根据业务的不同,公共缓存池的数量、缓存块的大小和数量会有所不同。
**enPayLoad 决定编码格式
enSize 决定图像分辨率。利用不同的编码通道,可以对同一rowdata编码出不同的分辨率
缓冲块的大小根据图像制式(PAL/NTSC)、图像分辨率、像素格式图像跨距(字节对齐)共同决定。函数SAMPLE_COMM_SYS_CalcPicVbBlaSize 计算缓存快的大小。
2.2 初始化MPP系统
由于MPP系统的正常运行依赖于缓存池,因此必须先声明HI_MPI_VB_init初始化缓存池,在初始化MPP系统。
如果多次初始化,仍会返回成功,但实际上系统不会对MP的运行状态有任何影响。函数SAMPLE_COMM_SYS_init完成MPP系统初始化。
2.3 启动VI设备
分为4步:
1.sensor初始化
2.启动VI设备
3.启动ISP
4.使能VI通道
2.4 启动视频处理模块
根据制式和分辨率获得图像宽和高的具体数据。在由此确定通道属性进行配置。每一个通道对已一系列的硬件和软件功能模块,通道可以进行“串联”,以完成一系列处理。
通道的“串联”在开发文档中称为通道绑定。在整个处理流程中,要先后经过如下的通道绑定:
VI--->VPSS VPSS---->VENC(后者绑定前者)
2.4.1 启动VPSS
主要根据制式和分辨率获得图像宽和高的具体数据,在由此确定通道属性,进行配置。然后使能VPP通道。
2.4.2 VPSS绑定VI
函数由MPP提供,直接调用。
2.5 启动视频流编码
先创建编码组,再创建编码通道。(编码通道组指的是芯片启动一次,能够同时处理的编码通道的集合。通道组模块接受外部原始图像数据,而不关心图像数据是来自哪个外部模块。
2.6 获取编码码流
这里专门开了一个线程用于接受码流
思路:把编码通道映射为一个文件句柄。接着的所有操作都是对文件句柄进行的。
流程如下:
1.获取通道的文件句柄
2.从各通道获取码流
1)查询编码码流的一帧中有多少包
2)根据包的数目分配内存
3)获取一帧数据
4)根据编码类型存数据
5)释放流(如果不释放,当视频缓冲池满时停止编码)
6)释放分配的内存
7)关闭文件句柄
8)循环以上7步