src.nth.io/

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Hoersten <[email protected]>2026-04-13 07:37:42 -0500
committerLuke Hoersten <[email protected]>2026-04-13 07:37:42 -0500
commit8a14be01daaa8c77733e53ed1da2a6914aaac407 (patch)
treed07f9f687d978d2ae9133fed247dee26f979a46f
parent63bc6c512cd64dac27a4f34b6c1342bee39c00d5 (diff)
Remove warm prebuffer mode from doorbell-viewport
Always start mpv on demand (cold start). The warm path was fragile on the RPi4 with fkms and added complexity without reliable benefit.
-rw-r--r--doorbell-viewport/defaults/main.yaml1
-rw-r--r--doorbell-viewport/files/doorbell-viewport.py29
-rw-r--r--doorbell-viewport/templates/doorbell-viewport.env.j21
3 files changed, 5 insertions, 26 deletions
diff --git a/doorbell-viewport/defaults/main.yaml b/doorbell-viewport/defaults/main.yaml
index e4d438c..1755af7 100644
--- a/doorbell-viewport/defaults/main.yaml
+++ b/doorbell-viewport/defaults/main.yaml
@@ -5,7 +5,6 @@ doorbell_viewport_protect_host: ""
doorbell_viewport_camera_id: ""
doorbell_viewport_timeout: 45
doorbell_viewport_touch_match: ""
-doorbell_viewport_prebuffer_mode: "warm"
doorbell_viewport_display_backend: "vcgencmd"
doorbell_viewport_orientation: 270
doorbell_viewport_drm_connector: "HDMI-A-1"
diff --git a/doorbell-viewport/files/doorbell-viewport.py b/doorbell-viewport/files/doorbell-viewport.py
index 74241e3..555685c 100644
--- a/doorbell-viewport/files/doorbell-viewport.py
+++ b/doorbell-viewport/files/doorbell-viewport.py
@@ -68,7 +68,6 @@ class Config:
self.camera_id = os.environ["DOORBELL_VIEWPORT_CAMERA_ID"]
self.timeout = int(os.environ.get("DOORBELL_VIEWPORT_TIMEOUT", "45"))
self.touch_match = os.environ.get("DOORBELL_VIEWPORT_TOUCH_MATCH", "")
- self.prebuffer_mode = os.environ.get("DOORBELL_VIEWPORT_PREBUFFER_MODE", "warm")
self.display_backend = os.environ.get("DOORBELL_VIEWPORT_DISPLAY_BACKEND", "vcgencmd")
self.orientation = int(os.environ.get("DOORBELL_VIEWPORT_ORIENTATION", "270"))
self.drm_device = os.environ.get("DOORBELL_VIEWPORT_DRM_DEVICE", "/dev/dri/card1")
@@ -79,12 +78,11 @@ class Config:
def log_config(self):
log.info(
"Config: protect_host=%s camera_id=%s timeout=%ds "
- "prebuffer_mode=%s display_backend=%s orientation=%d "
+ "display_backend=%s orientation=%d "
"drm_device=%s drm_connector=%s drm_mode=%s",
self.protect_host,
self.camera_id,
self.timeout,
- self.prebuffer_mode,
self.display_backend,
self.orientation,
self.drm_device,
@@ -300,16 +298,6 @@ class DoorbellViewport:
if not self.config.rtsp_url:
log.warning("No RTSP URL at startup; will retry after reconnect")
- # Warm prebuffer: mpv starts immediately, rendering to framebuffer
- # while display remains off — zero-latency activation later.
- # display.off() is called AFTER start_mpv() because mpv's DRM mode
- # setting re-enables the HDMI output, overriding any prior vcgencmd state.
- if self.config.prebuffer_mode == "warm" and self.config.rtsp_url:
- await self.start_mpv()
- await asyncio.sleep(3) # wait for mpv DRM mode-setting to complete
- self.display.off()
- log.info("Warm prebuffer active: mpv running, display off")
-
await asyncio.gather(
self.protect_listener(),
self.touch_listener(),
@@ -327,12 +315,8 @@ class DoorbellViewport:
if was_idle:
log.info("State: IDLE -> ACTIVE")
- if self.config.prebuffer_mode == "warm":
- # mpv already buffering; just enable the display
- self.display.on()
- else:
- await self.start_mpv()
- self.display.on()
+ await self.start_mpv()
+ self.display.on()
else:
log.info("State: ACTIVE -> timer extended")
@@ -349,8 +333,7 @@ class DoorbellViewport:
self.timer_task = None
self.display.off()
- if self.config.prebuffer_mode != "warm":
- await self.stop_mpv()
+ await self.stop_mpv()
async def on_ring(self):
log.info("Event: doorbell ring")
@@ -439,7 +422,7 @@ class DoorbellViewport:
if self.mpv_proc is proc:
self.mpv_proc = None
await asyncio.sleep(2)
- if self.config.prebuffer_mode == "warm" or self.state == State.ACTIVE:
+ if self.state == State.ACTIVE:
log.info("Restarting mpv after unexpected exit")
await self.start_mpv()
@@ -463,8 +446,6 @@ class DoorbellViewport:
url = await loop.run_in_executor(None, self.protect.get_camera_rtsp_url)
if url:
self.config.rtsp_url = url
- if self.config.prebuffer_mode == "warm":
- await self.start_mpv()
async def _connect_protect_ws(self):
log.info("Protect: connecting to WebSocket")
diff --git a/doorbell-viewport/templates/doorbell-viewport.env.j2 b/doorbell-viewport/templates/doorbell-viewport.env.j2
index 3863dbc..13f3849 100644
--- a/doorbell-viewport/templates/doorbell-viewport.env.j2
+++ b/doorbell-viewport/templates/doorbell-viewport.env.j2
@@ -4,7 +4,6 @@ DOORBELL_VIEWPORT_PROTECT_PASSWORD={{vault_doorbell_viewport_protect_password}}
DOORBELL_VIEWPORT_CAMERA_ID={{doorbell_viewport_camera_id}}
DOORBELL_VIEWPORT_TIMEOUT={{doorbell_viewport_timeout}}
DOORBELL_VIEWPORT_TOUCH_MATCH={{doorbell_viewport_touch_match}}
-DOORBELL_VIEWPORT_PREBUFFER_MODE={{doorbell_viewport_prebuffer_mode}}
DOORBELL_VIEWPORT_DISPLAY_BACKEND={{doorbell_viewport_display_backend}}
DOORBELL_VIEWPORT_ORIENTATION={{doorbell_viewport_orientation}}
DOORBELL_VIEWPORT_DRM_DEVICE={{doorbell_viewport_drm_device}}