2021-05-29 20:27:00 +02:00
|
|
|
import queue
|
2021-05-29 20:33:01 +02:00
|
|
|
import signal
|
|
|
|
import multiprocessing as mp
|
2021-05-29 20:27:00 +02:00
|
|
|
from multiprocessing import shared_memory
|
|
|
|
from frigate.util import SharedMemoryFrameManager
|
|
|
|
|
|
|
|
|
2021-05-29 20:33:01 +02:00
|
|
|
def output_frames(config, video_output_queue):
|
|
|
|
stop_event = mp.Event()
|
|
|
|
|
|
|
|
def receiveSignal(signalNumber, frame):
|
|
|
|
stop_event.set()
|
|
|
|
|
|
|
|
signal.signal(signal.SIGTERM, receiveSignal)
|
|
|
|
signal.signal(signal.SIGINT, receiveSignal)
|
|
|
|
|
2021-05-29 20:27:00 +02:00
|
|
|
frame_manager = SharedMemoryFrameManager()
|
|
|
|
previous_frames = {}
|
|
|
|
|
2021-05-29 20:33:01 +02:00
|
|
|
while not stop_event.is_set():
|
2021-05-29 20:27:00 +02:00
|
|
|
try:
|
|
|
|
(
|
|
|
|
camera,
|
|
|
|
frame_time,
|
|
|
|
current_tracked_objects,
|
|
|
|
motion_boxes,
|
|
|
|
regions,
|
|
|
|
) = video_output_queue.get(True, 10)
|
|
|
|
except queue.Empty:
|
|
|
|
continue
|
|
|
|
|
|
|
|
frame_id = f"{camera}{frame_time}"
|
|
|
|
|
|
|
|
frame = frame_manager.get(frame_id, config.cameras[camera].frame_shape_yuv)
|
|
|
|
|
|
|
|
if camera in previous_frames:
|
|
|
|
frame_manager.delete(previous_frames[camera])
|
|
|
|
|
|
|
|
previous_frames[camera] = frame_id
|