diff options
Diffstat (limited to 'pkgs/development/libraries/ffmpeg/generic.nix')
-rw-r--r-- | pkgs/development/libraries/ffmpeg/generic.nix | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/pkgs/development/libraries/ffmpeg/generic.nix b/pkgs/development/libraries/ffmpeg/generic.nix new file mode 100644 index 00000000000..1f127d948af --- /dev/null +++ b/pkgs/development/libraries/ffmpeg/generic.nix @@ -0,0 +1,195 @@ +{ stdenv, fetchurl, pkgconfig, perl, texinfo, yasm +, alsaLib, bzip2, fontconfig, freetype, libiconv, lame, libass, libogg, libtheora +, libva, libvdpau, libvorbis, libvpx, lzma, pulseaudio, SDL, soxr, x264 +, xvidcore, zlib +, openglSupport ? false, mesa ? null +# Build options +, runtimeCpuDetectBuild ? true # Detect CPU capabilities at runtime +, multithreadBuild ? true # Multithreading via pthreads/win32 threads +# Developer options +, debugDeveloper ? false +, optimizationsDeveloper ? true +, extraWarningsDeveloper ? false +# Inherit generics +, branch, sha256, version, ... +}: + +/* 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: + * libvpx 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) icCygwin isDarwin isFreeBSD isLinux; + inherit (stdenv.lib) optional optionals enableFeature; + + 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 + disDarwinFix = origArg: minVer: fixArg: if (isDarwin && reqMin minVer) then fixArg else origArg; +in + +assert openglSupport -> mesa != null; + +stdenv.mkDerivation rec { + + name = "ffmpeg-${version}"; + inherit version; + + src = fetchurl { + url = "https://www.ffmpeg.org/releases/${name}.tar.bz2"; + inherit sha256; + }; + + patchPhase = ''patchShebangs .''; + + configureFlags = [ + # License + "--enable-gpl" + "--enable-version3" + # Build flags + "--enable-shared" + "--disable-static" + (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 + (ifMinVer "2.4" "--enable-pixelutils") + # Executables + "--enable-ffmpeg" + "--disable-ffplay" + (ifMinVer "0.6" "--enable-ffprobe") + "--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" + (ifMinVer "1.0" "--enable-fontconfig") + (ifMinVer "0.7" "--enable-libfreetype") + "--enable-libmp3lame" + (ifMinVer "1.2" "--enable-iconv") + "--enable-libtheora" + (ifMinVer "0.6" (enableFeature (isLinux || isFreeBSD) "vaapi")) + "--enable-vdpau" + "--enable-libvorbis" + (disDarwinFix (ifMinVer "0.6" "--enable-libvpx") "0.6" "--disable-libvpx") + (ifMinVer "2.4" "--enable-lzma") + (ifMinVer "2.2" (enableFeature openglSupport "opengl")) + (disDarwinFix (ifMinVer "0.9" "--enable-libpulse") "0.9" "--disable-libpulse") + (ifMinVer "2.5" "--enable-sdl") # Only configurable since 2.5, auto detected before then + (ifMinVer "1.2" "--enable-libsoxr") + "--enable-libx264" + "--enable-libxvid" + "--enable-zlib" + # 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") + ] ++ optional (stdenv.cc.cc.isClang or false) "--cc=clang"; + + nativeBuildInputs = [ perl pkgconfig texinfo yasm ]; + + buildInputs = [ + bzip2 fontconfig freetype libiconv lame libass libogg libtheora libvdpau + libvorbis lzma SDL soxr x264 xvidcore zlib + ] ++ optional openglSupport mesa + ++ optionals (!isDarwin) [ libvpx pulseaudio ] # Need to be fixed on Darwin + ++ optional (isLinux || isFreeBSD) libva + ++ optional isLinux alsaLib; + + enableParallelBuilding = true; + + /* Cross-compilation is untested, consider this an outline, more work + needs to be done to portions of the build to get it to work correctly */ + crossAttrs = let + os = '' + if [ "${stdenv.cross.config}" = "*cygwin*" ] ; then + # Probably should look for mingw too + echo "cygwin" + elif [ "${stdenv.cross.config}" = "*darwin*" ] ; then + echo "darwin" + elif [ "${stdenv.cross.config}" = "*freebsd*" ] ; then + echo "freebsd" + elif [ "${stdenv.cross.config}" = "*linux*" ] ; then + echo "linux" + elif [ "${stdenv.cross.config}" = "*netbsd*" ] ; then + echo "netbsd" + elif [ "${stdenv.cross.config}" = "*openbsd*" ] ; then + echo "openbsd" + fi + ''; + in { + dontSetConfigureCross = true; + configureFlags = configureFlags ++ [ + "--cross-prefix=${stdenv.cross.config}-" + "--enable-cross-compile" + "--target_os=${os}" + "--arch=${stdenv.cross.arch}" + ]; + }; + + passthru = { + vaapiSupport = if reqMin "0.6" && (isLinux || isFreeBSD) then true else false; + vdpauSupport = true; + }; + + 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 fuuzetsu ]; + inherit branch; + }; +} |