Skip to content

Commit

Permalink
Feature: automatic camera resolution configuration (#6810)
Browse files Browse the repository at this point in the history
* Add auto configuration for height, width and fps in detect role

* Add auto-configuration for detect width, height, and fps for input roles with detect in the CameraConfig class in config.py

* Refactor code to retrieve video properties from input stream in CameraConfig class and add optional parameter to retrieve video duration in get_video_properties function

* format

* Set default detect dimensions to 1280x720 and update DetectConfig to use the defaults

* Revert "Set default detect dimensions to 1280x720 and update DetectConfig to use the defaults"

This reverts commit a1aed04.

* Add default detect dimensions if autoconfiguration failed and log a warning message

* fix warn message spelling on frigate/config.py

Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>

* Ensure detect height and width are not None before using them in camera configuration

* docs: initial commit

* rename streamInfo to stream_info

Co-authored-by: Blake Blackshear <blakeb@blakeshome.com>

* Apply suggestions from code review

Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>

* Update docs

* handle case then get_video_properties returns 0x0 dimension

* Set detect resolution based on stream properties if available, else apply default values

* Update FrigateConfig to set default values for stream_info if resolution detection fails

* Update camera detection dimensions based on stream information if available

---------

Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
Co-authored-by: Blake Blackshear <blakeb@blakeshome.com>
  • Loading branch information
3 people committed Jul 14, 2023
1 parent 6ac36e8 commit ce3a544
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 18 deletions.
4 changes: 2 additions & 2 deletions docs/docs/configuration/camera_specific.md
Expand Up @@ -80,8 +80,8 @@ cameras:
rtmp:
enabled: False # <-- RTMP should be disabled if your stream is not H264
detect:
width: # <---- update for your camera's resolution
height: # <---- update for your camera's resolution
width: # <- optional, by default Frigate tries to automatically detect resolution
height: # <- optional, by default Frigate tries to automatically detect resolution
```

### Blue Iris RTSP Cameras
Expand Down
4 changes: 2 additions & 2 deletions docs/docs/configuration/cameras.md
Expand Up @@ -33,8 +33,8 @@ cameras:
roles:
- record
detect:
width: 1280
height: 720
width: 1280 # <- optional, by default Frigate tries to automatically detect resolution
height: 720 # <- optional, by default Frigate tries to automatically detect resolution
```

Additional cameras are simply added to the config under the `cameras` entry.
Expand Down
3 changes: 0 additions & 3 deletions docs/docs/configuration/index.md
Expand Up @@ -19,9 +19,6 @@ cameras:
- path: rtsp://viewer:{FRIGATE_RTSP_PASSWORD}@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
roles:
- detect
detect:
width: 1280
height: 720
```

### VSCode Configuration Schema
Expand Down
4 changes: 0 additions & 4 deletions docs/docs/development/contributing.md
Expand Up @@ -68,10 +68,6 @@ cameras:
input_args: -re -stream_loop -1 -fflags +genpts
roles:
- detect
detect:
height: 1080
width: 1920
fps: 5
```

These input args tell ffmpeg to read the mp4 file in an infinite loop. You can use any valid ffmpeg input here.
Expand Down
5 changes: 0 additions & 5 deletions docs/docs/guides/getting_started.md
Expand Up @@ -22,8 +22,6 @@ cameras:
- detect
detect:
enabled: False # <---- disable detection until you have a working camera feed
width: 1280 # <---- update for your camera's resolution
height: 720 # <---- update for your camera's resolution
```

### Step 2: Start Frigate
Expand Down Expand Up @@ -105,9 +103,6 @@ cameras:
- path: rtsp://10.0.10.10:554/rtsp
roles:
- detect
detect:
width: 1280
height: 720
motion:
mask:
- 0,461,3,0,1919,0,1919,843,1699,492,1344,458,1346,336,973,317,869,375,866,432
Expand Down
32 changes: 30 additions & 2 deletions frigate/config.py
Expand Up @@ -26,6 +26,7 @@
deep_merge,
escape_special_characters,
get_ffmpeg_arg_list,
get_video_properties,
load_config_with_no_duplicates,
)
from frigate.util.image import create_mask
Expand All @@ -42,6 +43,7 @@
DEFAULT_TRACKED_OBJECTS = ["person"]
DEFAULT_LISTEN_AUDIO = ["bark", "speech", "yell", "scream"]
DEFAULT_DETECTORS = {"cpu": {"type": "cpu"}}
DEFAULT_DETECT_DIMENSIONS = {"width": 1280, "height": 720}


class FrigateBaseModel(BaseModel):
Expand Down Expand Up @@ -284,8 +286,8 @@ class StationaryConfig(FrigateBaseModel):


class DetectConfig(FrigateBaseModel):
height: int = Field(default=720, title="Height of the stream for the detect role.")
width: int = Field(default=1280, title="Width of the stream for the detect role.")
height: Optional[int] = Field(title="Height of the stream for the detect role.")
width: Optional[int] = Field(title="Width of the stream for the detect role.")
fps: int = Field(
default=5, title="Number of frames per second to process through detection."
)
Expand Down Expand Up @@ -1020,6 +1022,32 @@ def runtime_config(self, plus_api: PlusApi = None) -> FrigateConfig:
{"name": name, **merged_config}
)

if (
camera_config.detect.height is None
or camera_config.detect.width is None
):
for input in camera_config.ffmpeg.inputs:
if "detect" in input.roles:
stream_info = {"width": 0, "height": 0}
try:
stream_info = get_video_properties(input.path)
except Exception:
logger.warn(
f"Error detecting stream resolution automatically for {input.path} Applying default values."
)
stream_info = {"width": 0, "height": 0}

camera_config.detect.width = (
stream_info["width"]
if stream_info.get("width")
else DEFAULT_DETECT_DIMENSIONS["width"]
)
camera_config.detect.height = (
stream_info["height"]
if stream_info.get("height")
else DEFAULT_DETECT_DIMENSIONS["height"]
)

# Default max_disappeared configuration
max_disappeared = camera_config.detect.fps * 5
if camera_config.detect.max_disappeared is None:
Expand Down

0 comments on commit ce3a544

Please sign in to comment.