mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-05-01 19:17:41 +03:00
Add more processes
This commit is contained in:
parent
4b913953a1
commit
e8dd382280
@ -65,7 +65,7 @@ from frigate.ptz.onvif import OnvifController
|
|||||||
from frigate.record.cleanup import RecordingCleanup
|
from frigate.record.cleanup import RecordingCleanup
|
||||||
from frigate.record.export import migrate_exports
|
from frigate.record.export import migrate_exports
|
||||||
from frigate.record.record import manage_recordings
|
from frigate.record.record import manage_recordings
|
||||||
from frigate.review.review import manage_review_segments
|
from frigate.review.review import ReviewProcess
|
||||||
from frigate.stats.emitter import StatsEmitter
|
from frigate.stats.emitter import StatsEmitter
|
||||||
from frigate.stats.util import stats_init
|
from frigate.stats.util import stats_init
|
||||||
from frigate.storage import StorageMaintainer
|
from frigate.storage import StorageMaintainer
|
||||||
@ -236,12 +236,7 @@ class FrigateApp:
|
|||||||
logger.info(f"Recording process started: {recording_process.pid}")
|
logger.info(f"Recording process started: {recording_process.pid}")
|
||||||
|
|
||||||
def init_review_segment_manager(self) -> None:
|
def init_review_segment_manager(self) -> None:
|
||||||
review_segment_process = util.Process(
|
review_segment_process = ReviewProcess(self.config)
|
||||||
target=manage_review_segments,
|
|
||||||
name="review_segment_manager",
|
|
||||||
args=(self.config,),
|
|
||||||
)
|
|
||||||
review_segment_process.daemon = True
|
|
||||||
self.review_segment_process = review_segment_process
|
self.review_segment_process = review_segment_process
|
||||||
review_segment_process.start()
|
review_segment_process.start()
|
||||||
self.processes["review_segment"] = review_segment_process.pid or 0
|
self.processes["review_segment"] = review_segment_process.pid or 0
|
||||||
|
|||||||
@ -18,11 +18,10 @@ from frigate.config.camera.updater import (
|
|||||||
)
|
)
|
||||||
from frigate.const import SHM_FRAMES_VAR
|
from frigate.const import SHM_FRAMES_VAR
|
||||||
from frigate.models import Regions
|
from frigate.models import Regions
|
||||||
from frigate.util import Process as FrigateProcess
|
|
||||||
from frigate.util.builtin import empty_and_close_queue
|
from frigate.util.builtin import empty_and_close_queue
|
||||||
from frigate.util.image import SharedMemoryFrameManager, UntrackedSharedMemory
|
from frigate.util.image import SharedMemoryFrameManager, UntrackedSharedMemory
|
||||||
from frigate.util.object import get_camera_regions_grid
|
from frigate.util.object import get_camera_regions_grid
|
||||||
from frigate.video import CameraTracker, capture_camera
|
from frigate.video import CameraCapture, CameraTracker
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -183,11 +182,7 @@ class CameraMaintainer(threading.Thread):
|
|||||||
frame_size = config.frame_shape_yuv[0] * config.frame_shape_yuv[1]
|
frame_size = config.frame_shape_yuv[0] * config.frame_shape_yuv[1]
|
||||||
self.frame_manager.create(f"{config.name}_frame{i}", frame_size)
|
self.frame_manager.create(f"{config.name}_frame{i}", frame_size)
|
||||||
|
|
||||||
capture_process = FrigateProcess(
|
capture_process = CameraCapture(config, count, self.camera_metrics[name])
|
||||||
target=capture_camera,
|
|
||||||
name=f"camera_capture:{name}",
|
|
||||||
args=(config, count, self.camera_metrics[name]),
|
|
||||||
)
|
|
||||||
capture_process.daemon = True
|
capture_process.daemon = True
|
||||||
self.capture_processes[name] = capture_process
|
self.capture_processes[name] = capture_process
|
||||||
capture_process.start()
|
capture_process.start()
|
||||||
|
|||||||
@ -1,36 +1,23 @@
|
|||||||
"""Run recording maintainer and cleanup."""
|
"""Run recording maintainer and cleanup."""
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import multiprocessing as mp
|
|
||||||
import signal
|
|
||||||
import threading
|
|
||||||
from types import FrameType
|
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
from setproctitle import setproctitle
|
|
||||||
|
|
||||||
|
import frigate.util as util
|
||||||
from frigate.config import FrigateConfig
|
from frigate.config import FrigateConfig
|
||||||
from frigate.review.maintainer import ReviewSegmentMaintainer
|
from frigate.review.maintainer import ReviewSegmentMaintainer
|
||||||
from frigate.util.services import listen
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def manage_review_segments(config: FrigateConfig) -> None:
|
class ReviewProcess(util.Process):
|
||||||
stop_event = mp.Event()
|
def __init__(self, config: FrigateConfig) -> None:
|
||||||
|
super().__init__(name="frigate.review_segment_manager", daemon=True)
|
||||||
|
self.config = config
|
||||||
|
|
||||||
def receiveSignal(signalNumber: int, frame: Optional[FrameType]) -> None:
|
def run(self) -> None:
|
||||||
stop_event.set()
|
self.pre_run_setup()
|
||||||
|
maintainer = ReviewSegmentMaintainer(
|
||||||
signal.signal(signal.SIGTERM, receiveSignal)
|
self.config,
|
||||||
signal.signal(signal.SIGINT, receiveSignal)
|
self.stop_event,
|
||||||
|
)
|
||||||
threading.current_thread().name = "process:review_segment_manager"
|
maintainer.start()
|
||||||
setproctitle("frigate.review_segment_manager")
|
|
||||||
listen()
|
|
||||||
|
|
||||||
maintainer = ReviewSegmentMaintainer(
|
|
||||||
config,
|
|
||||||
stop_event,
|
|
||||||
)
|
|
||||||
maintainer.start()
|
|
||||||
|
|||||||
@ -1,9 +1,7 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
import multiprocessing as mp
|
|
||||||
import os
|
import os
|
||||||
import queue
|
import queue
|
||||||
import signal
|
|
||||||
import subprocess as sp
|
import subprocess as sp
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
@ -12,7 +10,6 @@ from multiprocessing.synchronize import Event as MpEvent
|
|||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
import cv2
|
import cv2
|
||||||
from setproctitle import setproctitle
|
|
||||||
|
|
||||||
import frigate.util as util
|
import frigate.util as util
|
||||||
from frigate.camera import CameraMetrics, PTZMetrics
|
from frigate.camera import CameraMetrics, PTZMetrics
|
||||||
@ -318,7 +315,7 @@ class CameraWatchdog(threading.Thread):
|
|||||||
ffmpeg_cmd, self.logger, self.logpipe, self.frame_size
|
ffmpeg_cmd, self.logger, self.logpipe, self.frame_size
|
||||||
)
|
)
|
||||||
self.ffmpeg_pid.value = self.ffmpeg_detect_process.pid
|
self.ffmpeg_pid.value = self.ffmpeg_detect_process.pid
|
||||||
self.capture_thread = CameraCapture(
|
self.capture_thread = CameraCaptureRunner(
|
||||||
self.config,
|
self.config,
|
||||||
self.shm_frame_count,
|
self.shm_frame_count,
|
||||||
self.frame_index,
|
self.frame_index,
|
||||||
@ -396,7 +393,7 @@ class CameraWatchdog(threading.Thread):
|
|||||||
return newest_segment_time
|
return newest_segment_time
|
||||||
|
|
||||||
|
|
||||||
class CameraCapture(threading.Thread):
|
class CameraCaptureRunner(threading.Thread):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
config: CameraConfig,
|
config: CameraConfig,
|
||||||
@ -440,31 +437,28 @@ class CameraCapture(threading.Thread):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def capture_camera(
|
class CameraCapture(util.Process):
|
||||||
config: CameraConfig, shm_frame_count: int, camera_metrics: CameraMetrics
|
def __init__(
|
||||||
):
|
self, config: CameraConfig, shm_frame_count: int, camera_metrics: CameraMetrics
|
||||||
stop_event = mp.Event()
|
) -> None:
|
||||||
|
super().__init__(name=f"camera_capture:{config.name}", daemon=True)
|
||||||
|
self.config = config
|
||||||
|
self.shm_frame_count = shm_frame_count
|
||||||
|
self.camera_metrics = camera_metrics
|
||||||
|
|
||||||
def receiveSignal(signalNumber, frame):
|
def run(self) -> None:
|
||||||
stop_event.set()
|
self.pre_run_setup()
|
||||||
|
camera_watchdog = CameraWatchdog(
|
||||||
signal.signal(signal.SIGTERM, receiveSignal)
|
self.config,
|
||||||
signal.signal(signal.SIGINT, receiveSignal)
|
self.shm_frame_count,
|
||||||
|
self.camera_metrics.frame_queue,
|
||||||
threading.current_thread().name = f"capture:{config.name}"
|
self.camera_metrics.camera_fps,
|
||||||
setproctitle(f"frigate.capture:{config.name}")
|
self.camera_metrics.skipped_fps,
|
||||||
|
self.camera_metrics.ffmpeg_pid,
|
||||||
camera_watchdog = CameraWatchdog(
|
self.stop_event,
|
||||||
config,
|
)
|
||||||
shm_frame_count,
|
camera_watchdog.start()
|
||||||
camera_metrics.frame_queue,
|
camera_watchdog.join()
|
||||||
camera_metrics.camera_fps,
|
|
||||||
camera_metrics.skipped_fps,
|
|
||||||
camera_metrics.ffmpeg_pid,
|
|
||||||
stop_event,
|
|
||||||
)
|
|
||||||
camera_watchdog.start()
|
|
||||||
camera_watchdog.join()
|
|
||||||
|
|
||||||
|
|
||||||
class CameraTracker(util.Process):
|
class CameraTracker(util.Process):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user