MPP 视频编解码服务框架

MPP 视频编解码服务框架

1. 组成

rk_vcodec.o基础对象:

  • mpp_service.o:服务和字符设备;
  • mpp_common.o:session/task/ioctl/queue;
  • mpp_iommu.o:buffer映射。

Codec backend按Kconfig链接。

2. Backend

本树支持:

  • RKVDEC/RKVDEC2;
  • RKVENC/RKVENC2;
  • VDPU1/VDPU2;
  • VEPU1/VEPU2;
  • IEP2;
  • JPEG decoder/encoder;
  • AV1 decoder;
  • VDPP。

3. 设备入口

Service分配字符设备号、class和device。具体hardware device使用mpp_dev_ioctl,open创建session并与backend绑定。

4. 会话

Session隔离每个用户context:

  • pending/running task;
  • imported buffers;
  • register offsets;
  • codec type;
  • wait状态;
  • cleanup。

它是软件隔离,不代替IOMMU和输入验证。

5. Task

1
2
3
4
5
6
7
8
9
10
11
ioctl request
-> parse message/register data
-> allocate task
-> translate offsets/buffers
-> enqueue
-> scheduler chooses device
-> power on
-> program registers
-> IRQ finish
-> readback result
-> wake session

6. Register Translation

Userspace通常提交硬件寄存器参数。Backend必须只接受允许的register范围,并把buffer fd/offset转换为IOVA,不能允许任意physical address。

7. IOMMU

mpp_iommu.c负责attach/map/unmap和fault相关处理。Mapping lifetime至少覆盖硬件task;session close时先cancel/drain task再释放。

8. IRQ

Top-half应快速读取/清除status并标记结果;耗时完成处理放到thread/work/tasklet。Spurious IRQ和stale completion需通过active task状态判断。

9. Timeout和Reset

Codec可能因bitstream、寄存器、IOMMU或硬件问题hang。Timeout worker需reset硬件,并把当前task返回错误,不能让等待者永久阻塞。

10. PM

每个task开始前runtime-resume clock/power,完成后autosuspend。频率可能通过devfreq/OPP调整。

11. RK3588

rockchip_linux_defconfig启用了MPP service和RKVDEC2/RKVENC2/AV1等多backend。是否真正probe取决于最终DTS中对应codec节点、IOMMU、clock/reset和status

12. 与V4L2的区别

MPP是Rockchip vendor ABI;上游codec通常使用V4L2 mem2mem/stateless API。用户库不能互换,容器镜像必须匹配目标kernel ABI。

13. 性能

  • 减少buffer copy,使用dma-buf;
  • 批量/链式task;
  • 避免频繁power cycle;
  • 正确配置IOMMU和DDR QoS;
  • decoder/encoder并行时考虑共享带宽。

14. 安全

压缩bitstream和用户register均不可信。重点审计长度/offset乘法、register白名单、session close、timeout reset、IOMMU fault和信息泄露。

15. 调试

查看device node、MPP版本、procfs状态、session/task队列、IRQ计数、reset、IOMMU faults、clock以及userspace mpp库日志。

文章互动

阅读 --

留言

0 条留言

正在加载留言…