From ff90db30e6f649a7f92267cb23dcf496c1354171 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Mon, 12 Jun 2023 04:06:02 -0600 Subject: [PATCH] Various Bug Fixes (#6768) * Fix birdseye infinite loop * Fix division by zero --- frigate/output.py | 20 +++++++++++++++++--- frigate/record/cleanup.py | 2 +- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/frigate/output.py b/frigate/output.py index 89a624ebf..ea0a19b90 100644 --- a/frigate/output.py +++ b/frigate/output.py @@ -7,6 +7,7 @@ import queue import signal import subprocess as sp import threading +import traceback from wsgiref.simple_server import make_server import cv2 @@ -430,9 +431,10 @@ class BirdsEyeFrameManager: else: # calculate optimal layout coefficient = 1.0 + calculating = True # decrease scaling coefficient until height of all cameras can fit into the birdseye canvas - while True: + while calculating: layout_candidate, total_height = calculate_layout( (canvas_width, canvas_height), active_cameras_to_add, @@ -440,9 +442,13 @@ class BirdsEyeFrameManager: ) if (canvas_height * 0.75) < total_height <= canvas_height: - break + calculating = False elif total_height < canvas_height * 0.75: + logger.error( + f"Canvas ratio is {canvas_height * 0.75} > {total_height} :: {canvas_height / total_height}" + ) coefficient += 0.1 + calculating = False else: coefficient -= 0.1 @@ -473,8 +479,16 @@ class BirdsEyeFrameManager: if (now - self.last_output_time) < 1 / 10: return False + try: + updated_frame = self.update_frame() + except Exception: + updated_frame = False + self.active_cameras = [] + self.camera_layout = 0 + print(traceback.format_exc()) + # if the frame was updated or the fps is too low, send frame - if self.update_frame() or (now - self.last_output_time) > 1: + if updated_frame or (now - self.last_output_time) > 1: self.last_output_time = now return True return False diff --git a/frigate/record/cleanup.py b/frigate/record/cleanup.py index 75a1f9508..bb5022c93 100644 --- a/frigate/record/cleanup.py +++ b/frigate/record/cleanup.py @@ -241,7 +241,7 @@ class RecordingCleanup(threading.Thread): {"id": recording_id} for recording_id in recordings_to_delete ] - if len(recordings_to_delete) / recordings.count() > 0.5: + if len(recordings_to_delete) / max(1, recordings.count()) > 0.5: logger.debug( f"Deleting {(len(recordings_to_delete) / recordings.count()):2f}% of recordings could be due to configuration error. Aborting..." )