about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/vapoursynth
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/vapoursynth')
-rw-r--r--nixpkgs/pkgs/development/libraries/vapoursynth/0001-Call-weak-function-to-allow-adding-preloaded-plugins.patch74
-rw-r--r--nixpkgs/pkgs/development/libraries/vapoursynth/default.nix67
-rw-r--r--nixpkgs/pkgs/development/libraries/vapoursynth/editor.nix59
-rw-r--r--nixpkgs/pkgs/development/libraries/vapoursynth/plugin-interface.nix113
4 files changed, 313 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/libraries/vapoursynth/0001-Call-weak-function-to-allow-adding-preloaded-plugins.patch b/nixpkgs/pkgs/development/libraries/vapoursynth/0001-Call-weak-function-to-allow-adding-preloaded-plugins.patch
new file mode 100644
index 000000000000..72ec48f020b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/vapoursynth/0001-Call-weak-function-to-allow-adding-preloaded-plugins.patch
@@ -0,0 +1,74 @@
+From 439e2effe1cc372925daf6d5c28569663ffb93ed Mon Sep 17 00:00:00 2001
+From: Tadeo Kondrak <me@tadeo.ca>
+Date: Mon, 25 Jan 2021 11:17:44 -0700
+Subject: [PATCH] Call weak function to allow adding preloaded plugins after
+ compile
+
+---
+ src/core/vscore.cpp | 19 +++++++++++++++++++
+ src/core/vscore.h   |  5 +++++
+ 2 files changed, 24 insertions(+)
+
+diff --git a/src/core/vscore.cpp b/src/core/vscore.cpp
+index f8e69062..4ce4c623 100644
+--- a/src/core/vscore.cpp
++++ b/src/core/vscore.cpp
+@@ -1791,6 +1791,20 @@ void VSCore::destroyFilterInstance(VSNode *node) {
+     freeDepth--;
+ }
+ 
++extern "C" {
++void __attribute__((weak)) VSLoadPluginsNix(void (*load)(void *data, const char *path), void *data);
++
++struct VSLoadPluginsNixCallbackData {
++    VSCore *core;
++    const char *filter;
++};
++
++static void VSLoadPluginsNixCallback(void *data, const char *path) {
++    auto callbackData = static_cast<VSLoadPluginsNixCallbackData *>(data);
++    callbackData->core->loadAllPluginsInPath(path, callbackData->filter);
++}
++}
++
+ VSCore::VSCore(int flags) :
+     numFilterInstances(1),
+     numFunctionInstances(0),
+@@ -1918,6 +1932,11 @@ VSCore::VSCore(int flags) :
+     } // If neither exists, an empty string will do.
+ #endif
+ 
++    if (VSLoadPluginsNix != nullptr) {
++        VSLoadPluginsNixCallbackData data{this, filter.c_str()};
++        VSLoadPluginsNix(VSLoadPluginsNixCallback, &data);
++    }
++
+     VSMap *settings = readSettings(configFile);
+     const char *error = vs_internal_vsapi.mapGetError(settings);
+     if (error) {
+diff --git a/src/core/vscore.h b/src/core/vscore.h
+index 2ce0f56b..2982b133 100644
+--- a/src/core/vscore.h
++++ b/src/core/vscore.h
+@@ -985,6 +985,9 @@ public:
+     std::string getV3ArgString() const;
+ };
+ 
++extern "C" {
++static void VSLoadPluginsNixCallback(void *data, const char *path);
++}
+ 
+ struct VSPlugin {
+     friend struct VSPluginFunction;
+@@ -1140,6 +1143,8 @@ public:
+ 
+     explicit VSCore(int flags);
+     void freeCore();
++
++    friend void VSLoadPluginsNixCallback(void *data, const char *path);
+ };
+ 
+ #endif // VSCORE_H
+-- 
+2.32.0
+
diff --git a/nixpkgs/pkgs/development/libraries/vapoursynth/default.nix b/nixpkgs/pkgs/development/libraries/vapoursynth/default.nix
new file mode 100644
index 000000000000..3eaeeccc4544
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/vapoursynth/default.nix
@@ -0,0 +1,67 @@
+{ lib, stdenv, fetchFromGitHub, pkg-config, autoreconfHook, makeWrapper
+, runCommandCC, runCommand, vapoursynth, writeText, patchelf, buildEnv
+, zimg, libass, python3, libiconv
+, ApplicationServices
+, ocrSupport ? false, tesseract
+, imwriSupport ? true, imagemagick
+}:
+
+with lib;
+
+stdenv.mkDerivation rec {
+  pname = "vapoursynth";
+  version = "R55";
+
+  src = fetchFromGitHub {
+    owner  = "vapoursynth";
+    repo   = "vapoursynth";
+    rev    = version;
+    sha256 = "sha256-91lPknNX3NM3NraIcPAR478paPoYvgjgCOIcdgaR5nE=";
+  };
+
+  patches = [
+    ./0001-Call-weak-function-to-allow-adding-preloaded-plugins.patch
+  ];
+
+  nativeBuildInputs = [ pkg-config autoreconfHook makeWrapper ];
+  buildInputs = [
+    zimg libass
+    (python3.withPackages (ps: with ps; [ sphinx cython ]))
+  ] ++ optionals stdenv.isDarwin [ libiconv ApplicationServices ]
+    ++ optional ocrSupport   tesseract
+    ++ optional imwriSupport imagemagick;
+
+  configureFlags = [
+    (optionalString (!ocrSupport)   "--disable-ocr")
+    (optionalString (!imwriSupport) "--disable-imwri")
+  ];
+
+  enableParallelBuilding = true;
+
+  passthru = rec {
+    # If vapoursynth is added to the build inputs of mpv and then
+    # used in the wrapping of it, we want to know once inside the
+    # wrapper, what python3 version was used to build vapoursynth so
+    # the right python3.sitePackages will be used there.
+    inherit python3;
+
+    withPlugins = import ./plugin-interface.nix {
+      inherit lib python3 buildEnv writeText runCommandCC stdenv runCommand
+        vapoursynth makeWrapper withPlugins;
+    };
+  };
+
+  postInstall = ''
+    wrapProgram $out/bin/vspipe \
+        --prefix PYTHONPATH : $out/${python3.sitePackages}
+  '';
+
+  meta = with lib; {
+    description = "A video processing framework with the future in mind";
+    homepage    = "http://www.vapoursynth.com/";
+    license     = licenses.lgpl21;
+    platforms   = platforms.x86_64;
+    maintainers = with maintainers; [ rnhmjoj sbruder tadeokondrak ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/libraries/vapoursynth/editor.nix b/nixpkgs/pkgs/development/libraries/vapoursynth/editor.nix
new file mode 100644
index 000000000000..5cd4b4608ecb
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/vapoursynth/editor.nix
@@ -0,0 +1,59 @@
+{ lib, mkDerivation, fetchFromBitbucket, makeWrapper, runCommand
+, python3, vapoursynth
+, qmake, qtbase, qtwebsockets
+}:
+
+let
+  unwrapped = mkDerivation rec {
+    pname = "vapoursynth-editor";
+    version = "R19";
+
+    src = fetchFromBitbucket {
+      owner = "mystery_keeper";
+      repo = pname;
+      rev = lib.toLower version;
+      sha256 = "1zlaynkkvizf128ln50yvzz3b764f5a0yryp6993s9fkwa7djb6n";
+    };
+
+    nativeBuildInputs = [ qmake ];
+    buildInputs = [ qtbase vapoursynth qtwebsockets ];
+
+    dontWrapQtApps = true;
+
+    preConfigure = "cd pro";
+
+    preFixup = ''
+      cd ../build/release*
+      mkdir -p $out/bin
+      for bin in vsedit{,-job-server{,-watcher}}; do
+          mv $bin $out/bin
+          wrapQtApp $out/bin/$bin
+      done
+    '';
+
+    passthru = { inherit withPlugins; };
+
+    meta = with lib; {
+      description = "Cross-platform editor for VapourSynth scripts";
+      homepage = "https://bitbucket.org/mystery_keeper/vapoursynth-editor";
+      license = licenses.mit;
+      maintainers = with maintainers; [ tadeokondrak ];
+      platforms = platforms.all;
+    };
+  };
+
+  withPlugins = plugins: let
+    vapoursynthWithPlugins = vapoursynth.withPlugins plugins;
+  in runCommand "${unwrapped.name}-with-plugins" {
+    buildInputs = [ makeWrapper ];
+    passthru = { withPlugins = plugins': withPlugins (plugins ++ plugins'); };
+  } ''
+    mkdir -p $out/bin
+    for bin in vsedit{,-job-server{,-watcher}}; do
+        makeWrapper ${unwrapped}/bin/$bin $out/bin/$bin \
+            --prefix PYTHONPATH : ${vapoursynthWithPlugins}/${python3.sitePackages} \
+            --prefix LD_LIBRARY_PATH : ${vapoursynthWithPlugins}/lib
+    done
+  '';
+in
+  withPlugins []
diff --git a/nixpkgs/pkgs/development/libraries/vapoursynth/plugin-interface.nix b/nixpkgs/pkgs/development/libraries/vapoursynth/plugin-interface.nix
new file mode 100644
index 000000000000..95df3c97747f
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/vapoursynth/plugin-interface.nix
@@ -0,0 +1,113 @@
+{ lib, python3, buildEnv, writeText, runCommandCC, stdenv, runCommand
+, vapoursynth, makeWrapper, withPlugins }:
+
+plugins: let
+  pythonEnvironment = python3.buildEnv.override {
+    extraLibs = plugins;
+  };
+
+  getRecursivePropagatedBuildInputs = pkgs: lib.flatten
+    (map
+      (pkg: let cleanPropagatedBuildInputs = lib.filter lib.isDerivation pkg.propagatedBuildInputs;
+        in cleanPropagatedBuildInputs ++ (getRecursivePropagatedBuildInputs cleanPropagatedBuildInputs))
+      pkgs);
+
+  deepPlugins = lib.unique (plugins ++ (getRecursivePropagatedBuildInputs plugins));
+
+  pluginsEnv = buildEnv {
+    name = "vapoursynth-plugins-env";
+    pathsToLink = [ "/lib/vapoursynth" ];
+    paths = deepPlugins;
+  };
+
+  pluginLoader = let
+    source = writeText "vapoursynth-nix-plugins.c" ''
+      void VSLoadPluginsNix(void (*load)(void *data, const char *path), void *data) {
+      ${lib.concatMapStringsSep "" (path: "load(data, \"${path}/lib/vapoursynth\");") deepPlugins}
+      }
+    '';
+  in
+  runCommandCC "vapoursynth-plugin-loader" {
+    executable = true;
+    preferLocalBuild = true;
+    allowSubstitutes = false;
+  } ''
+    mkdir -p $out/lib
+    $CC -shared -fPIC ${source} -o "$out/lib/libvapoursynth-nix-plugins${ext}"
+  '';
+
+  ext = stdenv.targetPlatform.extensions.sharedLibrary;
+in
+runCommand "${vapoursynth.name}-with-plugins" {
+  nativeBuildInputs = [ makeWrapper ];
+  passthru = {
+    inherit python3;
+    withPlugins = plugins': withPlugins (plugins ++ plugins');
+  };
+} ''
+  mkdir -p \
+    $out/bin \
+    $out/lib/pkgconfig \
+    $out/lib/vapoursynth \
+    $out/${python3.sitePackages}
+
+  for textFile in \
+      lib/pkgconfig/vapoursynth{,-script}.pc \
+      lib/libvapoursynth.la \
+      lib/libvapoursynth-script.la \
+      ${python3.sitePackages}/vapoursynth.la
+  do
+      substitute ${vapoursynth}/$textFile $out/$textFile \
+          --replace "${vapoursynth}" "$out"
+  done
+
+  for binaryPlugin in ${pluginsEnv}/lib/vapoursynth/*; do
+      ln -s $binaryPlugin $out/''${binaryPlugin#"${pluginsEnv}/"}
+  done
+
+  for pythonPlugin in ${pythonEnvironment}/${python3.sitePackages}/*; do
+      ln -s $pythonPlugin $out/''${pythonPlugin#"${pythonEnvironment}/"}
+  done
+
+  for binaryFile in \
+      lib/libvapoursynth${ext} \
+      lib/libvapoursynth-script${ext}.0.0.0
+  do
+    old_rpath=$(patchelf --print-rpath ${vapoursynth}/$binaryFile)
+    new_rpath="$old_rpath:$out/lib"
+    patchelf \
+        --set-rpath "$new_rpath" \
+        --output $out/$binaryFile \
+        ${vapoursynth}/$binaryFile
+    patchelf \
+        --add-needed libvapoursynth-nix-plugins${ext} \
+        $out/$binaryFile
+  done
+
+  for binaryFile in \
+      ${python3.sitePackages}/vapoursynth${ext} \
+      bin/.vspipe-wrapped
+  do
+      old_rpath=$(patchelf --print-rpath ${vapoursynth}/$binaryFile)
+      new_rpath="''${old_rpath//"${vapoursynth}"/"$out"}"
+      patchelf \
+          --set-rpath "$new_rpath" \
+          --output $out/$binaryFile \
+          ${vapoursynth}/$binaryFile
+  done
+
+  ln -s \
+      ${pluginLoader}/lib/libvapoursynth-nix-plugins${ext} \
+      $out/lib/libvapoursynth-nix-plugins${ext}
+  ln -s ${vapoursynth}/include $out/include
+  ln -s ${vapoursynth}/lib/vapoursynth/* $out/lib/vapoursynth
+  ln -s \
+      libvapoursynth-script${ext}.0.0.0 \
+      $out/lib/libvapoursynth-script${ext}
+  ln -s \
+      libvapoursynth-script${ext}.0.0.0 \
+      $out/lib/libvapoursynth-script${ext}.0
+
+  makeWrapper $out/bin/.vspipe-wrapped $out/bin/vspipe \
+      --prefix PYTHONPATH : $out/${python3.sitePackages}
+''