diff --git a/pkgs/development/libraries/ffmpeg/generic.nix b/pkgs/development/libraries/ffmpeg/generic.nix index 94e86bfa09ad..fa60d9c6dc5b 100644 --- a/pkgs/development/libraries/ffmpeg/generic.nix +++ b/pkgs/development/libraries/ffmpeg/generic.nix @@ -1,934 +1,1019 @@ -{ lib, config, stdenv, buildPackages, removeReferencesTo, addDriverRunpath, pkg-config, perl, texinfo, texinfo6, yasm +{ + lib, + config, + stdenv, + buildPackages, + removeReferencesTo, + addDriverRunpath, + pkg-config, + perl, + texinfo, + texinfo6, + yasm, # You can fetch any upstream version using this derivation by specifying version and hash # NOTICE: Always use this argument to override the version. Do not use overrideAttrs. -, version # ffmpeg ABI version. Also declare this if you're overriding the source. -, hash ? "" # hash of the upstream source for the given ABI version -, source ? fetchgit { + version, # ffmpeg ABI version. Also declare this if you're overriding the source. + hash ? "", # hash of the upstream source for the given ABI version + source ? fetchgit { url = "https://git.ffmpeg.org/ffmpeg.git"; rev = "n${version}"; inherit hash; - } + }, -, ffmpegVariant ? "small" # Decides which dependencies are enabled by default + ffmpegVariant ? "small", # Decides which dependencies are enabled by default # Build with headless deps; excludes dependencies that are only necessary for # GUI applications. To be used for purposes that don't generally need such # components and i.e. only depend on libav -, withHeadlessDeps ? ffmpegVariant == "headless" || withSmallDeps + withHeadlessDeps ? ffmpegVariant == "headless" || withSmallDeps, # Dependencies a user might customarily expect from a regular ffmpeg build. # /All/ packages that depend on ffmpeg and some of its feaures should depend # on the small variant. Small means the minimal set of features that satisfies # all dependants in Nixpkgs -, withSmallDeps ? ffmpegVariant == "small" || withFullDeps + withSmallDeps ? ffmpegVariant == "small" || withFullDeps, # Everything enabled; only guarded behind platform exclusivity or brokeness. # If you need to depend on ffmpeg-full because ffmpeg is missing some feature # your package needs, you should enable that feature in regular ffmpeg # instead. -, withFullDeps ? ffmpegVariant == "full" + withFullDeps ? ffmpegVariant == "full", -, fetchgit -, fetchpatch2 + fetchgit, + fetchpatch2, # Feature flags -, withAlsa ? withHeadlessDeps && stdenv.hostPlatform.isLinux # Alsa in/output supporT -, withAmf ? withHeadlessDeps && lib.meta.availableOn stdenv.hostPlatform amf # AMD Media Framework video encoding -, withAom ? withHeadlessDeps # AV1 reference encoder -, withAribb24 ? withFullDeps # ARIB text and caption decoding -, withAribcaption ? withFullDeps && lib.versionAtLeast version "6.1" # ARIB STD-B24 Caption Decoder/Renderer -, withAss ? withHeadlessDeps && stdenv.hostPlatform == stdenv.buildPlatform # (Advanced) SubStation Alpha subtitle rendering -, withAvisynth ? withFullDeps # AviSynth script files reading -, withBluray ? withHeadlessDeps # BluRay reading -, withBs2b ? withFullDeps # bs2b DSP library -, withBzlib ? withHeadlessDeps -, withCaca ? withFullDeps # Textual display (ASCII art) -, withCdio ? withFullDeps && withGPL # Audio CD grabbing -, withCelt ? withHeadlessDeps # CELT decoder -, withChromaprint ? withFullDeps # Audio fingerprinting -, withCodec2 ? withFullDeps # codec2 en/decoding -, withCuda ? withFullDeps && withNvcodec -, withCudaLLVM ? withHeadlessDeps -, withCudaNVCC ? withFullDeps && withUnfree && config.cudaSupport -, withCuvid ? withHeadlessDeps && withNvcodec -, withDav1d ? withHeadlessDeps # AV1 decoder (focused on speed and correctness) -, withDc1394 ? withFullDeps && !stdenv.hostPlatform.isDarwin # IIDC-1394 grabbing (ieee 1394) -, withDrm ? withHeadlessDeps && (with stdenv; isLinux || isFreeBSD) # libdrm support -, withDvdnav ? withFullDeps && withGPL && lib.versionAtLeast version "7" # needed for DVD demuxing -, withDvdread ? withFullDeps && withGPL && lib.versionAtLeast version "7" # needed for DVD demuxing -, withFdkAac ? withFullDeps && (!withGPL || withUnfree) # Fraunhofer FDK AAC de/encoder -, withNvcodec ? withHeadlessDeps && (with stdenv; !isDarwin && !isAarch32 && !hostPlatform.isRiscV && hostPlatform == buildPlatform) # dynamically linked Nvidia code -, withFlite ? withFullDeps # Voice Synthesis -, withFontconfig ? withHeadlessDeps # Needed for drawtext filter -, withFreetype ? withHeadlessDeps # Needed for drawtext filter -, withFrei0r ? withFullDeps && withGPL # frei0r video filtering -, withFribidi ? withHeadlessDeps # Needed for drawtext filter -, withGme ? withFullDeps # Game Music Emulator -, withGnutls ? withHeadlessDeps -, withGsm ? withFullDeps # GSM de/encoder -, withHarfbuzz ? withHeadlessDeps && lib.versionAtLeast version "6.1" # Needed for drawtext filter -, withIconv ? withHeadlessDeps -, withIlbc ? withFullDeps # iLBC de/encoding -, withJack ? withFullDeps && !stdenv.hostPlatform.isDarwin # Jack audio -, withJxl ? withFullDeps && lib.versionAtLeast version "5" # JPEG XL de/encoding -, withKvazaar ? withFullDeps # HEVC encoding -, withLadspa ? withFullDeps # LADSPA audio filtering -, withLc3 ? withFullDeps && lib.versionAtLeast version "7.1" # LC3 de/encoding -, withLcevcdec ? false && lib.versionAtLeast version "7.1" # LCEVC decoding # FIXME currently makes ffmpeg crash in any operation on non-AVX CPUs -, withLcms2 ? withFullDeps # ICC profile support via lcms2 -, withLzma ? withHeadlessDeps # xz-utils -, withMetal ? false # Unfree and requires manual downloading of files -, withMfx ? withFullDeps && (with stdenv.hostPlatform; isLinux && !isAarch) # Hardware acceleration via intel-media-sdk/libmfx -, withModplug ? withFullDeps && !stdenv.hostPlatform.isDarwin # ModPlug support -, withMp3lame ? withHeadlessDeps # LAME MP3 encoder -, withMysofa ? withFullDeps # HRTF support via SOFAlizer -, withNpp ? withFullDeps && withUnfree && config.cudaSupport # Nvidia Performance Primitives-based code -, withNvdec ? withHeadlessDeps && withNvcodec -, withNvenc ? withHeadlessDeps && withNvcodec -, withOpenal ? withFullDeps # OpenAL 1.1 capture support -, withOpencl ? withHeadlessDeps -, withOpencoreAmrnb ? withFullDeps && withVersion3 # AMR-NB de/encoder -, withOpencoreAmrwb ? withFullDeps && withVersion3 # AMR-WB decoder -, withOpengl ? withFullDeps && !stdenv.hostPlatform.isDarwin # OpenGL rendering -, withOpenh264 ? withFullDeps # H.264/AVC encoder -, withOpenjpeg ? withHeadlessDeps # JPEG 2000 de/encoder -, withOpenmpt ? withHeadlessDeps # Tracked music files decoder -, withOpus ? withHeadlessDeps # Opus de/encoder -, withPlacebo ? withFullDeps && !stdenv.hostPlatform.isDarwin # libplacebo video processing library -, withPulse ? withSmallDeps && stdenv.hostPlatform.isLinux # Pulseaudio input support -, withQrencode ? withFullDeps && lib.versionAtLeast version "7" # QR encode generation -, withQuirc ? withFullDeps && lib.versionAtLeast version "7" # QR decoding -, withRav1e ? withFullDeps # AV1 encoder (focused on speed and safety) -, withRist ? withHeadlessDeps # Reliable Internet Stream Transport (RIST) protocol -, withRtmp ? withFullDeps # RTMP[E] support -, withRubberband ? withFullDeps && withGPL # Rubberband filter -, withSamba ? withFullDeps && !stdenv.hostPlatform.isDarwin && withGPLv3 # Samba protocol -, withSdl2 ? withSmallDeps -, withShaderc ? withFullDeps && !stdenv.hostPlatform.isDarwin && lib.versionAtLeast version "5.0" -, withShine ? withFullDeps # Fixed-point MP3 encoding -, withSnappy ? withFullDeps # Snappy compression, needed for hap encoding -, withSoxr ? withHeadlessDeps # Resampling via soxr -, withSpeex ? withHeadlessDeps # Speex de/encoder -, withSrt ? withHeadlessDeps # Secure Reliable Transport (SRT) protocol -, withSsh ? withHeadlessDeps # SFTP protocol -, withSvg ? withFullDeps # SVG protocol -, withSvtav1 ? withHeadlessDeps && !stdenv.hostPlatform.isAarch64 && !stdenv.hostPlatform.isMinGW # AV1 encoder/decoder (focused on speed and correctness) -, withTensorflow ? false # Tensorflow dnn backend support (Increases closure size by ~390 MiB) -, withTheora ? withHeadlessDeps # Theora encoder -, withTwolame ? withFullDeps # MP2 encoding -, withV4l2 ? withHeadlessDeps && stdenv.hostPlatform.isLinux # Video 4 Linux support -, withV4l2M2m ? withV4l2 -, withVaapi ? withHeadlessDeps && (with stdenv; isLinux || isFreeBSD) # Vaapi hardware acceleration -, withVdpau ? withSmallDeps && !stdenv.hostPlatform.isMinGW # Vdpau hardware acceleration -, withVidStab ? withHeadlessDeps && withGPL # Video stabilization -, withVmaf ? withFullDeps && !stdenv.hostPlatform.isAarch64 && lib.versionAtLeast version "5" # Netflix's VMAF (Video Multi-Method Assessment Fusion) -, withVoAmrwbenc ? withFullDeps && withVersion3 # AMR-WB encoder -, withVorbis ? withHeadlessDeps # Vorbis de/encoding, native encoder exists -, withVpl ? false # Hardware acceleration via intel libvpl -, withVpx ? withHeadlessDeps && stdenv.buildPlatform == stdenv.hostPlatform # VP8 & VP9 de/encoding -, withVulkan ? withHeadlessDeps && !stdenv.hostPlatform.isDarwin -, withVvenc ? withFullDeps && lib.versionAtLeast version "7.1" # H.266/VVC encoding -, withWebp ? withHeadlessDeps # WebP encoder -, withX264 ? withHeadlessDeps && withGPL # H.264/AVC encoder -, withX265 ? withHeadlessDeps && withGPL # H.265/HEVC encoder -, withXavs ? withFullDeps && withGPL # AVS encoder -, withXcb ? withXcbShm || withXcbxfixes || withXcbShape # X11 grabbing using XCB -, withXcbShape ? withFullDeps # X11 grabbing shape rendering -, withXcbShm ? withFullDeps # X11 grabbing shm communication -, withXcbxfixes ? withFullDeps # X11 grabbing mouse rendering -, withXevd ? withFullDeps && lib.versionAtLeast version "7.1" && !xevd.meta.broken # MPEG-5 EVC decoding -, withXeve ? withFullDeps && lib.versionAtLeast version "7.1" && !xeve.meta.broken # MPEG-5 EVC encoding -, withXlib ? withFullDeps # Xlib support -, withXml2 ? withHeadlessDeps # libxml2 support, for IMF and DASH demuxers -, withXvid ? withHeadlessDeps && withGPL # Xvid encoder, native encoder exists -, withZimg ? withHeadlessDeps -, withZlib ? withHeadlessDeps -, withZmq ? withFullDeps # Message passing -, withZvbi ? withHeadlessDeps # Teletext support + withAlsa ? withHeadlessDeps && stdenv.hostPlatform.isLinux, # Alsa in/output supporT + withAmf ? withHeadlessDeps && lib.meta.availableOn stdenv.hostPlatform amf, # AMD Media Framework video encoding + withAom ? withHeadlessDeps, # AV1 reference encoder + withAribb24 ? withFullDeps, # ARIB text and caption decoding + withAribcaption ? withFullDeps && lib.versionAtLeast version "6.1", # ARIB STD-B24 Caption Decoder/Renderer + withAss ? withHeadlessDeps && stdenv.hostPlatform == stdenv.buildPlatform, # (Advanced) SubStation Alpha subtitle rendering + withAvisynth ? withFullDeps, # AviSynth script files reading + withBluray ? withHeadlessDeps, # BluRay reading + withBs2b ? withFullDeps, # bs2b DSP library + withBzlib ? withHeadlessDeps, + withCaca ? withFullDeps, # Textual display (ASCII art) + withCdio ? withFullDeps && withGPL, # Audio CD grabbing + withCelt ? withHeadlessDeps, # CELT decoder + withChromaprint ? withFullDeps, # Audio fingerprinting + withCodec2 ? withFullDeps, # codec2 en/decoding + withCuda ? withFullDeps && withNvcodec, + withCudaLLVM ? withHeadlessDeps, + withCudaNVCC ? withFullDeps && withUnfree && config.cudaSupport, + withCuvid ? withHeadlessDeps && withNvcodec, + withDav1d ? withHeadlessDeps, # AV1 decoder (focused on speed and correctness) + withDc1394 ? withFullDeps && !stdenv.hostPlatform.isDarwin, # IIDC-1394 grabbing (ieee 1394) + withDrm ? withHeadlessDeps && (with stdenv; isLinux || isFreeBSD), # libdrm support + withDvdnav ? withFullDeps && withGPL && lib.versionAtLeast version "7", # needed for DVD demuxing + withDvdread ? withFullDeps && withGPL && lib.versionAtLeast version "7", # needed for DVD demuxing + withFdkAac ? withFullDeps && (!withGPL || withUnfree), # Fraunhofer FDK AAC de/encoder + withNvcodec ? + withHeadlessDeps + && ( + with stdenv; !isDarwin && !isAarch32 && !hostPlatform.isRiscV && hostPlatform == buildPlatform + ), # dynamically linked Nvidia code + withFlite ? withFullDeps, # Voice Synthesis + withFontconfig ? withHeadlessDeps, # Needed for drawtext filter + withFreetype ? withHeadlessDeps, # Needed for drawtext filter + withFrei0r ? withFullDeps && withGPL, # frei0r video filtering + withFribidi ? withHeadlessDeps, # Needed for drawtext filter + withGme ? withFullDeps, # Game Music Emulator + withGnutls ? withHeadlessDeps, + withGsm ? withFullDeps, # GSM de/encoder + withHarfbuzz ? withHeadlessDeps && lib.versionAtLeast version "6.1", # Needed for drawtext filter + withIconv ? withHeadlessDeps, + withIlbc ? withFullDeps, # iLBC de/encoding + withJack ? withFullDeps && !stdenv.hostPlatform.isDarwin, # Jack audio + withJxl ? withFullDeps && lib.versionAtLeast version "5", # JPEG XL de/encoding + withKvazaar ? withFullDeps, # HEVC encoding + withLadspa ? withFullDeps, # LADSPA audio filtering + withLc3 ? withFullDeps && lib.versionAtLeast version "7.1", # LC3 de/encoding + withLcevcdec ? false && lib.versionAtLeast version "7.1", # LCEVC decoding # FIXME currently makes ffmpeg crash in any operation on non-AVX CPUs + withLcms2 ? withFullDeps, # ICC profile support via lcms2 + withLzma ? withHeadlessDeps, # xz-utils + withMetal ? false, # Unfree and requires manual downloading of files + withMfx ? withFullDeps && (with stdenv.hostPlatform; isLinux && !isAarch), # Hardware acceleration via intel-media-sdk/libmfx + withModplug ? withFullDeps && !stdenv.hostPlatform.isDarwin, # ModPlug support + withMp3lame ? withHeadlessDeps, # LAME MP3 encoder + withMysofa ? withFullDeps, # HRTF support via SOFAlizer + withNpp ? withFullDeps && withUnfree && config.cudaSupport, # Nvidia Performance Primitives-based code + withNvdec ? withHeadlessDeps && withNvcodec, + withNvenc ? withHeadlessDeps && withNvcodec, + withOpenal ? withFullDeps, # OpenAL 1.1 capture support + withOpencl ? withHeadlessDeps, + withOpencoreAmrnb ? withFullDeps && withVersion3, # AMR-NB de/encoder + withOpencoreAmrwb ? withFullDeps && withVersion3, # AMR-WB decoder + withOpengl ? withFullDeps && !stdenv.hostPlatform.isDarwin, # OpenGL rendering + withOpenh264 ? withFullDeps, # H.264/AVC encoder + withOpenjpeg ? withHeadlessDeps, # JPEG 2000 de/encoder + withOpenmpt ? withHeadlessDeps, # Tracked music files decoder + withOpus ? withHeadlessDeps, # Opus de/encoder + withPlacebo ? withFullDeps && !stdenv.hostPlatform.isDarwin, # libplacebo video processing library + withPulse ? withSmallDeps && stdenv.hostPlatform.isLinux, # Pulseaudio input support + withQrencode ? withFullDeps && lib.versionAtLeast version "7", # QR encode generation + withQuirc ? withFullDeps && lib.versionAtLeast version "7", # QR decoding + withRav1e ? withFullDeps, # AV1 encoder (focused on speed and safety) + withRist ? withHeadlessDeps, # Reliable Internet Stream Transport (RIST) protocol + withRtmp ? withFullDeps, # RTMP[E] support + withRubberband ? withFullDeps && withGPL, # Rubberband filter + withSamba ? withFullDeps && !stdenv.hostPlatform.isDarwin && withGPLv3, # Samba protocol + withSdl2 ? withSmallDeps, + withShaderc ? withFullDeps && !stdenv.hostPlatform.isDarwin && lib.versionAtLeast version "5.0", + withShine ? withFullDeps, # Fixed-point MP3 encoding + withSnappy ? withFullDeps, # Snappy compression, needed for hap encoding + withSoxr ? withHeadlessDeps, # Resampling via soxr + withSpeex ? withHeadlessDeps, # Speex de/encoder + withSrt ? withHeadlessDeps, # Secure Reliable Transport (SRT) protocol + withSsh ? withHeadlessDeps, # SFTP protocol + withSvg ? withFullDeps, # SVG protocol + withSvtav1 ? withHeadlessDeps && !stdenv.hostPlatform.isAarch64 && !stdenv.hostPlatform.isMinGW, # AV1 encoder/decoder (focused on speed and correctness) + withTensorflow ? false, # Tensorflow dnn backend support (Increases closure size by ~390 MiB) + withTheora ? withHeadlessDeps, # Theora encoder + withTwolame ? withFullDeps, # MP2 encoding + withV4l2 ? withHeadlessDeps && stdenv.hostPlatform.isLinux, # Video 4 Linux support + withV4l2M2m ? withV4l2, + withVaapi ? withHeadlessDeps && (with stdenv; isLinux || isFreeBSD), # Vaapi hardware acceleration + withVdpau ? withSmallDeps && !stdenv.hostPlatform.isMinGW, # Vdpau hardware acceleration + withVidStab ? withHeadlessDeps && withGPL, # Video stabilization + withVmaf ? withFullDeps && !stdenv.hostPlatform.isAarch64 && lib.versionAtLeast version "5", # Netflix's VMAF (Video Multi-Method Assessment Fusion) + withVoAmrwbenc ? withFullDeps && withVersion3, # AMR-WB encoder + withVorbis ? withHeadlessDeps, # Vorbis de/encoding, native encoder exists + withVpl ? false, # Hardware acceleration via intel libvpl + withVpx ? withHeadlessDeps && stdenv.buildPlatform == stdenv.hostPlatform, # VP8 & VP9 de/encoding + withVulkan ? withHeadlessDeps && !stdenv.hostPlatform.isDarwin, + withVvenc ? withFullDeps && lib.versionAtLeast version "7.1", # H.266/VVC encoding + withWebp ? withHeadlessDeps, # WebP encoder + withX264 ? withHeadlessDeps && withGPL, # H.264/AVC encoder + withX265 ? withHeadlessDeps && withGPL, # H.265/HEVC encoder + withXavs ? withFullDeps && withGPL, # AVS encoder + withXcb ? withXcbShm || withXcbxfixes || withXcbShape, # X11 grabbing using XCB + withXcbShape ? withFullDeps, # X11 grabbing shape rendering + withXcbShm ? withFullDeps, # X11 grabbing shm communication + withXcbxfixes ? withFullDeps, # X11 grabbing mouse rendering + withXevd ? withFullDeps && lib.versionAtLeast version "7.1" && !xevd.meta.broken, # MPEG-5 EVC decoding + withXeve ? withFullDeps && lib.versionAtLeast version "7.1" && !xeve.meta.broken, # MPEG-5 EVC encoding + withXlib ? withFullDeps, # Xlib support + withXml2 ? withHeadlessDeps, # libxml2 support, for IMF and DASH demuxers + withXvid ? withHeadlessDeps && withGPL, # Xvid encoder, native encoder exists + withZimg ? withHeadlessDeps, + withZlib ? withHeadlessDeps, + withZmq ? withFullDeps, # Message passing + withZvbi ? withHeadlessDeps, # Teletext support -/* - * Licensing options (yes some are listed twice, filters and such are not listed) - */ -, withGPL ? true -, withVersion3 ? true # When withGPL is set this implies GPLv3 otherwise it is LGPLv3 -, withGPLv3 ? withGPL && withVersion3 -, withUnfree ? false + # Licensing options (yes some are listed twice, filters and such are not listed) + withGPL ? true, + withVersion3 ? true, # When withGPL is set this implies GPLv3 otherwise it is LGPLv3 + withGPLv3 ? withGPL && withVersion3, + withUnfree ? false, -/* - * Build options - */ -, withSmallBuild ? false # Optimize for size instead of speed -, withRuntimeCPUDetection ? true # Detect CPU capabilities at runtime (disable to compile natively) -, withGrayscale ? withFullDeps # Full grayscale support -, withSwscaleAlpha ? buildSwscale # Alpha channel support in swscale. You probably want this when buildSwscale. -, withHardcodedTables ? withHeadlessDeps # Hardcode decode tables instead of runtime generation -, withSafeBitstreamReader ? withHeadlessDeps # Buffer boundary checking in bitreaders -, withMultithread ? true # Multithreading via pthreads/win32 threads -, withNetwork ? withHeadlessDeps # Network support -, withPixelutils ? withHeadlessDeps # Pixel utils in libavutil -, withStatic ? stdenv.hostPlatform.isStatic -, withShared ? !stdenv.hostPlatform.isStatic -, withPic ? true -, withThumb ? false # On some ARM platforms + # Build options + withSmallBuild ? false, # Optimize for size instead of speed + withRuntimeCPUDetection ? true, # Detect CPU capabilities at runtime (disable to compile natively) + withGrayscale ? withFullDeps, # Full grayscale support + withSwscaleAlpha ? buildSwscale, # Alpha channel support in swscale. You probably want this when buildSwscale. + withHardcodedTables ? withHeadlessDeps, # Hardcode decode tables instead of runtime generation + withSafeBitstreamReader ? withHeadlessDeps, # Buffer boundary checking in bitreaders + withMultithread ? true, # Multithreading via pthreads/win32 threads + withNetwork ? withHeadlessDeps, # Network support + withPixelutils ? withHeadlessDeps, # Pixel utils in libavutil + withStatic ? stdenv.hostPlatform.isStatic, + withShared ? !stdenv.hostPlatform.isStatic, + withPic ? true, + withThumb ? false, # On some ARM platforms -/* - * Program options - */ -, buildFfmpeg ? withHeadlessDeps # Build ffmpeg executable -, buildFfplay ? withSmallDeps # Build ffplay executable -, buildFfprobe ? withHeadlessDeps # Build ffprobe executable -, buildQtFaststart ? withFullDeps # Build qt-faststart executable -, withBin ? buildFfmpeg || buildFfplay || buildFfprobe || buildQtFaststart -/* - * Library options - */ -, buildAvcodec ? withHeadlessDeps # Build avcodec library -, buildAvdevice ? withHeadlessDeps # Build avdevice library -, buildAvfilter ? withHeadlessDeps # Build avfilter library -, buildAvformat ? withHeadlessDeps # Build avformat library -# Deprecated but depended upon by some packages. -# https://github.com/NixOS/nixpkgs/pull/211834#issuecomment-1417435991) -, buildAvresample ? withHeadlessDeps && lib.versionOlder version "5" # Build avresample library -, buildAvutil ? withHeadlessDeps # Build avutil library -, buildPostproc ? withHeadlessDeps # Build postproc library -, buildSwresample ? withHeadlessDeps # Build swresample library -, buildSwscale ? withHeadlessDeps # Build swscale library -, withLib ? buildAvcodec - || buildAvdevice - || buildAvfilter - || buildAvformat - || buildAvutil - || buildPostproc - || buildSwresample - || buildSwscale -/* - * Documentation options - */ -, withDocumentation ? withHtmlDoc || withManPages || withPodDoc || withTxtDoc -, withHtmlDoc ? withHeadlessDeps # HTML documentation pages -, withManPages ? withHeadlessDeps # Man documentation pages -, withPodDoc ? withHeadlessDeps # POD documentation pages -, withTxtDoc ? withHeadlessDeps # Text documentation pages -# Whether a "doc" output will be produced. Note that withManPages does not produce -# a "doc" output because its files go to "man". -, withDoc ? withDocumentation && (withHtmlDoc || withPodDoc || withTxtDoc) + # Program options + buildFfmpeg ? withHeadlessDeps, # Build ffmpeg executable + buildFfplay ? withSmallDeps, # Build ffplay executable + buildFfprobe ? withHeadlessDeps, # Build ffprobe executable + buildQtFaststart ? withFullDeps, # Build qt-faststart executable + withBin ? buildFfmpeg || buildFfplay || buildFfprobe || buildQtFaststart, + # Library options + buildAvcodec ? withHeadlessDeps, # Build avcodec library + buildAvdevice ? withHeadlessDeps, # Build avdevice library + buildAvfilter ? withHeadlessDeps, # Build avfilter library + buildAvformat ? withHeadlessDeps, # Build avformat library + # Deprecated but depended upon by some packages. + # https://github.com/NixOS/nixpkgs/pull/211834#issuecomment-1417435991) + buildAvresample ? withHeadlessDeps && lib.versionOlder version "5", # Build avresample library + buildAvutil ? withHeadlessDeps, # Build avutil library + buildPostproc ? withHeadlessDeps, # Build postproc library + buildSwresample ? withHeadlessDeps, # Build swresample library + buildSwscale ? withHeadlessDeps, # Build swscale library + withLib ? + buildAvcodec + || buildAvdevice + || buildAvfilter + || buildAvformat + || buildAvutil + || buildPostproc + || buildSwresample + || buildSwscale, + # Documentation options + withDocumentation ? withHtmlDoc || withManPages || withPodDoc || withTxtDoc, + withHtmlDoc ? withHeadlessDeps, # HTML documentation pages + withManPages ? withHeadlessDeps, # Man documentation pages + withPodDoc ? withHeadlessDeps, # POD documentation pages + withTxtDoc ? withHeadlessDeps, # Text documentation pages + # Whether a "doc" output will be produced. Note that withManPages does not produce + # a "doc" output because its files go to "man". + withDoc ? withDocumentation && (withHtmlDoc || withPodDoc || withTxtDoc), -/* - * Developer options - */ -, withDebug ? false -, withOptimisations ? true -, withExtraWarnings ? false -, withStripping ? false + # Developer options + withDebug ? false, + withOptimisations ? true, + withExtraWarnings ? false, + withStripping ? false, -/* - * External libraries options - */ -, alsa-lib -, amf -, amf-headers -, aribb24 -, avisynthplus -, bzip2 -, celt -, chromaprint -, codec2 -, clang -, dav1d -, fdk_aac -, flite -, fontconfig -, freetype -, frei0r -, fribidi -, game-music-emu -, gnutls -, gsm -, harfbuzz -, intel-media-sdk -, kvazaar -, ladspaH -, lame -, lcevcdec -, lcms2 -, libaom -, libaribcaption -, libass -, libbluray -, libbs2b -, libcaca -, libcdio -, libcdio-paranoia -, libdc1394 -, libdrm -, libdvdnav -, libdvdread -, libGL -, libGLU -, libiconv -, libilbc -, libjack2 -, libjxl -, liblc3 -, libmodplug -, libmysofa -, libopenmpt -, libopus -, libplacebo -, libplacebo_5 -, libpulseaudio -, libraw1394 -, librist -, librsvg -, libssh -, libtensorflow -, libtheora -, libv4l -, libva -, libva-minimal -, libvdpau -, libvmaf -, libvorbis -, libvpl -, libvpx -, libwebp -, libX11 -, libxcb -, libXext -, libxml2 -, libXv -, nv-codec-headers -, nv-codec-headers-12 -, ocl-icd # OpenCL ICD -, openal -, opencl-headers # OpenCL headers -, opencore-amr -, openh264 -, openjpeg -, qrencode -, quirc -, rav1e -, rtmpdump -, rubberband -, twolame -, samba -, SDL2 -, shaderc -, shine -, snappy -, soxr -, speex -, srt -, svt-av1 -, vid-stab -, vo-amrwbenc -, vulkan-headers -, vulkan-loader -, vvenc -, x264 -, x265 -, xavs -, xevd -, xeve -, xvidcore -, xz -, zeromq -, zimg -, zlib -, zvbi -/* - * Darwin - */ -, apple-sdk_15 -, xcode # unfree contains metalcc and metallib -/* - * Cuda Packages - */ -, cuda_cudart -, cuda_nvcc -, libnpp -/* - * Testing - */ -, testers + # External libraries options + alsa-lib, + amf, + amf-headers, + aribb24, + avisynthplus, + bzip2, + celt, + chromaprint, + codec2, + clang, + dav1d, + fdk_aac, + flite, + fontconfig, + freetype, + frei0r, + fribidi, + game-music-emu, + gnutls, + gsm, + harfbuzz, + intel-media-sdk, + kvazaar, + ladspaH, + lame, + lcevcdec, + lcms2, + libaom, + libaribcaption, + libass, + libbluray, + libbs2b, + libcaca, + libcdio, + libcdio-paranoia, + libdc1394, + libdrm, + libdvdnav, + libdvdread, + libGL, + libGLU, + libiconv, + libilbc, + libjack2, + libjxl, + liblc3, + libmodplug, + libmysofa, + libopenmpt, + libopus, + libplacebo, + libplacebo_5, + libpulseaudio, + libraw1394, + librist, + librsvg, + libssh, + libtensorflow, + libtheora, + libv4l, + libva, + libva-minimal, + libvdpau, + libvmaf, + libvorbis, + libvpl, + libvpx, + libwebp, + libX11, + libxcb, + libXext, + libxml2, + libXv, + nv-codec-headers, + nv-codec-headers-12, + ocl-icd, # OpenCL ICD + openal, + opencl-headers, # OpenCL headers + opencore-amr, + openh264, + openjpeg, + qrencode, + quirc, + rav1e, + rtmpdump, + rubberband, + twolame, + samba, + SDL2, + shaderc, + shine, + snappy, + soxr, + speex, + srt, + svt-av1, + vid-stab, + vo-amrwbenc, + vulkan-headers, + vulkan-loader, + vvenc, + x264, + x265, + xavs, + xevd, + xeve, + xvidcore, + xz, + zeromq, + zimg, + zlib, + zvbi, + # Darwin + apple-sdk_15, + xcode, # unfree contains metalcc and metallib + # Cuda Packages + cuda_cudart, + cuda_nvcc, + libnpp, + # Testing + testers, }: -/* Maintainer notes: - * - * Version bumps: - * It should always be safe to bump patch releases (e.g. 2.1.x, x being a patch release) - * If adding a new branch, note any configure flags that were added, changed, or deprecated/removed - * and make the necessary changes. - * - * Known issues: - * Cross-compiling will disable features not present on host OS - * (e.g. dxva2 support [DirectX] will not be enabled unless natively compiled on Cygwin) - * - */ +/* + Maintainer notes: + + Version bumps: + It should always be safe to bump patch releases (e.g. 2.1.x, x being a patch release) + If adding a new branch, note any configure flags that were added, changed, or deprecated/removed + and make the necessary changes. + + Known issues: + 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 (lib) optional optionals optionalString enableFeature versionOlder versionAtLeast; + inherit (lib) + optional + optionals + optionalString + enableFeature + versionOlder + versionAtLeast + ; in +assert lib.elem ffmpegVariant [ + "headless" + "small" + "full" +]; -assert lib.elem ffmpegVariant [ "headless" "small" "full" ]; - -/* - * Licensing dependencies - */ +# Licensing dependencies assert withGPLv3 -> withGPL && withVersion3; -/* - * Build dependencies - */ +# Build dependencies assert withPixelutils -> buildAvutil; assert !(withMfx && withVpl); # incompatible features -/* - * Program dependencies - */ -assert buildFfmpeg -> buildAvcodec - && buildAvfilter - && buildAvformat - && (buildSwresample || buildAvresample); -assert buildFfplay -> buildAvcodec - && buildAvformat - && buildSwscale - && (buildSwresample || buildAvresample); +# Program dependencies +assert + buildFfmpeg + -> buildAvcodec && buildAvfilter && buildAvformat && (buildSwresample || buildAvresample); +assert + buildFfplay + -> buildAvcodec && buildAvformat && buildSwscale && (buildSwresample || buildAvresample); assert buildFfprobe -> buildAvcodec && buildAvformat; -/* - * Library dependencies - */ +# Library dependencies assert buildAvcodec -> buildAvutil; # configure flag since 0.6 -assert buildAvdevice -> buildAvformat - && buildAvcodec - && buildAvutil; # configure flag since 0.6 +assert buildAvdevice -> buildAvformat && buildAvcodec && buildAvutil; # configure flag since 0.6 assert buildAvformat -> buildAvcodec && buildAvutil; # configure flag since 0.6 assert buildPostproc -> buildAvutil; assert buildSwscale -> buildAvutil; -/* - * External Library dependencies - */ -assert (withCuda || withCuvid || withNvdec || withNvenc) -> withNvcodec; +# External Library dependencies +assert (withCuda || withCuvid || withNvdec || withNvenc) -> withNvcodec; -stdenv.mkDerivation (finalAttrs: { - pname = "ffmpeg" + (optionalString (ffmpegVariant != "small") "-${ffmpegVariant}"); - inherit version; - src = source; +stdenv.mkDerivation ( + finalAttrs: + { + pname = "ffmpeg" + (optionalString (ffmpegVariant != "small") "-${ffmpegVariant}"); + inherit version; + src = source; - postPatch = '' - patchShebangs . - '' + lib.optionalString withFrei0r '' - substituteInPlace libavfilter/vf_frei0r.c \ - --replace /usr/local/lib/frei0r-1 ${frei0r}/lib/frei0r-1 - substituteInPlace doc/filters.texi \ - --replace /usr/local/lib/frei0r-1 ${frei0r}/lib/frei0r-1 - ''; + postPatch = + '' + patchShebangs . + '' + + lib.optionalString withFrei0r '' + substituteInPlace libavfilter/vf_frei0r.c \ + --replace /usr/local/lib/frei0r-1 ${frei0r}/lib/frei0r-1 + substituteInPlace doc/filters.texi \ + --replace /usr/local/lib/frei0r-1 ${frei0r}/lib/frei0r-1 + ''; - patches = [] - ++ optionals (lib.versionAtLeast version "6.1" && lib.versionOlder version "6.2") [ - (fetchpatch2 { # this can be removed post 6.1 - name = "fix_build_failure_due_to_PropertyKey_EncoderID"; - url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/cb049d377f54f6b747667a93e4b719380c3e9475"; - hash = "sha256-sxRXKKgUak5vsQTiV7ge8vp+N22CdTIvuczNgVRP72c="; - }) - (fetchpatch2 { - name = "CVE-2024-31582.patch"; - url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/99debe5f823f45a482e1dc08de35879aa9c74bd2"; - hash = "sha256-+CQ9FXR6Vr/AmsbXFiCUXZcxKj1s8nInEdke/Oc/kUA="; - }) - (fetchpatch2 { - name = "CVE-2024-31578.patch"; - url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/3bb00c0a420c3ce83c6fafee30270d69622ccad7"; - hash = "sha256-oZMZysBA+/gwaGEM1yvI+8wCadXWE7qLRL6Emap3b8Q="; - }) - (fetchpatch2 { - name = "CVE-2023-49501.patch"; - url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/4adb93dff05dd947878c67784d98c9a4e13b57a7"; - hash = "sha256-7cwktto3fPMDGvCZCVtB01X8Q9S/4V4bDLUICSNfGgw="; - }) - (fetchpatch2 { - name = "CVE-2023-49502.patch"; - url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/737ede405b11a37fdd61d19cf25df296a0cb0b75"; - hash = "sha256-mpSJwR9TX5ENjjCKvzuM/9e1Aj/AOiQW0+72oOMl9v8="; - }) - (fetchpatch2 { - name = "CVE-2023-50007.patch"; - url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/b1942734c7cbcdc9034034373abcc9ecb9644c47"; - hash = "sha256-v0hNcqBtm8GCGAU9UbRUCE0slodOjZCHrkS8e4TrVcQ="; - }) - (fetchpatch2 { - name = "CVE-2023-50008.patch"; - url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/5f87a68cf70dafeab2fb89b42e41a4c29053b89b"; - hash = "sha256-sqUUSOPTPLwu2h8GbAw4SfEf+0oWioz52BcpW1n4v3Y="; - }) - ] - ++ optionals (lib.versionAtLeast version "7.1") [ - ./fix-fate-ffmpeg-spec-disposition-7.1.patch + patches = + [ ] + ++ optionals (lib.versionAtLeast version "6.1" && lib.versionOlder version "6.2") [ + (fetchpatch2 { + # this can be removed post 6.1 + name = "fix_build_failure_due_to_PropertyKey_EncoderID"; + url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/cb049d377f54f6b747667a93e4b719380c3e9475"; + hash = "sha256-sxRXKKgUak5vsQTiV7ge8vp+N22CdTIvuczNgVRP72c="; + }) + (fetchpatch2 { + name = "CVE-2024-31582.patch"; + url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/99debe5f823f45a482e1dc08de35879aa9c74bd2"; + hash = "sha256-+CQ9FXR6Vr/AmsbXFiCUXZcxKj1s8nInEdke/Oc/kUA="; + }) + (fetchpatch2 { + name = "CVE-2024-31578.patch"; + url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/3bb00c0a420c3ce83c6fafee30270d69622ccad7"; + hash = "sha256-oZMZysBA+/gwaGEM1yvI+8wCadXWE7qLRL6Emap3b8Q="; + }) + (fetchpatch2 { + name = "CVE-2023-49501.patch"; + url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/4adb93dff05dd947878c67784d98c9a4e13b57a7"; + hash = "sha256-7cwktto3fPMDGvCZCVtB01X8Q9S/4V4bDLUICSNfGgw="; + }) + (fetchpatch2 { + name = "CVE-2023-49502.patch"; + url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/737ede405b11a37fdd61d19cf25df296a0cb0b75"; + hash = "sha256-mpSJwR9TX5ENjjCKvzuM/9e1Aj/AOiQW0+72oOMl9v8="; + }) + (fetchpatch2 { + name = "CVE-2023-50007.patch"; + url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/b1942734c7cbcdc9034034373abcc9ecb9644c47"; + hash = "sha256-v0hNcqBtm8GCGAU9UbRUCE0slodOjZCHrkS8e4TrVcQ="; + }) + (fetchpatch2 { + name = "CVE-2023-50008.patch"; + url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/5f87a68cf70dafeab2fb89b42e41a4c29053b89b"; + hash = "sha256-sqUUSOPTPLwu2h8GbAw4SfEf+0oWioz52BcpW1n4v3Y="; + }) + ] + ++ optionals (lib.versionAtLeast version "7.1") [ + ./fix-fate-ffmpeg-spec-disposition-7.1.patch - # Expose a private API for Chromium / Qt WebEngine. - (fetchpatch2 { - url = "https://gitlab.archlinux.org/archlinux/packaging/packages/ffmpeg/-/raw/a02c1a15706ea832c0d52a4d66be8fb29499801a/add-av_stream_get_first_dts-for-chromium.patch"; - hash = "sha256-DbH6ieJwDwTjKOdQ04xvRcSLeeLP2Z2qEmqeo8HsPr4="; - }) - ]; + # Expose a private API for Chromium / Qt WebEngine. + (fetchpatch2 { + url = "https://gitlab.archlinux.org/archlinux/packaging/packages/ffmpeg/-/raw/a02c1a15706ea832c0d52a4d66be8fb29499801a/add-av_stream_get_first_dts-for-chromium.patch"; + hash = "sha256-DbH6ieJwDwTjKOdQ04xvRcSLeeLP2Z2qEmqeo8HsPr4="; + }) + ]; - configurePlatforms = []; - setOutputFlags = false; # Only accepts some of them - configureFlags = [ - #mingw64 is internally treated as mingw32, so 32 and 64 make no difference here - "--target_os=${if stdenv.hostPlatform.isMinGW then "mingw64" else stdenv.hostPlatform.parsed.kernel.name}" - "--arch=${stdenv.hostPlatform.parsed.cpu.name}" - "--pkg-config=${buildPackages.pkg-config.targetPrefix}pkg-config" - /* - * Licensing flags - */ - (enableFeature withGPL "gpl") - (enableFeature withVersion3 "version3") - (enableFeature withUnfree "nonfree") - /* - * Build flags - */ - (enableFeature withStatic "static") - (enableFeature withShared "shared") - (enableFeature withPic "pic") - (enableFeature withThumb "thumb") + configurePlatforms = [ ]; + setOutputFlags = false; # Only accepts some of them + configureFlags = + [ + #mingw64 is internally treated as mingw32, so 32 and 64 make no difference here + "--target_os=${ + if stdenv.hostPlatform.isMinGW then "mingw64" else stdenv.hostPlatform.parsed.kernel.name + }" + "--arch=${stdenv.hostPlatform.parsed.cpu.name}" + "--pkg-config=${buildPackages.pkg-config.targetPrefix}pkg-config" + # Licensing flags + (enableFeature withGPL "gpl") + (enableFeature withVersion3 "version3") + (enableFeature withUnfree "nonfree") + # Build flags + (enableFeature withStatic "static") + (enableFeature withShared "shared") + (enableFeature withPic "pic") + (enableFeature withThumb "thumb") - (enableFeature withSmallBuild "small") - (enableFeature withRuntimeCPUDetection "runtime-cpudetect") - (enableFeature withGrayscale "gray") - (enableFeature withSwscaleAlpha "swscale-alpha") - (enableFeature withHardcodedTables "hardcoded-tables") - (enableFeature withSafeBitstreamReader "safe-bitstream-reader") + (enableFeature withSmallBuild "small") + (enableFeature withRuntimeCPUDetection "runtime-cpudetect") + (enableFeature withGrayscale "gray") + (enableFeature withSwscaleAlpha "swscale-alpha") + (enableFeature withHardcodedTables "hardcoded-tables") + (enableFeature withSafeBitstreamReader "safe-bitstream-reader") - (enableFeature (withMultithread && stdenv.hostPlatform.isUnix) "pthreads") - (enableFeature (withMultithread && stdenv.hostPlatform.isWindows) "w32threads") - "--disable-os2threads" # We don't support OS/2 + (enableFeature (withMultithread && stdenv.hostPlatform.isUnix) "pthreads") + (enableFeature (withMultithread && stdenv.hostPlatform.isWindows) "w32threads") + "--disable-os2threads" # We don't support OS/2 - (enableFeature withNetwork "network") - (enableFeature withPixelutils "pixelutils") + (enableFeature withNetwork "network") + (enableFeature withPixelutils "pixelutils") - "--datadir=${placeholder "data"}/share/ffmpeg" + "--datadir=${placeholder "data"}/share/ffmpeg" - /* - * Program flags - */ - (enableFeature buildFfmpeg "ffmpeg") - (enableFeature buildFfplay "ffplay") - (enableFeature buildFfprobe "ffprobe") - ] ++ optionals withBin [ - "--bindir=${placeholder "bin"}/bin" - ] ++ [ - /* - * Library flags - */ - (enableFeature buildAvcodec "avcodec") - (enableFeature buildAvdevice "avdevice") - (enableFeature buildAvfilter "avfilter") - (enableFeature buildAvformat "avformat") - ] ++ optionals (lib.versionOlder version "5") [ - # Ffmpeg > 4 doesn't know about the flag anymore - (enableFeature buildAvresample "avresample") - ] ++ [ - (enableFeature buildAvutil "avutil") - (enableFeature (buildPostproc && withGPL) "postproc") - (enableFeature buildSwresample "swresample") - (enableFeature buildSwscale "swscale") - ] ++ optionals withLib [ - "--libdir=${placeholder "lib"}/lib" - "--incdir=${placeholder "dev"}/include" - ] ++ [ - /* - * Documentation flags - */ - (enableFeature withDocumentation "doc") - (enableFeature withHtmlDoc "htmlpages") - (enableFeature withManPages "manpages") - ] ++ optionals withManPages [ - "--mandir=${placeholder "man"}/share/man" - ] ++ [ - (enableFeature withPodDoc "podpages") - (enableFeature withTxtDoc "txtpages") - ] ++ optionals withDoc [ - "--docdir=${placeholder "doc"}/share/doc/ffmpeg" - ] ++ [ - /* - * External libraries - */ - (enableFeature withAlsa "alsa") - (enableFeature withAmf "amf") - (enableFeature withAom "libaom") - (enableFeature withAribb24 "libaribb24") - ] ++ optionals (versionAtLeast version "6.1") [ - (enableFeature withAribcaption "libaribcaption") - ] ++ [ - (enableFeature withAss "libass") - (enableFeature withAvisynth "avisynth") - (enableFeature withBluray "libbluray") - (enableFeature withBs2b "libbs2b") - (enableFeature withBzlib "bzlib") - (enableFeature withCaca "libcaca") - (enableFeature withCdio "libcdio") - (enableFeature withCelt "libcelt") - (enableFeature withChromaprint "chromaprint") - (enableFeature withCodec2 "libcodec2") - (enableFeature withCuda "cuda") - (enableFeature withCudaLLVM "cuda-llvm") - (enableFeature withCudaNVCC "cuda-nvcc") - (enableFeature withCuvid "cuvid") - (enableFeature withDav1d "libdav1d") - (enableFeature withDc1394 "libdc1394") - (enableFeature withDrm "libdrm") - ] ++ optionals (versionAtLeast version "7") [ - (enableFeature withDvdnav "libdvdnav") - (enableFeature withDvdread "libdvdread") - ] ++ [ - (enableFeature withFdkAac "libfdk-aac") - (enableFeature withNvcodec "ffnvcodec") - (enableFeature withFlite "libflite") - (enableFeature withFontconfig "fontconfig") - (enableFeature withFontconfig "libfontconfig") - (enableFeature withFreetype "libfreetype") - (enableFeature withFrei0r "frei0r") - (enableFeature withFribidi "libfribidi") - (enableFeature withGme "libgme") - (enableFeature withGnutls "gnutls") - (enableFeature withGsm "libgsm") - ] ++ optionals (versionAtLeast version "6.1") [ - (enableFeature withHarfbuzz "libharfbuzz") - ] ++ [ - (enableFeature withIconv "iconv") - (enableFeature withIlbc "libilbc") - (enableFeature withJack "libjack") - ] ++ optionals (versionAtLeast finalAttrs.version "5.0") [ - (enableFeature withJxl "libjxl") - ] ++ [ - (enableFeature withKvazaar "libkvazaar") - (enableFeature withLadspa "ladspa") - ] ++ optionals (versionAtLeast version "7.1") [ - (enableFeature withLc3 "liblc3") - (enableFeature withLcevcdec "liblcevc-dec") - ] ++ optionals (versionAtLeast version "5.1") [ - (enableFeature withLcms2 "lcms2") - ] ++ [ - (enableFeature withLzma "lzma") - ] ++ optionals (versionAtLeast version "5.0") [ - (enableFeature withMetal "metal") - ] ++ [ - (enableFeature withMfx "libmfx") - (enableFeature withModplug "libmodplug") - (enableFeature withMp3lame "libmp3lame") - (enableFeature withMysofa "libmysofa") - (enableFeature withNpp "libnpp") - (enableFeature withNvdec "nvdec") - (enableFeature withNvenc "nvenc") - (enableFeature withOpenal "openal") - (enableFeature withOpencl "opencl") - (enableFeature withOpencoreAmrnb "libopencore-amrnb") - (enableFeature withOpencoreAmrwb "libopencore-amrwb") - (enableFeature withOpengl "opengl") - (enableFeature withOpenh264 "libopenh264") - (enableFeature withOpenjpeg "libopenjpeg") - (enableFeature withOpenmpt "libopenmpt") - (enableFeature withOpus "libopus") - ] ++ optionals (versionAtLeast version "5.0") [ - (enableFeature withPlacebo "libplacebo") - ] ++ [ - (enableFeature withPulse "libpulse") - ] ++ optionals (versionAtLeast version "7") [ - (enableFeature withQrencode "libqrencode") - (enableFeature withQuirc "libquirc") - ] ++ [ - (enableFeature withRav1e "librav1e") - (enableFeature withRist "librist") - (enableFeature withRtmp "librtmp") - (enableFeature withRubberband "librubberband") - (enableFeature withSamba "libsmbclient") - (enableFeature withSdl2 "sdl2") - ] ++ optionals (versionAtLeast version "5.0") [ - (enableFeature withShaderc "libshaderc") - ] ++ [ - (enableFeature withShine "libshine") - (enableFeature withSnappy "libsnappy") - (enableFeature withSoxr "libsoxr") - (enableFeature withSpeex "libspeex") - (enableFeature withSrt "libsrt") - (enableFeature withSsh "libssh") - (enableFeature withSvg "librsvg") - (enableFeature withSvtav1 "libsvtav1") - (enableFeature withTensorflow "libtensorflow") - (enableFeature withTheora "libtheora") - (enableFeature withTwolame "libtwolame") - (enableFeature withV4l2 "libv4l2") - (enableFeature withV4l2M2m "v4l2-m2m") - (enableFeature withVaapi "vaapi") - (enableFeature withVdpau "vdpau") - ] ++ optionals (versionAtLeast version "6.0") [ - (enableFeature withVpl "libvpl") - ] ++ [ - (enableFeature withVidStab "libvidstab") # Actual min. version 2.0 - (enableFeature withVmaf "libvmaf") - (enableFeature withVoAmrwbenc "libvo-amrwbenc") - (enableFeature withVorbis "libvorbis") - (enableFeature withVpx "libvpx") - (enableFeature withVulkan "vulkan") - ] ++ optionals (versionAtLeast version "7.1") [ - (enableFeature withVvenc "libvvenc") - ] ++ [ - (enableFeature withWebp "libwebp") - (enableFeature withX264 "libx264") - (enableFeature withX265 "libx265") - (enableFeature withXavs "libxavs") - (enableFeature withXcb "libxcb") - (enableFeature withXcbShape "libxcb-shape") - (enableFeature withXcbShm "libxcb-shm") - (enableFeature withXcbxfixes "libxcb-xfixes") - ] ++ optionals (versionAtLeast version "7") [ - (enableFeature withXevd "libxevd") - (enableFeature withXeve "libxeve") - ] ++ [ - (enableFeature withXlib "xlib") - (enableFeature withXml2 "libxml2") - (enableFeature withXvid "libxvid") - (enableFeature withZimg "libzimg") - (enableFeature withZlib "zlib") - (enableFeature withZmq "libzmq") - (enableFeature withZvbi "libzvbi") - /* - * Developer flags - */ - (enableFeature withDebug "debug") - (enableFeature withOptimisations "optimizations") - (enableFeature withExtraWarnings "extra-warnings") - (enableFeature withStripping "stripping") - ] ++ optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ - "--cross-prefix=${stdenv.cc.targetPrefix}" - "--enable-cross-compile" - "--host-cc=${buildPackages.stdenv.cc}/bin/cc" - ] ++ optionals stdenv.cc.isClang [ - "--cc=${stdenv.cc.targetPrefix}clang" - "--cxx=${stdenv.cc.targetPrefix}clang++" - ] ++ optionals withMetal [ - "--metalcc=${xcode}/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/metal" - "--metallib=${xcode}/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/metallib" - ]; + # Program flags + (enableFeature buildFfmpeg "ffmpeg") + (enableFeature buildFfplay "ffplay") + (enableFeature buildFfprobe "ffprobe") + ] + ++ optionals withBin [ + "--bindir=${placeholder "bin"}/bin" + ] + ++ [ + # Library flags + (enableFeature buildAvcodec "avcodec") + (enableFeature buildAvdevice "avdevice") + (enableFeature buildAvfilter "avfilter") + (enableFeature buildAvformat "avformat") + ] + ++ optionals (lib.versionOlder version "5") [ + # Ffmpeg > 4 doesn't know about the flag anymore + (enableFeature buildAvresample "avresample") + ] + ++ [ + (enableFeature buildAvutil "avutil") + (enableFeature (buildPostproc && withGPL) "postproc") + (enableFeature buildSwresample "swresample") + (enableFeature buildSwscale "swscale") + ] + ++ optionals withLib [ + "--libdir=${placeholder "lib"}/lib" + "--incdir=${placeholder "dev"}/include" + ] + ++ [ + # Documentation flags + (enableFeature withDocumentation "doc") + (enableFeature withHtmlDoc "htmlpages") + (enableFeature withManPages "manpages") + ] + ++ optionals withManPages [ + "--mandir=${placeholder "man"}/share/man" + ] + ++ [ + (enableFeature withPodDoc "podpages") + (enableFeature withTxtDoc "txtpages") + ] + ++ optionals withDoc [ + "--docdir=${placeholder "doc"}/share/doc/ffmpeg" + ] + ++ [ + # External libraries + (enableFeature withAlsa "alsa") + (enableFeature withAmf "amf") + (enableFeature withAom "libaom") + (enableFeature withAribb24 "libaribb24") + ] + ++ optionals (versionAtLeast version "6.1") [ + (enableFeature withAribcaption "libaribcaption") + ] + ++ [ + (enableFeature withAss "libass") + (enableFeature withAvisynth "avisynth") + (enableFeature withBluray "libbluray") + (enableFeature withBs2b "libbs2b") + (enableFeature withBzlib "bzlib") + (enableFeature withCaca "libcaca") + (enableFeature withCdio "libcdio") + (enableFeature withCelt "libcelt") + (enableFeature withChromaprint "chromaprint") + (enableFeature withCodec2 "libcodec2") + (enableFeature withCuda "cuda") + (enableFeature withCudaLLVM "cuda-llvm") + (enableFeature withCudaNVCC "cuda-nvcc") + (enableFeature withCuvid "cuvid") + (enableFeature withDav1d "libdav1d") + (enableFeature withDc1394 "libdc1394") + (enableFeature withDrm "libdrm") + ] + ++ optionals (versionAtLeast version "7") [ + (enableFeature withDvdnav "libdvdnav") + (enableFeature withDvdread "libdvdread") + ] + ++ [ + (enableFeature withFdkAac "libfdk-aac") + (enableFeature withNvcodec "ffnvcodec") + (enableFeature withFlite "libflite") + (enableFeature withFontconfig "fontconfig") + (enableFeature withFontconfig "libfontconfig") + (enableFeature withFreetype "libfreetype") + (enableFeature withFrei0r "frei0r") + (enableFeature withFribidi "libfribidi") + (enableFeature withGme "libgme") + (enableFeature withGnutls "gnutls") + (enableFeature withGsm "libgsm") + ] + ++ optionals (versionAtLeast version "6.1") [ + (enableFeature withHarfbuzz "libharfbuzz") + ] + ++ [ + (enableFeature withIconv "iconv") + (enableFeature withIlbc "libilbc") + (enableFeature withJack "libjack") + ] + ++ optionals (versionAtLeast finalAttrs.version "5.0") [ + (enableFeature withJxl "libjxl") + ] + ++ [ + (enableFeature withKvazaar "libkvazaar") + (enableFeature withLadspa "ladspa") + ] + ++ optionals (versionAtLeast version "7.1") [ + (enableFeature withLc3 "liblc3") + (enableFeature withLcevcdec "liblcevc-dec") + ] + ++ optionals (versionAtLeast version "5.1") [ + (enableFeature withLcms2 "lcms2") + ] + ++ [ + (enableFeature withLzma "lzma") + ] + ++ optionals (versionAtLeast version "5.0") [ + (enableFeature withMetal "metal") + ] + ++ [ + (enableFeature withMfx "libmfx") + (enableFeature withModplug "libmodplug") + (enableFeature withMp3lame "libmp3lame") + (enableFeature withMysofa "libmysofa") + (enableFeature withNpp "libnpp") + (enableFeature withNvdec "nvdec") + (enableFeature withNvenc "nvenc") + (enableFeature withOpenal "openal") + (enableFeature withOpencl "opencl") + (enableFeature withOpencoreAmrnb "libopencore-amrnb") + (enableFeature withOpencoreAmrwb "libopencore-amrwb") + (enableFeature withOpengl "opengl") + (enableFeature withOpenh264 "libopenh264") + (enableFeature withOpenjpeg "libopenjpeg") + (enableFeature withOpenmpt "libopenmpt") + (enableFeature withOpus "libopus") + ] + ++ optionals (versionAtLeast version "5.0") [ + (enableFeature withPlacebo "libplacebo") + ] + ++ [ + (enableFeature withPulse "libpulse") + ] + ++ optionals (versionAtLeast version "7") [ + (enableFeature withQrencode "libqrencode") + (enableFeature withQuirc "libquirc") + ] + ++ [ + (enableFeature withRav1e "librav1e") + (enableFeature withRist "librist") + (enableFeature withRtmp "librtmp") + (enableFeature withRubberband "librubberband") + (enableFeature withSamba "libsmbclient") + (enableFeature withSdl2 "sdl2") + ] + ++ optionals (versionAtLeast version "5.0") [ + (enableFeature withShaderc "libshaderc") + ] + ++ [ + (enableFeature withShine "libshine") + (enableFeature withSnappy "libsnappy") + (enableFeature withSoxr "libsoxr") + (enableFeature withSpeex "libspeex") + (enableFeature withSrt "libsrt") + (enableFeature withSsh "libssh") + (enableFeature withSvg "librsvg") + (enableFeature withSvtav1 "libsvtav1") + (enableFeature withTensorflow "libtensorflow") + (enableFeature withTheora "libtheora") + (enableFeature withTwolame "libtwolame") + (enableFeature withV4l2 "libv4l2") + (enableFeature withV4l2M2m "v4l2-m2m") + (enableFeature withVaapi "vaapi") + (enableFeature withVdpau "vdpau") + ] + ++ optionals (versionAtLeast version "6.0") [ + (enableFeature withVpl "libvpl") + ] + ++ [ + (enableFeature withVidStab "libvidstab") # Actual min. version 2.0 + (enableFeature withVmaf "libvmaf") + (enableFeature withVoAmrwbenc "libvo-amrwbenc") + (enableFeature withVorbis "libvorbis") + (enableFeature withVpx "libvpx") + (enableFeature withVulkan "vulkan") + ] + ++ optionals (versionAtLeast version "7.1") [ + (enableFeature withVvenc "libvvenc") + ] + ++ [ + (enableFeature withWebp "libwebp") + (enableFeature withX264 "libx264") + (enableFeature withX265 "libx265") + (enableFeature withXavs "libxavs") + (enableFeature withXcb "libxcb") + (enableFeature withXcbShape "libxcb-shape") + (enableFeature withXcbShm "libxcb-shm") + (enableFeature withXcbxfixes "libxcb-xfixes") + ] + ++ optionals (versionAtLeast version "7") [ + (enableFeature withXevd "libxevd") + (enableFeature withXeve "libxeve") + ] + ++ [ + (enableFeature withXlib "xlib") + (enableFeature withXml2 "libxml2") + (enableFeature withXvid "libxvid") + (enableFeature withZimg "libzimg") + (enableFeature withZlib "zlib") + (enableFeature withZmq "libzmq") + (enableFeature withZvbi "libzvbi") + # Developer flags + (enableFeature withDebug "debug") + (enableFeature withOptimisations "optimizations") + (enableFeature withExtraWarnings "extra-warnings") + (enableFeature withStripping "stripping") + ] + ++ optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ + "--cross-prefix=${stdenv.cc.targetPrefix}" + "--enable-cross-compile" + "--host-cc=${buildPackages.stdenv.cc}/bin/cc" + ] + ++ optionals stdenv.cc.isClang [ + "--cc=${stdenv.cc.targetPrefix}clang" + "--cxx=${stdenv.cc.targetPrefix}clang++" + ] + ++ optionals withMetal [ + "--metalcc=${xcode}/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/metal" + "--metallib=${xcode}/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/metallib" + ]; - # ffmpeg embeds the configureFlags verbatim in its binaries and because we - # configure binary, include, library dir etc., this causes references in - # outputs where we don't want them. Patch the generated config.h to remove all - # such references except for data. - postConfigure = let - toStrip = map placeholder (lib.remove "data" finalAttrs.outputs) # We want to keep references to the data dir. - ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) buildPackages.stdenv.cc - ++ lib.optional withMetal xcode; - in - "remove-references-to ${lib.concatStringsSep " " (map (o: "-t ${o}") toStrip)} config.h"; + # ffmpeg embeds the configureFlags verbatim in its binaries and because we + # configure binary, include, library dir etc., this causes references in + # outputs where we don't want them. Patch the generated config.h to remove all + # such references except for data. + postConfigure = + let + toStrip = + map placeholder (lib.remove "data" finalAttrs.outputs) # We want to keep references to the data dir. + ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) buildPackages.stdenv.cc + ++ lib.optional withMetal xcode; + in + "remove-references-to ${lib.concatStringsSep " " (map (o: "-t ${o}") toStrip)} config.h"; - strictDeps = true; + strictDeps = true; - nativeBuildInputs = [ removeReferencesTo addDriverRunpath perl pkg-config yasm ] - # Texinfo version 7.1 introduced breaking changes, which older versions of ffmpeg do not handle. - ++ (if versionOlder version "5" then [ texinfo6 ] else [ texinfo ]) - ++ optionals withCudaLLVM [ clang ] - ++ optionals withCudaNVCC [ cuda_nvcc ]; + nativeBuildInputs = + [ + removeReferencesTo + addDriverRunpath + perl + pkg-config + yasm + ] + # Texinfo version 7.1 introduced breaking changes, which older versions of ffmpeg do not handle. + ++ (if versionOlder version "5" then [ texinfo6 ] else [ texinfo ]) + ++ optionals withCudaLLVM [ clang ] + ++ optionals withCudaNVCC [ cuda_nvcc ]; - buildInputs = [] - ++ optionals stdenv.hostPlatform.isDarwin [ apple-sdk_15 ] - ++ optionals withAlsa [ alsa-lib ] - ++ optionals withAmf [ amf-headers ] - ++ optionals withAom [ libaom ] - ++ optionals withAribb24 [ aribb24 ] - ++ optionals withAribcaption [ libaribcaption ] - ++ optionals withAss [ libass ] - ++ optionals withAvisynth [ avisynthplus ] - ++ optionals withBluray [ libbluray ] - ++ optionals withBs2b [ libbs2b ] - ++ optionals withBzlib [ bzip2 ] - ++ optionals withCaca [ libcaca ] - ++ optionals withCdio [ libcdio libcdio-paranoia ] - ++ optionals withCelt [ celt ] - ++ optionals withChromaprint [ chromaprint ] - ++ optionals withCodec2 [ codec2 ] - ++ optionals withCudaNVCC [ cuda_cudart cuda_nvcc ] - ++ optionals withDav1d [ dav1d ] - ++ optionals withDc1394 [ libdc1394 libraw1394 ] - ++ optionals withDrm [ libdrm ] - ++ optionals withDvdnav [ libdvdnav ] - ++ optionals withDvdread [ libdvdread ] - ++ optionals withFdkAac [ fdk_aac ] - ++ optionals withNvcodec [ (if (lib.versionAtLeast version "6") then nv-codec-headers-12 else nv-codec-headers) ] - ++ optionals withFlite [ flite ] - ++ optionals withFontconfig [ fontconfig ] - ++ optionals withFreetype [ freetype ] - ++ optionals withFrei0r [ frei0r ] - ++ optionals withFribidi [ fribidi ] - ++ optionals withGme [ game-music-emu ] - ++ optionals withGnutls [ gnutls ] - ++ optionals withGsm [ gsm ] - ++ optionals withHarfbuzz [ harfbuzz ] - ++ optionals withIconv [ libiconv ] # On Linux this should be in libc, do we really need it? - ++ optionals withIlbc [ libilbc ] - ++ optionals withJack [ libjack2 ] - ++ optionals withJxl [ libjxl ] - ++ optionals withKvazaar [ kvazaar ] - ++ optionals withLadspa [ ladspaH ] - ++ optionals withLc3 [ liblc3 ] - ++ optionals withLcevcdec [ lcevcdec ] - ++ optionals withLcms2 [ lcms2 ] - ++ optionals withLzma [ xz ] - ++ optionals withMfx [ intel-media-sdk ] - ++ optionals withModplug [ libmodplug ] - ++ optionals withMp3lame [ lame ] - ++ optionals withMysofa [ libmysofa ] - ++ optionals withNpp [ libnpp cuda_cudart cuda_nvcc ] - ++ optionals withOpenal [ openal ] - ++ optionals withOpencl [ ocl-icd opencl-headers ] - ++ optionals (withOpencoreAmrnb || withOpencoreAmrwb) [ opencore-amr ] - ++ optionals withOpengl [ libGL libGLU ] - ++ optionals withOpenh264 [ openh264 ] - ++ optionals withOpenjpeg [ openjpeg ] - ++ optionals withOpenmpt [ libopenmpt ] - ++ optionals withOpus [ libopus ] - ++ optionals withPlacebo [ (if (lib.versionAtLeast version "6.1") then libplacebo else libplacebo_5) vulkan-headers ] - ++ optionals withPulse [ libpulseaudio ] - ++ optionals withQrencode [ qrencode ] - ++ optionals withQuirc [ quirc ] - ++ optionals withRav1e [ rav1e ] - ++ optionals withRist [ librist ] - ++ optionals withRtmp [ rtmpdump ] - ++ optionals withRubberband [ rubberband ] - ++ optionals withSamba [ samba ] - ++ optionals withSdl2 [ SDL2 ] - ++ optionals withShaderc [ shaderc ] - ++ optionals withShine [ shine ] - ++ optionals withSnappy [ snappy ] - ++ optionals withSoxr [ soxr ] - ++ optionals withSpeex [ speex ] - ++ optionals withSrt [ srt ] - ++ optionals withSsh [ libssh ] - ++ optionals withSvg [ librsvg ] - ++ optionals withSvtav1 [ svt-av1 ] - ++ optionals withTensorflow [ libtensorflow ] - ++ optionals withTheora [ libtheora ] - ++ optionals withTwolame [ twolame ] - ++ optionals withV4l2 [ libv4l ] - ++ optionals withVaapi [ (if withSmallDeps then libva else libva-minimal) ] - ++ optionals withVdpau [ libvdpau ] - ++ optionals withVidStab [ vid-stab ] - ++ optionals withVmaf [ libvmaf ] - ++ optionals withVoAmrwbenc [ vo-amrwbenc ] - ++ optionals withVorbis [ libvorbis ] - ++ optionals withVpl [ libvpl ] - ++ optionals withVpx [ libvpx ] - ++ optionals withVulkan [ vulkan-headers vulkan-loader ] - ++ optionals withVvenc [ vvenc ] - ++ optionals withWebp [ libwebp ] - ++ optionals withX264 [ x264 ] - ++ optionals withX265 [ x265 ] - ++ optionals withXavs [ xavs ] - ++ optionals withXcb [ libxcb ] - ++ optionals withXevd [ xevd ] - ++ optionals withXeve [ xeve ] - ++ optionals withXlib [ libX11 libXv libXext ] - ++ optionals withXml2 [ libxml2 ] - ++ optionals withXvid [ xvidcore ] - ++ optionals withZimg [ zimg ] - ++ optionals withZlib [ zlib ] - ++ optionals withZmq [ zeromq ] - ++ optionals withZvbi [ zvbi ] - ; + buildInputs = + [ ] + ++ optionals stdenv.hostPlatform.isDarwin [ apple-sdk_15 ] + ++ optionals withAlsa [ alsa-lib ] + ++ optionals withAmf [ amf-headers ] + ++ optionals withAom [ libaom ] + ++ optionals withAribb24 [ aribb24 ] + ++ optionals withAribcaption [ libaribcaption ] + ++ optionals withAss [ libass ] + ++ optionals withAvisynth [ avisynthplus ] + ++ optionals withBluray [ libbluray ] + ++ optionals withBs2b [ libbs2b ] + ++ optionals withBzlib [ bzip2 ] + ++ optionals withCaca [ libcaca ] + ++ optionals withCdio [ + libcdio + libcdio-paranoia + ] + ++ optionals withCelt [ celt ] + ++ optionals withChromaprint [ chromaprint ] + ++ optionals withCodec2 [ codec2 ] + ++ optionals withCudaNVCC [ + cuda_cudart + cuda_nvcc + ] + ++ optionals withDav1d [ dav1d ] + ++ optionals withDc1394 [ + libdc1394 + libraw1394 + ] + ++ optionals withDrm [ libdrm ] + ++ optionals withDvdnav [ libdvdnav ] + ++ optionals withDvdread [ libdvdread ] + ++ optionals withFdkAac [ fdk_aac ] + ++ optionals withNvcodec [ + (if (lib.versionAtLeast version "6") then nv-codec-headers-12 else nv-codec-headers) + ] + ++ optionals withFlite [ flite ] + ++ optionals withFontconfig [ fontconfig ] + ++ optionals withFreetype [ freetype ] + ++ optionals withFrei0r [ frei0r ] + ++ optionals withFribidi [ fribidi ] + ++ optionals withGme [ game-music-emu ] + ++ optionals withGnutls [ gnutls ] + ++ optionals withGsm [ gsm ] + ++ optionals withHarfbuzz [ harfbuzz ] + ++ optionals withIconv [ libiconv ] # On Linux this should be in libc, do we really need it? + ++ optionals withIlbc [ libilbc ] + ++ optionals withJack [ libjack2 ] + ++ optionals withJxl [ libjxl ] + ++ optionals withKvazaar [ kvazaar ] + ++ optionals withLadspa [ ladspaH ] + ++ optionals withLc3 [ liblc3 ] + ++ optionals withLcevcdec [ lcevcdec ] + ++ optionals withLcms2 [ lcms2 ] + ++ optionals withLzma [ xz ] + ++ optionals withMfx [ intel-media-sdk ] + ++ optionals withModplug [ libmodplug ] + ++ optionals withMp3lame [ lame ] + ++ optionals withMysofa [ libmysofa ] + ++ optionals withNpp [ + libnpp + cuda_cudart + cuda_nvcc + ] + ++ optionals withOpenal [ openal ] + ++ optionals withOpencl [ + ocl-icd + opencl-headers + ] + ++ optionals (withOpencoreAmrnb || withOpencoreAmrwb) [ opencore-amr ] + ++ optionals withOpengl [ + libGL + libGLU + ] + ++ optionals withOpenh264 [ openh264 ] + ++ optionals withOpenjpeg [ openjpeg ] + ++ optionals withOpenmpt [ libopenmpt ] + ++ optionals withOpus [ libopus ] + ++ optionals withPlacebo [ + (if (lib.versionAtLeast version "6.1") then libplacebo else libplacebo_5) + vulkan-headers + ] + ++ optionals withPulse [ libpulseaudio ] + ++ optionals withQrencode [ qrencode ] + ++ optionals withQuirc [ quirc ] + ++ optionals withRav1e [ rav1e ] + ++ optionals withRist [ librist ] + ++ optionals withRtmp [ rtmpdump ] + ++ optionals withRubberband [ rubberband ] + ++ optionals withSamba [ samba ] + ++ optionals withSdl2 [ SDL2 ] + ++ optionals withShaderc [ shaderc ] + ++ optionals withShine [ shine ] + ++ optionals withSnappy [ snappy ] + ++ optionals withSoxr [ soxr ] + ++ optionals withSpeex [ speex ] + ++ optionals withSrt [ srt ] + ++ optionals withSsh [ libssh ] + ++ optionals withSvg [ librsvg ] + ++ optionals withSvtav1 [ svt-av1 ] + ++ optionals withTensorflow [ libtensorflow ] + ++ optionals withTheora [ libtheora ] + ++ optionals withTwolame [ twolame ] + ++ optionals withV4l2 [ libv4l ] + ++ optionals withVaapi [ (if withSmallDeps then libva else libva-minimal) ] + ++ optionals withVdpau [ libvdpau ] + ++ optionals withVidStab [ vid-stab ] + ++ optionals withVmaf [ libvmaf ] + ++ optionals withVoAmrwbenc [ vo-amrwbenc ] + ++ optionals withVorbis [ libvorbis ] + ++ optionals withVpl [ libvpl ] + ++ optionals withVpx [ libvpx ] + ++ optionals withVulkan [ + vulkan-headers + vulkan-loader + ] + ++ optionals withVvenc [ vvenc ] + ++ optionals withWebp [ libwebp ] + ++ optionals withX264 [ x264 ] + ++ optionals withX265 [ x265 ] + ++ optionals withXavs [ xavs ] + ++ optionals withXcb [ libxcb ] + ++ optionals withXevd [ xevd ] + ++ optionals withXeve [ xeve ] + ++ optionals withXlib [ + libX11 + libXv + libXext + ] + ++ optionals withXml2 [ libxml2 ] + ++ optionals withXvid [ xvidcore ] + ++ optionals withZimg [ zimg ] + ++ optionals withZlib [ zlib ] + ++ optionals withZmq [ zeromq ] + ++ optionals withZvbi [ zvbi ]; - buildFlags = [ "all" ] - ++ optional buildQtFaststart "tools/qt-faststart"; # Build qt-faststart executable + buildFlags = [ "all" ] ++ optional buildQtFaststart "tools/qt-faststart"; # Build qt-faststart executable - env = lib.optionalAttrs stdenv.cc.isGNU { - NIX_CFLAGS_COMPILE = toString [ - "-Wno-error=incompatible-pointer-types" - "-Wno-error=int-conversion" - ]; - }; + env = lib.optionalAttrs stdenv.cc.isGNU { + NIX_CFLAGS_COMPILE = toString [ + "-Wno-error=incompatible-pointer-types" + "-Wno-error=int-conversion" + ]; + }; - doCheck = stdenv.buildPlatform.canExecute stdenv.hostPlatform; + doCheck = stdenv.buildPlatform.canExecute stdenv.hostPlatform; - # Fails with SIGABRT otherwise FIXME: Why? - checkPhase = let - ldLibraryPathEnv = if stdenv.hostPlatform.isDarwin then "DYLD_LIBRARY_PATH" else "LD_LIBRARY_PATH"; - libsToLink = [ ] - ++ optional buildAvcodec "libavcodec" - ++ optional buildAvdevice "libavdevice" - ++ optional buildAvfilter "libavfilter" - ++ optional buildAvformat "libavformat" - ++ optional buildAvresample "libavresample" - ++ optional buildAvutil "libavutil" - ++ optional buildPostproc "libpostproc" - ++ optional buildSwresample "libswresample" - ++ optional buildSwscale "libswscale" + # Fails with SIGABRT otherwise FIXME: Why? + checkPhase = + let + ldLibraryPathEnv = if stdenv.hostPlatform.isDarwin then "DYLD_LIBRARY_PATH" else "LD_LIBRARY_PATH"; + libsToLink = + [ ] + ++ optional buildAvcodec "libavcodec" + ++ optional buildAvdevice "libavdevice" + ++ optional buildAvfilter "libavfilter" + ++ optional buildAvformat "libavformat" + ++ optional buildAvresample "libavresample" + ++ optional buildAvutil "libavutil" + ++ optional buildPostproc "libpostproc" + ++ optional buildSwresample "libswresample" + ++ optional buildSwscale "libswscale"; + in + '' + ${ldLibraryPathEnv}="${lib.concatStringsSep ":" libsToLink}" make check -j$NIX_BUILD_CORES + ''; + + outputs = + optionals withBin [ "bin" ] # The first output is the one that gets symlinked by default! + ++ optionals withLib [ + "lib" + "dev" + ] + ++ optionals withDoc [ "doc" ] + ++ optionals withManPages [ "man" ] + ++ [ + "data" + "out" + ] # We need an "out" output because we get an error otherwise. It's just an empty dir. ; - in '' - ${ldLibraryPathEnv}="${lib.concatStringsSep ":" libsToLink}" make check -j$NIX_BUILD_CORES - ''; - outputs = optionals withBin [ "bin" ] # The first output is the one that gets symlinked by default! - ++ optionals withLib [ "lib" "dev" ] - ++ optionals withDoc [ "doc" ] - ++ optionals withManPages [ "man" ] - ++ [ "data" "out" ] # We need an "out" output because we get an error otherwise. It's just an empty dir. - ; - - postInstall = optionalString buildQtFaststart '' - install -D tools/qt-faststart -t $bin/bin - ''; - - # Set RUNPATH so that libnvcuvid and libcuda in /run/opengl-driver(-32)/lib can be found. - # See the explanation in addDriverRunpath. - postFixup = optionalString (stdenv.hostPlatform.isLinux && withLib) '' - addDriverRunpath ${placeholder "lib"}/lib/libavcodec.so - addDriverRunpath ${placeholder "lib"}/lib/libavutil.so - '' - # https://trac.ffmpeg.org/ticket/10809 - + optionalString (versionAtLeast version "5.0" && withVulkan && !stdenv.hostPlatform.isMinGW) '' - patchelf $lib/lib/libavcodec.so --add-needed libvulkan.so --add-rpath ${lib.makeLibraryPath [ vulkan-loader ]} - ''; - - enableParallelBuilding = true; - - passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; - - meta = with lib; { - description = "Complete, cross-platform solution to record, convert and stream audio and video"; - homepage = "https://www.ffmpeg.org/"; - changelog = "https://github.com/FFmpeg/FFmpeg/blob/n${version}/Changelog"; - 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. + postInstall = optionalString buildQtFaststart '' + install -D tools/qt-faststart -t $bin/bin ''; - license = with licenses; [ lgpl21Plus ] - ++ optional withGPL gpl2Plus - ++ optional withVersion3 lgpl3Plus - ++ optional withGPLv3 gpl3Plus - ++ optional withUnfree unfreeRedistributable - ++ optional (withGPL && withUnfree) unfree; - pkgConfigModules = [ ] - ++ optional buildAvcodec "libavcodec" - ++ optional buildAvdevice "libavdevice" - ++ optional buildAvfilter "libavfilter" - ++ optional buildAvformat "libavformat" - ++ optional buildAvresample "libavresample" - ++ optional buildAvutil "libavutil" - ++ optional buildPostproc "libpostproc" - ++ optional buildSwresample "libswresample" - ++ optional buildSwscale "libswscale"; - platforms = platforms.all; - # See https://github.com/NixOS/nixpkgs/pull/295344#issuecomment-1992263658 - broken = stdenv.hostPlatform.isMinGW && stdenv.hostPlatform.is64bit; - maintainers = with maintainers; [ atemu jopejoe1 emily ]; - mainProgram = "ffmpeg"; - }; -} // lib.optionalAttrs withCudaLLVM { - # remove once https://github.com/NixOS/nixpkgs/issues/318674 is addressed properly - hardeningDisable = [ "zerocallusedregs" ]; -}) + + # Set RUNPATH so that libnvcuvid and libcuda in /run/opengl-driver(-32)/lib can be found. + # See the explanation in addDriverRunpath. + postFixup = + optionalString (stdenv.hostPlatform.isLinux && withLib) '' + addDriverRunpath ${placeholder "lib"}/lib/libavcodec.so + addDriverRunpath ${placeholder "lib"}/lib/libavutil.so + '' + # https://trac.ffmpeg.org/ticket/10809 + + optionalString (versionAtLeast version "5.0" && withVulkan && !stdenv.hostPlatform.isMinGW) '' + patchelf $lib/lib/libavcodec.so --add-needed libvulkan.so --add-rpath ${ + lib.makeLibraryPath [ vulkan-loader ] + } + ''; + + enableParallelBuilding = true; + + passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + + meta = with lib; { + description = "Complete, cross-platform solution to record, convert and stream audio and video"; + homepage = "https://www.ffmpeg.org/"; + changelog = "https://github.com/FFmpeg/FFmpeg/blob/n${version}/Changelog"; + 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 = + with licenses; + [ lgpl21Plus ] + ++ optional withGPL gpl2Plus + ++ optional withVersion3 lgpl3Plus + ++ optional withGPLv3 gpl3Plus + ++ optional withUnfree unfreeRedistributable + ++ optional (withGPL && withUnfree) unfree; + pkgConfigModules = + [ ] + ++ optional buildAvcodec "libavcodec" + ++ optional buildAvdevice "libavdevice" + ++ optional buildAvfilter "libavfilter" + ++ optional buildAvformat "libavformat" + ++ optional buildAvresample "libavresample" + ++ optional buildAvutil "libavutil" + ++ optional buildPostproc "libpostproc" + ++ optional buildSwresample "libswresample" + ++ optional buildSwscale "libswscale"; + platforms = platforms.all; + # See https://github.com/NixOS/nixpkgs/pull/295344#issuecomment-1992263658 + broken = stdenv.hostPlatform.isMinGW && stdenv.hostPlatform.is64bit; + maintainers = with maintainers; [ + atemu + jopejoe1 + emily + ]; + mainProgram = "ffmpeg"; + }; + } + // lib.optionalAttrs withCudaLLVM { + # remove once https://github.com/NixOS/nixpkgs/issues/318674 is addressed properly + hardeningDisable = [ "zerocallusedregs" ]; + } +)