docs.rs failed to build lamco-pipewire-0.1.4
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
lamco-pipewire
High-performance PipeWire integration for Wayland screen capture with DMA-BUF support.
Features
- Zero-Copy DMA-BUF: Hardware-accelerated frame transfer when available
- Multi-Monitor: Concurrent handling of multiple monitor streams
- Format Negotiation: Automatic format selection with fallbacks
- YUV Conversion: Built-in NV12, I420, YUY2 to BGRA conversion
- Cursor Extraction: Separate cursor tracking for remote desktop
- Damage Tracking: Region-based change detection for efficient encoding
- Adaptive Bitrate: Network-aware bitrate control for streaming
- Error Recovery: Automatic reconnection and stream recovery
Quick Start
use ;
// Create manager with default configuration
let mut manager = with_default?;
// Connect using portal-provided file descriptor (from lamco-portal)
manager.connect.await?;
// Create stream for a monitor
let stream_info = StreamInfo ;
let handle = manager.create_stream.await?;
// Receive frames
if let Some = manager.frame_receiver.await
manager.shutdown.await?;
Configuration
use ;
let config = builder
.buffer_count // More buffers for high refresh
.preferred_format // Preferred pixel format
.use_dmabuf // Enable zero-copy
.max_streams // Limit concurrent streams
.enable_cursor // Extract cursor separately
.enable_damage_tracking // Track changed regions
.build;
let manager = new?;
Feature Flags
| Feature | Default | Description |
|---|---|---|
dmabuf |
Yes | DMA-BUF zero-copy support |
yuv |
No | YUV format conversion utilities |
cursor |
No | Hardware cursor extraction |
damage |
No | Region damage tracking |
adaptive |
No | Adaptive bitrate control |
full |
No | All features enabled |
[]
= { = "0.1", = ["full"] }
Architecture
PipeWire's Rust bindings use Rc<> and NonNull<> internally, making them not Send. This crate solves this with a dedicated thread architecture:
┌─────────────────────────────────────────────────────────┐
│ Tokio Async Runtime │
│ │
│ Your Application → PipeWireManager │
│ (Send + Sync wrapper) │
│ │ │
│ │ Commands via mpsc │
│ ▼ │
└───────────────────────────┼─────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────┐
│ Dedicated PipeWire Thread │
│ (std::thread - owns all non-Send types) │
│ │
│ MainLoop (Rc) ─> Context (Rc) ─> Core (Rc) │
│ │ │
│ ▼ │
│ Streams (NonNull) │
│ │ │
│ │ Frames via mpsc │
└──────────────────────────────────────┼──────────────────┘
│
▼
Your application receives frames
Performance
- Frame latency: < 2ms (with DMA-BUF)
- Memory usage: < 100MB per stream
- CPU usage: < 5% per stream (1080p @ 60Hz)
- Refresh rates: Tested up to 144Hz
Requirements
- Linux with a Wayland compositor
- PipeWire installed and running
- PipeWire development libraries:
libpipewire-0.3-dev(Debian/Ubuntu) orpipewire-devel(Fedora) - Rust 1.77+
Platform Compatibility
| Compositor | Portal Package | Status |
|---|---|---|
| GNOME | xdg-desktop-portal-gnome |
✅ Tested |
| KDE Plasma | xdg-desktop-portal-kde |
✅ Tested |
| wlroots (Sway, Hyprland) | xdg-desktop-portal-wlr |
✅ Tested |
| X11 | N/A | ❌ Not supported |
Related Crates
lamco-portal- XDG Desktop Portal integration for obtaining PipeWire file descriptors
License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.