5.1. 系统概述

5.1.1. 文档使用方法

5.1.1.1. 文档组成

  • 第 1 小节 : 整体描述多媒体系统

  • 第 2 小节 : 多媒体系统核心软件框架 HBN ( 目前多媒体系统部分模块,没有包含在 HBN 框架中,后面详细描述 )

  • 第 3 小节 : 多媒体系统调试手段

  • 第 4-14 小节 : 详细介绍各个独立模块 , 包括基本信息、使用方法、注意事项

  • 第 15 小节 : 图像质量调试方法

5.1.1.2. 如何使用文档

  1. 掌握多媒体系统整体核心框架

    • 详细阅读多媒体章节第 1 小节,掌握多媒体系统组成部分(包含多媒体章节第 4-12 小节)以及各个部分之间关系

    • 详细阅读多媒体章节第 2 小节,掌握多媒体系统核心软件框架 HBN

    • 浏览多媒体章节第 3 小节,了解多媒体系统哪些调试手段,在后面使用过程遇到问题时,知道哪些手段可以调试

  2. 结合 示例代码 章节的 demo, 逐个了解多媒体章节第 4-14 小章节模块,至此可以实现摄像头采集处理链路搭建

  3. 按照多媒体章节第 15 小节调试图像质量

5.1.2. 整体概述

多媒体系统集成多种硬件加速单元,使 CPU 专注优势任务:运行操作系统处理业务逻辑。
同时,系统提供简洁灵活的 API,用于高效连接协调模块工作。以下硬件软件两个方面进行介绍:

  1. 硬件方面:详述硬件模块组成结构硬件单元之间数据交互机制。

  2. 软件方面:解析软件 API 的设计功能,并说明如何利用 API 实现不同硬件单元高效数据协作

5.1.3. 硬件方面

5.1.3.1. 组成

模块 全称 解释
VIN Video Input 软件概念,包含 MIPI、 SIF,接收单路多路 Camera sensor 数据,直接送给下游 ISP 或到 DDR
SIF Sensor Interface 衔接 MIPI 口,把 MIPI 接口收到数据送给下游 ISP 或直接到 DDR
ISP Image Signal Processor 图像信号处理器
VSE Video Scaler 图像裁剪、缩放、颜色空间转换
OSD On Screen Display 视频图像叠层显示
GDC Geometrical Distortion Correction 几何畸变矫正
VPU Video Processing Unit 视频处理单元,完成视频编解码功能,支持 H.264/H.265
JPU JPEG Processing Unit JPEG 图片处理单元,完成 JPEG、 MJPEG 的编解码功能
2DGPU 2D Graphics Processing Unit 2D 图像加速单元,提供位块传输、矩形填充清除、 Alpha 融合、旋转、裁剪、颜色空间转换功能
3DGPU 3D Graphics Processing Unit 3D 图像渲染加速单元
Display Video Display Unit 视频显示模块,提供图层、旋转功能,支持 BT1120 、 HDMI、 MIPI DSI 接口

5.1.3.2. 数据交互

X5 芯片内置专用数据通道,可直接连接 VIN、 ISP 和 VSE 模块,实现视频数据高速直传,不需要读写 DDR ,从而节省 DDR 带宽,大幅提升性能。
然而,由于 ISP 的硬件资源单一的,当接入多路 Camera Sensor 时,必须通过复用方式进行处理,视频数据必须通过 DDR 进行缓存。
基于数据传输是否依赖 DDR 缓存,硬件加速单元之间数据交互方式可以分为以下两种模式:

  1. Offline 模式 ( 图中 绿色箭头):数据通过 DDR 完成传输,上游模块数据写入 DDR,下游模块从 DDR 读取。此模式支持多路 Camera Sensor 的接入场景。

  2. Online 模式 ( 图中 红色箭头):数据直接上游模块传递下游模块,无需读写 DDR,显著提升性能。然而,该模式适用单路 Camera Sensor 的场景。

注意:多路 Camera Sensor 场景下,ISP 到 VSE 支持 Online, 并且建议使用 Online 模式(有效减少 DDR 带宽)

下图描述 多路 Camera Sensor 和单路 Camera Sensor 两种使用场景:

 框图

总结如下:

  • VIN:包含 4 个 MIPI RX 和 4 个 SIF

    • MIPI RX:连接 1 个 MIPI 接口的 Camera Sensor

    • SIF:与 MIPI 接口一一对应,把 MIPI 接口收到数据送给下游 ISP 或直接到 DDR;

  • ISP:有 4 个输入 port,支持与 4 路 SIF 连接。由于 ISP 硬件 Pipeline 只有一个,接入多路 camera Sensor 时, ISP 会数据到 DDR,然后复用 Pipeline

    • 单路 Camera Sensor 场景下, VIN 到 ISP 的连接方式:优先选用 Online 模式,支持 Offline 模式

    • 多路 Camera Sensor 场景下, VIN 到 ISP 的连接方式:只支持 Offline 模式

    • 注意:当接入 HDR Sensor 时,VIN 和 ISP 的连接方式只能选择 online,由于 online 模式独占 ISP 资源,所以支持 1 路。

  • VSE:只有 1 个输入 port, 硬件只有 1 个,支持 6 个输出通道,每个通道支持不同尺寸缩放裁剪,支持 OSD 功能,可图像叠加文字色块

    • 单路 Camera Sensor 场景下, ISP 到 VSE 的连接方式优先选用 Online,支持 Offline 模式

    • 多路 Camera Sensor 场景下, ISP 到 VSE 的连接方式同样优先选用 Online(支持多路 Online),支持 Offline 模式

  • 其他模块:只支持 Offline 模式:

    • Display:从 DDR 读数据,然后通过 MIPI DSI/BT1120 输出显示设备,或通过 MIPI Tx 输出一个 MIPI Host 设备;

    • GDC2DGPU3DGPUVPUJPU:从 DDR 读数据,处理完再到 DDR;

5.1.4. 软件方面

5.1.4.1. 框架

 框图

下面左向右介绍每个 API 的作用:

  1. HBN API: 包含HBN Framework APIISP APIOSD APICamera API,覆盖摄像头采集链路所有模块,

    • HBN Framework API: 多媒体系统软件核心框架 ,
      每个模块作为一个节点( vnode),然后每个模块连接起来形成流水线 (vflow),
      目前涵盖了 VIN, ISP, VSE, GDC, 2DGPU, 详细HBN 框架接口说明

    • ISP API: 用于动态配置获取 ISP 模块参数,详细 图像质量 ISP,
      ISP 模块静态参数配置数据流转HBN Framework实现

    • OSD API: 用于创建配置 OSD 模块,没有HBN Framework API 覆盖,但是可以通过接口 attach 到 VSE 节点通道上,
      详细 区域处理 OSD

    • Camera API: 用于配置 Camera Sensor,没有HBN Framework API 覆盖,但是可以通过接口 attach 到 VIN 节点 ,
      详细 视频接入 Camera

  2. MediaCodec API: 用于控制 VPU 和 JPU 模块,实现 H264 、 H265 、 JPEG 编解码功能 , 详细 视频编解码 Codec

  3. OpenGL ES、EGL、OpenCL、Vulkan: 3DGPU 的接口,通用的 3DGPU 框架 , 详细3DGPU

  4. N2D API: 2DGPU 的接口,详细2DGPU, 部分功能集成到 HBN 框架,推荐使用 N2D API

  5. DRM API: 视频显示模块接口,详细 视频输出 Display

  6. HB_MEM API: 实现用户空间实现大块物理地址连续内存管理,详细 内存管理 Hbmem

    • 实现视频数据缓存:所有硬件加速单元和 DMA 模块使用内存必须物理地址连续

    • 实现视频数据流转:底层基于 dmabuf,实现图像数据内核不同驱动之间以及内核用户之间传递

5.1.4.2. 数据交互

处理视频数据时,硬件加速单元要求使用物理地址连续的 DDR 缓存。为满足这一需求,多媒体系统软件提供HB_MEM API,具备以下特点 :

  • 用户内存分配 :支持用户分配大块物理地址连续内存,满足视频处理需求。

  • 专用内存区域:分配内存来源于 ION 区域(设备树预留内存区域, Linux 系统标准分配器不会使用区域)。详细ION 系统调试指南

  • 拷贝数据传输:基于底层的 dmabuf 框架,实现不同驱动以及内核用户之间数据直接传递,避免内存拷贝操作。

  • 高效内存管理:通过内存池( mempool)避免频繁内存申请释放,从而减少用户内核态间频繁切换,提升内存分配效率。

  • 视频结构支持:提供结构体 hb_mem_graphic_buf_t,用于描述视频数据内容格式信息。

因此多媒体系统软件基于结构hb_mem_graphic_buf_t 完成不同硬件加速单元之间数据交换,对于支持 hb_mem_graphic_buf_t 的 API,
可以通过各种方式完成转换,如下描述

  1. HBN APIMediaCodec API 使用视频数据结构hb_mem_graphic_buf_t

  2. N2D API 视频数据结构n2d_buffer_t, 可以hb_mem_graphic_buf_t获取物理地址视频参数转换成 n2d_buffer_t,详细sample_gpu_2d 使用说明

  3. DRM API 底层基于 dmabuf 实现,可以hb_mem_graphic_buf_t获取 dmabuf 的文件描述符转换成 dma_buf_map_t, 详细sample_vot 使用说明

  4. OpenGL ES、EGL、OpenCL、Vulkan: 待补充

不同硬件模块之间进行数据传输时,需要注意对齐问题, 下面列出各个模块输入输出分辨率输入输出内存对齐要求

模块 输入像素 输出像素 输入内存 stride 输出内存 stride
SIF 必须偶数 必须偶数 -(输入是MIPI数据,不是内存) 宽:16字节对齐
ISP 必须偶数 必须偶数 宽:16字节对齐 宽:16字节对齐
VSE 必须偶数 宽: 16的倍数, 高:偶数 宽:16字节对齐 宽:16字节对齐
GDC 必须偶数 必须偶数 宽:16字节对齐 宽:16字节对齐
OSD 宽: 16的倍数, 高: 偶数 没有输出 - -
VPU (Encoder) 必须是8的倍数 -(输出裸码不是图像) 宽:32字节对齐 -(输出裸码不是图像)
VPU (Decoder) 必须偶数 必须偶数 -(输入裸码不是图像 ) 要求16字节对齐
JPU (Encoder) 宽: 16的倍数, 高: 8的倍数 -(输出裸码不是图像) 要求16字节对齐 -(输出裸码不是图像)
JPU (Decoder) 必须偶数 必须偶数 -(输入裸码不是图像) 要求16字节对齐
2DGPU 宽:64的倍数,高:偶数 宽:64的倍数, 高:偶数 宽:64字节对齐 宽:64字节对齐
3DGPU 要求 要求 要求 要求
Display(DC8000Nano) 必须偶数 -(不会输出内存) 宽:32字节对齐 - (不会输出内存)

注意:

  1. 2DGPU 支持多种格式,上述表格描述是 NV12 格式(常用格式)的情况, 不同格式像素要求不同的,详细见: 2DGPU 对齐要求

  2. 3DGPU 调用函数 clCreateBuffer 传入FlagCL_MEM_USE_HOST_PTR情况下,需要地址大小要 64字节对齐