SDK架构介绍
1. 模块介绍¶
表1-1
| 简称 | 全称 | 职责 |
|---|---|---|
| SYS | System | 实现 MI 系统初始化、内存缓冲池管理、各个模块之间数据流的管理 |
| VDEC | Video Decoder | H264/H265/JPEG 视频解码器 |
| DIVP | Deinterlace&Video Post Process Engine | DIVP Engine有两个主要的功能 ①对解码后数据进行格式转换 ②解码后数据进行缩放 |
| VDISP | Vitrual Display | 软件拼图 |
| DISP | Display Engine | DISP对VDEC/DIVP 处理单元输出的图像做硬件拼图,并连同AO输出音频信号一起编码成HDMI/VGA/CVBS 输出信号的单元 |
| VENC | Video Encoder | H264/H265/MotionJpeg编码器 |
| AI | Audio Input Interface | I2S audio input采集单元 |
| AO | Audio Output Interface | 音频输出 |
| GFX | Graphics Engine | Graphic Engine 提供对2D画图的基本硬件加速支援,降低CPU的负荷 |
| FB | FrameBuffer | UI显示 |
| HDMI | High Definition Multimedia Interface | HDMI/VGA标准输出 |
2. 软件架构¶

图2-1
-
功能实现函数从上到下,分为:
-
MI API层
-
MI实现层
-
Hal硬件抽象层
-
Driver层和芯片硬件层
-
-
MI IMPLEMENT和HAL层以ko形式给出,MI API以lib库的形式给出。
-
SDK功能代码在Kernel层实现,减少从kernel到User mode来回调度,提高逻辑函数实现的效率。
-
对上层客户提供MI API的User Mode接口,用户层APP直接调用MI接口,即可调用到对应的MI功能。
3. SDK目录结构¶
表3-1
| project | 模块名 | 功能 |
|---|---|---|
| board | PCB板信息存放路径 | |
| configs | 预配置文件存放路径 | |
| image | 产生镜像文件的材料库和镜像文件存放处 | |
| kbuild | kernel编译环境 | |
| release | 目标池,存放对外头文件,库文件和内核模块以及第三方库 | |
| SDK | Verify/feature | 验证文件夹,里面存放模块单元测试和特性测试文件 |
| Verify/demo | 整体功能测试demo |
4. 内存管理¶
详细参考Memory Layout介绍。
-
通过mmap.ini预留的内存
-
支持mma管理module内存,各个module从mma预留的size中分配

图4-1
环境变量设置预留内存用量:
/ # cat /proc/cmdline
console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=squashfs ro init=/linuxrc LX_MEM=0xff00000 mma_heap=MMU_MMA,miu=0,sz=0x3800000 mma_heap=mma_heap_name0,miu=0,sz=0x1d00000 mma_memblock_remove=1
5. 基本概念¶
-
数据流
- 各个MI Module 可以看成是一个纯数据处理单元,数据流推送由MI SYS内部统一调度。输入数据流表示该数据单元的input数据,输出数据流表示该处理单元处理过的output数据。
-
控制流
- APP 对各个MI Module 数据处理过程进行参数控制的过程,比如设置MI_VDEC解码参数,启动停止MI_VDEC 通道,设置MI_VDEC通道输出端口之分辨率及format等
-
Channel(通道)
-
对于需要处理或者输出stream的MI模组,一个channel代表该MI 模组处理或者输出一路stream的分时复用的上下文(context)及相关控制流设定
-
对于可分时复用之模组如MI_VDEC, MI_DIVP, MI_DISP,可支援多个channel
-
-
Port(端口)
-
Port分为2种
-
input port: channel输入数据流的位置
-
output port: channel输出数据流的位置。
-
-
一个channel可以有多个input port及多个output port.

图5-1
-
6. NVR架构¶
6.1. NVR软件架构¶

图6-1
ai/ao/fb/hdmi都是相对独立的模块,不需要和其它模块串接。 nvr最重要的是解码显示流程,一般vdec->disp即可,某些流程还需要再串接一级divp,即vdec->divp->disp。
6.2. NVR常见数据流¶
-
解码显示
vdec channel只有output,disp channel只有input,一般解码显示只需要将vdec chn绑定到disp chn即可,port口都为0。

图6-2
-
抓图
-
由于vdec解码出来的图像往往是已经缩放到disp显示的size,不能满足抓图的需求,所以内部做了处理,创建divp chn6则代表要走抓图流程。
-
默认会解码出原始size图像到port1,然后内部将port1缩小到disp size到port0,port0再绑定disp去显示。
-
port1的数据可以直接用于抓图,如果抓原始size图片可以直接port1绑定到venc。
-
如果要抓指定size图片,可以将vdec port1先绑定一个divp做缩放,然后divp绑定venc编码成图片。

图6-3
-
-
PIP
-
disp有两层layer,layer0 有16个chn,layer1有1个chn,用于PIP显示,通道号固定为16。
-
由于一般PIP窗口都比较小,所以会直接从vdec chn绑定divp做缩放,然后divp绑定pip disp显示。
-
layer1永远在layer0之上,UI之下。

图6-4
-
-
电子放大
-
divp和disp模块都可以做crop,走divp模块则会多耗一级内存和带宽。
-
disp窗口大于等于vdec size的情况下,只需在disp做crop即可,调用接口MI_DISP_SetZoomInWindow设置crop参数。
-
disp窗口小于vdec size的情况下,走disp crop则会对清晰度打折扣,这时可以让vdec出原图,绑定divp做crop,再divp绑定disp显示。
-
但是divp有硬件限制,size最大只能到1920x1920,所以有些case不可避免还是会有清晰度的损失,比如400w码流到1080p显示。

图6-5
-
7. NVR api¶
参考各模块api介绍文档。
8. DEBUG方法¶
详细参考MI调试手册