1.2、整体 Pipeline 总览
buffer 流向
sql
┌──────────────────────────────────────────────────────────────┐
│ DDR (共享内存) │
│ │
│ ┌──────────────┐ │
│ │ Compressed │ │
│ │ Video Stream │ (H.264 / H.265 / VP9) │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ DMA Buffer (YUV) │
│ │ VPU │──────────────────────────────┐ │
│ │ (MPP / VDEC) │ │ │
│ └──────┬───────┘ │ │
│ │ │ │
│ │ (optional) │ │
│ ▼ │ │
│ ┌──────────────┐ DMA Buffer (RGB/YUV) │ │
│ │ RGA │──────────────────────────────┘ │
│ │ (Resize/CSC) │ │
│ └──────┬───────┘ │
│ │ │
│ │ │
│ ▼ │
│ ┌──────────────┐ GPU Framebuffer (RGBA) │
│ │ GPU │◀──────── Qt / OpenGL / EGL ─────────┐ │
│ │ (Mali-G52) │ │ │
│ └──────┬───────┘ │ │
│ │ │ │
│ ▼ │ │
│ ┌──────────────────────────────────────────────────┐ │ │
│ │ DRM / VOP2 │◀─┘ │
│ │ │ │
│ │ Plane-0 : Video (from VPU/RGA buffer) │ │
│ │ Plane-1 : UI (from GPU framebuffer) │ │
│ │ Plane-2 : Cursor / Overlay │ │
│ │ │ │
│ └──────────────┬───────────────────────────────────┘ │
│ │ │
│ ▼ │
│ LCD / HDMI / MIPI │
└──────────────────────────────────────────────────────────────┘
1.2.1、逐模块 + Buffer流向详解(非常关键)
下面我不讲概念,只讲真实数据是怎么走的。
1.2.1.1、VPU(视频解码路径)
css
Compressed stream
↓
VPU (MPP / V4L2)
↓
DMA buffer (YUV420 / NV12)
要点:
VPU输出的是 原始帧- 帧放在
DMA buffer(物理连续内存) CPU不拷贝、不参与像素处理
这一步决定:CPU 占用是否低
1.2.1.2、RGA(可选:图像处理)
css
VPU YUV buffer
↓
RGA
(resize / rotate / CSC)
↓
DMA buffer (目标尺寸 / RGB)
什么时候一定要 RGA?
- 视频分辨率 ≠ 屏幕分辨率
- 视频是
YUV,但DRM/GPU需要RGB - 需要旋转 / 镜像
RGA 是"视频帧进入显示系统前的整形器"
1.2.1.3、GPU(UI 渲染路径)
css
Qt / OpenGL
↓
GPU (Mali)
↓
Framebuffer (RGBA8888)
注意:
GPU不解视频GPU的buffer通常是GEM / dumb bufferUI动画、透明度、文字都在这里完成
这一路和 VPU 是完全并行的
1.2.1.4、DRM / VOP2(最终合成 + 输出)
css
Plane-0 ← Video buffer (VPU / RGA)
Plane-1 ← UI buffer (GPU)
Plane-2 ← Overlay / Cursor
↓
Hardware composition
↓
Scanout
关键点(非常重要):
DRM不拷贝bufferDRM不"算"像素DRM只是:- 绑定
buffer - 设置
plane - 设置
alpha / z-order - 扫描输出
- 绑定
这是为什么 DRM overlay 几乎不耗 CPU/GPU
1.2.2、真实项目常见 Pipeline
-
UI+ 单视频(最常见)nginxVPU ──────▶ DRM plane-0 GPU ──────▶ DRM plane-1性能最好
GPU压力最小推荐方案
-
双视频叠加
nginxVPU(0) ─▶ DRM plane-0 VPU(1) ─▶ DRM plane-1 (alpha=0.5) GPU ─▶ DRM plane-2GPU几乎不参与视频
DRM plane数量是瓶颈 -
不用
DRM overlay(性能最差)nginxVPU → RGA → GPU → GPU 合成 → DRMGPU负担重
UI+ 视频一起掉帧只在
DRM plane不够时才用
1.2.3、Buffer 类型对照表
Buffer |
来源 | 用途 |
|---|---|---|
DMA buffer |
VPU / RGA |
视频帧 |
GEM buffer |
GPU |
UI / OpenGL |
dumb buffer |
DRM |
scanout |
ION / CMA |
kernel |
连续内存池 |