From f0de4d359257fe2cabb44a961171311358aa61f4 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Thu, 12 Nov 2026 18:02:11 -0600 Subject: [PATCH] serialize recording frame extraction for review descriptions --- .../post/review_descriptions.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/frigate/data_processing/post/review_descriptions.py b/frigate/data_processing/post/review_descriptions.py index b348b4647a..c56d4e1961 100644 --- a/frigate/data_processing/post/review_descriptions.py +++ b/frigate/data_processing/post/review_descriptions.py @@ -68,6 +68,9 @@ class ReviewDescriptionProcessor(PostProcessorApi): self.review_desc_dps = EventsPerSecond() self.review_desc_dps.start() + # one review's ffmpeg extraction at a time, as on the maintainer loop + self._frame_extraction_lock = threading.Lock() + def calculate_frame_count( self, camera: str, @@ -212,13 +215,14 @@ class ReviewDescriptionProcessor(PostProcessorApi): buffer_extension = get_recording_buffer_extension( final_data["end_time"] - final_data["start_time"] ) - frames = self.get_recording_frames( - camera, - final_data["start_time"] - buffer_extension, - final_data["end_time"] + buffer_extension, - height=480, # Use 480p for good balance between quality and token usage - frame_mode=genai_config.frame_mode, - ) + with self._frame_extraction_lock: + frames = self.get_recording_frames( + camera, + final_data["start_time"] - buffer_extension, + final_data["end_time"] + buffer_extension, + height=480, # Use 480p for good balance between quality and token usage + frame_mode=genai_config.frame_mode, + ) if frames: if genai_config.debug_save_thumbnails: