From d17c8baf979c8833bafc225484b4c9aca171e30b Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Fri, 16 Feb 2024 06:58:29 -0700 Subject: [PATCH] remove birdseye from camera metrics --- frigate/app.py | 15 --------------- frigate/comms/dispatcher.py | 22 ++++++++++++---------- frigate/output/birdseye.py | 34 ++++++++++++++++++---------------- frigate/output/output.py | 6 +----- 4 files changed, 31 insertions(+), 46 deletions(-) diff --git a/frigate/app.py b/frigate/app.py index 08ef99256..63672b014 100644 --- a/frigate/app.py +++ b/frigate/app.py @@ -175,20 +175,6 @@ class FrigateApp: "process": None, "audio_rms": mp.Value("d", 0.0), # type: ignore[typeddict-item] "audio_dBFS": mp.Value("d", 0.0), # type: ignore[typeddict-item] - "birdseye_enabled": mp.Value( # type: ignore[typeddict-item] - # issue https://github.com/python/typeshed/issues/8799 - # from mypy 0.981 onwards - "i", - self.config.cameras[camera_name].birdseye.enabled, - ), - "birdseye_mode": mp.Value( # type: ignore[typeddict-item] - # issue https://github.com/python/typeshed/issues/8799 - # from mypy 0.981 onwards - "i", - BirdseyeModeEnum.get_index( - self.config.cameras[camera_name].birdseye.mode.value - ), - ), } self.ptz_metrics[camera_name] = { "ptz_autotracker_enabled": mp.Value( # type: ignore[typeddict-item] @@ -474,7 +460,6 @@ class FrigateApp: args=( self.config, self.video_output_queue, - self.camera_metrics, ), ) output_processor.daemon = True diff --git a/frigate/comms/dispatcher.py b/frigate/comms/dispatcher.py index f9b2fba33..81ce80d1a 100644 --- a/frigate/comms/dispatcher.py +++ b/frigate/comms/dispatcher.py @@ -319,17 +319,18 @@ class Dispatcher: birdseye_settings = self.config.cameras[camera_name].birdseye if payload == "ON": - if not self.camera_metrics[camera_name]["birdseye_enabled"].value: + if not birdseye_settings.enabled: logger.info(f"Turning on birdseye for {camera_name}") - self.camera_metrics[camera_name]["birdseye_enabled"].value = True birdseye_settings.enabled = True elif payload == "OFF": - if self.camera_metrics[camera_name]["birdseye_enabled"].value: + if birdseye_settings.enabled: logger.info(f"Turning off birdseye for {camera_name}") - self.camera_metrics[camera_name]["birdseye_enabled"].value = False birdseye_settings.enabled = False + self.config_updater.publish( + f"config/birdseye/{camera_name}", self.config.cameras[camera_name].birdseye + ) self.publish(f"{camera_name}/birdseye/state", payload, retain=True) def _on_birdseye_mode_command(self, camera_name: str, payload: str) -> None: @@ -340,16 +341,17 @@ class Dispatcher: return birdseye_config = self.config.cameras[camera_name].birdseye + if not birdseye_config.enabled: logger.info(f"Birdseye mode not enabled for {camera_name}") return - new_birdseye_mode = BirdseyeModeEnum(payload.lower()) - logger.info(f"Setting birdseye mode for {camera_name} to {new_birdseye_mode}") - - # update the metric (need the mode converted to an int) - self.camera_metrics[camera_name]["birdseye_mode"].value = ( - BirdseyeModeEnum.get_index(new_birdseye_mode) + birdseye_config.mode = BirdseyeModeEnum(payload.lower()) + logger.info( + f"Setting birdseye mode for {camera_name} to {birdseye_config.mode}" ) + self.config_updater.publish( + f"config/birdseye/{camera_name}", self.config.cameras[camera_name].birdseye + ) self.publish(f"{camera_name}/birdseye_mode/state", payload, retain=True) diff --git a/frigate/output/birdseye.py b/frigate/output/birdseye.py index ff3b7521f..72a7f2dfe 100644 --- a/frigate/output/birdseye.py +++ b/frigate/output/birdseye.py @@ -14,9 +14,9 @@ import traceback import cv2 import numpy as np +from frigate.comms.config_updater import ConfigSubscriber from frigate.config import BirdseyeModeEnum, FrigateConfig from frigate.const import BASE_DIR, BIRDSEYE_PIPE -from frigate.types import CameraMetricsTypes from frigate.util.image import ( SharedMemoryFrameManager, copy_yuv_to_position, @@ -267,7 +267,6 @@ class BirdsEyeFrameManager: config: FrigateConfig, frame_manager: SharedMemoryFrameManager, stop_event: mp.Event, - camera_metrics: dict[str, CameraMetricsTypes], ): self.config = config self.mode = config.birdseye.mode @@ -278,7 +277,6 @@ class BirdsEyeFrameManager: 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.camera_metrics = camera_metrics self.inactivity_threshold = config.birdseye.inactivity_threshold if config.birdseye.layout.max_cameras: @@ -675,15 +673,12 @@ class BirdsEyeFrameManager: def update(self, camera, object_count, motion_count, frame_time, frame) -> bool: # don't process if birdseye is disabled for this camera camera_config = self.config.cameras[camera].birdseye + if not camera_config.enabled: return False - # get our metrics (sync'd across processes) - # which allows us to control it via mqtt (or any other dispatcher) - camera_metrics = self.camera_metrics[camera] - # disabling birdseye is a little tricky - if not camera_metrics["birdseye_enabled"].value: + if not camera_config.enabled: # if we've rendered a frame (we have a value for last_active_frame) # then we need to set it to zero if self.cameras[camera]["last_active_frame"] > 0: @@ -691,12 +686,9 @@ class BirdsEyeFrameManager: return False - # get the birdseye mode state from camera metrics - birdseye_mode = BirdseyeModeEnum.get(camera_metrics["birdseye_mode"].value) - # update the last active frame for the camera self.cameras[camera]["current_frame"] = frame_time - if self.camera_active(birdseye_mode, object_count, motion_count): + if self.camera_active(camera_config.mode, object_count, motion_count): self.cameras[camera]["last_active_frame"] = frame_time now = datetime.datetime.now().timestamp() @@ -725,7 +717,6 @@ class Birdseye: self, config: FrigateConfig, frame_manager: SharedMemoryFrameManager, - camera_metrics: dict[str, CameraMetricsTypes], stop_event: mp.Event, websocket_server, ) -> None: @@ -745,9 +736,8 @@ class Birdseye: self.broadcaster = BroadcastThread( "birdseye", self.converter, websocket_server, stop_event ) - self.birdseye_manager = BirdsEyeFrameManager( - config, frame_manager, stop_event, camera_metrics - ) + self.birdseye_manager = BirdsEyeFrameManager(config, frame_manager, stop_event) + self.config_subscriber = ConfigSubscriber("config/birdseye/") if config.birdseye.restream: self.birdseye_buffer = frame_manager.create( @@ -766,6 +756,18 @@ class Birdseye: frame_time: float, frame, ) -> None: + # check if there is an updated config + while True: + updated_topic, updated_birdseye_config = ( + self.config_subscriber.check_for_update() + ) + + if not updated_topic: + break + + camera_name = updated_topic.rpartition("/")[-1] + self.config.cameras[camera_name].birdseye = updated_birdseye_config + if self.birdseye_manager.update( camera, len([o for o in current_tracked_objects if not o["stationary"]]), diff --git a/frigate/output/output.py b/frigate/output/output.py index efcff4b7c..fb9be80e2 100644 --- a/frigate/output/output.py +++ b/frigate/output/output.py @@ -21,7 +21,6 @@ from frigate.config import FrigateConfig from frigate.output.birdseye import Birdseye from frigate.output.camera import JsmpegCamera from frigate.output.preview import PreviewRecorder -from frigate.types import CameraMetricsTypes from frigate.util.image import SharedMemoryFrameManager logger = logging.getLogger(__name__) @@ -30,7 +29,6 @@ logger = logging.getLogger(__name__) def output_frames( config: FrigateConfig, video_output_queue: mp.Queue, - camera_metrics: dict[str, CameraMetricsTypes], ): threading.current_thread().name = "output" setproctitle("frigate.output") @@ -70,9 +68,7 @@ def output_frames( preview_recorders[camera] = PreviewRecorder(cam_config) if config.birdseye.enabled: - birdseye = Birdseye( - config, frame_manager, camera_metrics, stop_event, websocket_server - ) + birdseye = Birdseye(config, frame_manager, stop_event, websocket_server) websocket_thread.start()