2个版本 (1个稳定版本)
| 1.0.0 | 2024年7月19日 |
|---|---|
| 0.1.0 | 2019年6月6日 |
#23 in 视频
每月116次 下载
在 rav1d-cli 中使用
10MB
263K SLoC
rav1d
rav1d 是一个AV1跨平台解码器,开源,注重速度和正确性。它是 dav1d 的Rust语言版本。
构建
rav1d是用Rust编写的,并使用标准的Rust工具链进行构建。可以通过访问 https://rustup.rs 来安装Rust工具链。rav1d库在稳定版Rust上为 x86、x86_64 和 aarch64 进行构建,但当前需要夜班编译器来支持 arm 和 riscv64。项目默认配置为通过 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-gnui686-unknown-linux-gnuarmv7-unknown-linux-gnueabihfaarch64-unknown-linux-gnuriscv64gc-unknown-linux-gnu
运行测试
目前我们使用原始的Meson测试套件来测试Rust端口。这意味着您需要安装Meson才能运行测试。
要设置和运行测试,请执行以下操作:
首先,使用cargo构建rav1d。您需要手动执行此步骤,因为当运行测试时,它不会自动构建。建议使用release或opt-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