3个版本
0.0.3 | 2024年8月2日 |
---|---|
0.0.2 | 2024年5月1日 |
0.0.1 | 2024年3月18日 |
#127 在 操作系统
156 每月下载次数
在 2 crates 中使用
1.5MB
42K SLoC
V4L2的Rust绑定
这是一个正在进行的库,用于实现V4L2的Rust安全绑定和高级接口。
目前实现了以下内容
- 对
OUTPUT
和CAPTURE
队列的安全低级抽象,以及MMAP
、USERPTR和
DMABUF
内存类型的缓冲区分配/排队/出队操作 - 对状态视频解码器接口的高级抽象
- 对状态视频编码器接口的高级抽象
- C FFI,用于从C程序中使用视频解码器接口
该库为V4L2提供了多个级别的抽象
-
最低级别是一个非常薄的V4L2 ioctls层,尽可能地接近实际的内核API,同时增加了额外的安全性和去除了一些历史负担,如单平面和多平面队列格式的差异。
-
更高级的抽象将设备、队列和其他V4L2概念作为强类型对象暴露出来。这里的目的是提供一个易于使用的接口,同时保持足够的通用性,可以用于任何类型的V4L2设备。
-
最后,更专业的抽象可用于应用程序执行特定任务,如使用硬件加速解码视频。对于这些抽象,通常会提供C FFI,这样它们的用途不仅限于Rust。
应将依赖保持在最低限度:此库直接使用ioctls与内核通信,并且仅依赖于几个小型、稳定的项目。
项目布局
lib
包含Rust库(v4l2r
),包括薄的 ioctl
抽象、更易用的 device
抽象以及特定任务的模块,例如视频解码和编码。
ffi
包含C FFI(v4l2r-ffi
),目前作为静态库暴露给其他项目链接。在构建时生成一个包含公共API的 v4l2r.h
头文件。
如何使用
请检查 lib/examples/vicodec_test/device_api.rs
以获取如何使用 device
级别接口的简短示例,或检查 lib/examples/vicodec_test/ioctl_api.rs
以获取使用更低级别的 ioctl
API 的相同示例。这两个示例都使用 vicodec
内核驱动程序(必须事先插入,例如使用 modprobe vicodec multiplanar=1
)将生成的帧编码为 FWHT
格式。
您可以使用以下示例进行尝试
cargo run --example vicodec_test -- /dev/video0
以运行 device
API 示例,或
cargo run --example vicodec_test -- /dev/video0 --use_ioctl
以运行 ioctl
示例,假设 /dev/video0
是 vicodec
编码器的路径。
lib/examples/fwht_encoder
包含另一个示例程序,该程序实现了一个在自身线程中运行的更高级别的 vicodec 编码器。它可以按以下方式运行
cargo run --example fwht_encoder -- /dev/video0 --stop_after 20 --save test_encoder.fwht
此调用将编码 20 个生成的帧,并将生成的流保存到 test_encoder.fwht
。向程序传递 --help
获取更多选项。
lib/examples/simple_decoder
是一个解码器示例,它可以解码上述 fwht_encoder
示例产生的流以及简单的 Annex-B H.264 流。例如,要解码我们刚才创建的 FWHT 流
cargo run --example simple_decoder -- test_encoder.fwht /dev/video1 --save test_decoder.bgr
test_decoder.bgr
可以使用例如 YUView 检查。格式将是 640x480 BGR,如解码程序报告的那样。
最后,ffi/examples/c_fwht_decode/
包含一个 C 程序,演示如何使用 C FFI 解码 FWHT 流。请参阅该目录中的 Makefile
以获取构建和使用说明。该程序纯粹用于演示 C FII:它被硬编码为解码同一目录中的 sample.fwht
文件,并且不支持任何其他输出。
依赖关系
~2.5MB
~57K SLoC