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-gnu
i686-unknown-linux-gnu
armv7-unknown-linux-gnueabihf
aarch64-unknown-linux-gnu
riscv64gc-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