mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	Fix camera access and improve typing (#15272)
* Fix camera access and improve typing: * Formatting
This commit is contained in:
		
							parent
							
								
									f094c59cd0
								
							
						
					
					
						commit
						ee816b2251
					
				| @ -35,8 +35,9 @@ from frigate.const import ( | ||||
|     CLIPS_DIR, | ||||
| ) | ||||
| from frigate.embeddings import EmbeddingsContext | ||||
| from frigate.events.external import ExternalEventProcessor | ||||
| from frigate.models import Event, ReviewSegment, Timeline | ||||
| from frigate.object_processing import TrackedObject | ||||
| from frigate.object_processing import TrackedObject, TrackedObjectProcessor | ||||
| from frigate.util.builtin import get_tz_modifiers | ||||
| 
 | ||||
| logger = logging.getLogger(__name__) | ||||
| @ -1087,9 +1088,11 @@ def create_event( | ||||
|         ) | ||||
| 
 | ||||
|     try: | ||||
|         frame = request.app.detected_frames_processor.get_current_frame(camera_name) | ||||
|         frame_processor: TrackedObjectProcessor = request.app.detected_frames_processor | ||||
|         external_processor: ExternalEventProcessor = request.app.external_processor | ||||
| 
 | ||||
|         event_id = request.app.external_processor.create_manual_event( | ||||
|         frame = frame_processor.get_current_frame(camera_name) | ||||
|         event_id = external_processor.create_manual_event( | ||||
|             camera_name, | ||||
|             label, | ||||
|             body.source_type, | ||||
|  | ||||
| @ -36,6 +36,7 @@ from frigate.const import ( | ||||
|     RECORD_DIR, | ||||
| ) | ||||
| from frigate.models import Event, Previews, Recordings, Regions, ReviewSegment | ||||
| from frigate.object_processing import TrackedObjectProcessor | ||||
| from frigate.util.builtin import get_tz_modifiers | ||||
| from frigate.util.image import get_image_from_recording | ||||
| 
 | ||||
| @ -79,7 +80,11 @@ def mjpeg_feed( | ||||
| 
 | ||||
| 
 | ||||
| def imagestream( | ||||
|     detected_frames_processor, camera_name: str, fps: int, height: int, draw_options | ||||
|     detected_frames_processor: TrackedObjectProcessor, | ||||
|     camera_name: str, | ||||
|     fps: int, | ||||
|     height: int, | ||||
|     draw_options: dict[str, any], | ||||
| ): | ||||
|     while True: | ||||
|         # max out at specified FPS | ||||
| @ -118,6 +123,7 @@ def latest_frame( | ||||
|     extension: Extension, | ||||
|     params: MediaLatestFrameQueryParams = Depends(), | ||||
| ): | ||||
|     frame_processor: TrackedObjectProcessor = request.app.detected_frames_processor | ||||
|     draw_options = { | ||||
|         "bounding_boxes": params.bbox, | ||||
|         "timestamp": params.timestamp, | ||||
| @ -129,17 +135,14 @@ def latest_frame( | ||||
|     quality = params.quality | ||||
| 
 | ||||
|     if camera_name in request.app.frigate_config.cameras: | ||||
|         frame = request.app.detected_frames_processor.get_current_frame( | ||||
|             camera_name, draw_options | ||||
|         ) | ||||
|         frame = frame_processor.get_current_frame(camera_name, draw_options) | ||||
|         retry_interval = float( | ||||
|             request.app.frigate_config.cameras.get(camera_name).ffmpeg.retry_interval | ||||
|             or 10 | ||||
|         ) | ||||
| 
 | ||||
|         if frame is None or datetime.now().timestamp() > ( | ||||
|             request.app.detected_frames_processor.get_current_frame_time(camera_name) | ||||
|             + retry_interval | ||||
|             frame_processor.get_current_frame_time(camera_name) + retry_interval | ||||
|         ): | ||||
|             if request.app.camera_error_image is None: | ||||
|                 error_image = glob.glob("/opt/frigate/frigate/images/camera-error.jpg") | ||||
| @ -180,7 +183,7 @@ def latest_frame( | ||||
|         ) | ||||
|     elif camera_name == "birdseye" and request.app.frigate_config.birdseye.restream: | ||||
|         frame = cv2.cvtColor( | ||||
|             request.app.detected_frames_processor.get_current_frame(camera_name), | ||||
|             frame_processor.get_current_frame(camera_name), | ||||
|             cv2.COLOR_YUV2BGR_I420, | ||||
|         ) | ||||
| 
 | ||||
| @ -813,15 +816,15 @@ def grid_snapshot( | ||||
| ): | ||||
|     if camera_name in request.app.frigate_config.cameras: | ||||
|         detect = request.app.frigate_config.cameras[camera_name].detect | ||||
|         frame = request.app.detected_frames_processor.get_current_frame(camera_name, {}) | ||||
|         frame_processor: TrackedObjectProcessor = request.app.detected_frames_processor | ||||
|         frame = frame_processor.get_current_frame(camera_name, {}) | ||||
|         retry_interval = float( | ||||
|             request.app.frigate_config.cameras.get(camera_name).ffmpeg.retry_interval | ||||
|             or 10 | ||||
|         ) | ||||
| 
 | ||||
|         if frame is None or datetime.now().timestamp() > ( | ||||
|             request.app.detected_frames_processor.get_current_frame_time(camera_name) | ||||
|             + retry_interval | ||||
|             frame_processor.get_current_frame_time(camera_name) + retry_interval | ||||
|         ): | ||||
|             return JSONResponse( | ||||
|                 content={"success": False, "message": "Unable to get valid frame"}, | ||||
|  | ||||
| @ -10,6 +10,7 @@ from enum import Enum | ||||
| from typing import Optional | ||||
| 
 | ||||
| import cv2 | ||||
| from numpy import ndarray | ||||
| 
 | ||||
| from frigate.comms.detections_updater import DetectionPublisher, DetectionTypeEnum | ||||
| from frigate.comms.events_updater import EventUpdatePublisher | ||||
| @ -45,7 +46,7 @@ class ExternalEventProcessor: | ||||
|         duration: Optional[int], | ||||
|         include_recording: bool, | ||||
|         draw: dict[str, any], | ||||
|         snapshot_frame: any, | ||||
|         snapshot_frame: Optional[ndarray], | ||||
|     ) -> str: | ||||
|         now = datetime.datetime.now().timestamp() | ||||
|         camera_config = self.config.cameras.get(camera) | ||||
| @ -131,8 +132,11 @@ class ExternalEventProcessor: | ||||
|         label: str, | ||||
|         event_id: str, | ||||
|         draw: dict[str, any], | ||||
|         img_frame: any, | ||||
|     ) -> str: | ||||
|         img_frame: Optional[ndarray], | ||||
|     ) -> Optional[str]: | ||||
|         if not img_frame: | ||||
|             return None | ||||
| 
 | ||||
|         # write clean snapshot if enabled | ||||
|         if camera_config.snapshots.clean_copy: | ||||
|             ret, png = cv2.imencode(".png", img_frame) | ||||
|  | ||||
| @ -6,7 +6,7 @@ import queue | ||||
| import threading | ||||
| from collections import Counter, defaultdict | ||||
| from multiprocessing.synchronize import Event as MpEvent | ||||
| from typing import Callable | ||||
| from typing import Callable, Optional | ||||
| 
 | ||||
| import cv2 | ||||
| import numpy as np | ||||
| @ -784,13 +784,18 @@ class TrackedObjectProcessor(threading.Thread): | ||||
|         else: | ||||
|             return {} | ||||
| 
 | ||||
|     def get_current_frame(self, camera, draw_options={}): | ||||
|     def get_current_frame( | ||||
|         self, camera: str, draw_options: dict[str, any] = {} | ||||
|     ) -> Optional[np.ndarray]: | ||||
|         if camera == "birdseye": | ||||
|             return self.frame_manager.get( | ||||
|                 "birdseye", | ||||
|                 (self.config.birdseye.height * 3 // 2, self.config.birdseye.width), | ||||
|             ) | ||||
| 
 | ||||
|         if camera not in self.camera_states: | ||||
|             return None | ||||
| 
 | ||||
|         return self.camera_states[camera].get_current_frame(draw_options) | ||||
| 
 | ||||
|     def get_current_frame_time(self, camera) -> int: | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user