2 min read

Raspberry Pi 向けの libcamera-rs と v4l2-rs を公開しました

時雨堂では C++ から Rust への移行を少しずつ進めています。C++ が無くなるということはないと思いますが、Rust 化できるところは Rust にしていこうという方針です。

Momo という WebRTC ネイティブクライアント (CLI 経由で WebRTC が利用できる) 仕組みがあるのですが、この Momo は Raspberry Pi Camera が使えたり、Raspberry Pi 4 まで搭載されている H.264 のハードウェアアクセラレーターを使って WebRTC で映像配信ができるというのが強みです。

Momo の Rust 版を開発するにあたりこの部分を Crate として分けることにしました。

libcamera-rs

libcamera は Raspberry Pi Camera (以降 Camera) を利用する場合に書かせないライブラリです。Camera を使うだけなら V4L2 を叩いて使うことはできるのですが細かい機能を使うには libcamera が必須です。 Raspberry Pi 側でチューニングした設定が入っているのも強みです。

Rust から libcamera を呼び出す場合は、libcamera 自体は Raspberry Pi OS に内蔵されており、動的に呼び出す方式で実装しています。

libcamera 自体は C++ で書かれているので一度 C API を生やして、それを bindgen を利用して自動生成する仕組みを使っています。あとは C API を cc でコンパイルして Rust 側から利用できるようにしています。

あとは Rust でラッピングして使いやすくして終わりです。

GitHub - shiguredo/libcamera-rs: Rust bindings for libcamera
Rust bindings for libcamera. Contribute to shiguredo/libcamera-rs development by creating an account on GitHub.

v4l2-rs

Raspberry Pi 4 までは H.264 ハードウェアアクセラレーターを積んでいます。これを Raspberry Pi OS 64 bit で利用するには v4l2 mem2mem を使う必要があります。

V4L2 自体はカーネルの機能なので libc を使うことで呼び出せます。汎用的な V4L2 ライブラリは将来のタスクとして、まずはRaspberry Pi 専用に実装しました。

これで libcamera-rs + v4l2-rs + mp4-rs で簡単に Rust で Raspberry Pi Camera を使って H.264 ファイルを生成できるようになりました。サンプルを用意してありますので、もし良ければ使ってみてください。

GitHub - shiguredo/v4l2-rs
Contribute to shiguredo/v4l2-rs development by creating an account on GitHub.

課題

問題はビルドです。macOS でビルド出来ないんですよね。Linux arm64 マシンが必要になるので、今どうにか気軽にビルド出来る仕組みがないか考えています。Development Containers 辺りがいいかなとは思っています。