libfunnel — Linux向けゼロコピーDMA-BUFフレーム共有ライブラリ

Library

概要

libfunnelは、Linux上でアプリケーション間のフレーム共有を容易にするためのCライブラリです。PipeWireのエコシステムを利用し、DMA-BUFを介したゼロコピーのフレーム転送をサポートすることで、GPUメモリから直接バッファを受け渡し、CPUによるピクセル転送を回避します。これにより、映像処理アプリやライブビデオ合成、リアルタイムストリーミングなどで低レイテンシかつ低オーバーヘッドなデータ経路を提供します。READMEでは「Spout2 / Syphon, but for Linux」と表現されており、EGL連携の簡単な利用例も示されています。現時点ではAPIは未確定で、粗削りな部分が残る旨が明記されています。

GitHub

リポジトリの統計情報

  • スター数: 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連携が必要なマルチプロセス映像ワークフローに有用。

リポジトリ情報:

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の安定化や追加機能の提案・コントリビュートも歓迎される段階です。