Repository navigation
0.7.15 — Live-view reliability
Live-view reliability fix: the RTSP keepalive placeholder now preserves the camera's own codec parameter sets, and the backpressure queue self-corrects latency — fixing a Home Assistant / go2rtc reconnect loop where a stream would connect and then immediately drop.
Fixes
- Keepalive placeholder→live handoff no longer breaks the stream. When a client connected before the camera produced its first frame, Neolink served a locally-encoded black keyframe whose H264/H265 parameter sets (SPS/PPS, plus VPS for H265) differed from the camera's. The RTSP/SDP parameters the client negotiated were inferred from that synthetic frame, so when the real camera bitstream arrived a strict client (go2rtc / Home Assistant) rejected it and reconnected — a tight reconnect loop where the stream never held, made worse once a camera fell behind and clients lingered on the placeholder. Neolink now caches each stream's first valid real camera keyframe and replays that as the keepalive placeholder, so the negotiated parameters match the live stream exactly. The synthetic black frame remains only as a cold-start fallback, before any real keyframe has been seen for a stream.
- Backpressure drops the oldest queued frame, not the newest. The forwarder→sender bridge queue previously discarded the incoming frame when full and kept the stale backlog, so a brief camera lag pinned latency at the backlog depth (the
CATCHUP enter (lag=…)path) and starved recovery. It now evicts the oldest queued frame and enqueues the newest, so latency self-corrects; an evicted video frame's clock advance is carried forward to the next delivered video frame, keeping the media clock continuous (no PTS jump / A-V drift).
Notes
- No configuration changes are required.
- Affects RTSP live view, including Home Assistant via the built-in go2rtc (WebRTC/MSE). Validated by
cargo build+ the workspace test suite (including new unit tests covering the real-IDR keepalive cache and the oldest-evicting queue's clock carry-forward); confirm against your own cameras after updating.
References
docs/home-assistant.md— live-view keepalive / placeholder behaviourdocs/av-timestamping.md— RTSP-output PTS and the drop/backpressure paths- Full
changelog.md
Docker image
docker pull ghcr.io/privatecoder/neolink:0.7.15