{ ... }: { flake.nixosModules.systemChromiumHevcVaapi = { config, lib, pkgs, ... }: let cfg = config.chiasson.system.chromiumHevc; in { options.chiasson.system.chromiumHevc.enable = lib.mkEnableOption '' VA-API packages for Chromium HEVC (Intel iHD + optional NVIDIA nvidia-vaapi-driver). Pair with `wisdomBrowsersChromiumHevc` on the user side. ''; config = lib.mkIf cfg.enable { hardware.graphics.enable = lib.mkDefault true; hardware.graphics.extraPackages = lib.mkAfter ( with pkgs; [ nvidia-vaapi-driver ] ); }; }; flake.homeManagerModules.wisdomBrowsersChromiumHevc = { config, lib, pkgs, ... }: let root = config.chiasson.home; cfg = config.chiasson.home.browsers.chromiumHevc; browserCatalog = { "google-chrome" = { package = pkgs.google-chrome; binary = "google-chrome-stable"; launcher = "google-chrome-hevc"; desktopName = "Google Chrome (HEVC)"; icon = "google-chrome"; }; chromium = { package = pkgs.chromium; binary = "chromium"; launcher = "chromium-hevc"; desktopName = "Chromium (HEVC)"; icon = "chromium"; }; "microsoft-edge" = { package = pkgs.microsoft-edge; binary = "microsoft-edge-stable"; launcher = "microsoft-edge-hevc"; desktopName = "Microsoft Edge (HEVC)"; icon = "microsoft-edge"; }; }; gpuProfiles = { intel = { driver = "iHD"; drmDevice = "/dev/dri/renderD128"; nvdBackend = "direct"; enableFeatures = [ "VaapiVideoDecodeLinuxGL" "VaapiVideoDecoder" "VaapiIgnoreDriverChecks" "PlatformHEVCDecoderSupport" "UseMultiPlaneFormatForHardwareVideo" "AcceleratedVideoDecodeLinuxGL" ]; disableFeatures = [ "AcceleratedVideoDecodeLinuxZeroCopyGL" ]; }; nvidia = { driver = "nvidia"; drmDevice = "/dev/dri/renderD129"; nvdBackend = "direct"; enableFeatures = [ "VaapiVideoDecoder" "VaapiIgnoreDriverChecks" "PlatformHEVCDecoderSupport" "VaapiOnNvidiaGPUs" "AcceleratedVideoDecodeLinuxGL" ]; disableFeatures = [ "AcceleratedVideoDecodeLinuxZeroCopyGL" "UseMultiPlaneFormatForHardwareVideo" "VaapiVideoDecodeLinuxGL" ]; }; }; activeGpu = gpuProfiles.${cfg.vaapi.gpu}; mkChromiumHevc = packageName: let spec = browserCatalog.${packageName}; browser = spec.package; launcherName = spec.launcher; enableFeatures = lib.concatStringsSep "," activeGpu.enableFeatures; disableFeatures = lib.concatStringsSep "," activeGpu.disableFeatures; desktopItem = pkgs.makeDesktopItem { name = launcherName; desktopName = spec.desktopName; genericName = "Web Browser"; exec = "${launcherName} %U"; icon = spec.icon; categories = [ "Network" "WebBrowser" ]; mimeTypes = [ "text/html" "text/xml" "application/xhtml+xml" "x-scheme-handler/http" "x-scheme-handler/https" ]; }; in pkgs.runCommand launcherName { inherit (browser) version; nativeBuildInputs = [ pkgs.makeWrapper ]; passthru = { inherit browser; }; } '' mkdir -p $out/bin $out/share/applications makeWrapper ${browser}/bin/${spec.binary} $out/bin/${launcherName} \ --set LIBVA_DRIVER_NAME ${lib.escapeShellArg activeGpu.driver} \ --set LIBVA_DRM_DEVICE ${lib.escapeShellArg activeGpu.drmDevice} \ --set NVD_BACKEND ${lib.escapeShellArg activeGpu.nvdBackend} \ --add-flags "--enable-features=${enableFeatures}" \ --add-flags "--disable-features=${disableFeatures}" \ ${lib.concatMapStringsSep " " (a: "--add-flags ${lib.escapeShellArg a}") cfg.extraCommandLineArgs} cp ${desktopItem}/share/applications/${launcherName}.desktop \ $out/share/applications/${launcherName}.desktop ''; selectedPackages = lib.filter ( name: let spec = browserCatalog.${name}; in lib.meta.availableOn pkgs.stdenv.hostPlatform spec.package ) cfg.packages; wrappers = map mkChromiumHevc selectedPackages; in { options.chiasson.home.browsers.chromiumHevc = { enable = lib.mkEnableOption '' `google-chrome-hevc`: Chromium with VA-API HEVC for Jellyfin / MSE playback. Default GPU is **Intel** (`vaapi.gpu = "intel"`): Chromium + NVIDIA VA-API is unsupported upstream (`nvidia-vaapi-driver` README) and fails with `failed Initialize()ing the frame pool` in Jellyfin. Requires `chiasson.system.chromiumHevc.enable` on NixOS. ''; packages = lib.mkOption { type = lib.types.listOf ( lib.types.enum (lib.attrNames browserCatalog) ); default = [ "google-chrome" ]; description = "Chromium-based browsers to wrap."; }; vaapi.gpu = lib.mkOption { type = lib.types.enum [ "intel" "nvidia" ]; default = "intel"; description = '' VA-API stack for `google-chrome-hevc`. Use **intel** for Jellyfin (Chromium + nvidia-vaapi-driver is unsupported and hits frame-pool init errors). **nvidia** keeps renderD129 + VaapiOnNvidiaGPUs for experiments only. ''; }; extraCommandLineArgs = lib.mkOption { type = lib.types.listOf lib.types.str; default = [ ]; description = "Extra Chromium flags appended after the HEVC profile flags."; }; }; config = lib.mkIf (root.enable && cfg.enable) { home.packages = wrappers; }; }; }