about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/ffmpeg/generic.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/ffmpeg/generic.nix')
-rw-r--r--nixpkgs/pkgs/development/libraries/ffmpeg/generic.nix228
1 files changed, 228 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/libraries/ffmpeg/generic.nix b/nixpkgs/pkgs/development/libraries/ffmpeg/generic.nix
new file mode 100644
index 000000000000..5b98884c1fc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/ffmpeg/generic.nix
@@ -0,0 +1,228 @@
+{ stdenv, buildPackages, fetchurl, pkgconfig, addOpenGLRunpath, perl, texinfo, yasm
+, alsaLib, bzip2, fontconfig, freetype, gnutls, libiconv, lame, libass, libogg
+, libssh, libtheora, libva, libdrm, libvorbis, libvpx, lzma, libpulseaudio, soxr
+, x264, x265, xvidcore, zlib, libopus, speex, nv-codec-headers, dav1d
+, openglSupport ? false, libGLU ? null, libGL ? null
+, libmfxSupport ? false, intel-media-sdk ? null
+, libaomSupport ? false, libaom ? null
+# Build options
+, runtimeCpuDetectBuild ? true # Detect CPU capabilities at runtime
+, multithreadBuild ? true # Multithreading via pthreads/win32 threads
+, sdlSupport ? !stdenv.isAarch32, SDL ? null, SDL2 ? null
+, vdpauSupport ? !stdenv.isAarch32, libvdpau ? null
+# Developer options
+, debugDeveloper ? false
+, optimizationsDeveloper ? true
+, extraWarningsDeveloper ? false
+# Darwin frameworks
+, Cocoa, darwinFrameworks ? [ Cocoa ]
+# Inherit generics
+, branch, sha256, version, patches ? [], ...
+}:
+
+/* Maintainer notes:
+ *
+ * THIS IS A MINIMAL BUILD OF FFMPEG, do not include dependencies unless
+ * a build that depends on ffmpeg requires them to be compiled into ffmpeg,
+ * see `ffmpeg-full' for an ffmpeg build with all features included.
+ *
+ * Need fixes to support Darwin:
+ *   pulseaudio
+ *
+ * Known issues:
+ * 0.6     - fails to compile (unresolved) (so far, only disabling a number of
+ *           features works, but that is not a feasible solution)
+ * 0.6.90  - mmx: compile errors (fix: disable for 0.6.90-rc0)
+ * 1.1     - libsoxr: compile error (fix: disable for 1.1)
+ *           Support was initially added in 1.1 before soxr api change, fix
+ *           would probably be to add soxr-1.0
+ * ALL     - Cross-compiling will disable features not present on host OS
+ *           (e.g. dxva2 support [DirectX] will not be enabled unless natively
+ *           compiled on Cygwin)
+ *
+ */
+
+let
+  inherit (stdenv) isDarwin isFreeBSD isLinux isAarch32;
+  inherit (stdenv.lib) optional optionals optionalString enableFeature filter;
+
+  cmpVer = builtins.compareVersions;
+  reqMin = requiredVersion: (cmpVer requiredVersion branch != 1);
+  reqMatch = requiredVersion: (cmpVer requiredVersion branch == 0);
+
+  ifMinVer = minVer: flag: if reqMin minVer then flag else null;
+
+  # Version specific fix
+  verFix = withoutFix: fixVer: withFix: if reqMatch fixVer then withFix else withoutFix;
+
+  # Disable dependency that needs fixes before it will work on Darwin or Arm
+  disDarwinOrArmFix = origArg: minVer: fixArg: if ((isDarwin || isAarch32) && reqMin minVer) then fixArg else origArg;
+
+  vaapiSupport = reqMin "0.6" && ((isLinux || isFreeBSD) && !isAarch32);
+
+  vpxSupport = reqMin "0.6" && !isAarch32;
+in
+
+assert openglSupport -> libGL != null && libGLU != null;
+assert libmfxSupport -> intel-media-sdk != null;
+assert libaomSupport -> libaom != null;
+
+stdenv.mkDerivation rec {
+
+  pname = "ffmpeg";
+  inherit version;
+
+  src = fetchurl {
+    url = "https://www.ffmpeg.org/releases/${pname}-${version}.tar.bz2";
+    inherit sha256;
+  };
+
+  postPatch = ''patchShebangs .'';
+  inherit patches;
+
+  outputs = [ "bin" "dev" "out" "man" ]
+    ++ optional (reqMin "1.0") "doc" ; # just dev-doc
+  setOutputFlags = false; # doesn't accept all and stores configureFlags in libs!
+
+  configurePlatforms = [];
+  configureFlags = filter (v: v != null) ([
+      "--arch=${stdenv.hostPlatform.parsed.cpu.name}"
+      "--target_os=${stdenv.hostPlatform.parsed.kernel.name}"
+    # License
+      "--enable-gpl"
+      "--enable-version3"
+    # Build flags
+      "--enable-shared"
+      (ifMinVer "0.6" "--enable-pic")
+      (enableFeature runtimeCpuDetectBuild "runtime-cpudetect")
+      "--enable-hardcoded-tables"
+    ] ++
+      (if multithreadBuild then (
+         if stdenv.isCygwin then
+           ["--disable-pthreads" "--enable-w32threads"]
+         else # Use POSIX threads by default
+           ["--enable-pthreads" "--disable-w32threads"])
+       else
+         ["--disable-pthreads" "--disable-w32threads"])
+    ++ [
+      (ifMinVer "0.9" "--disable-os2threads") # We don't support OS/2
+      "--enable-network"
+      (ifMinVer "2.4" "--enable-pixelutils")
+    # Executables
+      "--enable-ffmpeg"
+      "--disable-ffplay"
+      (ifMinVer "0.6" "--enable-ffprobe")
+      (if reqMin "4" then null else "--disable-ffserver")
+    # Libraries
+      (ifMinVer "0.6" "--enable-avcodec")
+      (ifMinVer "0.6" "--enable-avdevice")
+      "--enable-avfilter"
+      (ifMinVer "0.6" "--enable-avformat")
+      (ifMinVer "1.0" "--enable-avresample")
+      (ifMinVer "1.1" "--enable-avutil")
+      "--enable-postproc"
+      (ifMinVer "0.9" "--enable-swresample")
+      "--enable-swscale"
+    # Docs
+      (ifMinVer "0.6" "--disable-doc")
+    # External Libraries
+      "--enable-bzlib"
+      "--enable-gnutls"
+      (ifMinVer "1.0" "--enable-fontconfig")
+      (ifMinVer "0.7" "--enable-libfreetype")
+      "--enable-libmp3lame"
+      (ifMinVer "1.2" "--enable-iconv")
+      "--enable-libtheora"
+      (ifMinVer "2.1" "--enable-libssh")
+      (ifMinVer "0.6" (enableFeature vaapiSupport "vaapi"))
+      (ifMinVer "3.4" (enableFeature vaapiSupport "libdrm"))
+      (enableFeature vdpauSupport "vdpau")
+      "--enable-libvorbis"
+      (ifMinVer "0.6" (enableFeature vpxSupport "libvpx"))
+      (ifMinVer "2.4" "--enable-lzma")
+      (ifMinVer "2.2" (enableFeature openglSupport "opengl"))
+      (ifMinVer "4.2" (enableFeature libmfxSupport "libmfx"))
+      (ifMinVer "4.2" (enableFeature libaomSupport "libaom"))
+      (disDarwinOrArmFix (ifMinVer "0.9" "--enable-libpulse") "0.9" "--disable-libpulse")
+      (ifMinVer "2.5" (if sdlSupport && reqMin "3.2" then "--enable-sdl2" else if sdlSupport then "--enable-sdl" else null)) # autodetected before 2.5, SDL1 support removed in 3.2 for SDL2
+      (ifMinVer "1.2" "--enable-libsoxr")
+      "--enable-libx264"
+      "--enable-libxvid"
+      "--enable-zlib"
+      (ifMinVer "2.8" "--enable-libopus")
+      "--enable-libspeex"
+      (ifMinVer "2.8" "--enable-libx265")
+      (ifMinVer "4.2" (enableFeature (dav1d != null) "libdav1d"))
+    # Developer flags
+      (enableFeature debugDeveloper "debug")
+      (enableFeature optimizationsDeveloper "optimizations")
+      (enableFeature extraWarningsDeveloper "extra-warnings")
+      "--disable-stripping"
+    # Disable mmx support for 0.6.90
+      (verFix null "0.6.90" "--disable-mmx")
+  ] ++ optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+      "--cross-prefix=${stdenv.cc.targetPrefix}"
+      "--enable-cross-compile"
+  ] ++ optional stdenv.cc.isClang "--cc=clang");
+
+  depsBuildBuild = [ buildPackages.stdenv.cc ];
+  nativeBuildInputs = [ addOpenGLRunpath perl pkgconfig texinfo yasm ];
+
+  buildInputs = [
+    bzip2 fontconfig freetype gnutls libiconv lame libass libogg libssh libtheora
+    libvorbis lzma soxr x264 x265 xvidcore zlib libopus speex nv-codec-headers
+  ] ++ optionals openglSupport [ libGL libGLU ]
+    ++ optional libmfxSupport intel-media-sdk
+    ++ optional libaomSupport libaom
+    ++ optional vpxSupport libvpx
+    ++ optionals (!isDarwin && !isAarch32) [ libpulseaudio ] # Need to be fixed on Darwin and ARM
+    ++ optional ((isLinux || isFreeBSD) && !isAarch32) libva
+    ++ optional ((isLinux || isFreeBSD) && !isAarch32) libdrm
+    ++ optional isLinux alsaLib
+    ++ optionals isDarwin darwinFrameworks
+    ++ optional vdpauSupport libvdpau
+    ++ optional sdlSupport (if reqMin "3.2" then SDL2 else SDL)
+    ++ optional (reqMin "4.2") dav1d;
+
+  enableParallelBuilding = true;
+
+  doCheck = false; # fails
+
+  # ffmpeg 3+ generates pkg-config (.pc) files that don't have the
+  # form automatically handled by the multiple-outputs hooks.
+  postFixup = ''
+    moveToOutput bin "$bin"
+    moveToOutput share/ffmpeg/examples "$doc"
+    for pc in ''${!outputDev}/lib/pkgconfig/*.pc; do
+      substituteInPlace $pc \
+        --replace "includedir=$out" "includedir=''${!outputInclude}"
+    done
+  '' + optionalString stdenv.isLinux ''
+    # Set RUNPATH so that libnvcuvid and libcuda in /run/opengl-driver(-32)/lib can be found.
+    # See the explanation in addOpenGLRunpath.
+    addOpenGLRunpath $out/lib/libavcodec.so
+    addOpenGLRunpath $out/lib/libavutil.so
+  '';
+
+  installFlags = [ "install-man" ];
+
+  passthru = {
+    inherit vaapiSupport vdpauSupport;
+  };
+
+  meta = with stdenv.lib; {
+    description = "A complete, cross-platform solution to record, convert and stream audio and video";
+    homepage = "http://www.ffmpeg.org/";
+    longDescription = ''
+      FFmpeg is the leading multimedia framework, able to decode, encode, transcode,
+      mux, demux, stream, filter and play pretty much anything that humans and machines
+      have created. It supports the most obscure ancient formats up to the cutting edge.
+      No matter if they were designed by some standards committee, the community or
+      a corporation.
+    '';
+    license = licenses.gpl3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ codyopel ];
+    inherit branch;
+  };
+}