about summary refs log tree commit diff
path: root/nixpkgs/pkgs/applications/video/mpv/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/applications/video/mpv/default.nix')
-rw-r--r--nixpkgs/pkgs/applications/video/mpv/default.nix279
1 files changed, 279 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/applications/video/mpv/default.nix b/nixpkgs/pkgs/applications/video/mpv/default.nix
new file mode 100644
index 000000000000..163729d879b9
--- /dev/null
+++ b/nixpkgs/pkgs/applications/video/mpv/default.nix
@@ -0,0 +1,279 @@
+{ lib
+, config
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, addOpenGLRunpath
+, bash
+, docutils
+, meson
+, ninja
+, pkg-config
+, python3
+, ffmpeg
+, freefont_ttf
+, freetype
+, libass
+, libpthreadstubs
+, nv-codec-headers-11
+, lua
+, libuchardet
+, libiconv
+, xcbuild
+, rcodesign
+
+, waylandSupport ? stdenv.isLinux
+  , wayland
+  , wayland-protocols
+  , wayland-scanner
+  , libxkbcommon
+
+, x11Support ? stdenv.isLinux
+  , libGLU, libGL
+  , libX11
+  , libXext
+  , libXxf86vm
+  , libXrandr
+  , libXpresent
+
+, cddaSupport ? false
+  , libcdio
+  , libcdio-paranoia
+
+, vulkanSupport ? stdenv.isLinux
+  , libplacebo
+  , shaderc # instead of spirv-cross
+  , vulkan-headers
+  , vulkan-loader
+
+, drmSupport ? stdenv.isLinux
+  , libdrm
+  , mesa
+
+, alsaSupport        ? stdenv.isLinux, alsa-lib
+, archiveSupport     ? true,           libarchive
+, bluraySupport      ? true,           libbluray
+, bs2bSupport        ? true,           libbs2b
+, cacaSupport        ? true,           libcaca
+, cmsSupport         ? true,           lcms2
+, dvdnavSupport      ? stdenv.isLinux, libdvdnav
+, dvbinSupport       ? stdenv.isLinux
+, jackaudioSupport   ? false,          libjack2
+, javascriptSupport  ? true,           mujs
+, libpngSupport      ? true,           libpng
+, openalSupport      ? true,           openalSoft
+, pulseSupport       ? config.pulseaudio or stdenv.isLinux, libpulseaudio
+, pipewireSupport    ? stdenv.isLinux, pipewire
+, rubberbandSupport  ? true,           rubberband
+, screenSaverSupport ? true,           libXScrnSaver
+, sdl2Support        ? true,           SDL2
+, sixelSupport       ? false,          libsixel
+, speexSupport       ? true,           speex
+, swiftSupport       ? stdenv.isDarwin, swift
+, theoraSupport      ? true,           libtheora
+, vaapiSupport       ? x11Support || waylandSupport, libva
+, vapoursynthSupport ? false,          vapoursynth
+, vdpauSupport       ? true,           libvdpau
+, xineramaSupport    ? stdenv.isLinux, libXinerama
+, xvSupport          ? stdenv.isLinux, libXv
+, zimgSupport        ? true,           zimg
+, darwin
+}:
+
+let
+  inherit (darwin.apple_sdk_11_0.frameworks)
+    AVFoundation Accelerate Cocoa CoreAudio CoreFoundation CoreMedia
+    MediaPlayer VideoToolbox;
+  luaEnv = lua.withPackages (ps: with ps; [ luasocket ]);
+
+  overrideSDK = platform: version:
+    platform // lib.optionalAttrs (platform ? darwinMinVersion) {
+      darwinMinVersion = version;
+    };
+
+  stdenv' = if swiftSupport && stdenv.isDarwin && stdenv.isx86_64
+    then stdenv.override (old: {
+      buildPlatform = overrideSDK old.buildPlatform "10.15";
+      hostPlatform = overrideSDK old.hostPlatform "10.15";
+      targetPlatform = overrideSDK old.targetPlatform "10.15";
+    })
+    else stdenv;
+in stdenv'.mkDerivation (finalAttrs: {
+  pname = "mpv";
+  version = "0.37.0";
+
+  outputs = [ "out" "dev" "doc" "man" ];
+
+  src = fetchFromGitHub {
+    owner = "mpv-player";
+    repo = "mpv";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-izAz9Iiam7tJAWIQkmn2cKOfoaog8oPKq4sOUtp1nvU=";
+  };
+
+  patches = [ ./darwin-sigtool-no-deep.patch ];
+
+  postPatch = lib.concatStringsSep "\n" [
+    # Don't reference compile time dependencies or create a build outputs cycle
+    # between out and dev
+    ''
+    substituteInPlace meson.build \
+      --replace-fail "conf_data.set_quoted('CONFIGURATION', configuration)" \
+                     "conf_data.set_quoted('CONFIGURATION', '<ommited>')"
+    ''
+    # A trick to patchShebang everything except mpv_identify.sh
+    ''
+    pushd TOOLS
+    mv mpv_identify.sh mpv_identify
+    patchShebangs *.py *.sh
+    mv mpv_identify mpv_identify.sh
+    popd
+    ''
+  ];
+
+  # Ensure we reference 'lib' (not 'out') of Swift.
+  preConfigure = lib.optionalString swiftSupport ''
+    export SWIFT_LIB_DYNAMIC="${lib.getLib swift.swift}/lib/swift/macosx"
+  '';
+
+  mesonFlags = [
+    (lib.mesonOption "default_library" "shared")
+    (lib.mesonBool "libmpv" true)
+    (lib.mesonEnable "libarchive" archiveSupport)
+    (lib.mesonEnable "manpage-build" true)
+    (lib.mesonEnable "cdda" cddaSupport)
+    (lib.mesonEnable "dvbin" dvbinSupport)
+    (lib.mesonEnable "dvdnav" dvdnavSupport)
+    (lib.mesonEnable "openal" openalSupport)
+    (lib.mesonEnable "sdl2" sdl2Support)
+    # Disable whilst Swift isn't supported
+    (lib.mesonEnable "swift-build" swiftSupport)
+    (lib.mesonEnable "macos-cocoa-cb" swiftSupport)
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Toggle explicitly because it fails on darwin
+    (lib.mesonEnable "videotoolbox-pl" vulkanSupport)
+  ];
+
+  mesonAutoFeatures = "auto";
+
+  nativeBuildInputs = [
+    addOpenGLRunpath
+    docutils # for rst2man
+    meson
+    ninja
+    pkg-config
+  ]
+  ++ lib.optionals stdenv.isDarwin [ xcbuild.xcrun rcodesign ]
+  ++ lib.optionals swiftSupport [ swift ]
+  ++ lib.optionals waylandSupport [ wayland-scanner ];
+
+  buildInputs = [
+    bash
+    ffmpeg
+    freetype
+    libass
+    libplacebo
+    libpthreadstubs
+    libuchardet
+    luaEnv
+    python3
+  ] ++ lib.optionals alsaSupport        [ alsa-lib ]
+    ++ lib.optionals archiveSupport     [ libarchive ]
+    ++ lib.optionals bluraySupport      [ libbluray ]
+    ++ lib.optionals bs2bSupport        [ libbs2b ]
+    ++ lib.optionals cacaSupport        [ libcaca ]
+    ++ lib.optionals cddaSupport        [ libcdio libcdio-paranoia ]
+    ++ lib.optionals cmsSupport         [ lcms2 ]
+    ++ lib.optionals drmSupport         [ libdrm mesa ]
+    ++ lib.optionals dvdnavSupport      [ libdvdnav libdvdnav.libdvdread ]
+    ++ lib.optionals jackaudioSupport   [ libjack2 ]
+    ++ lib.optionals javascriptSupport  [ mujs ]
+    ++ lib.optionals libpngSupport      [ libpng ]
+    ++ lib.optionals openalSupport      [ openalSoft ]
+    ++ lib.optionals pipewireSupport    [ pipewire ]
+    ++ lib.optionals pulseSupport       [ libpulseaudio ]
+    ++ lib.optionals rubberbandSupport  [ rubberband ]
+    ++ lib.optionals screenSaverSupport [ libXScrnSaver ]
+    ++ lib.optionals sdl2Support        [ SDL2 ]
+    ++ lib.optionals sixelSupport       [ libsixel ]
+    ++ lib.optionals speexSupport       [ speex ]
+    ++ lib.optionals theoraSupport      [ libtheora ]
+    ++ lib.optionals vaapiSupport       [ libva ]
+    ++ lib.optionals vapoursynthSupport [ vapoursynth ]
+    ++ lib.optionals vdpauSupport       [ libvdpau ]
+    ++ lib.optionals vulkanSupport      [ shaderc vulkan-headers vulkan-loader ]
+    ++ lib.optionals waylandSupport     [ wayland wayland-protocols libxkbcommon ]
+    ++ lib.optionals x11Support         [ libX11 libXext libGLU libGL libXxf86vm libXrandr libXpresent ]
+    ++ lib.optionals xineramaSupport    [ libXinerama ]
+    ++ lib.optionals xvSupport          [ libXv ]
+    ++ lib.optionals zimgSupport        [ zimg ]
+    ++ lib.optionals stdenv.isLinux     [ nv-codec-headers-11 ]
+    ++ lib.optionals stdenv.isDarwin    [ libiconv ]
+    ++ lib.optionals stdenv.isDarwin    [ Accelerate CoreFoundation Cocoa CoreAudio MediaPlayer VideoToolbox ]
+    ++ lib.optionals (stdenv.isDarwin && swiftSupport) [ AVFoundation CoreMedia ];
+
+  postBuild = lib.optionalString stdenv.isDarwin ''
+    pushd .. # Must be run from the source dir because it uses relative paths
+    python3 TOOLS/osxbundle.py -s build/mpv
+    popd
+  '';
+
+  postInstall = ''
+    # Use a standard font
+    mkdir -p $out/share/mpv
+    ln -s ${freefont_ttf}/share/fonts/truetype/FreeSans.ttf $out/share/mpv/subfont.ttf
+
+    pushd ../TOOLS
+    cp mpv_identify.sh umpv $out/bin/
+    popd
+    pushd $out/share/applications
+
+    # patch out smb protocol reference, since our ffmpeg can't handle it
+    substituteInPlace mpv.desktop --replace-fail "smb," ""
+
+    sed -e '/Icon=/ ! s|mpv|umpv|g; s|^Exec=.*|Exec=umpv %U|' \
+      mpv.desktop > umpv.desktop
+    printf "NoDisplay=true\n" >> umpv.desktop
+    popd
+  '' + lib.optionalString stdenv.isDarwin ''
+    mkdir -p $out/Applications
+    cp -r mpv.app $out/Applications
+  '';
+
+  # Set RUNPATH so that libcuda in /run/opengl-driver(-32)/lib can be found.
+  # See the explanation in addOpenGLRunpath.
+  postFixup = lib.optionalString stdenv.isLinux ''
+    addOpenGLRunpath $out/bin/mpv
+    patchShebangs --update --host $out/bin/umpv $out/bin/mpv_identify.sh
+  '';
+
+  passthru = {
+    inherit
+    # The wrapper consults luaEnv and lua.version
+    luaEnv
+    lua
+    # In the wrapper, we want to reference vapoursynth which has the `python3`
+    # passthru attribute (which has the `sitePrefix` attribute). This way we'll
+    # be sure that in the wrapper we'll use the same python3.sitePrefix used to
+    # build vapoursynth.
+    vapoursynthSupport
+    vapoursynth
+    ;
+  };
+
+  meta = {
+    homepage = "https://mpv.io";
+    description = "General-purpose media player, fork of MPlayer and mplayer2";
+    longDescription = ''
+      mpv is a free and open-source general-purpose video player, based on the
+      MPlayer and mplayer2 projects, with great improvements above both.
+    '';
+    changelog = "https://github.com/mpv-player/mpv/releases/tag/v${finalAttrs.version}";
+    license = lib.licenses.gpl2Plus;
+    mainProgram = "mpv";
+    maintainers = with lib.maintainers; [
+      AndersonTorres fpletz globin ma27 tadeokondrak
+    ];
+    platforms = lib.platforms.unix;
+  };
+})