diff --git a/docs/docs/configuration/cameras.md b/docs/docs/configuration/cameras.md index e301316a1..0c306e20c 100644 --- a/docs/docs/configuration/cameras.md +++ b/docs/docs/configuration/cameras.md @@ -229,7 +229,12 @@ cameras: hwaccel_args: # Optional: stream specific input args (default: inherit) input_args: - + # Optional: camera specific global args (default: inherit) + global_args: + # Optional: camera specific hwaccel args (default: inherit) + hwaccel_args: + # Optional: camera specific input args (default: inherit) + input_args: # Optional: camera specific output args (default: inherit) output_args: diff --git a/frigate/config.py b/frigate/config.py index 7035659ac..4ea1fb6c3 100644 --- a/frigate/config.py +++ b/frigate/config.py @@ -164,6 +164,9 @@ CAMERA_FFMPEG_SCHEMA = vol.Schema( 'input_args': vol.Any(str, [str]), }], vol.Msg(each_role_used_once, msg="Each input role may only be used once"), vol.Msg(detect_is_required, msg="The detect role is required")), + 'global_args': vol.Any(str, [str]), + 'hwaccel_args': vol.Any(str, [str]), + 'input_args': vol.Any(str, [str]), 'output_args': { vol.Optional('detect', default=DETECT_FFMPEG_OUTPUT_ARGS_DEFAULT): vol.Any(str, [str]), vol.Optional('record', default=RECORD_FFMPEG_OUTPUT_ARGS_DEFAULT): vol.Any(str, [str]), @@ -392,12 +395,12 @@ class MqttConfig(): } class CameraInput(): - def __init__(self, global_config, ffmpeg_input): + def __init__(self, camera_config, global_config, ffmpeg_input): self._path = ffmpeg_input['path'] self._roles = ffmpeg_input['roles'] - self._global_args = ffmpeg_input.get('global_args', global_config['global_args']) - self._hwaccel_args = ffmpeg_input.get('hwaccel_args', global_config['hwaccel_args']) - self._input_args = ffmpeg_input.get('input_args', global_config['input_args']) + self._global_args = ffmpeg_input.get('global_args', camera_config.get('global_args', global_config['global_args'])) + self._hwaccel_args = ffmpeg_input.get('hwaccel_args', camera_config.get('hwaccel_args', global_config['hwaccel_args'])) + self._input_args = ffmpeg_input.get('input_args', camera_config.get('input_args', global_config['input_args'])) @property def path(self): @@ -421,7 +424,7 @@ class CameraInput(): class CameraFfmpegConfig(): def __init__(self, global_config, config): - self._inputs = [CameraInput(global_config, i) for i in config['inputs']] + self._inputs = [CameraInput(config, global_config, i) for i in config['inputs']] self._output_args = config.get('output_args', global_config['output_args']) @property diff --git a/frigate/test/test_config.py b/frigate/test/test_config.py index aedba1400..c906a7c0c 100644 --- a/frigate/test/test_config.py +++ b/frigate/test/test_config.py @@ -160,7 +160,7 @@ class TestConfig(TestCase): assert('dog' in frigate_config.cameras['back'].objects.filters) assert(frigate_config.cameras['back'].objects.filters['dog'].threshold == 0.7) - def test_ffmpeg_params(self): + def test_ffmpeg_params_global(self): config = { 'ffmpeg': { 'input_args': ['-re'] @@ -190,6 +190,64 @@ class TestConfig(TestCase): } frigate_config = FrigateConfig(config=config) assert('-re' in frigate_config.cameras['back'].ffmpeg_cmds[0]['cmd']) + + def test_ffmpeg_params_camera(self): + config = { + 'mqtt': { + 'host': 'mqtt' + }, + 'cameras': { + 'back': { + 'ffmpeg': { + 'inputs': [ + { 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] } + ], + 'input_args': ['-re'] + }, + 'height': 1080, + 'width': 1920, + 'objects': { + 'track': ['person', 'dog'], + 'filters': { + 'dog': { + 'threshold': 0.7 + } + } + } + } + } + } + frigate_config = FrigateConfig(config=config) + assert('-re' in frigate_config.cameras['back'].ffmpeg_cmds[0]['cmd']) + + def test_ffmpeg_params_input(self): + config = { + 'mqtt': { + 'host': 'mqtt' + }, + 'cameras': { + 'back': { + 'ffmpeg': { + 'inputs': [ + { 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'], 'input_args': ['-re'] } + ] + }, + 'height': 1080, + 'width': 1920, + 'objects': { + 'track': ['person', 'dog'], + 'filters': { + 'dog': { + 'threshold': 0.7 + } + } + } + } + } + } + frigate_config = FrigateConfig(config=config) + assert('-re' in frigate_config.cameras['back'].ffmpeg_cmds[0]['cmd']) + def test_inherit_clips_retention(self): config = {