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 | ioctl request |
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库日志。
正在加载留言…