CDR 应用开发指南
概述
编写目的
本文档用来指导用户进行V861 CDR产品应用开发,主要介绍CDR应用的开发流程、指导方法和常见问题。
CDR(Car Driving Recorder)行车记录仪,是一种安装在车辆内的电子设备,主要用于实时记录行车过程中的视频、音频及车辆行驶数据。
如果您首次接触全志V861 CDR应用开发,请先阅读 新手指引 章节,熟悉本文档的结构、表达约定和开发流程。
如果您已熟悉全志V861 CDR应用开发,可以跳过前面的新手指引章节,阅读 CDR应用开发章节,查看需要进一步了解的内容。
如果您已完全掌握全志V861 CDR应用开发,可以跳过本文档的介绍,阅读更深入的开发指导文档:
-
《V861_Tina_Linux_SDK_使用指南》
-
《V861_Tina_Linux_方案FAQ》
-
《Tina_Linux_多媒体MPP_开发指南》
-
《Tina_Linux_MPP_Sample_使用说明》
-
《V861_Tina_Linux_多媒体内存_优化指南》
-
《V861_Tina_Linux_Camera_通路配置指南》
适用范围
适用的产品型号:
-
V861
-
V881
读者对象
本文档(本指南)主要适用于以下人员:
-
应用开发工程师
-
技术支持工程师
相关术语介绍
- CDR(Car Driving Recorder):行车记录仪
- MPP(Media Process Platform):嵌入式多媒体处理平台中间件软件
- RT-MEDIA(Real Time Media):嵌入式实时多媒体软件,包含rt-media内核驱动和rt-media用户层
- CSI(Camera Serial Interface ):相机串行接口,DVP(Digital Video Port)数字视频端口
- MIPI(Mobile Industry Processor Interface):MIPI联盟(TI、ST、ARM、Nokia)定义的移动行业处理器接口 ,如MIPI CSI-2(Cmaera)、MIPI DSI(Display)
- TDM(Time Divison Multiplexing):帧级分时复用控制器
- TDM RX(receive):帧级分时复用控制器的接收端
- TDM TX(transmit):帧级分时复用控制器的发送端
- ISP(Image Signal Processing):图像信号处理器
- VIPP(Video Input Post Processor):视频输入后处理器
- VE/VENC(Video Encoder):视频编码器
- ENCPP(Encoder Pre-Process):编码前处理模块
- ORL(Object Rectangle Label):物体矩形框标注
- LBC(Lossy Block Compression):有损块压缩
- LBD(Lossy Block Decompression):有损块解压缩
- ISP D3D:ISP 3D降噪
- hblank:行消隐,当扫描点到达图像右侧边缘时,扫描点快速返回左侧,重新开始在第1行的起点下面进行第2行扫描,行与行之间的返回过程称为行消隐
- vblank:场消隐,扫描点扫描完一帧后,要从图像的右下角返回到图像的左上角,开始新一帧的扫描,会有一段间隔时间,这个时间间隔是场消隐
新手指引
文档结构总览
本文档分为以下几章:
-
概述:介绍文档编写目的、适用范围、读者对象、相关术语介绍。
-
新手指引:介绍文档结构、表达约定、开发流程。
-
CDR应用开发:介绍CDR应用开发,内容包括场景描述、场景约束、操作指导、开发指导、常见问题。
表达约定
在熟悉V861 CDR产品开发前,先简要介绍CDR应用开发SDK环境、接口使用等。
- SDK环境:V861开发使用的是Tina5.0构建系统,Tina5.0 SDK目录结构,主要有构建工具、构建系统、配置工具、工具链、芯片配置目录、内核及boot目录等组成。下面简单介绍各个目录的作用,关于Tina5.0 SDK是详细使用方法,请参考文档《Tina_Linux_系统软件_开发指南》。
V861 SDK目录结构:
Tina-v861/
├── brandy // 存放boot0,uboot等代码。
├── bsp // 存放着Allwinner的驱动,以及对内核的改动,保证着原生内核(kernel/linux-X.X)比较干净的状态,并且能够快速移植适配到新内核中。
├── build // 存放Tina Linux的系统构建脚本。
├── build.sh -> build/top_build.sh
├── device // 存放芯片方案的配置文件,包括内核配置、env配置、分区表配置、sys_config.fex、board.dts等。
├── kernel // 存放不同版本的内核代码,V861使用的内核版本是Linux-6.6。
├── openwrt // 存放着OpenWrt原生代码,及软件包、芯片方案目录。
├── out // 用于保存编译相关的临时文件和最终镜像文件,编译后自动生成此目录,例如编译方案v861。
├── platform // 存放着一些软件包源码,这些软件包的编译方式是通用的。
├── prebuilt // 存放着一些预编译好的工具。
├── rtos // 存放异构系统构建环境。
└── tools // 存放一些host端工具,例如打包工具。
- 接口使用:V861提供两套多媒体接口,MPP接口和RT-MEDIA接口,不同的产品开发使用的接口也会不同。CDR应用 开发使用的音视频编解码接口是MPP接口。下面简要介绍MPP接口代码存放的位置,关于MPP接口的详细用法及示例,请参考文档《Tina_Linux_多媒体MPP_开发指南》、《Tina_Linux_MPP_Sample_使用说明》。
MPP接口代码位置:
platform/allwinner/eyesee-mpp/middleware/sun252iw1/
.
├── config // 存放mpp的配置、版本记录文件。
├── include // 存放mpp接口的头文件。
├── install // 编译mpp后生成的临时文件,拷贝到文件系统中的mpp的库、头文件、配置文件等。
├── InstallDev // 编译mpp后生成的临时文件,mpp的库和头文件。
├── media // 存放mpp组件接口文件、组件、LIBRARY库。
├── MallocMonitor // 内存泄漏、越界检测工具。
├── Readme.txt
├── sample // 存放mpp的sample。
└── tina.mk
快捷跳转命令:cmpp_s
开发流程
CDR应用开发的一般流程,按开发先后顺序可以分为:场景评估、功能开发、系统优化、图像调试、方案测试、方案验收。
-
场景评估:在项目导入初期进行,重点对场景的可行性进行评估,可以借助SDK现有的Demo进行实测,评估场景的性能、内存、功能、功耗等是否满足。评估立项后,开始硬件设计和打板工作。
-
功能开发:在项目立项后进行,重点拆分场景中覆盖的多个功能项,先独立完成各项功能的应用开发和适配工作,再根据场景对功能进行整合,完成初版的应用。在硬件回板前,通常可先借用开发板进行部分功能开发。
-
系统优化:在功能开发后进行,先梳理全功能下的系统性能、内存、功耗等指标数据,再进行分析,拆分到具体的模块和业务功能,进行逐个优化和验证。
-
图像调试:在功能开发后进行,可以与系统优化并行。若有对标的竞品需提供竞品机器;若没有竞品需要先对齐图像优化的目标。图像调试分客观调试和主观调试。图像优化包含编码效果和图像效果,需要一起调试。
-
方案测试:在系统优化和图像调试后进行,如果图像调试周期长,也可以与图像调试并行。测试项包含软件功能测试、硬件信号测试、硬件可靠性测试。
-
方案验收:方案软硬件测试通过,图像效果验收通过后,整个方案算验收完成,可以试产和量产。

CDR应用开发
CDR方案单目方案。这里摄像头模组通常是指MIPI协议的摄像头,若是DVP、USB摄像头的方案,本章内容同样适用。
本章分别从场景描述、场景约束、操作指导、开发指导、以及常见问题等几个方面详细阐述如何开发一个CDR应用。
场景描述
首先描述CDR应用的典型场景,再通过软件框图和数据流程图分别介绍该场景的软件框架和数据流程。
典型场景
该场景包含2路H.265编码、1路JPEG编码、音频采集、音频播放和音频3A算法。
主码流:H.265,离线编码,1080p@30fps,9Mbps
子码流:H.265,离线编码,720p@30fps,4Mbps
拍照:JPEG,1080p
音频:AAC,8K采样率,单声道,3A算法(AEC、ANS、AGC)
软件框架
该场景使用的硬件有:MIPI SENSOR、ISP、VIPP、VE、DE、MIC、SPEAKER、AudioSys,其中,MIPI SENSOR、MIC、SPEAKER为外设硬件,其他均为SOC硬件。硬件上的软件分3层,从上往下分别是:应用层、中间件层、驱动层。
-
应用层:客户APP属于应用层,该层基于MPP接口实现,功能包含录像写卡、拍照、语音对讲、语音播报等。
-
中间件层:MPP、ALSA Lib、tinyalsa属于中间件层,该层对外提供统一的MPI接口,内部按组件分多个模块,调用不同的库接口,模块包含SYS、ISP、VI、VENC、AI、AO、AENC、ADEC,库包含libisp、libcedarc、aec_lib、ans_lib、agc_float_lib、AudioLib、ALSA Lib、tinyalsa。
-
驱动层:V4L2、sunxi-vin、cedar-ve、ALSA core、ASoc core、audio machine/codec/platform属于驱动层,该层提供ioctl和设备节点给中间件层或者应用层使用,是标准的linux驱动。

数据流程
该场景的数据流程分为:视频数据流程、音频数据流程。
-
视频数据流程:摄像头模组采集视频RAW图像,经过MIPI、CSI、PARSER后传入ISP处理,输出YUV图像给VIPP,VIPP输出图像给VE进行编码,编码后输出编码码流数据。
-
音频数据流程:音频采集和编码,MIC采集音频数据,经过AudioSys音频驱动处理后,通过ALSA Lib传递给中间件层MPP音频组件和3A算法库处理,处理后的音频可以进行编码;音频解码和播放,音频文件经过MPP音频解码,解码后的音频数据传递给ALSA Lib,ALSA Lib再传给AudioSys音频驱动,最后通过speaker播放。

场景约束
以下场景约束适用于V861芯片。
通路数量限制
-
每个sensor最多支持创建4路VIPP,每个VIPP最多支持创建4个虚通道
-
最多支持创建16个VENC通道
-
最多支持创建1个音频通道,若开启AEC回声消除算法,最多支持创建2个音频通道
功能限制
-
VIPP支持ORL画框功能,不支持overlay和cover功能
-
JPEG编码不支持首帧OSD overlay水印反色功能
-
支持JPEG解码,不支持H.264和H.265解码
性能限制
V861:
-
H265编码性能最高支持4K@25fps
-
H264编码性能最高支持4K@25fps
-
JPEG编码,最大支持1080p@60fps
-
JPEG解码,最大支持1080p@60fps
V881:
-
H265编码性能最高支持4K@30fps
-
H264编码性能最高支持4K@25fps
-
JPEG编码,最大支 持1080p@60fps
-
JPEG解码,最大支持1080p@60fps
编解码分辨率约束
- 编码
| 编码格式 | 输入格式 | 最小输入 | 最大输入 | 最小输出 | 最大输出 |
|---|---|---|---|---|---|
| H265/H264 | LBC | 128x64 | 4080x4080 | 128x64 | 4096x4096 |
| H265/H264 | YUV420/YUV422/ARGB | 64x64 | 4096x4096 | 64x64 | 4096x4096 |
| JPEG | LBC | 128x64 | 4080x4080 | 128x64 | 4096x4096 |
| JPEG | YUV420/YUV422/ARGB | 64x64 | 8192x8192 | 64x64 | 8192x8192 |
- JPEG解码,输入和输出最大分辨率支持8192x8192
编码分辨率对齐约束
输入:
-
编码输入宽度:LBC格式输入时,宽度16对齐,非LBC格式输入时,宽度8对齐
-
编码输入高度:宽度8对齐
输出:
-
编码输出宽度:HEVC格式输出时,宽度16对齐,AVC/JPEG 格式输出时,宽度16对齐
-
编码输出高度:HEVC/JPEG 格式输出时,高度8对齐,AVC格式输出时,高度16对齐