Hi3516 sample学习心得

嵌入式系统通常是一个资源受限的系统,因此直接在嵌入式系统的硬件平台上编写软件 比较困难,有时候甚至是不可能的。 目前的解决方法是采用宿主机、目标机的开发模式。在宿主机上编写程序,通过交叉编 译器生成目标板上可以执行的二进制代码。然后通过文件系统,将二进制代码放在特定 目录下,在目标板上运行。 宿主机:VMWARE \ ubuntu(服务器:192.168.1.101) 环境:交叉开发工具包,nfs 目标机:linux hi3516

1.2>安装过程
参见卖方附赠视频教程“SDK 安装及编译视频.avi” 。 nfs 文件系统挂载: 挂载点改变修改/etc/exports 文件,具体方法自行谷歌。

2. 开发流程
首先要有这样一个意识,即对开发板进行的配置,是以我们的需求为基础的。我们所做的工 作在系统层次图的 应用层 部分:

所需的函数统一由 MPP(媒体处理平台)提供接口。MPP 封装实现了基本功能函数,屏蔽 掉了对底层的操作。 sample_venc.c 为完成视频采集编码一系列操作的代码。观察其代码风格如下: 1.函数返回值作为状态码,用以判断函数是否执行成功。 2.函数需要传出的值通过全局变量或地址传出。

现在以函数先后顺序(也即视频采集编码处理流程)对各步骤做以说明。

2.1 配置视频缓存池:
视频缓存池作用: 视频缓存池主要向媒体业务提供大块物理内存管理功能, 负责内存的 分配和回收, 充分发挥内存缓存池的作用, 让物理内存资源在各个媒体处理模块中合理使用。 由于视频输入通道不提供创建和销毁公共视频缓存池功能,因此,在系统初始化之前, 必须为视频输入通道配置公共视频缓存池。根据业务的不同,公共缓存池的数量、缓存块的 大小和数量会有所不同。 enPayLoad---------------决定编码格式。 enSize--------------------决定图像分辨率。 (利用不同的编码通道,可以对同一 rowdata 编 码出不同的分辨率。 ) 缓存块的大小根据 图像制式(PAL/NTSC) 、图像分辨率、像素格式、图像跨距(字节对 齐)共同决定。函数 SAMPLE_COMM_SYS_CalcPicVbBlkSize 计算缓存块大小。

2.2 初始化 MPP 系统
由于 MPP 系统的正常运行依赖于缓存池,因此必须先调用 HI_MPI_VB_Init 初始 化缓存池,再初始化 MPP 系统。 如果多次初始化,仍会返回成功,但实际上系统不会对 MPP 的运行状态有任何影 响。函数 SAMPLE_COMM_SYS_Init 完成 MPP 系统初始化。

2.3 启动 VI 设备
分为 4 步: Tips: isp run must at this step -- after vi dev enable, before vi chn enable

2.3.1 sensor 初始化 2.3.2 启动 VI 设备 2.3.3 启动 ISP 2.3.4 使能 VI 通道
(函数皆由 MPP 提供接口)

2.4 启动视频处理模块
根据 制式和分辨率 获得图像宽和高的具体数据。再由此确定通道属性,进行配置。 每一个通道 对应一系列的 硬件和软件功能模块 ,通道可以进行“串联” ,以完成一系列处 理。通道的“串联”在开发文档中成为 通道绑定。在整个处理流程中,要先后经过如下的 通道绑定: VI----VPSS VPSS----VENC(后者绑定前者)

2.4.1 启动 VPSS
主要根据制式和分辨率 获得图像宽和高的具体数据。再由此确定通道属性,进行配置。然 后使能 VPSS 通道。

2.4.2 VPSS 绑定 VI
函数由 MPP 提供,直接调用。

2.5

启动视频流编码

首先创建编码组,再创建编码通道。 (编码通道组是指芯片启动一次,能够同时处理的编码 通道的集合。通道组模块接收外部原始图像数据,而不关心图像数据是来自哪个 外部模块。我的理解是主通道为物理通道,所有绑定与同一物理通道的扩展通道,其数据源 是一样的。关于他们的具体关系,参见开发参考文档的“6 视频编码模块------ 6.2.2 编码通 道与通道组” 。 )然后将编码通道注册到通道组。接着开启编码通道接收输入图像。

2.6

获取编码码流

在这里新开了一个线程专门用于接收码流。 具体思路为: 把编码通道映射为一个文件句柄(函数 HI_MPI_VENC_GetFd 完成此操作) 。接着的所有 操作都是对文件句柄进行的。 这完全类似于端口通信中将端口打开视作文件句柄, 然后进行 读写操作。 流程图如下: >1. 获取通道的文件句柄。 >2. 从 各 通 道 获 取 码 流 。 ( 这 里 一 共 有 3<0\1\2> 个 通 道 , 分 别 产 生 分 辨 率 为 1080p,VGA,QVGA 的 h264 编码码流。--------------我们的工程中只需要编码通道 0 的 1080p 码 流) >2.1 查询编码码流的一帧中有多少的包。 >2.2 根据包的数目分配内存。

>2.3 获取一帧数据。 >2.4 根据编码类型存数据。 >2.5 释放流。 (不及时释放,当视频缓冲池满时即停止编码) >2.6 释放分配的内存。 >2.7 关闭文件句柄。 >2.8 循环执行以上 7 步。

3.附录 3.1 名词解释
视频输入(VI) 、 视频处理(VPSS) 、 视频编码(VENC) 、 视频解码(VDEC) 、 视频输出(VO)、 视频侦测分析(VDA)、 音频输入(AI)、 音频输出(AO)、 音频编码(AENC) 、 音频解码(ADEC) 、 编码通道组子模块(GROUP) 区域管理(REGION) 视频编码层(VCL, VideoCoding Layer) 网络提取层(NAL, NetworkAbstraction Layer)

SDK MPP AI VEDU IVE PTS DDRC MMZ ROI

Software Developer’s Kit----Media Processing Platform----Auto Iris----Control Video Encode Unit----Intelligent Video Engineering ----Presentation Time----Stamp Double-Data Rate Controller----Media Memory Zone----Region Of Interest

软件开发工具包 媒体处理平台 自动光圈控制 视频编码单元 智能加速引擎 时间戳 DDR 控制器 媒体内存区域 感兴趣区域

3.2 其他要点
1. 当输入图像大小与编码通道宽高完全匹配时,才能启动编码通道进行编码。 2. 未尽事宜,参阅开发完档。

你可能感兴趣的:(HI海思)