gstreamer.rs — Video Streaming

Receives H.264 video from the rover over UDP, decodes it, and serves it as MJPEG over HTTP so the frontend can display it in <img> tags.

Pipeline per camera

udpsrc (UDP port) → rtpjitterbuffer → rtph264depay → avdec_h264 → videoconvert → jpegenc → appsink

Each decoded JPEG frame is placed into a shared FrameBuffer (Arc<Mutex<Option<Bytes>>>). A separate async HTTP server (using warp) reads from that buffer and streams it as multipart/x-mixed-replace — the standard MJPEG format.

Port mapping

UDP input port

HTTP output port

Camera

4500

5000

Depth / front camera

4501

5001

Secondary camera

4502

5002

Arm camera

Feed health monitoring

A background task (watch_feed_health) polls each stream every 500ms. If no frame has been received within 2 seconds, the stream is considered stale. The backend emits a camera-feed-status Tauri event to the frontend with the payload:

{ "port": 5000, "stale": true }

The frontend listens for this event to show feed status indicators.

For development without rover hardware, run the fake_camera_gstreamer. For instructions see Common Operations.


Revision #8
Created 2026-04-14 09:38:40 UTC by Candela Cimadevilla Gonzalez
Updated 2026-04-15 15:00:35 UTC by Dmytro Khorsun