| 
					
				 | 
			
			
				@@ -19,6 +19,7 @@ from ws4py.server.wsgirefserver import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from ws4py.server.wsgiutils import WebSocketWSGIApplication 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from ws4py.websocket import WebSocket 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from frigate.config import FrigateConfig 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 from frigate.util import SharedMemoryFrameManager, get_yuv_crop, copy_yuv_to_position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -73,9 +74,11 @@ class BroadcastThread(threading.Thread): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class BirdsEyeFrameManager: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def __init__(self, config, frame_manager: SharedMemoryFrameManager, width, height): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def __init__(self, config, frame_manager: SharedMemoryFrameManager): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.config = config 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.frame_manager = frame_manager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        width = config.birdseye.width 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        height = config.birdseye.height 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.frame_shape = (height, width) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.yuv_shape = (height * 3 // 2, width) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.frame = np.ndarray(self.yuv_shape, dtype=np.uint8) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -134,6 +137,7 @@ class BirdsEyeFrameManager: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def update_frame(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # determine how many cameras are tracking objects within the last 30 seconds 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         now = datetime.datetime.now().timestamp() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # TODO: this needs to be based on the "mode" from the config 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         active_cameras = set( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 cam 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -251,7 +255,7 @@ class BirdsEyeFrameManager: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return self.update_frame() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-def output_frames(config, video_output_queue): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def output_frames(config: FrigateConfig, video_output_queue): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     threading.current_thread().name = f"output" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     setproctitle(f"frigate.output") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -289,17 +293,24 @@ def output_frames(config, video_output_queue): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             camera, converters[camera], websocket_server 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    converters["birdseye"] = FFMpegConverter(1280, 720, 1280, 720, 8) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    broadcasters["birdseye"] = BroadcastThread( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        "birdseye", converters["birdseye"], websocket_server 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if config.birdseye.enabled: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        converters["birdseye"] = FFMpegConverter( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            config.birdseye.width, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            config.birdseye.height, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            config.birdseye.width, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            config.birdseye.height, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            config.birdseye.quality, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        broadcasters["birdseye"] = BroadcastThread( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "birdseye", converters["birdseye"], websocket_server 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     websocket_thread.start() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for t in broadcasters.values(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         t.start() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    birdseye_manager = BirdsEyeFrameManager(config, frame_manager, 1280, 720) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    birdseye_manager = BirdsEyeFrameManager(config, frame_manager) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     while not stop_event.is_set(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -325,7 +336,7 @@ def output_frames(config, video_output_queue): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             converters[camera].write(frame.tobytes()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # update birdseye if websockets are connected 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if any( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if config.birdseye.enabled and any( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ws.environ["PATH_INFO"].endswith("birdseye") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for ws in websocket_server.manager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ): 
			 |