diff --git a/Dockerfile b/Dockerfile
index 17bf01a19..244678b63 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -192,22 +192,10 @@ RUN ldconfig
EXPOSE 5000
EXPOSE 1935
EXPOSE 8554
-EXPOSE 8555
+EXPOSE 8555/tcp 8555/udp
-# Fails if cont-init.d fails
-ENV S6_BEHAVIOUR_IF_STAGE2_FAILS=2
-# Wait indefinitely for cont-init.d to finish before starting services
-ENV S6_CMD_WAIT_FOR_SERVICES=1
-ENV S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0
-# Give services (including Frigate) 30 seconds to stop before killing them
-# But this is not working currently because of:
-# https://github.com/just-containers/s6-overlay/issues/503
-ENV S6_SERVICES_GRACETIME=30000
# Configure logging to prepend timestamps, log to stdout, keep 0 archives and rotate on 10MB
ENV S6_LOGGING_SCRIPT="T 1 n0 s10000000 T"
-# TODO: remove after a new version of s6-overlay is released. See:
-# https://github.com/just-containers/s6-overlay/issues/460#issuecomment-1327127006
-ENV S6_SERVICES_READYTIME=50
ENTRYPOINT ["/init"]
CMD []
@@ -217,7 +205,7 @@ FROM deps AS devcontainer
# Do not start the actual Frigate service on devcontainer as it will be started by VSCode
# But start a fake service for simulating the logs
-COPY docker/fake_frigate_run /etc/services.d/frigate/run
+COPY docker/fake_frigate_run /etc/s6-overlay/s6-rc.d/frigate/run
# Install Node 16
RUN apt-get update \
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/consumer-for b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/consumer-for
new file mode 100644
index 000000000..5e9301778
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/consumer-for
@@ -0,0 +1 @@
+frigate
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/dependencies.d/log-prepare b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/dependencies.d/log-prepare
new file mode 100644
index 000000000..e69de29bb
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/pipeline-name b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/pipeline-name
new file mode 100644
index 000000000..01f465e4e
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/pipeline-name
@@ -0,0 +1 @@
+frigate-pipeline
diff --git a/docker/rootfs/etc/services.d/frigate/log/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/run
similarity index 100%
rename from docker/rootfs/etc/services.d/frigate/log/run
rename to docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/run
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/type b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/type
new file mode 100644
index 000000000..5883cff0c
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/type
@@ -0,0 +1 @@
+longrun
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/dependencies.d/go2rtc b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/dependencies.d/go2rtc
new file mode 100644
index 000000000..e69de29bb
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/finish b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/finish
new file mode 100755
index 000000000..d83c1a6e6
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/finish
@@ -0,0 +1,30 @@
+#!/command/with-contenv bash
+# shellcheck shell=bash
+# Take down the S6 supervision tree when the service exits
+
+set -o errexit -o nounset -o pipefail
+
+declare exit_code_container
+exit_code_container=$(cat /run/s6-linux-init-container-results/exitcode)
+readonly exit_code_container
+readonly exit_code_service="${1}"
+readonly exit_code_signal="${2}"
+readonly service="Frigate"
+
+echo "Service ${service} exited with code ${exit_code_service} (by signal ${exit_code_signal})" >&2
+
+if [[ "${exit_code_service}" -eq 256 ]]; then
+ if [[ "${exit_code_container}" -eq 0 ]]; then
+ echo $((128 + exit_code_signal)) > /run/s6-linux-init-container-results/exitcode
+ fi
+elif [[ "${exit_code_service}" -ne 0 ]]; then
+ if [[ "${exit_code_container}" -eq 0 ]]; then
+ echo "${exit_code_service}" > /run/s6-linux-init-container-results/exitcode
+ fi
+else
+ # Exit code 0 is expected when Frigate is restarted by the user. In this case,
+ # we create a signal for the go2rtc finish script to tolerate the restart.
+ touch /dev/shm/restarting-frigate
+fi
+
+exec /run/s6/basedir/bin/halt
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/producer-for b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/producer-for
new file mode 100644
index 000000000..65f1316a4
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/producer-for
@@ -0,0 +1 @@
+frigate-log
diff --git a/docker/rootfs/etc/services.d/frigate/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/run
similarity index 81%
rename from docker/rootfs/etc/services.d/frigate/run
rename to docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/run
index c543ff0ff..905f4b670 100755
--- a/docker/rootfs/etc/services.d/frigate/run
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/run
@@ -4,6 +4,9 @@
set -o errexit -o nounset -o pipefail
+# Tell S6-Overlay not to restart this service
+s6-svc -O .
+
cd /opt/frigate
# Replace the bash process with the Frigate process, redirecting stderr to stdout
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/type b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/type
new file mode 100644
index 000000000..5883cff0c
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/frigate/type
@@ -0,0 +1 @@
+longrun
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/consumer-for b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/consumer-for
new file mode 100644
index 000000000..02b16a879
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/consumer-for
@@ -0,0 +1 @@
+go2rtc
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/dependencies.d/log-prepare b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/dependencies.d/log-prepare
new file mode 100644
index 000000000..e69de29bb
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/pipeline-name b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/pipeline-name
new file mode 100644
index 000000000..1fe545297
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/pipeline-name
@@ -0,0 +1 @@
+go2rtc-pipeline
diff --git a/docker/rootfs/etc/services.d/go2rtc/log/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/run
similarity index 100%
rename from docker/rootfs/etc/services.d/go2rtc/log/run
rename to docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/run
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/type b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/type
new file mode 100644
index 000000000..5883cff0c
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/type
@@ -0,0 +1 @@
+longrun
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/dependencies.d/base b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/dependencies.d/base
new file mode 100644
index 000000000..e69de29bb
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/finish b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/finish
new file mode 100755
index 000000000..26b34294a
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/finish
@@ -0,0 +1,32 @@
+#!/command/with-contenv bash
+# shellcheck shell=bash
+# Take down the S6 supervision tree when the service exits
+
+set -o errexit -o nounset -o pipefail
+
+declare exit_code_container
+exit_code_container=$(cat /run/s6-linux-init-container-results/exitcode)
+readonly exit_code_container
+readonly exit_code_service="${1}"
+readonly exit_code_signal="${2}"
+readonly service="go2rtc"
+
+echo "Service ${service} exited with code ${exit_code_service} (by signal ${exit_code_signal})" >&2
+
+if [[ "${exit_code_service}" -eq 256 ]]; then
+ if [[ "${exit_code_container}" -eq 0 ]]; then
+ echo $((128 + exit_code_signal)) > /run/s6-linux-init-container-results/exitcode
+ fi
+elif [[ "${exit_code_service}" -ne 0 ]]; then
+ if [[ "${exit_code_container}" -eq 0 ]]; then
+ echo "${exit_code_service}" > /run/s6-linux-init-container-results/exitcode
+ fi
+else
+ # go2rtc is not supposed to exit, so even when it exits with 0 we make the
+ # container with 1. We only tolerate it when Frigate is restarting.
+ if [[ "${exit_code_container}" -eq 0 && ! -f /dev/shm/restarting-frigate ]]; then
+ echo "1" > /run/s6-linux-init-container-results/exitcode
+ fi
+fi
+
+exec /run/s6/basedir/bin/halt
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/producer-for b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/producer-for
new file mode 100644
index 000000000..20fbc45f8
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/producer-for
@@ -0,0 +1 @@
+go2rtc-log
diff --git a/docker/rootfs/etc/cont-init.d/prepare-go2rtc.sh b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run
similarity index 78%
rename from docker/rootfs/etc/cont-init.d/prepare-go2rtc.sh
rename to docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run
index a47c9d440..ae5d7ee60 100755
--- a/docker/rootfs/etc/cont-init.d/prepare-go2rtc.sh
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run
@@ -1,10 +1,13 @@
#!/command/with-contenv bash
# shellcheck shell=bash
-# Prepare the go2rtc config
+# Start the go2rtc service
set -o errexit -o nounset -o pipefail
-function get_ip_and_port() {
+# Tell S6-Overlay not to restart this service
+s6-svc -O .
+
+function get_ip_and_port_from_supervisor() {
local ip_address
# Example: 192.168.1.10/24
local ip_regex='^([0-9]{1,3}\.{3}[0-9]{1,3})/[0-9]{1,2}$'
@@ -41,9 +44,17 @@ function get_ip_and_port() {
export FRIGATE_GO2RTC_WEBRTC_CANDIDATE_INTERNAL="${ip_address}:${webrtc_port}"
}
+echo "[INFO] Preparing go2rtc config..." >&2
+
if [[ -n "${SUPERVISOR_TOKEN:-}" ]]; then
# Running as a Home Assistant add-on, infer the IP address and port
- get_ip_and_port
+ get_ip_and_port_from_supervisor
fi
-python3 /usr/local/go2rtc/create_config.py
+raw_config=$(python3 /usr/local/go2rtc/create_config.py)
+
+echo "[INFO] Starting go2rtc..." >&2
+
+# Replace the bash process with the go2rtc process, redirecting stderr to stdout
+exec 2>&1
+exec go2rtc -config="${raw_config}"
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/type b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/type
new file mode 100644
index 000000000..5883cff0c
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/type
@@ -0,0 +1 @@
+longrun
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/dependencies.d/base b/docker/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/dependencies.d/base
new file mode 100644
index 000000000..e69de29bb
diff --git a/docker/rootfs/etc/cont-init.d/prepare-logs.sh b/docker/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/run
similarity index 100%
rename from docker/rootfs/etc/cont-init.d/prepare-logs.sh
rename to docker/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/run
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/type b/docker/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/type
new file mode 100644
index 000000000..bdd22a185
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/type
@@ -0,0 +1 @@
+oneshot
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/up b/docker/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/up
new file mode 100644
index 000000000..f90be02e8
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/up
@@ -0,0 +1 @@
+/etc/s6-overlay/s6-rc.d/log-prepare/run
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/consumer-for b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/consumer-for
new file mode 100644
index 000000000..68b7d12d4
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/consumer-for
@@ -0,0 +1 @@
+nginx
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/dependencies.d/log-prepare b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/dependencies.d/log-prepare
new file mode 100644
index 000000000..e69de29bb
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/pipeline-name b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/pipeline-name
new file mode 100644
index 000000000..e22259a61
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/pipeline-name
@@ -0,0 +1 @@
+nginx-pipeline
diff --git a/docker/rootfs/etc/services.d/nginx/log/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/run
similarity index 100%
rename from docker/rootfs/etc/services.d/nginx/log/run
rename to docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/run
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/type b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/type
new file mode 100644
index 000000000..5883cff0c
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/type
@@ -0,0 +1 @@
+longrun
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/dependencies.d/frigate b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/dependencies.d/frigate
new file mode 100644
index 000000000..e69de29bb
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/finish b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/finish
new file mode 100755
index 000000000..01c37d192
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/finish
@@ -0,0 +1,28 @@
+#!/command/with-contenv bash
+# shellcheck shell=bash
+# Take down the S6 supervision tree when the service fails
+
+set -o errexit -o nounset -o pipefail
+
+declare exit_code_container
+exit_code_container=$(cat /run/s6-linux-init-container-results/exitcode)
+readonly exit_code_container
+readonly exit_code_service="${1}"
+readonly exit_code_signal="${2}"
+readonly service="NGINX"
+
+echo "Service ${service} exited with code ${exit_code_service} (by signal ${exit_code_signal})" >&2
+
+if [[ "${exit_code_service}" -eq 256 ]]; then
+ if [[ "${exit_code_container}" -eq 0 ]]; then
+ echo $((128 + exit_code_signal)) > /run/s6-linux-init-container-results/exitcode
+ fi
+ if [[ "${exit_code_signal}" -eq 15 ]]; then
+ exec /run/s6/basedir/bin/halt
+ fi
+elif [[ "${exit_code_service}" -ne 0 ]]; then
+ if [[ "${exit_code_container}" -eq 0 ]]; then
+ echo "${exit_code_service}" > /run/s6-linux-init-container-results/exitcode
+ fi
+ exec /run/s6/basedir/bin/halt
+fi
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/producer-for b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/producer-for
new file mode 100644
index 000000000..307d7404c
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/producer-for
@@ -0,0 +1 @@
+nginx-log
diff --git a/docker/rootfs/etc/services.d/nginx/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/run
similarity index 100%
rename from docker/rootfs/etc/services.d/nginx/run
rename to docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/run
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/type b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/type
new file mode 100644
index 000000000..5883cff0c
--- /dev/null
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/nginx/type
@@ -0,0 +1 @@
+longrun
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/frigate-pipeline b/docker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/frigate-pipeline
new file mode 100644
index 000000000..e69de29bb
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/go2rtc-pipeline b/docker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/go2rtc-pipeline
new file mode 100644
index 000000000..e69de29bb
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/nginx-pipeline b/docker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/nginx-pipeline
new file mode 100644
index 000000000..e69de29bb
diff --git a/docker/rootfs/etc/services.d/frigate/finish b/docker/rootfs/etc/services.d/frigate/finish
deleted file mode 100755
index e219ed8b4..000000000
--- a/docker/rootfs/etc/services.d/frigate/finish
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/command/with-contenv bash
-# shellcheck shell=bash
-# Take down the S6 supervision tree when the service exits
-
-set -o errexit -o nounset -o pipefail
-
-# Prepare exit code
-if [[ "${1}" -eq 256 ]]; then
- exit_code="$((128 + ${2}))"
-else
- exit_code="${1}"
-fi
-
-# Make the container exit with the same exit code as the service
-echo "${exit_code}" > /run/s6-linux-init-container-results/exitcode
-exec /run/s6/basedir/bin/halt
diff --git a/docker/rootfs/etc/services.d/go2rtc/finish b/docker/rootfs/etc/services.d/go2rtc/finish
deleted file mode 100755
index c1b77fccc..000000000
--- a/docker/rootfs/etc/services.d/go2rtc/finish
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/command/with-contenv bash
-# shellcheck shell=bash
-# Take down the S6 supervision tree when the service fails, or restart it
-# otherwise
-
-if [[ "${1}" -ne 0 && "${1}" -ne 256 ]]; then
- exec /run/s6/basedir/bin/halt
-fi
diff --git a/docker/rootfs/etc/services.d/go2rtc/run b/docker/rootfs/etc/services.d/go2rtc/run
deleted file mode 100755
index a67615630..000000000
--- a/docker/rootfs/etc/services.d/go2rtc/run
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/command/with-contenv bash
-# shellcheck shell=bash
-# Start the go2rtc service
-
-# Replace the bash process with the go2rtc process, redirecting stderr to stdout
-exec 2>&1
-exec go2rtc -config=/dev/shm/go2rtc.yaml
diff --git a/docker/rootfs/etc/services.d/nginx/finish b/docker/rootfs/etc/services.d/nginx/finish
deleted file mode 100755
index c1b77fccc..000000000
--- a/docker/rootfs/etc/services.d/nginx/finish
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/command/with-contenv bash
-# shellcheck shell=bash
-# Take down the S6 supervision tree when the service fails, or restart it
-# otherwise
-
-if [[ "${1}" -ne 0 && "${1}" -ne 256 ]]; then
- exec /run/s6/basedir/bin/halt
-fi
diff --git a/docker/rootfs/usr/local/go2rtc/create_config.py b/docker/rootfs/usr/local/go2rtc/create_config.py
index 314e21988..faa84c287 100644
--- a/docker/rootfs/usr/local/go2rtc/create_config.py
+++ b/docker/rootfs/usr/local/go2rtc/create_config.py
@@ -5,6 +5,7 @@ import os
import yaml
+BTBN_PATH = "/usr/lib/btbn-ffmpeg"
config_file = os.environ.get("CONFIG_FILE", "/config/config.yml")
# Check if we can use .yaml instead of .yml
@@ -20,21 +21,34 @@ if config_file.endswith((".yaml", ".yml")):
elif config_file.endswith(".json"):
config = json.loads(raw_config)
-go2rtc_config: dict[str, any] = config["go2rtc"]
+go2rtc_config: dict[str, any] = config.get("go2rtc", {})
-if not go2rtc_config.get("log", {}).get("format"):
+# we want to ensure that logs are easy to read
+if go2rtc_config.get("log") is None:
go2rtc_config["log"] = {"format": "text"}
+elif go2rtc_config["log"].get("format") is None:
+ go2rtc_config["log"]["format"] = "text"
if not go2rtc_config.get("webrtc", {}).get("candidates", []):
default_candidates = []
- # Use FRIGATE_GO2RTC_WEBRTC_CANDIDATE_INTERNAL as candidate if set
+ # use internal candidate if it was discovered when running through the add-on
internal_candidate = os.environ.get("FRIGATE_GO2RTC_WEBRTC_CANDIDATE_INTERNAL", None)
if internal_candidate is not None:
default_candidates.append(internal_candidate)
+ # should set default stun server so webrtc can work
default_candidates.append("stun:8555")
go2rtc_config["webrtc"] = {"candidates": default_candidates}
-# Write YAML config to /dev/shm/go2rtc.yaml
-with open("/dev/shm/go2rtc.yaml", "w") as f:
- yaml.dump(go2rtc_config, f)
+# need to replace ffmpeg command when using ffmpeg4
+if not os.path.exists(BTBN_PATH):
+ if go2rtc_config.get("ffmpeg") is None:
+ go2rtc_config["ffmpeg"] = {
+ "rtsp": "-fflags nobuffer -flags low_delay -stimeout 5000000 -user_agent go2rtc/ffmpeg -rtsp_transport tcp -i {input}"
+ }
+ elif go2rtc_config["ffmpeg"].get("rtsp") is None:
+ go2rtc_config["ffmpeg"][
+ "rtsp"
+ ] = "-fflags nobuffer -flags low_delay -stimeout 5000000 -user_agent go2rtc/ffmpeg -rtsp_transport tcp -i {input}"
+
+print(json.dumps(go2rtc_config))
diff --git a/docs/docs/configuration/hardware_acceleration.md b/docs/docs/configuration/hardware_acceleration.md
index 93fb568f2..c9ff695c5 100644
--- a/docs/docs/configuration/hardware_acceleration.md
+++ b/docs/docs/configuration/hardware_acceleration.md
@@ -7,12 +7,6 @@ It is recommended to update your configuration to enable hardware accelerated de
### Raspberry Pi 3/4
-:::caution
-
-There is currently a bug in ffmpeg that causes hwaccel to not work for the RPi kernel 5.15.61 and above. For more information see https://github.com/blakeblackshear/frigate/issues/3780
-
-:::
-
Ensure you increase the allocated RAM for your GPU to at least 128 (raspi-config > Performance Options > GPU Memory).
**NOTICE**: If you are using the addon, you may need to turn off `Protection mode` for hardware acceleration.
diff --git a/frigate/http.py b/frigate/http.py
index a83b94751..581635d5e 100644
--- a/frigate/http.py
+++ b/frigate/http.py
@@ -769,7 +769,10 @@ def config_save():
logging.error(f"Error restarting Frigate: {e}")
return "Config successfully saved, unable to restart Frigate", 200
- return "Config successfully saved, restarting...", 200
+ return (
+ "Config successfully saved, restarting (this can take up to one minute)...",
+ 200,
+ )
else:
return "Config successfully saved.", 200
diff --git a/frigate/util.py b/frigate/util.py
index 69ead2a7a..2987099e8 100755
--- a/frigate/util.py
+++ b/frigate/util.py
@@ -628,13 +628,8 @@ def clipped(obj, frame_shape):
def restart_frigate():
- proc = psutil.Process(1)
- # if this is running via s6, sigterm pid 1
- if proc.name() == "s6-svscan":
- proc.terminate()
- # otherwise, just try and exit frigate
- else:
- os.kill(os.getpid(), signal.SIGTERM)
+ # S6 overlay is configured to exit once the Frigate process exits
+ os.kill(os.getpid(), signal.SIGTERM)
class EventsPerSecond:
diff --git a/web/src/AppBar.jsx b/web/src/AppBar.jsx
index 95a6bfbf2..b5bb16c0f 100644
--- a/web/src/AppBar.jsx
+++ b/web/src/AppBar.jsx
@@ -78,7 +78,7 @@ export default function AppBar() {
{showDialogWait ? (
) : null}
diff --git a/web/src/routes/Camera.jsx b/web/src/routes/Camera.jsx
index c703ea1ce..3be2bfb71 100644
--- a/web/src/routes/Camera.jsx
+++ b/web/src/routes/Camera.jsx
@@ -112,7 +112,7 @@ export default function Camera({ camera }) {
player = (
-
+
);
@@ -129,7 +129,7 @@ export default function Camera({ camera }) {
player = (
-
+
);