跳到主要内容

MPP 硬编解码

MPP 是 Rockchip 提供的媒体处理软件平台,全称 Media Process Platform。它把芯片底层编解码差异封装起来,对上层提供统一的 MPI 接口,用来做视频硬解、硬编和部分视频处理。

官方项目:

MPP 系统框架

MPP 位于应用和内核编解码驱动之间,上层通过 MPI 接口调用,底层由 MPP 处理编解码模块、系统适配和硬件访问。

适用场景

在 Neardi Pi 3 上,如果应用需要使用硬件编解码能力,而不是纯 CPU 编解码,一般就会用到 MPP。

常见场景:

  • 解码 H.264 / H.265 等视频流,用于显示、AI 前处理或文件播放。
  • 将摄像头图像编码成 H.264 / H.265 / MJPEG 码流。
  • 开发低延迟视频应用,直接控制 Rockchip 编解码硬件。
  • 和 GStreamer、FFmpeg 或自研 C/C++ 应用集成。

MPP 更偏底层。如果只是快速搭建媒体链路,GStreamer 通常更方便;如果需要精细控制 buffer、延迟、码率控制或零拷贝路径,直接使用 MPP 会更合适。

功能范围

具体编解码能力和 SoC、SDK 配置有关。MPP 通常提供:

功能常见格式
视频解码H.265、H.264、VP9、VP8、MPEG-4、MPEG-2、MPEG-1、VC1、MJPEG、AV1
视频编码H.265、H.264、VP8、MJPEG
视频处理拷贝、缩放、色彩空间转换、去隔行

量产项目前,建议再结合 SDK release note 或 Rockchip multimedia benchmark 文档确认 RK3576 的实际能力。

核心概念

MPP 常用的数据结构包括:

  • MppCtx:编解码实例上下文。
  • MppApi:MPI 操作接口。
  • MppPacket:压缩码流包,常用于解码输入或编码输出。
  • MppFrame:解码后的图像帧或编码前的原始帧。
  • MppBuffer:硬件友好的 buffer,通常和 DMA-BUF 相关。
  • MppTask:高级任务接口,用于更复杂的处理流程。

简单解码流程可以理解为:

bitstream -> MppPacket -> decode_put_packet()
decode_get_frame() -> MppFrame -> display / process / save

简单编码流程可以理解为:

raw image -> MppFrame -> encode_put_frame()
encode_get_packet() -> MppPacket -> file / network stream

源码和编译

SDK 中 MPP 一般在:

SDK/external/mpp

也可以从官方仓库获取:

git clone https://github.com/rockchip-linux/mpp.git

MPP 支持 CMake 构建。基于 SDK 开发时,优先使用 SDK 内置的编译流程,因为它和发布镜像中的 kernel driver、用户态库以及板级配置更匹配。

Demo 和工具

MPP 源码里包含 demo 和实用工具,常用于快速验证硬解、硬编链路。

调试时重点看:

  • 输入码流格式和分辨率是否正确。
  • 输出帧格式、stride 和 buffer 排布是否符合预期。
  • 内核 video codec driver 是否启用。
  • 应用是否有权限访问对应的编解码设备节点。

开发注意点

  • MPP 依赖 Rockchip 内核编解码驱动和对应 DTS 配置。
  • 需要性能时,尽量减少不必要的内存拷贝,优先考虑 DMA-BUF / 零拷贝路径。
  • 注意图像 stride 和像素格式,硬件 buffer 通常有对齐要求,不一定等于可见宽度。
  • 做推流时,需要根据延迟和带宽要求调整码率、GOP、帧率和码率控制模式。
  • 调试建议先跑官方 demo,再逐步替换输入输出部分。

相关页面