Per-tile stream quality (high/low), fps cap, latency flags

Cameras carry multiple stream URLs (streams: high/medium/low); each
tile picks one via Quality (auto/high/low). Small tiles can pull the
low substream to cut Pi decode load. discover --enable-rtsp takes a
comma list (high,low), enables each channel, records all enabled ones.
TUI: q cycles a tile quality (shown in the tile); discover enables
high+low. Player: --framedrop + low-delay demuxer flags; player.max_fps.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Levi Woodard
2026-07-01 21:55:25 -05:00
parent 780396076d
commit 8d95c944bd
10 changed files with 287 additions and 70 deletions

View File

@@ -122,13 +122,18 @@ func (d *Daemon) applyLayout(ctx context.Context, name string) error {
continue
}
cam := cfg.CameraByName(tile.Camera)
if cam == nil || cam.Disabled || cam.RTSP == "" {
if cam == nil || cam.Disabled {
d.log.Warn("skipping tile: camera unavailable", "slot", slot, "camera", tile.Camera)
continue
}
url := cam.StreamURL(tile.Quality)
if url == "" {
d.log.Warn("skipping tile: no stream url", "slot", slot, "camera", tile.Camera, "quality", tile.Quality)
continue
}
cs, rs := tile.Span()
rect := compositor.TileRect(w, h, cols, rows, tile.Col, tile.Row, cs, rs)
p := player.New(slot, cam.Name, cam.RTSP, cfg.Player, d.runDir, d.log)
p := player.New(slot, cam.Name, url, cfg.Player, d.runDir, d.log)
players = append(players, p)
d.wg.Add(1)