gst-plugin-zenoh

Crates.iogst-plugin-zenoh
lib.rsgst-plugin-zenoh
version0.3.2
created_at2025-12-27 11:03:07.445328+00
updated_at2025-12-29 22:12:31.069754+00
descriptionHigh-performance GStreamer plugin for distributed media streaming using Zenoh protocol
homepage
repositoryhttps://github.com/p13marc/gst-plugin-zenoh
max_upload_size
id2007043
size572,673
(p13marc)

documentation

https://docs.rs/gst-plugin-zenoh

README

gst-plugin-zenoh

Crates.io Documentation License

A GStreamer plugin for distributed media streaming using Zenoh.

Elements

Element Description Documentation
zenohsink Publishes GStreamer buffers to Zenoh README
zenohsrc Subscribes to Zenoh and delivers to pipelines README
zenohdemux Demultiplexes streams by key expression README

Quick Start

Installation

# Ubuntu/Debian
sudo apt-get install libunwind-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

# Fedora
sudo dnf install libunwind-devel gstreamer1-devel gstreamer1-plugins-base-devel

# Build
cargo build --release

# With compression support
cargo build --release --features compression

Basic Usage

# Set plugin path
export GST_PLUGIN_PATH=target/release

# Sender
gst-launch-1.0 videotestsrc ! zenohsink key-expr=demo/video

# Receiver
gst-launch-1.0 zenohsrc key-expr=demo/video ! videoconvert ! autovideosink

Features

  • QoS Control: Reliability modes, congestion control, priority levels (1-7)
  • Low Latency: Express mode, zero-copy paths, efficient session management
  • Session Sharing: Share Zenoh sessions across elements to reduce overhead
  • Compression: Optional Zstandard, LZ4, or Gzip (compile-time features)
  • Buffer Metadata: PTS, DTS, duration, flags preserved for A/V sync
  • Caps Transmission: Automatic format negotiation between sender/receiver
  • URI Handler: Configure via zenoh:key-expr?priority=2&reliability=reliable
  • Statistics: Real-time monitoring of bytes, messages, errors, dropped packets

Rust API

use gstzenoh::{ZenohSink, ZenohSrc, ZenohDemux, PadNaming};

// Simple constructor
let sink = ZenohSink::new("demo/video");

// Builder pattern
let sink = ZenohSink::builder("demo/video")
    .reliability("reliable")
    .priority(2)
    .express(true)
    .build();

// Typed getters
println!("Sent: {} bytes", sink.bytes_sent());

See docs.rs for full API documentation.

Compression

Build with compression features:

cargo build --release --features compression-zstd  # Zstandard (recommended)
cargo build --release --features compression-lz4   # LZ4 (fastest)
cargo build --release --features compression-gzip  # Gzip (compatible)
cargo build --release --features compression       # All algorithms

Usage:

# Sender with compression
gst-launch-1.0 videotestsrc ! zenohsink key-expr=demo/video compression=zstd

# Receiver (auto-decompresses)
gst-launch-1.0 zenohsrc key-expr=demo/video ! videoconvert ! autovideosink

Feature Compatibility

Sender Receiver Result
compression=none Any build Works
compression=zstd Built with compression-zstd Works
compression=zstd Built without compression Error logged, raw compressed bytes delivered

Recommendation: Build both sender and receiver with the same compression features, or use --features compression for full compatibility.

Requirements

  • Rust 1.85+ (edition 2024)
  • GStreamer 1.20+

License

Mozilla Public License 2.0 - see LICENSE.

Commit count: 0

cargo fmt