Compare commits

..

1 Commits

Author SHA1 Message Date
Nicolas Mowen
63c9be1f82
Merge 1f5b7fb946 into 1a75251ffb 2025-11-29 21:35:06 +00:00

View File

@ -124,50 +124,45 @@ def capture_frames(
config_subscriber.check_for_updates() config_subscriber.check_for_updates()
return config.enabled return config.enabled
try: while not stop_event.is_set():
while not stop_event.is_set(): if not get_enabled_state():
if not get_enabled_state(): logger.debug(f"Stopping capture thread for disabled {config.name}")
logger.debug(f"Stopping capture thread for disabled {config.name}") break
fps.value = frame_rate.eps()
skipped_fps.value = skipped_eps.eps()
current_frame.value = datetime.now().timestamp()
frame_name = f"{config.name}_frame{frame_index}"
frame_buffer = frame_manager.write(frame_name)
try:
frame_buffer[:] = ffmpeg_process.stdout.read(frame_size)
except Exception:
# shutdown has been initiated
if stop_event.is_set():
break break
fps.value = frame_rate.eps() logger.error(f"{config.name}: Unable to read frames from ffmpeg process.")
skipped_fps.value = skipped_eps.eps()
current_frame.value = datetime.now().timestamp()
frame_name = f"{config.name}_frame{frame_index}"
frame_buffer = frame_manager.write(frame_name)
try:
frame_buffer[:] = ffmpeg_process.stdout.read(frame_size)
except Exception:
# shutdown has been initiated
if stop_event.is_set():
break
if ffmpeg_process.poll() is not None:
logger.error( logger.error(
f"{config.name}: Unable to read frames from ffmpeg process." f"{config.name}: ffmpeg process is not running. exiting capture thread..."
) )
break
if ffmpeg_process.poll() is not None: continue
logger.error(
f"{config.name}: ffmpeg process is not running. exiting capture thread..."
)
break
continue frame_rate.update()
frame_rate.update() # don't lock the queue to check, just try since it should rarely be full
try:
# add to the queue
frame_queue.put((frame_name, current_frame.value), False)
frame_manager.close(frame_name)
except queue.Full:
# if the queue is full, skip this frame
skipped_eps.update()
# don't lock the queue to check, just try since it should rarely be full frame_index = 0 if frame_index == shm_frame_count - 1 else frame_index + 1
try:
# add to the queue
frame_queue.put((frame_name, current_frame.value), False)
frame_manager.close(frame_name)
except queue.Full:
# if the queue is full, skip this frame
skipped_eps.update()
frame_index = 0 if frame_index == shm_frame_count - 1 else frame_index + 1
finally:
config_subscriber.stop()
class CameraWatchdog(threading.Thread): class CameraWatchdog(threading.Thread):
@ -239,16 +234,6 @@ class CameraWatchdog(threading.Thread):
else: else:
self.ffmpeg_detect_process.wait() self.ffmpeg_detect_process.wait()
# Wait for old capture thread to fully exit before starting a new one
if self.capture_thread is not None and self.capture_thread.is_alive():
self.logger.info("Waiting for capture thread to exit...")
self.capture_thread.join(timeout=5)
if self.capture_thread.is_alive():
self.logger.warning(
f"Capture thread for {self.config.name} did not exit in time"
)
self.logger.error( self.logger.error(
"The following ffmpeg logs include the last 100 lines prior to exit." "The following ffmpeg logs include the last 100 lines prior to exit."
) )