With a second physical camera added (the new ÉSZAK Tapo TC47), the TV camwall was moved off Frigate’s birdseye onto an explicit 4-substream 2×2 composite built directly in mpv. Key finding: Frigate birdseye is unreliable as a fixed multi-cam wall source once you have more than two cameras — it flip-flops between showing 2 and 4 cameras depending on activity. See also TV wall (HDMI), 2026-07-18-birdseye-nvenc-blue-glare, SESSION-HANDOVER.
For Agents
What changed:
/usr/local/bin/camwall-mpv.shnow composites the 4 go2rtc substreams directly into a grouped 2×2 (DÉL left column, ÉSZAK right column) via an mpv--vf lavfifiltergraph, instead of playingrtsp://127.0.0.1:8554/birdseye. Cameras: cam1_sub=DÉL-Fix, cam2_sub=DÉL-PTZ, cam3_sub=ÉSZAK-Fix, cam4_sub=ÉSZAK-PTZ. The new ÉSZAK camera is192.168.30.139(telep_cam3 fix + telep_cam4 ptz) added to Frigate alongside DÉL (cam1/cam2). Keep--hwdec=no. Backup:camwall-mpv.sh.bak-2x2.
Why: birdseye is unreliable for a fixed >2-cam layout
Frigate birdseye flip-flops between 2 and 4 cameras
Birdseye is a dynamic/activity-driven composite — it drops cameras depending on activity/state, so with 4 cameras it visibly flip-flops between showing 2 and 4. That is fine for its intended “show me what’s active” purpose but cannot be used as a stable fixed wall source once you have more than two cameras. The old 2-camera wall tolerated it; the 4-camera wall does not.
This is a different birdseye problem from the earlier NVENC “blue glare” corruption — that was encoder wedging; this is birdseye’s compositing logic dropping panes by design.
The new camwall composite
/usr/local/bin/camwall-mpv.sh was rewritten to:
- Take cam1_sub as the primary mpv input, and pull cam2_sub / cam3_sub / cam4_sub in via libavfilter
movie=sources. - Grouped 2×2 layout: DÉL in the left column (Fix top, PTZ bottom), ÉSZAK in the right column.
- Four
drawtextlabels (one per pane). - Dropped the old “TOP KÉPEK” overlay (the static JPEG strip).
- Kept the wifi-usage IPC osd-overlay strip — still fed via
--input-ipc-server=/run/camwall.sock(see 2026-07-22-wifi-usage-strip).
Substream map (all via go2rtc on rtsp://127.0.0.1:8554/):
| Pane | Substream | Camera |
|---|---|---|
| top-left | cam1_sub | DÉL – Fix |
| bottom-left | cam2_sub | DÉL – PTZ |
| top-right | cam3_sub | ÉSZAK – Fix |
| bottom-right | cam4_sub | ÉSZAK – PTZ |
Gotchas
mpv
movie=rtsp URLs need the colons escapedlibavfilter parses
:as an option separator, so an rtsp URL inside amovie=source must be writtenrtsp\://127.0.0.1\:8554/...(escape every colon) or the filtergraph fails to parse. Also:movie=can’t takertsp_transport, so it emits a benign461 Unsupported transportand falls back UDP→TCP on its own. Harmless — do not chase it.
A
movie=pane can freeze on its last frame if go2rtc restartsThe mpv watchdog only covers the primary input (cam1_sub). If go2rtc restarts, the three
movie=-sourced panes can freeze on their last frame until camwall is restarted. Tradeoff accepted vs birdseye’s flip-flopping. If a pane looks stuck,systemctl restart camwall.
Keep
--hwdec=no— NVDEC corrupts these feeds (magenta)Same established rig philosophy as before: software decode on the 12900K. The RTX 3080’s NVDEC corrupts these feeds into magenta under GPU contention with Frigate. Do not “optimize” the wall back onto hardware decode.
Latency fix (2026-07-29) — 4 tiled single-input mpv instances
The 2×2 composite worked but the TV wall ran ~10–13 s behind live. Isolated to mpv’s single-composite
movie= lavfi buffering — the camera and go2rtc were each only ~1 s, so the multi-input filtergraph
was the whole delay.
Fix: one low-latency mpv per quadrant, not one mpv compositing four inputs
Rearchitected
/usr/local/bin/camwall-mpv.shinto 4 tiled single-input low-latency mpv instances — one per quadrant via per-instance--geometry, each with--profile=low-latency --cache=noand a per-panedrawtextlabel. Result: ~1–2 s per pane, stable (down from ~10–13 s). Backupcamwall-mpv.sh.bak-latency. The single-compositemovie=filtergraph is what buffered; single-input panes don’t.
SUPERSEDED (2026-07-31): the residual multi-second lag is 2.4 GHz WiFi bufferbloat, not mpv
The tiled rearchitecture helped, but it was not the whole story. The wandering per-pane lag that persisted — up to ~12 s, worst on DÉL — even after a full rebuild to a go2rtc MSE/chromium wall, is 2.4 GHz camera-WiFi saturation (99% channel-busy → bufferbloat), a capacity problem upstream of both mpv and go2rtc that no player-side fix can resolve. Full evidence chain + ranked fixes: 2026-07-31-camwall-lag-24ghz-wifi-bufferbloat.
Two known regressions from the tiled rearchitecture (open follow-ups)
- (a) WiFi strip now confined to the BL pane — it was full-width under the old single-mpv composite; with 4 separate mpv processes the
/run/camwall.sockIPC osd-overlay only lives on the one socket-owning pane. Cosmetic.- (b) Watchdog freeze-detection now only covers the one IPC-socket-owning pane (cam2 / BL), not all 4. Security-relevant — a frozen ÉSZAK/DÉL pane could go unnoticed. Fix direction: per-pane IPC sockets or framebuffer-based per-quadrant staleness detection.
Backups
camwall-mpv.sh.bak-latency(2026-07-29 tiled low-latency rearchitecture)camwall-mpv.sh.bak-2x2(the 2×2 lavfi composite)- earlier:
camwall-mpv.sh.bak-quad,camwall-mpv.sh.bak-relabel
Related
- TV wall (HDMI) — the camwall / mpv → DRM-KMS → HDMI pipeline
- 2026-07-18-birdseye-nvenc-blue-glare — the other birdseye problem (NVENC encoder corruption) + the RTSP→mpv→TV isolation method
- 2026-07-22-wifi-usage-strip — the wifi-usage osd-overlay strip retained via
/run/camwall.sock - 2026-07-28-frigate-notify-camera-exclude — the same new ÉSZAK camera’s indoor false-triggering was silenced in frigate-notify
- 2026-07-31-camwall-lag-24ghz-wifi-bufferbloat — the REAL root cause of the residual camwall lag: saturated 2.4 GHz camera WiFi (bufferbloat), upstream of mpv/go2rtc; supersedes the player-tuning latency fix above
- SESSION-HANDOVER
- homelab
- LOG
- TOPICS