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};