NVR&XVR SDK架构介绍


1. 模块介绍

简称 全称 职责
SYS System 实现MI系统初始化、内存管理、各个模块之间数据流的管理
VDEC Video Decoder H264/H265 视频解码器
JPD Jpeg Decoder Jpeg解码器
SCL Scaler 缩放/裁剪/格式转换等功能
VDISP Vitrual Display 软件拼图
DISP Display Engine DISP对VDEC/SCL 处理单元输出的图像做硬件拼图,并连同AO输出音频信号一起编码成HDMI/VGA/CVBS 输出信号的单元
VENC Video Encoder H264/H265/MotionJpeg编码器
AI Audio Input Interface audio input采集单元
AO Audio Output Interface 音频输出
GFX Graphics Engine Graphic Engine 提供对2D画图的基本硬件加速支援,降低CPU的负荷
FB FrameBuffer UI显示
HDMI High Definition Multimedia Interface HDMI/VGA标准输出
AEC Acoustic Echo Cancellation 回声消除,抑制远程回声的算法
AED Acoustic Event Detection 声学事件检测,用于在音讯码流中侦测特定的声音事件
APC Audio Process Chain 音频处理链路,包含降噪、均衡器和自动增益控制的算法组合
BF beamforming 波束形成或空间滤波,用于传感器数组的定向信号处理技术传输或接收
SRC Sample Rate Conversion 重采样,用于对音频流做采样频率转换
SSL Sound Source Localization 声源定位,用于定位声音来源的方向
SENSOR Sensor 获取摄像头接口信息、调整分辨率和帧率等功能
VIF VIDEO Input Interface BT656/BT1120/MIPI等信号采集单元
ISP Image Signal Processing 实现 HDR,3D/2D 降噪,3A 算法,WDR 等相关功能
IQSERVER Image Quality tuning Server 图像质量调校服务,用来完成调校工具(IQ Tool)和开发板之间的数据通信, 包括 ISP 参数设置,获取图像,上传/下载相关文件等功能
RGN Region 区域管理模块,对SCL数据进行遮挡或叠加
SED Smart Encode 智能编码,主要提供智能编码通道的创建和销毁、开启和停止检测源图像、计算结果并关联到指定的编码通道等功能
IVE Intelligent Video Engine 提供图形智能识别算法中的基本算子支援
VDF Video Detection Framework 整合各个视频算法识别库的中间件架构,包括MD/OD/VG
SHADOW Shadow 用来连接VDF user层的一个通道,如果要用VDF,则需要包含此模块(lib库和ko),无需实际调用shadow接口
IPU Intelligent Process Unit 智能处理器,模块实现了AI 模型的推演功能加速
CIPHER Cipher 提供数据的加解密功能,包括 AES\RSA\SHA 加解密算法

2. SDK软件架构

  • 功能实现函数从上到下,分为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目录结构

目录 模块名 功能
project board PCB板信息存放路径
configs 预配置文件存放路径
image 产生镜像文件的材料库和镜像文件存放处
kbuild kernel编译环境
release 目标池,存放对外头文件/文档/库文件和内核模块以及第三方库
scripts 编译辅助功能脚本
tools 一些通用工具
sdk verify/xvr_demo xvr/nvr的一些参考测试demo

4. 内存管理

4.1. 内存分配方式

通过环境变量设置预留内存用量:

# cat /proc/cmdline

ubi.mtd=ubia,2048 root=/dev/mtdblock5 rootfstype=squashfs ro init=/linuxrc 
LX_MEM=0x80000000 mma_heap=mma_heap_name0,miu=0,sz=0x40000000 
mma_heap=mma_heap_fb,miu=0,sz=0x1000000 mma_memblock_remove=0 cma=2M 
mtdparts=nand0:1536k@1280k(BOOT),1536k(BOOT_BAK),256k(ENV),5m(KERNEL),
5m(RECOVERY),6m(rootfs),1m(MISC),109056k(ubia)
  • LX_MEM为总的DDR内存。

  • mma_heap=mma_heap_name0后的sz带的参数是预留给sdk编解码使用的总内存;大小需要根据产品规格评估。

  • mma_heap=mma_heap_fb后的sz带的参数是预留给FB模块使用的总内存。/misc/config.ini里面还会配置fb节点的内存(比如FB_BUFFER_LEN = 8192,单位为KB,则是给当前fb分配8M内存),如果有多个fb节点,则要各fb节点的内存相加等于这里的sz大小即可;如果是单fb节点,则fb节点内存与这里的sz预留大小相等即可。

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和output port。input port为channel输入数据流的位置,而output port则是channel输出数据流的位置。

    一个channel可以有多个input port及多个output port.

6. NVR&XVR架构

6.1. NVR&XVR软件架构

  • ai/ao/fb/gfx/hdmi都是相对独立的模块,不需要和其它模块串接。

  • nvr最重要的是解码显示流程,一般vdec->disp即可,某些流程还需要再串接一级scl,即vdec->scl->disp。

  • xvr主要包括回放流程(和nvr一致),预览流程(vif->isp->scl->disp)和存储流程(vif->isp->scl->venc)。

6.2. NVR常见数据流

6.2.1. 解码显示

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

6.2.2. 抓图

  1. 由于vdec解码出来的图像往往是已经缩小到disp显示的size(比如16分屏下),不能满足原始size抓图的需求,为了满足这种需求,引入vdec port1概念。

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

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

  4. 如果要抓指定size图片,可以将vdec port1先绑定一个scl(dev hw不限)做缩放,然后scl绑定venc编码成图片。

6.2.3. PIP

  1. disp有四层layer,layer0 / 2有32个chn,layer1 / 3有1个chn,用于PIP显示,input通道号固定为32。

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

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

6.2.4. 电子放大

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

  2. disp窗口小于vdec size的情况下,走disp crop则会对清晰度打折扣,所以nvr上只建议用vdec做crop。

6.3. XVR常见数据流

6.3.1. pipeline参考

模块串接可以有多种,有的更省频宽,有的更省内存,下图是推荐使用的pipeline(只列出其中1路vif->isp->scl->venc或disp的流程,其它路相同),已经是最节省内存的方案,而且用户层串接也相对比较简单,用户只需根据自己的实际场景做微调。

注意ISP和SCL绑定尽量使用realtime模式(ISP output port0),可以节省内存和带宽。在SCL硬件数量不够的情况下再考虑用framemode绑定(ISP output port1),尽量让分辨率低帧率低的流程走framemode。

6.3.2. 电子放大

xvr电子放大有2种,1种是回看电子放大,方案和nvr一样,vdec做crop即可。另一种是预览电子放大,流程是vif->isp->scl->disp,因为scl可能有多个output port,因此建议在scl的output做crop。