From 67bff1e79e62e82d03404a0c6ef675553974af35 Mon Sep 17 00:00:00 2001 From: Marc Altmann <40744649+MarcA711@users.noreply.github.com> Date: Mon, 13 May 2024 14:52:11 +0200 Subject: [PATCH] update FFmpeg for Rockchip (#11351) --- .../rootfs/usr/local/go2rtc/create_config.py | 14 ----- docker/rockchip/Dockerfile | 4 +- .../configuration/hardware_acceleration.md | 60 ++++++++++--------- 3 files changed, 33 insertions(+), 45 deletions(-) diff --git a/docker/main/rootfs/usr/local/go2rtc/create_config.py b/docker/main/rootfs/usr/local/go2rtc/create_config.py index 0e2ae7648..f3e4bdaa5 100644 --- a/docker/main/rootfs/usr/local/go2rtc/create_config.py +++ b/docker/main/rootfs/usr/local/go2rtc/create_config.py @@ -113,20 +113,6 @@ if int(os.environ["LIBAVFORMAT_VERSION_MAJOR"]) < 59: "-fflags nobuffer -flags low_delay -stimeout 5000000 -user_agent go2rtc/ffmpeg -rtsp_transport tcp -i {input}" ) -# add hardware acceleration presets for rockchip devices -# may be removed if frigate uses a go2rtc version that includes these presets -if go2rtc_config.get("ffmpeg") is None: - go2rtc_config["ffmpeg"] = { - "h264/rk": "-c:v h264_rkmpp_encoder -g 50 -bf 0", - "h265/rk": "-c:v hevc_rkmpp_encoder -g 50 -bf 0", - } -else: - if go2rtc_config["ffmpeg"].get("h264/rk") is None: - go2rtc_config["ffmpeg"]["h264/rk"] = "-c:v h264_rkmpp_encoder -g 50 -bf 0" - - if go2rtc_config["ffmpeg"].get("h265/rk") is None: - go2rtc_config["ffmpeg"]["h265/rk"] = "-c:v hevc_rkmpp_encoder -g 50 -bf 0" - for name in go2rtc_config.get("streams", {}): stream = go2rtc_config["streams"][name] diff --git a/docker/rockchip/Dockerfile b/docker/rockchip/Dockerfile index 7980fe585..d42117f7c 100644 --- a/docker/rockchip/Dockerfile +++ b/docker/rockchip/Dockerfile @@ -25,5 +25,5 @@ ADD https://github.com/MarcA711/rknpu2/releases/download/v1.5.2/librknnrt_rk3588 RUN rm -rf /usr/lib/btbn-ffmpeg/bin/ffmpeg RUN rm -rf /usr/lib/btbn-ffmpeg/bin/ffprobe -ADD --chmod=111 https://github.com/MarcA711/Rockchip-FFmpeg-Builds/releases/download/6.1-1/ffmpeg /usr/lib/btbn-ffmpeg/bin/ -ADD --chmod=111 https://github.com/MarcA711/Rockchip-FFmpeg-Builds/releases/download/6.1-1/ffprobe /usr/lib/btbn-ffmpeg/bin/ +ADD --chmod=111 https://github.com/MarcA711/Rockchip-FFmpeg-Builds/releases/download/6.1-3/ffmpeg /usr/lib/btbn-ffmpeg/bin/ +ADD --chmod=111 https://github.com/MarcA711/Rockchip-FFmpeg-Builds/releases/download/6.1-3/ffprobe /usr/lib/btbn-ffmpeg/bin/ diff --git a/docs/docs/configuration/hardware_acceleration.md b/docs/docs/configuration/hardware_acceleration.md index 72a1634ac..764a50be9 100644 --- a/docs/docs/configuration/hardware_acceleration.md +++ b/docs/docs/configuration/hardware_acceleration.md @@ -362,15 +362,43 @@ that NVDEC/NVDEC1 are in use. ## Rockchip platform -Hardware accelerated video de-/encoding is supported on all Rockchip SoCs. +Hardware accelerated video de-/encoding is supported on all Rockchip SoCs using [Nyanmisaka's FFmpeg Fork](https://github.com/nyanmisaka/ffmpeg-rockchip) based on [Rockchip's mpp library](https://github.com/rockchip-linux/mpp). + +### Prerequisites + +Make sure that you use a linux distribution that comes with the rockchip BSP kernel 5.10 or 6.1 and supports VPU. To check, enter the following commands: + +``` +$ uname -r +5.10.xxx-rockchip # or 6.1.xxx; the -rockchip suffix is important +$ ls /dev/dri +by-path card0 card1 renderD128 renderD129 # should list renderD128 +``` + +I recommend [Joshua Riek's Ubuntu for Rockchip](https://github.com/Joshua-Riek/ubuntu-rockchip), if your board is supported. ### Setup -Use a frigate docker image with `-rk` suffix and enable privileged mode by adding the `--privileged` flag to your docker run command or `privileged: true` to your `docker-compose.yml` file. +Follow Frigate's default installation instructions, but use a docker image with `-rk` suffix for example `ghcr.io/blakeblackshear/frigate:stable-rk`. + +Next, you need to grant docker permissions to access your hardware: +- During the configuration process, you should run docker in privileged mode to avoid any errors due to insufficient permissions. To do so, add `privileged: true` to your `docker-compose.yml` file or the `--privileged` flag to your docker run command. +- After everything works, you should only grant necessary permissions to increase security. Add the lines below to your `docker-compose.yml` file or the following options to your docker run command: `--security-opt systempaths=unconfined --security-opt apparmor=unconfined --device /dev/dri:/dev/dri --device /dev/dma_heap:/dev/dma_heap --device /dev/rga:/dev/rga --device /dev/mpp_service:/dev/mpp_service`: + +```yaml + security_opt: + - apparmor=unconfined + - systempaths=unconfined + devices: + - /dev/dri:/dev/dri + - /dev/dma_heap:/dev/dma_heap + - /dev/rga:/dev/rga + - /dev/mpp_service:/dev/mpp_service +``` ### Configuration -Add one of the following ffmpeg presets to your `config.yaml` to enable hardware acceleration: +Add one of the following FFmpeg presets to your `config.yaml` to enable hardware video processing: ```yaml # if you try to decode a h264 encoded stream @@ -387,29 +415,3 @@ ffmpeg: Make sure that your SoC supports hardware acceleration for your input stream. For example, if your camera streams with h265 encoding and a 4k resolution, your SoC must be able to de- and encode h265 with a 4k resolution or higher. If you are unsure whether your SoC meets the requirements, take a look at the datasheet. ::: - -### go2rtc presets for hardware accelerated transcoding - -If your input stream is to be transcoded using hardware acceleration, there are these presets for go2rtc: `h264/rk` and `h265/rk`. You can use them this way: - -``` -go2rtc: - streams: - Cam_h264: ffmpeg:rtsp://username:password@192.168.1.123/av_stream/ch0#video=h264/rk - Cam_h265: ffmpeg:rtsp://username:password@192.168.1.123/av_stream/ch0#video=h265/rk -``` - -:::warning - -The go2rtc docs may suggest the following configuration: - -``` -go2rtc: - streams: - Cam_h264: ffmpeg:rtsp://username:password@192.168.1.123/av_stream/ch0#video=h264#hardware=rk - Cam_h265: ffmpeg:rtsp://username:password@192.168.1.123/av_stream/ch0#video=h265#hardware=rk -``` - -However, this does not currently work. - -:::