# gst-plugin-zenoh
[](https://crates.io/crates/gst-plugin-zenoh)
[](https://docs.rs/gst-plugin-zenoh)
[](https://opensource.org/licenses/MPL-2.0)
A [GStreamer](https://gstreamer.freedesktop.org/) plugin for distributed media streaming using [Zenoh](https://zenoh.io/).
## Elements
| **zenohsink** | Publishes GStreamer buffers to Zenoh | [README](src/zenohsink/README.md) |
| **zenohsrc** | Subscribes to Zenoh and delivers to pipelines | [README](src/zenohsrc/README.md) |
| **zenohdemux** | Demultiplexes streams by key expression | [README](src/zenohdemux/README.md) |
## Quick Start
### Installation
```bash
# 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
```bash
# 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
```rust
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](https://docs.rs/gst-plugin-zenoh) for full API documentation.
## Compression
Build with compression features:
```bash
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:
```bash
# 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
| `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](LICENSE).