mecha10_video/
lib.rs

1/// Mecha10 Video Streaming
2///
3/// Provides WebRTC-based low-latency video streaming for robotics applications.
4///
5/// # Features
6///
7/// - **WebRTC Streaming**: H.264 video encoding with OpenH264
8/// - **Multi-client Support**: Broadcast frames to multiple WebRTC connections
9/// - **Low Latency**: 30-50ms latency with optimized encoding pipeline
10/// - **Zero-copy Frame Sharing**: Efficient frame distribution using Arc
11/// - **Optional Diagnostics**: Enable with `diagnostics` feature flag
12///
13/// # Architecture
14///
15/// ```text
16/// ┌─────────────┐
17/// │   Source    │ (Godot, Camera, etc.)
18/// │  (Frames)   │
19/// └──────┬──────┘
20///        │ mpsc::channel
21///        ▼
22/// ┌─────────────────────┐
23/// │  WebRTCServer       │
24/// │  (Frame Broadcast)  │
25/// └──────┬──────────────┘
26///        │ broadcast::channel
27///        ├─────────┬─────────┐
28///        ▼         ▼         ▼
29///   ┌────────┐ ┌────────┐ ┌────────┐
30///   │ Conn 1 │ │ Conn 2 │ │ Conn 3 │
31///   │ (H.264)│ │ (H.264)│ │ (H.264)│
32///   └────┬───┘ └────┬───┘ └────┬───┘
33///        │          │          │
34///        ▼          ▼          ▼
35///    Browser    Browser    Browser
36/// ```
37///
38/// # Example Usage
39///
40/// ```no_run
41/// use mecha10_video::{CameraFrame, ImageFormat, WebRTCServer};
42/// use mecha10_video::signaling::start_signaling_server;
43/// use tokio::sync::mpsc;
44/// use std::sync::Arc;
45///
46/// #[tokio::main]
47/// async fn main() -> anyhow::Result<()> {
48///     // Create frame channel
49///     let (frame_tx, frame_rx) = mpsc::channel(10);
50///
51///     // Create WebRTC server
52///     # #[cfg(not(feature = "diagnostics"))]
53///     let webrtc_server = WebRTCServer::new(frame_rx).await?;
54///
55///     // Start signaling server for SDP exchange
56///     let server = Arc::new(webrtc_server);
57///     tokio::spawn(async move {
58///         start_signaling_server(11010, server).await.unwrap();
59///     });
60///
61///     // Send frames to WebRTC server
62///     let frame = CameraFrame {
63///         camera_id: "camera0".to_string(),
64///         width: 640,
65///         height: 480,
66///         timestamp: 0,
67///         image_bytes: Arc::new(vec![0u8; 640 * 480 * 3]),
68///         format: ImageFormat::Rgb,
69///     };
70///     frame_tx.send(frame).await?;
71///
72///     Ok(())
73/// }
74/// ```
75///
76/// # Features
77///
78/// - `diagnostics` - Enable streaming diagnostics (frame encoding/sending metrics)
79///
80/// # Performance
81///
82/// - **Encoding**: ~8-15ms per frame (160×120 @ 30 FPS)
83/// - **Latency**: 30-50ms glass-to-glass
84/// - **Bitrate**: 400 Kbps (configurable)
85/// - **Codec**: H.264 (OpenH264)
86///
87/// # Source of Truth
88///
89/// This package was extracted from `simulation-bridge`, which is the
90/// production-tested reference implementation. See
91/// `docs/VIDEO_EXTRACTION_PLAN.md` for extraction details.
92pub mod frame;
93pub mod publisher;
94pub mod signaling;
95pub mod signaling_relay;
96pub mod webrtc;
97
98// Re-export commonly used types
99pub use frame::{CameraFrame, FrameBroadcaster, ImageFormat};
100pub use publisher::CameraPublisher;
101pub use signaling::start_signaling_server;
102pub use signaling_relay::{start_signaling_relay_client, SignalingRelayConfig};
103pub use webrtc::{SignalingMessage, WebRTCConnection, WebRTCServer};