From e5038b958b89686a4b9c73c7b8ef774c9729c655 Mon Sep 17 00:00:00 2001 From: Nick Mowen Date: Tue, 3 Jan 2023 13:07:21 -0700 Subject: [PATCH] Add handling of encode engine and video codec --- frigate/ffmpeg_presets.py | 17 +++++++++++++++++ frigate/restream.py | 33 +++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/frigate/ffmpeg_presets.py b/frigate/ffmpeg_presets.py index 1adbd3c9f..eb981a21c 100644 --- a/frigate/ffmpeg_presets.py +++ b/frigate/ffmpeg_presets.py @@ -230,6 +230,15 @@ PRESETS_HW_ACCEL_ENCODE = { ], } +PRESETS_HW_ACCEL_GO2RTC_ENGINE = { + "preset-intel-vaapi": "vaapi", + "preset-intel-qsv-h264": "vaapi", # go2rtc doesn't support qsv + "preset-intel-qsv-h265": "vaapi", + "preset-amd-vaapi": "vaapi", + "preset-nvidia-h264": "cuda", + "preset-nvidia-h265": "cuda", +} + def parse_preset_hardware_acceleration_decode(arg: Any) -> list[str]: """Return the correct preset if in preset format otherwise return None.""" @@ -267,6 +276,14 @@ def parse_preset_hardware_acceleration_encode(arg: Any) -> list[str]: return PRESETS_HW_ACCEL_ENCODE.get(arg, PRESETS_HW_ACCEL_ENCODE["default"]) +def parse_preset_hardware_acceleration_go2rtc_engine(arg: Any) -> list[str]: + """Return the correct engine for the preset otherwise returns None.""" + if not isinstance(arg, str): + return None + + return PRESETS_HW_ACCEL_GO2RTC_ENGINE.get(arg) + + PRESETS_INPUT = { "preset-http-jpeg-generic": _user_agent_args + [ diff --git a/frigate/restream.py b/frigate/restream.py index 6642fbeb4..50f690b99 100644 --- a/frigate/restream.py +++ b/frigate/restream.py @@ -3,18 +3,33 @@ import logging import requests -from frigate.util import escape_special_characters -from frigate.config import FrigateConfig +from typing import Optional + +from frigate.config import FrigateConfig, RestreamCodecEnum from frigate.const import BIRDSEYE_PIPE -from frigate.ffmpeg_presets import parse_preset_hardware_acceleration_encode +from frigate.ffmpeg_presets import ( + parse_preset_hardware_acceleration_encode, + parse_preset_hardware_acceleration_go2rtc_engine, +) +from frigate.util import escape_special_characters logger = logging.getLogger(__name__) -def get_manual_go2rtc_stream(camera_url: str) -> str: +def get_manual_go2rtc_stream( + camera_url: str, codec: RestreamCodecEnum, engine: Optional[str] +) -> str: """Get a manual stream for go2rtc.""" - return f"ffmpeg:{camera_url}#video=copy#audio=aac#audio=opus" + if codec == RestreamCodecEnum.copy: + return f"ffmpeg:{camera_url}#video=copy#audio=aac#audio=opus" + + if engine: + return ( + f"ffmpeg:{camera_url}#video={codec}#hardware={engine}#audio=aac#audio=opus" + ) + + return f"ffmpeg:{camera_url}#video={codec}#audio=aac#audio=opus" class RestreamApi: @@ -41,7 +56,13 @@ class RestreamApi: else: # go2rtc only supports rtsp for direct relay, otherwise ffmpeg is used self.relays[cam_name] = get_manual_go2rtc_stream( - escape_special_characters(input.path) + escape_special_characters( + input.path, + camera.restream.video_codec, + parse_preset_hardware_acceleration_go2rtc_engine( + self.config.ffmpeg.hwaccel_args + ), + ) ) if self.config.restream.birdseye: