From 03ca9e47cd89564a51d01ffe621489efa3a8f7e7 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Wed, 17 Jun 2026 18:38:14 -0500 Subject: nvenc transcoding in jellyfin --- hosts/poweredge/jellyfin.nix | 88 ++++++++++++++++++++++++++++++++------------ 1 file changed, 65 insertions(+), 23 deletions(-) (limited to 'hosts/poweredge') diff --git a/hosts/poweredge/jellyfin.nix b/hosts/poweredge/jellyfin.nix index 4fab7cc..2fbdabd 100644 --- a/hosts/poweredge/jellyfin.nix +++ b/hosts/poweredge/jellyfin.nix @@ -13,42 +13,69 @@ # GPU allowedDevices = [ - { node = "/dev/dri/card1"; modifier = "rw"; } - { node = "/dev/dri/renderD128"; modifier = "rw"; } + { node = "/dev/nvidia0"; modifier = "rw"; } + { node = "/dev/nvidiactl"; modifier = "rw"; } + { node = "/dev/nvidia-uvm"; modifier = "rw"; } + { node = "/dev/nvidia-uvm-tools"; modifier = "rw"; } + { node = "/dev/nvidia-modeset"; modifier = "rw"; } ]; bindMounts = { - "/dev/dri/card1" = { - hostPath = "/dev/dri/card1"; - isReadOnly = false; - }; - "/dev/dri/renderD128" = { - hostPath = "/dev/dri/renderD128"; - isReadOnly = false; - }; + # NVENC/NVDEC - video transcoding + "/dev/nvidia0" = { hostPath = "/dev/nvidia0"; isReadOnly = false; }; + "/dev/nvidiactl" = { hostPath = "/dev/nvidiactl"; isReadOnly = false; }; + # CUDA - required for ML inference + "/dev/nvidia-uvm" = { hostPath = "/dev/nvidia-uvm"; isReadOnly = false; }; + "/dev/nvidia-uvm-tools" = { hostPath = "/dev/nvidia-uvm-tools"; isReadOnly = false; }; + # Modeset - needed by some driver paths + "/dev/nvidia-modeset" = { hostPath = "/dev/nvidia-modeset"; isReadOnly = false; }; }; - config = { lib, config, ... }: { + config = { lib, config, pkgs, ... }: { # Network networking.interfaces.eth0.useDHCP = true; networking.firewall.allowedTCPPorts = [ 80 ]; # Caddy - # CUDA - nix.settings = { - substituters = [ "https://cache.flox.dev" ]; - trusted-public-keys = [ "flox-cache-public-1:7F4OyH7ZCnFhcze3fJdfyXYLQw/aV7GEed86nQ7IsOs=" ]; - }; - #nixpkgs.config.cudaSupport = true; - users.users.jellyfin.extraGroups = [ "video" "render" ]; + # Configure nixpkgs for nvidia/cuda + nixpkgs.config.allowUnfree = true; # Jellyfin services.jellyfin = { enable = true; - #hardwareAcceleration = { - # enable = true; - # type = "nvenc"; - # device = "/dev/dri/renderD128"; - #}; + openFirewall = true; + + hardwareAcceleration = { + enable = true; + type = "nvenc"; + device = "/dev/nvidia0"; # Required by the module's assertion, unused in encoding.xml for nvenc + }; + + forceEncodingConfig = true; # Override encoding.xml + + transcoding = { + enableHardwareEncoding = true; + + hardwareEncodingCodecs = { + hevc = true; # Pascal 4th-gen NVENC supports HEVC 8/10-bit encode + av1 = false; # NOT supported on Pascal — do not enable + }; + + hardwareDecodingCodecs = { + h264 = true; + hevc = true; + hevc10bit = true; + vp8 = true; + vp9 = true; + mpeg2 = true; + vc1 = true; + av1 = false; # NOT supported on Pascal NVDEC + hevcRExt10bit = false; # Range Extensions decode is a newer-gen feature, skip on Pascal + hevcRExt12bit = false; + }; + + encodingPreset = "medium"; + enableToneMapping = true; # works via CUDA-based tonemap_cuda filter on Pascal+ + }; }; # Reverse proxy @@ -59,6 +86,21 @@ ''; }; + # NVIDIA + services.xserver.videoDrivers = [ "nvidia" ]; # xserver.videoDrivers does not imply X + hardware.graphics.enable = true; + hardware.nvidia = { + modesetting.enable = true; # Required + nvidiaSettings = false; # Don't need gui + open = false; + package = config.boot.kernelPackages.nvidiaPackages.legacy_580; # Must match host + }; + + # Packages + environment.systemPackages = with pkgs; [ + config.hardware.nvidia.package # nvidia-smi + ]; + system.stateVersion = "26.05"; }; }; -- cgit v1.2.3