diff --git a/frigate/track/tracked_object.py b/frigate/track/tracked_object.py index 6b604b0e9..2852d8917 100644 --- a/frigate/track/tracked_object.py +++ b/frigate/track/tracked_object.py @@ -18,6 +18,7 @@ from frigate.config import ( ) from frigate.const import CLIPS_DIR, THUMB_DIR from frigate.review.types import SeverityEnum +from frigate.util.builtin import sanitize_float from frigate.util.image import ( area, calculate_region, @@ -202,6 +203,11 @@ class TrackedObject: ) ) + # users can configure speed zones incorrectly, so sanitize speed_magnitude + # and velocity_angle in case the values come back as inf or NaN + speed_magnitude = sanitize_float(speed_magnitude) + self.velocity_angle = sanitize_float(self.velocity_angle) + if self.ui_config.unit_system == "metric": self.current_estimated_speed = ( speed_magnitude * 3.6 diff --git a/frigate/util/builtin.py b/frigate/util/builtin.py index b35c7b942..52280ecd8 100644 --- a/frigate/util/builtin.py +++ b/frigate/util/builtin.py @@ -4,6 +4,7 @@ import ast import copy import datetime import logging +import math import multiprocessing as mp import queue import re @@ -399,3 +400,10 @@ def serialize( def deserialize(bytes_data: bytes) -> list[float]: """Deserializes a compact "raw bytes" format into a list of floats""" return list(struct.unpack("%sf" % (len(bytes_data) // 4), bytes_data)) + + +def sanitize_float(value): + """Replace NaN or inf with 0.0.""" + if isinstance(value, (int, float)) and not math.isfinite(value): + return 0.0 + return value