5.1. 系统概述
5.1.1. 文档使用方法
5.1.1.1. 文档组成
第 1 小节 : 整体
描述 多媒体系统 第 2 小节 : 多媒体系统
的 核心 软件 框架 HBN ( 目前 多媒体系统 有 部分 模块,没有 包含 在 HBN 框架 中,后面 会 详细描述 ) 第 3 小节 : 多媒体系统
的 调试 手段 第 4-14 小节 : 详细
介绍 各个 独立 模块 , 包括 基本 信息、使用 方法、注意事项 等 第 15 小节 : 图像
质量 的 调试 方法
5.1.1.2. 如何使用文档
掌握
多媒体系统 的 整体 和 核心 框架 详细
阅读 多媒体 章节 的 第 1 小节,掌握 多媒体系统 的 组成部分(包含 多媒体 章节 的 第 4-12 小节)以及 各个 部分 之间 的 关系 详细
阅读 多媒体 章节 的 第 2 小节,掌握 多媒体系统 的 核心 软件 框架 HBN 浏览
多媒体 章节 的 第 3 小节,了解 多媒体系统 有 哪些 调试 手段,在 后面 使用 过程 中 遇到 问题 时,知道 有 哪些 手段 可以 调试
结合 示例
代码 章节的 demo, 逐个 了解 多媒体 章节 的 第 4-14 小 章节 的 模块,至此 可以 实现 摄像头 采集 和 处理 链路 的 搭建 按照
多媒体 章节 的 第 15 小节 调试 图像 质量
5.1.2. 整体概述
多媒体
同时,系统
硬件
方面:详述 硬件 模块 的 组成 结构 及 各 硬件 单元 之间 的 数据 交互 机制。 软件
方面:解析 软件 API 的 设计 与 功能,并 说明 如何 利用 API 实现 不同 硬件 单元 间 的 高效 数据 协作
5.1.3. 硬件方面
5.1.3.1. 组成
| 模块 | 全称 | 解释 |
|---|---|---|
| VIN | Video Input | 软件 |
| SIF | Sensor Interface | 衔接 MIPI 口,把 MIPI 接口 |
| ISP | Image Signal Processor | 图像 |
| VSE | Video Scaler | 图像 |
| OSD | On Screen Display | 视频 |
| GDC | Geometrical Distortion Correction | 几何 |
| VPU | Video Processing Unit | 视频 |
| JPU | JPEG Processing Unit | JPEG 图片 |
| 2DGPU | 2D Graphics Processing Unit | 2D 图像 |
| 3DGPU | 3D Graphics Processing Unit | 3D 图像 |
| Display | Video Display Unit | 视频 |
5.1.3.2. 数据交互
X5 芯片
然而,由于 ISP 的
基于
Offline 模式 ( 图中 绿色
箭头 ):数据通过 DDR 完成 传输,上游 模块 将 数据 写入 DDR,下游 模块 从 DDR 读取。此 模式 支持 多路 Camera Sensor 的 接入 的 场景。 Online 模式 ( 图中 红色
箭头 ):数据直接 从 上游 模块 传递 至 下游 模块,无需 读写 DDR,显著 提升 性能。然而,该 模式 仅 适用 于 单路 Camera Sensor 的 场景。
注意:多路 Camera Sensor 场景
下图

总结
VIN:包含 4 个 MIPI RX 和 4 个 SIFMIPI 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 设备; GDC、2DGPU、3DGPU,VPU、JPU:从 DDR 读数据,处理完再 写 到 DDR;
5.1.4. 软件方面
5.1.4.1. 框架

下面
HBN API: 包含了 HBN Framework API、ISP API、OSD API、Camera 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
MediaCodec API: 用于控制 VPU 和 JPU 模块,实现 H264 、 H265 、 JPEG 编解码 的 功能 , 详细 见 视频 编解码 Codec OpenGL ES、EGL、OpenCL、Vulkan: 3DGPU 的接口,通用 的 3DGPU 框架 , 详细 见 3DGPU N2D API: 2DGPU 的接口,详细 见 2DGPU, 部分 功能 集成 到 HBN 框架,推荐 使用 N2D APIDRM API: 视频显示 模块 的 接口,详细 见 视频 输出 Display HB_MEM API: 实现在 用户 空间 实现 大块 物理地址 连续 内存 的 管理,详细 见 内存 管理 Hbmem 实现
视频 帧 数据 缓存:所有 的 硬件加速 单元 和 DMA 模块 使用 的 内存 必须 是 物理地址 连续 的 实现
视频 帧 数据 流转:底层 基于 dmabuf,实现 了 图像 数据 在 内核 态 的 不同 驱动 之间 以及 内核 态 和 用户 态 之间 传递
5.1.4.2. 数据交互
在HB_MEM API,具备
用户
态 :支持内存 分配 在 用户 态 分配 大块 物理地址 连续 的 内存,满足 视频 处理 需求。 专用
内存 :分配区域 的 内存 来源于 ION区域(设备树中 预留 的 内存 区域, Linux 系统 的 标准 分配器 不会 使用 该 区域)。详细 见 ION 系统 调试 指南 零
拷贝 :基于数据传输 底层 的 dmabuf 框架,实现 不同 驱动 间 以及 内核 态 与 用户 态 之间 数据 的 直接 传递,避免 内存 拷贝 操作。 高效
内存 :通过管理 内存 池( mempool)避免 频繁 的 内存 申请 和 释放,从而 减少 用户 态 与 内核 态间 的 频繁 切换,提升 内存 分配 效率。 视频
帧 :提供结构 体 支持 结构 体 hb_mem_graphic_buf_t,用于 描述 视频 帧 的 数据 内容 和 格式 信息。
因此hb_mem_graphic_buf_t 完成hb_mem_graphic_buf_t 的 API,
可以
HBN API与MediaCodec API使用的 视频 帧 的 数据结构 是 hb_mem_graphic_buf_tN2D API视频帧 的 数据结构 是 n2d_buffer_t, 可以从 hb_mem_graphic_buf_t中获取 物理地址 和 视频 参数 后 转换成 n2d_buffer_t,详细见 sample_gpu_2d 使用 说明 DRM API底层也 是 基于 dmabuf 实现,可以 从 hb_mem_graphic_buf_t中获取 dmabuf 的 文件 描述符 后 转换成 dma_buf_map_t, 详细见 sample_vot 使用 说明 OpenGL ES、EGL、OpenCL、Vulkan: 待补充
不同
| 模块 | 输入 |
输出 |
输入 |
输出 |
|---|---|---|---|---|
| SIF | 宽 |
宽 |
-(输入 |
宽:16字节 |
| ISP | 宽 |
宽 |
宽:16字节 |
宽:16字节 |
| VSE | 宽 |
宽: 16的 |
宽:16字节 |
宽:16字节 |
| GDC | 宽 |
宽 |
宽:16字节 |
宽:16字节 |
| OSD | 宽: 16的 |
没有 |
- | - |
| VPU (Encoder) | 宽 |
-(输出 |
宽:32字节 |
-(输出 |
| VPU (Decoder) | 宽 |
宽 |
-(输入 |
宽 |
| JPU (Encoder) | 宽: 16的 |
-(输出 |
宽 |
-(输出 |
| JPU (Decoder) | 宽 |
宽 |
-(输入 |
宽 |
| 2DGPU | 宽:64的 |
宽:64的 |
宽:64字节 |
宽:64字节 |
| 3DGPU | 无 |
无 |
无 |
无 |
| Display(DC8000Nano) | 宽 |
-(不会 |
宽:32字节 |
- (不会 |
注意:
2DGPU 支持
多种 格式,上述 表格 描述 的 是 NV12 格式(常用 的 格式)的 情况, 不同 格式 的 像素 要求 是 不同 的,详细 见: 2DGPU 对齐 要求 3DGPU 调用函数
clCreateBuffer传入的 Flag是CL_MEM_USE_HOST_PTR的情况 下,需要 地址 和 大小 都 要 64字节 对齐