diff --git a/nixos/modules/hardware/decklink.nix b/nixos/modules/hardware/decklink.nix new file mode 100644 index 000000000000..ca0ed389f8cc --- /dev/null +++ b/nixos/modules/hardware/decklink.nix @@ -0,0 +1,18 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.hardware.decklink; + kernelPackages = config.boot.kernelPackages; +in +{ + options.hardware.decklink.enable = lib.mkEnableOption "hardware support for the Blackmagic Design Decklink audio/video interfaces"; + + config = lib.mkIf cfg.enable { + # snd_blackmagic-io can cause issues with pipewire, + # so we do not enable it by default + boot.kernelModules = [ "blackmagic" "blackmagic-io" ]; + boot.extraModulePackages = [ kernelPackages.decklink ]; + systemd.packages = [ pkgs.blackmagic-desktop-video ]; + systemd.services.DesktopVideoHelper.wantedBy = [ "multi-user.target" ]; + }; +} diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 1e5787e44b55..31e592d5d9fe 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -59,6 +59,7 @@ ./hardware/cpu/intel-microcode.nix ./hardware/cpu/intel-sgx.nix ./hardware/cpu/x86-msr.nix + ./hardware/decklink.nix ./hardware/device-tree.nix ./hardware/digitalbitbox.nix ./hardware/flipperzero.nix diff --git a/pkgs/applications/video/obs-studio/default.nix b/pkgs/applications/video/obs-studio/default.nix index 0897c0041f5a..d787ab91db1e 100644 --- a/pkgs/applications/video/obs-studio/default.nix +++ b/pkgs/applications/video/obs-studio/default.nix @@ -48,6 +48,8 @@ , nlohmann_json , websocketpp , asio +, decklinkSupport ? false +, blackmagic-desktop-video , libdatachannel , libvpl , qrcodegencpp @@ -165,6 +167,8 @@ stdenv.mkDerivation (finalAttrs: { xorg.libX11 libvlc libGL + ] ++ optionals decklinkSupport [ + blackmagic-desktop-video ]; in '' # Remove libcef before patchelf, otherwise it will fail diff --git a/pkgs/by-name/bl/blackmagic-desktop-video/package.nix b/pkgs/by-name/bl/blackmagic-desktop-video/package.nix new file mode 100644 index 000000000000..211ee2fce81f --- /dev/null +++ b/pkgs/by-name/bl/blackmagic-desktop-video/package.nix @@ -0,0 +1,108 @@ +{ stdenv +, cacert +, curl +, runCommandLocal +, lib +, autoPatchelfHook +, libcxx +, libGL +, gcc7 +}: +stdenv.mkDerivation (finalAttrs: { + pname = "blackmagic-desktop-video"; + version = "14.0.1a2"; + + buildInputs = [ + autoPatchelfHook + libcxx + libGL + gcc7.cc.lib + ]; + + # yes, the below download function is an absolute mess. + # blame blackmagicdesign. + src = + let + # from the URL that the POST happens to, see browser console + DOWNLOADID = "d73a63095b6a4a189916fb2baa5a0ef3"; + in + runCommandLocal "${finalAttrs.pname}-${lib.versions.majorMinor finalAttrs.version}-src.tar.gz" + { + outputHashMode = "recursive"; + outputHashAlgo = "sha256"; + outputHash = "sha256-jkKzUqfirvsVIefjWLx4NlqznXanWDtvhTsIThWFTo4="; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars; + + nativeBuildInputs = [ curl ]; + + # ENV VARS + SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt"; + + inherit DOWNLOADID; + # from the URL the download page where you click the "only download" button is at + REFERID = "76801bc1d84147da9cb1a16e663ac33e"; + SITEURL = "https://www.blackmagicdesign.com/api/register/us/download/${DOWNLOADID}"; + + USERAGENT = builtins.concatStringsSep " " [ + "User-Agent: Mozilla/5.0 (X11; Linux ${stdenv.hostPlatform.linuxArch})" + "AppleWebKit/537.36 (KHTML, like Gecko)" + "Chrome/77.0.3865.75" + "Safari/537.36" + ]; + + REQJSON = builtins.toJSON { + "country" = "nl"; + "downloadOnly" = true; + "platform" = "Linux"; + "policy" = true; + }; + + } '' + RESOLVEURL=$(curl \ + -s \ + -H "$USERAGENT" \ + -H 'Content-Type: application/json;charset=UTF-8' \ + -H "Referer: https://www.blackmagicdesign.com/support/download/$REFERID/Linux" \ + --data-ascii "$REQJSON" \ + --compressed \ + "$SITEURL") + curl \ + --retry 3 --retry-delay 3 \ + --compressed \ + "$RESOLVEURL" \ + > $out + ''; + + postUnpack = + let + arch = stdenv.hostPlatform.uname.processor; + in + '' + tar xf Blackmagic_Desktop_Video_Linux_${lib.head (lib.splitString "a" finalAttrs.version)}/other/${arch}/desktopvideo-${finalAttrs.version}-${arch}.tar.gz + unpacked=$NIX_BUILD_TOP/desktopvideo-${finalAttrs.version}-${stdenv.hostPlatform.uname.processor} + ''; + + installPhase = '' + runHook preInstall + mkdir -p $out/{bin,share/doc,lib/systemd/system} + cp -r $unpacked/usr/share/doc/desktopvideo $out/share/doc + cp $unpacked/usr/lib/*.so $out/lib + cp $unpacked/usr/lib/systemd/system/DesktopVideoHelper.service $out/lib/systemd/system + cp $unpacked/usr/lib/blackmagic/DesktopVideo/DesktopVideoHelper $out/bin/ + substituteInPlace $out/lib/systemd/system/DesktopVideoHelper.service \ + --replace-fail "/usr/lib/blackmagic/DesktopVideo/DesktopVideoHelper" "$out/bin/DesktopVideoHelper" + runHook postInstall + ''; + + # need to tell the DesktopVideoHelper where to find its own library + appendRunpaths = [ "${placeholder "out"}/lib" ]; + + meta = with lib; { + homepage = "https://www.blackmagicdesign.com/support/family/capture-and-playback"; + maintainers = [ maintainers.naxdy ]; + license = licenses.unfree; + description = "Supporting applications for Blackmagic Decklink. Doesn't include the desktop applications, only the helper required to make the driver work"; + platforms = platforms.linux; + }; +}) diff --git a/pkgs/os-specific/linux/decklink/default.nix b/pkgs/os-specific/linux/decklink/default.nix new file mode 100644 index 000000000000..4916b8630ad4 --- /dev/null +++ b/pkgs/os-specific/linux/decklink/default.nix @@ -0,0 +1,49 @@ +{ stdenv +, lib +, blackmagic-desktop-video +, kernel +}: +stdenv.mkDerivation (finalAttrs: { + pname = "decklink"; + + # the download is a horrible curl mess. we reuse it between the kernel module + # and desktop service, since the version of the two have to match anyways. + # See pkgs/by-name/bl/blackmagic-desktop-video/package.nix for more. + inherit (blackmagic-desktop-video) src version; + + KERNELDIR = "${kernel.dev}/lib/modules/${kernel.modDirVersion}/build"; + INSTALL_MOD_PATH = placeholder "out"; + + nativeBuildInputs = kernel.moduleBuildDependencies; + + postUnpack = let + arch = stdenv.hostPlatform.uname.processor; + in '' + tar xf Blackmagic_Desktop_Video_Linux_${lib.head (lib.splitString "a" finalAttrs.version)}/other/${arch}/desktopvideo-${finalAttrs.version}-${arch}.tar.gz + moduleRoot=$NIX_BUILD_TOP/desktopvideo-${finalAttrs.version}-${stdenv.hostPlatform.uname.processor}/usr/src + sourceRoot=$moduleRoot + ''; + + buildPhase = '' + runHook preBuild + make -C $moduleRoot/blackmagic-${finalAttrs.version} -j$NIX_BUILD_CORES + make -C $moduleRoot/blackmagic-io-${finalAttrs.version} -j$NIX_BUILD_CORES + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + make -C $KERNELDIR M=$moduleRoot/blackmagic-${finalAttrs.version} modules_install + make -C $KERNELDIR M=$moduleRoot/blackmagic-io-${finalAttrs.version} modules_install + runHook postInstall + ''; + + meta = with lib; { + homepage = "https://www.blackmagicdesign.com/support/family/capture-and-playback"; + maintainers = [ maintainers.naxdy ]; + license = licenses.unfree; + description = "Kernel module for the Blackmagic Design Decklink cards"; + sourceProvenance = with lib.sourceTypes; [ binaryFirmware ]; + platforms = platforms.linux; + }; +}) diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix index 1167dfba1fc2..46c36ba47b33 100644 --- a/pkgs/top-level/aliases.nix +++ b/pkgs/top-level/aliases.nix @@ -140,7 +140,6 @@ mapAliases ({ bitwarden = bitwarden-desktop; # Added 2024-02-25 bitwig-studio1 = throw "bitwig-studio1 has been removed, you can upgrade to 'bitwig-studio'"; # Added 2023-01-03 bitwig-studio2 = throw "bitwig-studio2 has been removed, you can upgrade to 'bitwig-studio'"; # Added 2023-01-03 - blackmagic-desktop-video = throw "blackmagic-desktop-video has been due to being unmaintained"; # Added 2024-07-02 blender-with-packages = args: lib.warn "blender-with-packages is deprecated in favor of blender.withPackages, e.g. `blender.withPackages(ps: [ ps.foobar ])`" (blender.withPackages (_: args.packages)).overrideAttrs diff --git a/pkgs/top-level/linux-kernels.nix b/pkgs/top-level/linux-kernels.nix index b28b9884b587..28dfc585d66d 100644 --- a/pkgs/top-level/linux-kernels.nix +++ b/pkgs/top-level/linux-kernels.nix @@ -351,7 +351,7 @@ in { dddvb = callPackage ../os-specific/linux/dddvb { }; - decklink = throw "The decklink kernel module has been removed due to being unmaintained"; # Module removed on 2024-07-02 + decklink = callPackage ../os-specific/linux/decklink { }; digimend = callPackage ../os-specific/linux/digimend { };