MPP介绍
概述
MPP(Media Process Platform)是 Rockchip 提供的一套 硬件视频编解码中间件,用于统一调用芯片上 VPU(Video Processing Unit) 硬件资源,实现高性能视频编码和解码。MPP 是嵌入式视频/流媒体开发的重要组件,支持 RK 系列 SoC(如 RK3288、RK3399、RK3566、RK3588 等)。
核心功能
- 硬件解码(VDEC):支持 H.264、H.265/HEVC、VP8、VP9、AV1 等格式。
- 硬件编码(VENC):支持 H.264、H.265、JPEG、AV1 等格式。
- 统一 API 接口:通过 C API 或 V4L2,简化上层应用调用。
- 高性能多路处理:支持多路视频流并发编解码,降低 CPU 占用,节省功耗。
- 跨平台:Linux/Android 平台均可使用。
- 开源支持:源码开源,可根据项目需求修改和移植。
MPP 结构
MPP 在源码层面主要分为以下模块:
| 模块 | 功能 |
|---|---|
| OSAL | 跨平台底层封装:内存、线程、时间、日志等 |
| MPI / Mpp API | 用户调用接口:编码/解码任务提交与获取 |
| Base | 核心数据结构:MppBuffer、MppFrame、MppPacket、MppTask |
| Codec | 比特流解析与处理逻辑(Parser + WorkFlow) |
| HAL | 硬件抽象层,将 Codec 命令映射到 VPU 寄存器并触发执行 |
典型数据流:
用户应用 → MPI API → MPP Task → Codec Parser → HAL → VPU → 输出帧/比特流
使用场景
- 安防摄像头、智能家居摄像头
- 视频会议终端、机顶盒、投影仪
- AI + 视频前处理(VPU 编解码加速)
- 流媒体直播/录播系统
5. 仓库地址
- 官方主线仓库(Rockchip Linux MPP):
Rockchip 官方 MPP 仓库 - HermanChen 分支(活跃开发分支):
HermanChen MPP 仓库
开源代码目录结构
mpp/ ← 项目根
├── inc/ ← 公共头(rk_mpi.h 等)
├── osal/ ← 操作系统抽象层(线程、内存、时间…)
├── mpp/ ← MPP 主体(编解码上下文、码流处理)
│ ├── base/ ← MppBuffer / MppFrame / MppPacket 实现
│ ├── codec/ ← 各编解码器适配层
│ ├── hal/ ← 硬件抽象层(寄存器、ioctl)
│ └── vproc/ ← 视频后处理(IEP、VDPP)
├── kmpp/ ← 内核 MPP(newer flow)
├── utils/ ← 测试程序共用的工具代码
│ ├── mpi_dec_utils.{c,h} ← 解码测试用的命令行解析、文件读取
│ ├── mpi_enc_utils.{c,h} ← 编码测试用的命令行解析、ROI/OSD 工具
│ └── ...
└── test/ ← 测试的demo
test/ 下的程序不构建库,只产出可执行文件。它们链接 libmpp.so(或静态库)+ utils/ 这个内部静态库,跑在板子的用户态。
Rockchip MPP 模块结构示意图
+------------------------------------------------------+
| 上层应用/多媒体框架(Linux/Android) |
| OpenMax / gstreamer / libva / FFmpeg (hwaccel) |
+-----------------------------|------------------------+
▼
+---------------------------- MPP ----------------------------+
| |
| +--------------------+ +----------------------------+ |
| | MPI / MPP | | OSAL | |
| | Media Process API | | Operation System Abstract | |
| | (Open/Init/Put/Get)| | Layer: memory/thread/log | |
| +--------------------+ +----------------------------+ |
| | |
| ▼ |
| +------------------+ |
| | base | |
| | core components: | |
| | MppBuffer / | |
| | MppFrame / | |
| | MppPacket / | |
| | MppTask / MppMeta | |
| +------------------+ |
| | |
| ▼ |
| +------------------+ |
| | codec | |
| | parser + encoder/ | |
| | decoder workflows | |
| +------------------+ |
| | |
| ▼ |
| +------------------+ |
| | HAL | |
| | Hardware Abstraction| |
| | - register generator | |
| | for VPU codecs | |
| +------------------+ |
+----------------------------|-------------------------------+
▼
+------------------------ kernel ----------------------+
| |
| vcodec_service / v4l2 hardware drivers |
| (stateless frame hw codec kernel interface) |
+------------------------------------------------------+
各层职责解释
1) MPI / MPP 层
- MPP 的核心对外接口,提供统一的 媒体处理 API(打开/初始化/送入帧/取出结果)。
- 管理内部任务队列、帧/包队列,负责上层与内部 codec/HAL 的协作。
- 是上层应用调用硬件编解码的入口。
2) OSAL(系统抽象层)
- 屏蔽不同操作系统差异(内存分配、线程、时间、日志等)。
- 保证 MPP 在 Linux、Android等平台可跨平台编译和运行。
3) Base(核心数据结构层)
- 定义 MPP 的核心数据类型:
- MppBuffer:统一缓冲区对象(dma-buf / ion / drm 等)。
- MppFrame:视频帧结构。
- MppPacket:流数据包结构。
- MppTask / MppMeta:任务与元数据。
- 为 codec 层和 HAL 层提供统一数据承载。
4) Codec(编/解码工作流 + 解析)
- 对具体视频格式(H.264/H.265/VP8/VP9/JPEG 等)实现解析器、控制流程、逻辑。
- 分析流数据、组织 codec 工作任务、与 HAL 交互。
5) HAL(硬件抽象层)
- 将 codec 解析结果映射为硬件寄存器设置,生成配合内核驱动的配置。
- 核心作用是与 VPU(Video Processing Unit) 硬件协作:
- 生成给 vcodec_service 内核驱动的寄存器命令。
- 支持多种编码/解码格式。
- HAL 是 MPP 与真实硬件的桥梁。
6) 内核层(kernel)
- MPP 通过 HAL 与 SoC 的硬件编/解码内核驱动交互:
- vcodec_service:Stateless API kernel side。
- v4l2:V4L2 codec interface(部分平台)。
- 最终由内核驱动调度 VPU 硬件处理。
仓库里的目录对应关系
mpp/ - MPP 核心实现(MPI + base + codec + hal)
osal/ - 跨平台抽象层
inc/ - 对外头文件接口(MPI/公共定义)
test/ - MPP 功能测试与示例代码
doc/ - 设计说明文档
utils/ tools/ - 工具与辅助脚本
kmpp/ - 可能的 kernel 侧接口代码
build/ - CMake 构建脚本配置
这反映出 MPP 既是一个 library,又是一个跨平台中间件。
调用流程简化
应用(如 FFmpeg + libva/VAAPI)
↓
MPI / MPP API 调用
↓
Base + Codec 解析与任务组织
↓
HAL 生成寄存器命令
↓
Kernel vcodec_service 驱动
↓
SoC VPU 硬件执行
↓
返回 decoded frames / encoded packets
文件分组速查
| 用途 | 文件 | 行数 | 主线程模型 | 何时用 |
|---|---|---|---|---|
| 版本查询 | mpp_info_test.c | 30 | 无 | 验证库装对了没 |
| 解码(基础) | mpi_dec_test.c | 656 | 单解码线程 | 学解码 API 的入口 |
| 解码(输入输出分线程) | mpi_dec_mt_test.c | 443 | 一进一出两线程 | 流式低延迟场景参考 |
| 解码(无超时同步) | mpi_dec_nt_test.c | 521 | 单解码线程 | 用 decode() 一步到位 API |
| 解码(多实例) | mpi_dec_multi_test.c | 649 | 每实例 1 线程 | 多路并发性能测试 |
| 编码(基础) | mpi_enc_test.c | 766 | 每实例 1 线程 | 学编码 API 的入口 |
| 编码(输入输出分线程) | mpi_enc_mt_test.c | 680 | 一进一出两线程 | 摄像头实时编码参考 |
| 转码 + 码控 | mpi_rc2_test.c | 1149 | 解码 1 线程 + 主线程 | RC 调参、PSNR/SSIM 评估 |
| 旧 API 兼容 | vpu_api_test.c | 805 | 单线程 | 维护 legacy 应用 |
学习路径建议:先
mpp_info_test热身 →mpi_dec_test啃透 →mpi_enc_test→ 其它都是变体,照着对比看就行。
命名规则
读代码前记住几个缩写:
mpi= MPP Interface(rk_mpi.h那套对外 API)enc/dec= encoder / decodermt= multi-thread(输入输出分线程,不是多实例)nt= no-thread / no-timeout(关闭 MPP 内部解码线程,调用者一次decode()包揽 put+get)multi= multi-instance(多路并发,多实例)rc= rate control(码率控制)rc2= “RC 测试 v2″,相对于已废弃的mpi_rc_test
容易搞混的是 mt vs multi:
mt(multi-thread):1 个编/解码上下文,2 个线程(一个喂、一个取)multi:N 个上下文,N 个线程,每个互不干扰,用来测吞吐
Test Demo样例
mpp_info_test:把库版本和兼容矩阵打到屏幕上mpi_dec_test:解码教科书,simple + advanced 两条路全在这mpi_dec_mt_test:把 put 和 get 分两个线程来证明真异步mpi_dec_nt_test:MPP_SET_DISABLE_THREAD+mpi->decode()一步走完mpi_dec_multi_test:开 N 个解码器跑并发性能mpi_enc_test:编码教科书,含 ROI / OSD / 用户数据等所有 featurempi_enc_mt_test:编码端的 put_frame / get_packet 分线程版mpi_rc2_test:解码 → 再编码 → 再解码 → 算 PSNR/SSIM,调 RC 用vpu_api_test:旧 VPU API(libvpu)的兼容 demo,新代码别学这个
© 版权声明
转载请注明出处,并标明原文链接。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
THE END












暂无评论内容