瑞芯微开发笔记 · MPP 篇(零)MPP介绍

瑞芯微开发笔记 · MPP 篇(零)MPP介绍

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. 仓库地址

开源代码目录结构

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.c30验证库装对了没
解码(基础)mpi_dec_test.c656单解码线程学解码 API 的入口
解码(输入输出分线程)mpi_dec_mt_test.c443一进一出两线程流式低延迟场景参考
解码(无超时同步)mpi_dec_nt_test.c521单解码线程decode() 一步到位 API
解码(多实例)mpi_dec_multi_test.c649每实例 1 线程多路并发性能测试
编码(基础)mpi_enc_test.c766每实例 1 线程学编码 API 的入口
编码(输入输出分线程)mpi_enc_mt_test.c680一进一出两线程摄像头实时编码参考
转码 + 码控mpi_rc2_test.c1149解码 1 线程 + 主线程RC 调参、PSNR/SSIM 评估
旧 API 兼容vpu_api_test.c805单线程维护 legacy 应用

学习路径建议:先 mpp_info_test 热身 → mpi_dec_test 啃透 → mpi_enc_test → 其它都是变体,照着对比看就行。

命名规则

读代码前记住几个缩写:

  • mpi = MPP Interface(rk_mpi.h 那套对外 API)
  • enc / dec = encoder / decoder
  • mt = 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 个线程(一个喂、一个取)
  • multiN 个上下文,N 个线程,每个互不干扰,用来测吞吐

Test Demo样例

  • mpp_info_test:把库版本和兼容矩阵打到屏幕上
  • mpi_dec_test:解码教科书,simple + advanced 两条路全在这
  • mpi_dec_mt_test:把 put 和 get 分两个线程来证明真异步
  • mpi_dec_nt_testMPP_SET_DISABLE_THREAD + mpi->decode() 一步走完
  • mpi_dec_multi_test:开 N 个解码器跑并发性能
  • mpi_enc_test:编码教科书,含 ROI / OSD / 用户数据等所有 feature
  • mpi_enc_mt_test:编码端的 put_frame / get_packet 分线程版
  • mpi_rc2_test:解码 → 再编码 → 再解码 → 算 PSNR/SSIM,调 RC 用
  • vpu_api_test:旧 VPU API(libvpu)的兼容 demo,新代码别学这个
© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容