将 C 移植到 Rust 以实现快速且安全的 AV1 媒体解码器

主要观点:AV1 是重要视频格式,需内存安全高性能解码器,团队将 C 解码器dav1d移植为 Rust 版rav1d,介绍迁移方法及遇到的挑战。
关键信息

  • 现代软件中复杂数据解析是安全关键操作,AV1 格式复杂需安全实现,rav1ddav1d的 Rust 移植版,兼容 C API 且保留性能。
  • 迁移采用先将 C 代码 transpile 为不安全 Rust 再手动重写的方式,虽耗时超预期但能充分测试和减少调试。
  • 遇到 C 与安全 Rust 模式不匹配的挑战,如线程安全(需引入锁)、自引用结构(改指针为索引等)、联合体(用zerocopy crate reinterpret 字节)。
    重要细节
  • dav1d开发多年,代码量大,rav1d需保留与dav1d相同的数据结构布局和调用方式。
  • Rust 线程安全模型严格,通过MutexRwLock处理共享数据的线程安全,使用DisjointMut处理并发访问缓冲区,用原子类型替代锁以提高性能。
  • dav1d的自引用结构进行重构,移除子结构到容器的指针,改为传递额外结构引用。
  • 对于dav1d中的联合体,将有标签的 C 联合体重写为安全的标记 Rust 枚举,或用zerocopy crate 在运行时 reinterpret 字节。
  • rav1d目前比dav1d C 实现慢约 6%,后续将优化性能,且在安全至上的应用中提供内存安全实现,感谢相关支持并可在 GitHub 查看rav1d
阅读 18
0 条评论