libfunnel — Linux向けゼロコピーDMA-BUFフレーム共有ライブラリ
概要
libfunnelは、Linux上でアプリケーション間のフレーム共有を容易にするためのCライブラリです。PipeWireのエコシステムを利用し、DMA-BUFを介したゼロコピーのフレーム転送をサポートすることで、GPUメモリから直接バッファを受け渡し、CPUによるピクセル転送を回避します。これにより、映像処理アプリやライブビデオ合成、リアルタイムストリーミングなどで低レイテンシかつ低オーバーヘッドなデータ経路を提供します。READMEでは「Spout2 / Syphon, but for Linux」と表現されており、EGL連携の簡単な利用例も示されています。現時点ではAPIは未確定で、粗削りな部分が残る旨が明記されています。
リポジトリの統計情報
- スター数: 8
- フォーク数: 0
- ウォッチャー数: 8
- コミット数: 5
- ファイル数: 10
- メインの言語: C
主な特徴
- DMA-BUFベースのゼロコピーフレーム共有を提供し、CPU負荷とレイテンシを低減
- PipeWireをバックエンドに利用してアプリ間のストリーミングを実現
- EGLを利用したGPU側(OpenGL/EGLコンテキスト)との親和性を想定したAPI
- シンプルなAPIでストリーム作成・初期化・サイズ設定が可能
技術的なポイント
libfunnelの中心概念は「ゼロコピーでのフレーム共有」です。LinuxではDMA-BUFがGPUバッファをファイルディスクリプタとして扱い、他プロセスへ安全に渡す手段を提供します。libfunnelはこのDMA-BUFをPipeWireと組み合わせ、アプリAが生成したフレームをアプリBがCPUで再コピーすることなく直接利用できるようにします。これにより、映像合成やフィルタリング、配信といったワークフローでのオーバーヘッドが大きく削減されます。
API面では、初期化(funnel_init)→ストリーム作成(funnel_stream_create)→EGL初期化(funnel_stream_init_egl)→フレームサイズ設定(funnel_stream_set_size)といった流れを想定したシンプルな操作系が用意されています。EGL連携により、GPU上で生成したテクスチャやフレームバッファをDMA-BUFに対応させてそのまま送出できるため、OpenGL/OpenGL ESやVulkanを使うアプリとの親和性が高くなります。
パフォーマンス上の注意点としては、プラットフォーム依存のバッファフォーマットやメモリの種類(システムメモリ、GPU専用メモリ、ドライバがサポートするDMA-BUF属性)への対応が重要です。さらに、同期機構(フレームの準備完了や使用完了の同期)をどう扱うかによってレイテンシや競合の振る舞いが変わるため、libfunnel側と利用側で明確なライフサイクル設計が必要です。READMEにある通りAPIはまだ安定しておらず、拡張やエラーハンドリングの強化、互換性テスト(異なるGPUドライバやWayland/DRM環境での検証)が今後の課題です。
ユースケースとしては、複数アプリ間でのライブビデオ共有(例:ライブ合成ツール、配信ソフトとエフェクトプロセスの分離)、GPU処理パイプラインの分割(重い処理を別プロセスに分離して安定性を高める)などが考えられます。Spout2やSyphonのように、開発者が簡単にフレーム送受信を実装できる点が魅力です。
プロジェクトの構成
主要なファイルとディレクトリ:
- .clang-format: file
- .clangd: file
- .editorconfig: file
- .gitignore: file
- LICENSE: file
…他 5 ファイル
(リポジトリは比較的小規模で、ソースはC言語中心。設定ファイルやライセンスが含まれています。API実装やサンプルのファイル群が残りの構成要素と思われます。)
まとめ
PipeWireとDMA-BUFを使ったLinux向けゼロコピーフレーム共有の試みで、GPU連携が必要なマルチプロセス映像ワークフローに有用。
リポジトリ情報:
- 名前: libfunnel
- 説明: Easy app-to-app frame sharing using PipeWire
- スター数: 8
- 言語: C
- URL: https://github.com/hoshinolina/libfunnel
- オーナー: hoshinolina
- アバター: https://avatars.githubusercontent.com/u/102031928?v=4
READMEの抜粋:
libfunnel
A library to make creating PipeWire video streams easy, using zero-copy DMA-BUF frame sharing. “Spout2 / Syphon, but for Linux”.
Status
This is still rough around the edges and the API is not considered stable yet.
Usage
TL;DR for EGL
struct funnel_ctx *ctx;
struct funnel_stream *stream;
funnel_init(&ctx);
funnel_stream_create(ctx, "Funnel Test", &stream);
funnel_stream_init_egl(stream, egl_display);
funnel_stream_set_size(stream, width, height);
// FUNNEL_ASYNC ...
今後の利用を考える場合、まずはREADMEのサンプルに従って小さなプロトタイプを作成し、使用するGPUドライバやWayland/DRM環境での動作検証を行うことをおすすめします。APIの安定化や追加機能の提案・コントリビュートも歓迎される段階です。