Doorgaan naar hoofdinhoud
Onofficiële Beta-vertaling

Deze pagina is vertaald door PageTurner AI (beta). Niet officieel goedgekeurd door het project. Een fout gevonden? Probleem melden →

Handleiding voor hardwareversnelling op Rockchip VPU

Deze handleiding begeleidt je bij het instellen van volledige hardwareversnelling voor video op Rockchip VPU via RKMPP.

waarschuwing

RKMPP-hardwareversnelling vereist Jellyfin 10.9 of hoger.

Versnellingsmethoden

Hardwareversnelde transcodering wordt ondersteund en is geverifieerd met de Rockchip VPU van de RK3588/3588S SoC.

Linux is het enige ondersteunde platform en RKMPP is de enige beschikbare methode.

RKMPP in Jellyfin bestaat uit twee componenten: MPP en RGA. Jellyfin gebruikt deze om een zero-copy transcoderingspijplijn te realiseren.

In ARM-gebaseerde SoC's is de VPU doorgaans verantwoordelijk voor videodecodering en -encodering, terwijl de GPU alleen verantwoordelijk is voor grafische taken en berekeningen. De Mali-G610 GPU op de RK3588 SoC wordt bijvoorbeeld alleen gebruikt voor OpenCL-gebaseerde HDR-tonemapping.

De MPP-interface maakt deel uit van de SDK en BSP-kernel die door Rockchip wordt geleverd. De kernelstuurprogramma's en gebruikersmodus-runtimebibliotheek zijn beide open-source-implementaties en vertrouwen niet op propriëtaire firmware. Rockchip heeft geëxperimenteerd met de upstream V4L2-interface, maar deze kan niet voldoen aan de daadwerkelijke behoeften van Rockchip in hun producten. Totdat er een volwassen transcoderingsoplossing in de Linux-mainline is, moeten gebruikers RKMPP gebruiken.

De RGA-interface is Rockchip's 2D-naverwerkingseenheid, gebruikt voor videoschaling, pixelformaatconversie, ondertitel-inbranden, enz.

opmerking
  • In tegenstelling tot NVIDIA NVENC is er geen limiet voor gelijktijdige encodesessies op Rockchip VPU.

  • RKMPP ondersteunt headless servers op Linux, wat betekent dat een aangesloten monitor niet vereist is.

Tone-mappingmethoden

Hardwareversnelde HDR naar SDR tonemapping wordt alleen ondersteund op RK3588/3588S SoC vanwege beperkingen in het hardwarepixelformaat.

OpenCL is de enige beschikbare tonemapping-methode. Het ondersteunt zero-copy.

Selecteer SoC/VPU-hardware

RK3588/3588S is momenteel de meest aanbevolen SoC. Naast veelgebruikte codecs ondersteunt het ook 10-bit H.264 (High10) en AV1-decodering, en heeft het een encodering snelheid voor H.264/HEVC van maximaal 1080p@480fps of 4k@120fps. Oudere chips worden mogelijk ondersteund, maar we konden ze niet testen, zoals RK356x en RK33xx. Deze hebben vrij beperkte ondersteuning voor encoderingresolutie, en missen ook hardware-ondersteuning voor HDR-tonemapping. Controleer voor aanschaf van een nieuwe SBC voor hardwareversnelling altijd de datasheet van de Rockchip SoC.

H.264 transcoderen

AVC / H.264 8-bit wordt nog steeds veel gebruikt vanwege de uitstekende compatibiliteit. Alle Rockchip SoC's die RKMPP ondersteunen, kunnen het decoderen en encoderen.

  • Decoderen & encoderen van H.264 8-bit - Elke Rockchip SoC die RKMPP ondersteunt.

  • Decoderen van H.264 10-bit - Bijna alle Rockchip SoC's vanaf RK33xx.

HEVC transcoderen

HEVC / H.265 blijft de eerste keuze voor het opslaan van 4K 10-bit, HDR- en Dolby Vision-video. Het heeft volwassen software-encodingondersteuning dankzij x265, evenals breed geïmplementeerde hardware-encodingondersteuning in de meeste GPU's uitgebracht na 2016.

De HEVC-ondersteuning op Rockchip is gecompliceerd:

  • Decoderen van HEVC 8-bit - Bijna alle Rockchip SoC's vanaf RK33xx.

  • Encoderen van HEVC 8-bit - Bijna alle Rockchip SoC's vanaf RK35xx.

  • Decoderen van HEVC 10-bit - Bijna alle Rockchip SoC's vanaf RK33xx.

AV1 transcoderen

AV1 is een royaltyvrije, toekomstbestendige videocodec. Het bespaart veel opslagruimte en netwerkbandbreedte dankzij kleinere bestandsgroottes. Het nadeel is dat decoderen en encoderen zeer belastend is voor de CPU. Hardwareversnelling maakt realtime transcodering van AV1-streams mogelijk. AV1-encoding wordt ondersteund in Jellyfin 10.9 en nieuwere versies.

Rockchip heeft ondersteuning voor AV1-versnelling toegevoegd in hun nieuwste SoCs:

  • Decoderen AV1 8/10-bit - Rockchip RK3588/3588S en RK3576 SoC.

  • Encoderen AV1 8/10-bit - Vanaf de RK3588-serie is er geen Rockchip SoC die AV1-encoding ondersteunt.

Andere codecs transcoderen

Raadpleeg deze links:

Snelheid en kwaliteit

  • RK3588/3588S ondersteunt transcodering tot 1080p@480fps of 4k@120fps.

  • RK3576 heeft ongeveer de helft van de transcoderingscapaciteit van RK3588. Vanwege pixelformaatbeperkingen in de RGA-hardware ontbreekt echter tonemapping-functionaliteit.

  • RK356x heeft een resolutielimiet van 1080p@100fps voor de encoder. Het kan niet voldoen aan realtime 4k-encodingbehoeften.

  • RK33xx en ouder worden niet aanbevolen; hun encoders ondersteunen alleen H.264 1080p@30fps.

Door gebrek aan testapparatuur kunnen we kwaliteitsverschillen tussen Rockchip SoC-generaties niet vergelijken. Over het algemeen geldt: nieuwere SoCs bieden betere encodingkwaliteit. De VPU op RK3588-series voldoet naar eerste indruk zeer goed aan kwaliteitseisen voor realtime streamingmedia.

Linux-installaties

Een 64-bit Linux-distributie wordt aanbevolen. De Rockchip BSP-kernel (6.1 of 5.10 LTS) is vereist.

Configureren op Linux-host

Debian en Ubuntu Linux

Het voor Jellyfin benodigde jellyfin-ffmpeg* deb-pakket bevat alle vereiste gebruikersmodus-stuurprogramma's voor Rockchip MPP en RGA.

Daarnaast hoeft u alleen de OpenCL-runtime (libmali) te installeren en apparaatmachtigingen te configureren.

opmerking

Rootrechten zijn vereist.

  1. Ga ervan uit dat u de Jellyfin-repository aan uw apt-bronnenlijst hebt toegevoegd en jellyfin-server, jellyfin-web en jellyfin-ffmpeg7 hebt geïnstalleerd.

  2. Controleer of dma_heap, dri, mpp_service en rga bestaan in /dev. Upgrade anders uw BSP-kernel naar 5.10 LTS of nieuwer.

    $ ls -l /dev | grep -E "mpp|rga|dri|dma_heap"
    drwxr-xr-x 2 root root 80 Jan 1 1970 dma_heap
    drwxr-xr-x 3 root root 140 Jan 18 18:50 dri
    crw-rw---- 1 root video 241, 0 Jan 18 18:50 mpp_service
    crw-rw---- 1 root video 10, 122 Jan 18 18:50 rga
  3. Voeg de volgende regels toe aan /etc/udev/rules.d/99-rk-device-permissions.rules. Herstart om de wijzigingen te activeren.

    KERNEL=="mpp_service", MODE="0660", GROUP="video"
    KERNEL=="rga", MODE="0660", GROUP="video"
    KERNEL=="system", MODE="0666", GROUP="video"
    KERNEL=="system-dma32", MODE="0666", GROUP="video"
    KERNEL=="system-uncached", MODE="0666", GROUP="video"
    KERNEL=="system-uncached-dma32", MODE="0666", GROUP="video" RUN+="/usr/bin/chmod a+rw /dev/dma_heap"
  4. Voeg de gebruiker jellyfin toe aan de groepen render en video, en herstart daarna de jellyfin-service:

    opmerking

    Bij sommige distributies heet de groep input.

    sudo usermod -aG render jellyfin
    sudo usermod -aG video jellyfin
    sudo systemctl restart jellyfin
  5. Installeer de ARM Mali OpenCL-runtime (libmali) op de host:

    opmerking

    Alleen nodig voordat je HDR-tonemapping gebruikt op RK3588/3588S. Dit zorgt dat de gebruikersruimte-firmware en kernelstuurprogrammaversies overeenkomen, anders werkt OpenCL niet goed.

  6. Controleer de OpenCL-runtimestatus:

    sudo /usr/lib/jellyfin-ffmpeg/ffmpeg -v debug -init_hw_device rkmpp=rk -init_hw_device opencl=ocl@rk

    arm_release_ver: g24p0-00eac0, rk_so_ver: 8
    [AVHWDeviceContext @ 0xaaaae8321360] 1 OpenCL platforms found.
    [AVHWDeviceContext @ 0xaaaae8321360] 1 OpenCL devices found on platform "ARM Platform".
    [AVHWDeviceContext @ 0xaaaae8321360] 0.0: ARM Platform / Mali-G610 r0p0
    [AVHWDeviceContext @ 0xaaaae8321360] cl_arm_import_memory found as platform extension.
    [AVHWDeviceContext @ 0xaaaae8321360] cl_khr_image2d_from_buffer found as platform extension.
    [AVHWDeviceContext @ 0xaaaae8321360] DRM to OpenCL mapping on ARM function found (clImportMemoryARM).
    ...
  7. Schakel RKMPP in Jellyfin in en vink niet-ondersteunde codecs uit.

Configureren met Linux-virtualisatie

Voltooi eerst stap 2 en 5 uit de sectie Configureren op Linux-host hierboven. Dit geldt voor zowel Docker- als LXC-installaties.

Officiële Docker

De officiële Docker-image bevat alle benodigde Rockchip MPP-, RGA- en OpenCL-stuurprogramma's in gebruikersmodus.

Je moet alleen de apparaatbestanden van de VPU doorgeven van host naar Docker en de privileged mode inschakelen.

opmerking

Rootrechten zijn vereist.

  1. Gebruik de Docker-opdrachtregel: (de uitgebreide apparaatnamen tussen for...done zorgen voor achterwaartse compatibiliteit)

    sudo docker run -d \
    --security-opt systempaths=unconfined \
    --security-opt apparmor=unconfined \
    --name=jellyfin \
    --volume /path/to/config:/config \
    --volume /path/to/cache:/cache \
    --volume /path/to/media:/media \
    --net=host \
    --restart=unless-stopped \
    `for dev in dri dma_heap mali0 rga mpp_service \
    iep mpp-service vpu_service vpu-service \
    hevc_service hevc-service rkvdec rkvenc vepu h265e ; do \
    [ -e "/dev/$dev" ] && echo " --device /dev/$dev"; \
    done` \
    jellyfin/jellyfin
  2. Controleer de OpenCL-runtimestatus. Zorg dat je de GPU-firmware van libmali hebt geïnstalleerd.

    opmerking

    Alleen nodig vóór gebruik van HDR-tonemapping op RK3588/3588S.

    # Check the OpenCL (GPU firmware) on host with clinfo
    sudo apt update && sudo apt install -y clinfo && clinfo

    # Check the OpenCL runtime of Docker image with jellyfin-ffmpeg
    sudo docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg -v debug -init_hw_device rkmpp=rk -init_hw_device opencl=ocl@rk
  3. Schakel RKMPP in Jellyfin in en vink de niet-ondersteunde codecs uit.

LXC (Linux-containers)

Deze opzet kan nuttig zijn voor gebruikers die de RK3588/3588S SoC als Proxmox-host gebruiken, waar LXC de officiële en enige ondersteunde manier is voor lichte virtualisatie via systeemcontainers (LXC) versus applicatiecontainers (docker). Hoewel het Proxmox-team op dit moment ARM-platforms niet als host ondersteunt - en waarschijnlijk ook nooit zal doen - zijn succesvolle implementaties op ARM-apparaten wel mogelijk.

De LXC-opzet lijkt enigszins op Docker: je moet de apparaatbestanden van de VPU van de host naar LXC doorgeven en de privileged mode inschakelen (zie ook belangrijke "opmerking" hieronder over geprivilegieerde LXC-containers).

  1. Om de lijst van apparaatbestanden te vinden die je in de container moet doorgeven, gebruik je dit one-liner-commando op de Linux-host:

    for dev in dri dma_heap mali0 rga mpp_service iep mpp-service vpu_service vpu-service hevc_service hevc-service rkvdec rkvenc vepu h265e ; do [ -e "/dev/$dev" ] && echo "device /dev/$dev";  done
    device /dev/dri
    device /dev/dma_heap
    device /dev/mali0
    device /dev/rga
    device /dev/mpp_service

    Hieronder zie je een voorbeeld van de minimale vereiste extra containerconfiguratie (niet volledig) om VPU-hardwareversnelling werkend te krijgen:

    lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
    lxc.mount.entry: /dev/dma_heap dev/dma_heap none bind,optional,create=dir
    lxc.mount.entry: /dev/mpp_service dev/mpp_service none bind,optional,create=file
    lxc.mount.entry: /dev/rga dev/rga none bind,optional,create=file
    lxc.mount.entry: /dev/mali0 dev/mali0 none bind,optional,create=file
    lxc.cgroup2.devices.allow: a

    Raadpleeg de man-pagina van lxc.container.conf voor referentie over de werking van de opties lxc.mount.entry en lxc.cgroup2.devices. Als je wilt - en hier bezorgd over bent - kun je de regel lxc.cgroup2.devices.allow: a vervangen door een beperktere "allowlist device program" (voorbeeld vind je in dezelfde man-pagina) die elk VPU-karakterapparaat opsomt waartoe de container-naamruimte toegang moet hebben op de host.

    waarschuwing

    Privileged LXC-containers worden als onveilig beschouwd door het ontwerp - lees meer in de officiële LXC-documentatie. Deze handleiding behandelt echter niet de stappen die nodig zijn om jellyfin VPU-hardwareversnelling werkend te krijgen in een unprivileged container.

  2. Installeer het ondersteunde jellyfin-pakket in de LXC-container, of gebruik optioneel zelfs een officiële Docker-image binnen de LXC-container.

  3. Verifieer de OpenCL-runtimestatus als volgt - dit voorbeeld is verzameld vanuit de LXC-runtime van Ubuntu Jammy - de stappen zijn hetzelfde als bij Docker-implementaties:

    • libmali gebruikersruimte-stuurprogramma's moeten in de LXC-container geïnstalleerd zijn, anders wordt het opencl=ocl@rk apparaat niet geïnitialiseerd
    dpkg -l | egrep "libmali|clinfo|jellyfin"
    ii  clinfo                          3.0.21.02.21-1                          arm64        Query OpenCL system information
    ii jellyfin 10.10.1+ubu2204 all Jellyfin is the Free Software Media System.
    ii jellyfin-ffmpeg7 7.0.2-5-jammy arm64 Tools for transcoding, streaming and playing of multimedia files
    ii jellyfin-server 10.10.1+ubu2204 arm64 Jellyfin is the Free Software Media System.
    ii jellyfin-web 10.10.1+ubu2204 all Jellyfin is the Free Software Media System.
    ii libmali-valhall-g610-g13p0-gbm 1.9-1 arm64 Mali GPU User-Space Binary Drivers
    sudo /usr/lib/jellyfin-ffmpeg/ffmpeg -v debug -init_hw_device rkmpp=rk -init_hw_device opencl=ocl@rk
    < -- snip -- >
    arm_release_ver: g13p0-01eac0, rk_so_ver: 10
    [AVHWDeviceContext @ 0x55a5b30a00] 1 OpenCL platforms found.
    [AVHWDeviceContext @ 0x55a5b30a00] 1 OpenCL devices found on platform "ARM Platform".
    [AVHWDeviceContext @ 0x55a5b30a00] 0.0: ARM Platform / Mali-G610 r0p0
    [AVHWDeviceContext @ 0x55a5b30a00] cl_arm_import_memory found as platform extension.
    [AVHWDeviceContext @ 0x55a5b30a00] cl_khr_image2d_from_buffer found as platform extension.
    [AVHWDeviceContext @ 0x55a5b30a00] DRM to OpenCL mapping on ARM function found (clImportMemoryARM).
    Successfully parsed a group of options.
    < -- snip -- >
  4. Schakel RKMPP in de Jellyfin GUI in, vink ondersteunde (en gewenste) codecs aan en verwijder vinkjes bij niet-ondersteunde - zie sectie SoC/VPU-hardware selecteren voor meer details.

Verificatie op Linux

Voor de BSP-kernel ouder dan 6.1.84 is er geen betrouwbare manier om de belasting/utilisatie van de VPU op Rockchip SoC uit te lezen.

Maar u kunt dit nog steeds verifiëren door andere engines uit te lezen, zoals de RGA (2D hwaccel blitter).

opmerking

Rootrechten zijn vereist.

  1. Speel een video af in de Jellyfin-webclient en activeer transcodering door een lagere resolutie of bitrate in te stellen.

  2. VPU-belasting/utilisatie: voer sudo sh -c "echo 1000 > /proc/mpp_service/load_interval" && sudo watch -n 1 cat /proc/mpp_service/load uit

    Every 1.0s: cat /proc/mpp_service/load
    fdb51000.avsd-plus load: 0.00% utilization: 0.00%
    fdb50400.vdpu load: 0.00% utilization: 0.00%
    fdb50000.vepu load: 0.00% utilization: 0.00%
    fdb90000.jpegd load: 0.00% utilization: 0.00%
    fdba0000.jpege-core load: 0.00% utilization: 0.00%
    fdba4000.jpege-core load: 0.00% utilization: 0.00%
    fdba8000.jpege-core load: 0.00% utilization: 0.00%
    fdbac000.jpege-core load: 0.00% utilization: 0.00%
    fdbb0000.iep load: 0.00% utilization: 0.00%
    fdbd0000.rkvenc-core load: 98.26% utilization: 97.25%
    fdbe0000.rkvenc-core load: 10.78% utilization: 10.69%
    fdc38100.rkvdec-core load: 17.41% utilization: 17.09%
    fdc48100.rkvdec-core load: 17.64% utilization: 17.30%
    fdc70000.av1d load: 0.00% utilization: 0.00%
  3. RGA-belasting: voer sudo watch -n 1 cat /sys/kernel/debug/rkrga/load uit

    Every 1.0s: cat /sys/kernel/debug/rkrga/load
    num of scheduler = 3
    ================= load ==================
    scheduler[0]: rga3_core0
    load = 42%
    -----------------------------------
    scheduler[1]: rga3_core1
    load = 27%
    -----------------------------------
    scheduler[2]: rga2
    load = 0%
    -----------------------------------
    process 17: pid = 217002, name: /usr/lib/jellyfin-ffmpeg/ffmpeg ... -init_hw_device rkmpp=rk -hwaccel rkmpp -hwaccel_output_format drm_prime ...