Cache camera stream info to speed up future config generations (#11614)

* Cache camera stream info to speed up future config generations

* Formatting

* fix
This commit is contained in:
Nicolas Mowen 2024-05-29 07:41:41 -06:00 committed by GitHub
parent cf4517cbdb
commit d5f6decd30
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 21 additions and 4 deletions

View File

@ -1,6 +1,5 @@
from __future__ import annotations from __future__ import annotations
import asyncio
import json import json
import logging import logging
import os import os
@ -46,9 +45,9 @@ from frigate.util.builtin import (
get_ffmpeg_arg_list, get_ffmpeg_arg_list,
load_config_with_no_duplicates, load_config_with_no_duplicates,
) )
from frigate.util.config import get_relative_coordinates from frigate.util.config import StreamInfoRetriever, get_relative_coordinates
from frigate.util.image import create_mask from frigate.util.image import create_mask
from frigate.util.services import auto_detect_hwaccel, get_video_properties from frigate.util.services import auto_detect_hwaccel
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -73,6 +72,9 @@ DEFAULT_DETECTORS = {"cpu": {"type": "cpu"}}
DEFAULT_DETECT_DIMENSIONS = {"width": 1280, "height": 720} DEFAULT_DETECT_DIMENSIONS = {"width": 1280, "height": 720}
DEFAULT_TIME_LAPSE_FFMPEG_ARGS = "-vf setpts=0.04*PTS -r 30" DEFAULT_TIME_LAPSE_FFMPEG_ARGS = "-vf setpts=0.04*PTS -r 30"
# stream info handler
stream_info_retriever = StreamInfoRetriever()
class FrigateBaseModel(BaseModel): class FrigateBaseModel(BaseModel):
model_config = ConfigDict(extra="forbid", protected_namespaces=()) model_config = ConfigDict(extra="forbid", protected_namespaces=())
@ -1416,7 +1418,7 @@ class FrigateConfig(FrigateBaseModel):
if need_detect_dimensions or need_record_fourcc: if need_detect_dimensions or need_record_fourcc:
stream_info = {"width": 0, "height": 0, "fourcc": None} stream_info = {"width": 0, "height": 0, "fourcc": None}
try: try:
stream_info = asyncio.run(get_video_properties(input.path)) stream_info = stream_info_retriever.get_stream_info(input.path)
except Exception: except Exception:
logger.warn( logger.warn(
f"Error detecting stream parameters automatically for {input.path} Applying default values." f"Error detecting stream parameters automatically for {input.path} Applying default values."

View File

@ -1,5 +1,6 @@
"""configuration utils.""" """configuration utils."""
import asyncio
import logging import logging
import os import os
import shutil import shutil
@ -8,6 +9,7 @@ from typing import Optional, Union
from ruamel.yaml import YAML from ruamel.yaml import YAML
from frigate.const import CONFIG_DIR, EXPORT_DIR from frigate.const import CONFIG_DIR, EXPORT_DIR
from frigate.util.services import get_video_properties
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -194,3 +196,16 @@ def get_relative_coordinates(
return mask return mask
return mask return mask
class StreamInfoRetriever:
def __init__(self) -> None:
self.stream_cache: dict[str, tuple[int, int]] = {}
def get_stream_info(self, path: str) -> str:
if path in self.stream_cache:
return self.stream_cache[path]
info = asyncio.run(get_video_properties(path))
self.stream_cache[path] = info
return info