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常见数据流

  1. 解码显示

    vdec channel只有output,disp channel只有input,一般解码显示只需要将vdec chn绑定到disp chn即可,port口都为0。

    图6-2

  2. 抓图

    1. 由于vdec解码出来的图像往往是已经缩放到disp显示的size,不能满足抓图的需求,所以内部做了处理,创建divp chn6则代表要走抓图流程。

    2. 默认会解码出原始size图像到port1,然后内部将port1缩小到disp size到port0,port0再绑定disp去显示。

    3. port1的数据可以直接用于抓图,如果抓原始size图片可以直接port1绑定到venc。

    4. 如果要抓指定size图片,可以将vdec port1先绑定一个divp做缩放,然后divp绑定venc编码成图片。

    图6-3

  3. PIP

    1. disp有两层layer,layer0 有16个chn,layer1有1个chn,用于PIP显示,通道号固定为16。

    2. 由于一般PIP窗口都比较小,所以会直接从vdec chn绑定divp做缩放,然后divp绑定pip disp显示。

    3. layer1永远在layer0之上,UI之下。

    图6-4

  4. 电子放大

    1. divp和disp模块都可以做crop,走divp模块则会多耗一级内存和带宽。

    2. disp窗口大于等于vdec size的情况下,只需在disp做crop即可,调用接口MI_DISP_SetZoomInWindow设置crop参数。

    3. disp窗口小于vdec size的情况下,走disp crop则会对清晰度打折扣,这时可以让vdec出原图,绑定divp做crop,再divp绑定disp显示。

    4. 但是divp有硬件限制,size最大只能到1920x1920,所以有些case不可避免还是会有清晰度的损失,比如400w码流到1080p显示。

    图6-5


7. NVR api

参考各模块api介绍文档。


8. DEBUG方法

详细参考MI调试手册