3个版本

0.0.3 2024年8月2日
0.0.2 2024年5月1日
0.0.1 2024年3月18日

#127操作系统

Download history 166/week @ 2024-04-27 7/week @ 2024-05-04 128/week @ 2024-07-27 28/week @ 2024-08-03

156 每月下载次数
2 crates 中使用

MIT 许可证

1.5MB
42K SLoC

V4L2的Rust绑定

LICENSE Build Status Crates.io dependency status Documentation

这是一个正在进行的库,用于实现V4L2的Rust安全绑定和高级接口。

目前实现了以下内容

  • OUTPUTCAPTURE队列的安全低级抽象,以及MMAPUSERPTRDMABUF内存类型的缓冲区分配/排队/出队操作
  • 状态视频解码器接口的高级抽象
  • 状态视频编码器接口的高级抽象
  • 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/video0vicodec 编码器的路径。

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