diff --git a/frigate/output/birdseye.py b/frigate/output/birdseye.py index d3717d281..cdadafe71 100644 --- a/frigate/output/birdseye.py +++ b/frigate/output/birdseye.py @@ -273,17 +273,13 @@ class BirdsEyeFrameManager: stop_event: mp.Event, ): self.config = config - self.mode = config.birdseye.mode width, height = get_canvas_shape(config.birdseye.width, config.birdseye.height) self.frame_shape = (height, width) self.yuv_shape = (height * 3 // 2, width) self.frame = np.ndarray(self.yuv_shape, dtype=np.uint8) self.canvas = Canvas(width, height, config.birdseye.layout.scaling_factor) self.stop_event = stop_event - self.inactivity_threshold = config.birdseye.inactivity_threshold - - if config.birdseye.layout.max_cameras: - self.last_refresh_time = 0 + self.last_refresh_time = 0 # initialize the frame as black and with the Frigate logo self.blank_frame = np.zeros(self.yuv_shape, np.uint8) @@ -426,7 +422,7 @@ class BirdsEyeFrameManager: and self.config.cameras[cam].enabled and cam_data["last_active_frame"] > 0 and cam_data["current_frame_time"] - cam_data["last_active_frame"] - < self.inactivity_threshold + < self.config.birdseye.inactivity_threshold ] ) logger.debug(f"Active cameras: {active_cameras}") diff --git a/frigate/output/output.py b/frigate/output/output.py index 38b1ddc52..83962e1c9 100644 --- a/frigate/output/output.py +++ b/frigate/output/output.py @@ -15,6 +15,7 @@ from ws4py.server.wsgirefserver import ( ) from ws4py.server.wsgiutils import WebSocketWSGIApplication +from frigate.comms.config_updater import ConfigSubscriber from frigate.comms.detections_updater import DetectionSubscriber, DetectionTypeEnum from frigate.comms.ws import WebSocket from frigate.config import FrigateConfig @@ -138,6 +139,7 @@ class OutputProcess(FrigateProcess): CameraConfigUpdateEnum.record, ], ) + birdseye_config_subscriber = ConfigSubscriber("config/birdseye", exact=True) jsmpeg_cameras: dict[str, JsmpegCamera] = {} birdseye: Birdseye | None = None @@ -167,6 +169,20 @@ class OutputProcess(FrigateProcess): websocket_thread.start() while not self.stop_event.is_set(): + update_topic, birdseye_config = ( + birdseye_config_subscriber.check_for_update() + ) + + if update_topic is not None: + previous_global_mode = self.config.birdseye.mode + self.config.birdseye = birdseye_config + + for camera_config in self.config.cameras.values(): + if camera_config.birdseye.mode == previous_global_mode: + camera_config.birdseye.mode = birdseye_config.mode + + logger.debug("Applied dynamic birdseye config update") + # check if there is an updated config updates = config_subscriber.check_for_updates() @@ -297,6 +313,7 @@ class OutputProcess(FrigateProcess): birdseye.stop() config_subscriber.stop() + birdseye_config_subscriber.stop() websocket_server.manager.close_all() websocket_server.manager.stop() websocket_server.manager.join() diff --git a/web/src/components/config-form/section-configs/birdseye.ts b/web/src/components/config-form/section-configs/birdseye.ts index 7df38edd8..63fae75d9 100644 --- a/web/src/components/config-form/section-configs/birdseye.ts +++ b/web/src/components/config-form/section-configs/birdseye.ts @@ -28,10 +28,7 @@ const birdseye: SectionConfigOverrides = { "width", "height", "quality", - "mode", "layout.scaling_factor", - "inactivity_threshold", - "layout.max_cameras", "idle_heartbeat_fps", ], uiSchema: {