#av1 #decoder #cross-platform #assembly #flags #port #decoding

rav1d

Rust语言对dav1d AV1解码器的移植

2个版本 (1个稳定版本)

1.0.0 2024年7月19日
0.1.0 2019年6月6日

#23 in 视频

Download history 1/week @ 2024-05-16 111/week @ 2024-07-18 5/week @ 2024-07-25

每月116次 下载
rav1d-cli 中使用

BSD-2-Clause

10MB
263K SLoC

Assembly 154K SLoC // 0.0% comments GNU Style Assembly 61K SLoC // 0.1% comments Rust 48K SLoC // 0.0% comments Shell 126 SLoC // 0.2% comments Forge Config 4 SLoC

rav1d

rav1d 是一个AV1跨平台解码器,开源,注重速度和正确性。它是 dav1d 的Rust语言版本。

构建

rav1d是用Rust编写的,并使用标准的Rust工具链进行构建。可以通过访问 https://rustup.rs 来安装Rust工具链。rav1d库在稳定版Rust上为 x86x86_64aarch64 进行构建,但当前需要夜班编译器来支持 armriscv64。项目默认配置为通过 rust-toolchain.toml 使用夜班编译器,但可以使用 +stable cargo标志进行稳定库构建。

对于x86目标,您还需要安装 nasm 以支持汇编。

然后可以使用cargo创建发布版本

cargo build --release

为开发目的,您还可以使用 opt-dev 配置文件,它的运行速度比常规调试构建快,但仍然启用了所有调试检查

cargo build --profile opt-dev

仅使用稳定编译器构建 librav1d

cargo +stable build --lib --release

特性标志

以下特性标志受支持:

  • asm - 启用针对目标平台可用的优化汇编例程。
  • bitdepth_8 - 启用对8位深度解码的支持。
  • bitdepth_16 - 启用对10位和12位深度解码的支持。

所有这些特性默认启用。若要构建禁用其中一个或多个特性的librav1d版本,请使用--no-default-features标志结合--features标志来启用所需特性。例如,要构建不使用汇编例程的版本,这在测试Rust回退函数时很有用,请执行以下操作:

cargo build --no-default-features --features="bitdepth_8,bitdepth_16"

交叉编译

可以使用cargo--target标志将rav1d交叉编译为目标平台以外的平台。这将要求向rustc传递额外的参数,以告诉它使用哪个链接器。这可以通过设置RUSTFLAGS环境变量并指定linker编译器标志来实现。例如,从Ubuntu Linux机器编译aarch64-unknown-linux-gnu将按以下方式进行:

RUSTFLAGS="-C linker=aarch64-linux-gnu-gcc" cargo build --target aarch64-unknown-linux-gnu

如果您是为了在QEMU(qemu-*-static)下运行测试而进行交叉编译,您还需要指定+crt-static目标特性。

RUSTFLAGS="-C target-feature=+crt-static -C linker=aarch64-linux-gnu-gcc" cargo build --target aarch64-unknown-linux-gnu

这要求为目标平台安装rustup组件以及适合您的目标平台的适当交叉平台编译器/链接器工具链。我们如何在CI中交叉编译rav1d的示例可以在.github/workflows/build-and-test-qemu.yml中找到。

以下目标是当前支持的:

  • x86_64-unknown-linux-gnu
  • i686-unknown-linux-gnu
  • armv7-unknown-linux-gnueabihf
  • aarch64-unknown-linux-gnu
  • riscv64gc-unknown-linux-gnu

运行测试

目前我们使用原始的Meson测试套件来测试Rust端口。这意味着您需要安装Meson才能运行测试。

要设置和运行测试,请执行以下操作:

首先,使用cargo构建rav1d。您需要手动执行此步骤,因为当运行测试时,它不会自动构建。建议使用releaseopt-dev配置文件运行测试,因为调试构建运行缓慢,通常会导致测试超时。opt-dev配置文件通常适用于开发目的,因为它启用了某些优化,同时保留了调试检查。

cargo build --release

或者

cargo build --profile opt-dev

然后您可以使用test.sh辅助脚本运行测试

.github/workflows/test.sh -r target/release/dav1d

或者

.github/workflows/test.sh -r target/opt-dev/dav1d

测试脚本接受额外的参数来配置测试的运行方式

  • -s PATH - 指定seek_stress二进制文件的路径以运行seek_stress测试。这通常在主dav1d二进制文件的同一输出目录中,例如target/release/seek_stress
  • -t MULTIPLIER - 指定测试超时的乘数。允许测试运行时间更长,例如在运行调试构建的测试时。
  • -f DELAY - 指定测试的帧延迟。如果指定,测试还将使用多线程运行。
  • -n - 使用负步长进行测试。
  • -w WRAPPER - 指定用于运行测试的包装二进制文件。在非主机平台下使用QEMU进行测试时,这是必要的。

您可以通过参考.github/workflows文件夹中的CI脚本来了解更多有关如何构建和测试的信息。

使用 rav1d

librav1d 设计为 libdav1d 的直接替代品,因此它主要公开了一个与 libdav1d 相同用法的 C API。这可以在由 cargo build 生成的 librav1d.a 库中找到。有关 libdav1d 的主要 API 文档,请参考libdav1d,并且等效的 Rust 函数可以在src/lib.rs中找到。您还可以参考 dav1d 二进制文件的代码,以了解它如何使用 API,该代码可在tools/dav1d.rs中找到。

计划在未来添加一个 Rust API

依赖项

~2–7.5MB
~54K SLoC