2025-07-24 14:27:50 +02:00

438 lines
12 KiB
Nix

{
lib,
stdenv,
fetchurl,
fetchpatch,
replaceVars,
meson,
ninja,
gettext,
pkg-config,
python3,
gst-plugins-base,
orc,
gstreamer,
gobject-introspection,
wayland-scanner,
enableZbar ? false,
faacSupport ? false,
faac,
opencvSupport ? false,
opencv4,
faad2,
# Enabling lcevcdecoder currently causes issues when attempting to decode regular h264 data
# warning: No decoder available for type 'video/x-h264, stream-format=(string)avc, [...], lcevc=(boolean)false, [...]
lcevcdecSupport ? false,
lcevcdec,
ldacbtSupport ? lib.meta.availableOn stdenv.hostPlatform ldacbt,
ldacbt,
liblc3,
libass,
lrdf,
ladspaH,
lcms2,
libnice,
webrtcAudioProcessingSupport ? lib.meta.availableOn stdenv.hostPlatform webrtc-audio-processing_1,
webrtc-audio-processing_1,
lilv,
lv2,
serd,
sord,
sratom,
libbs2b,
libmodplug,
libmpeg2,
libmicrodns,
openjpeg,
libopus,
librsvg,
bluez,
chromaprint,
curl,
fdk_aac,
flite,
gsm,
json-glib,
ajaSupport ? lib.meta.availableOn stdenv.hostPlatform libajantv2,
libajantv2,
libaom,
libdc1394,
libde265,
libdrm,
libdvdnav,
libdvdread,
libgudev,
qrencode,
libsndfile,
libusb1,
neon,
openal,
openexr,
openh264Support ? lib.meta.availableOn stdenv.hostPlatform openh264,
openh264,
libopenmpt,
pango,
rtmpdump,
sbc,
soundtouch,
spandsp,
srtp,
zbar,
wayland-protocols,
wildmidi,
svt-av1,
fluidsynth,
libva,
wayland,
libwebp,
gnutls,
mjpegtools,
libGL,
addDriverRunpath,
gtk3,
libintl,
game-music-emu,
openssl,
x265,
libxml2,
srt,
vo-aacenc,
libfreeaptx,
zxing-cpp,
usrsctp,
directoryListingUpdater,
enableGplPlugins ? true,
bluezSupport ? stdenv.hostPlatform.isLinux,
# Causes every application using GstDeviceMonitor to send mDNS queries every 2 seconds
microdnsSupport ? false,
# Checks meson.is_cross_build(), so even canExecute isn't enough.
enableDocumentation ? stdenv.hostPlatform == stdenv.buildPlatform,
hotdoc,
guiSupport ? true,
gst-plugins-bad,
apple-sdk_gstreamer,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "gst-plugins-bad";
version = "1.26.0";
outputs = [
"out"
"dev"
];
src = fetchurl {
url = "https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-${finalAttrs.version}.tar.xz";
hash = "sha256-+Ch6hMX2Y2ilpQ2l+WmZSgLEfyAiD/4coxVBk+Za8hY=";
};
patches = [
# Add fallback paths for nvidia userspace libraries
(replaceVars ./fix-paths.patch {
inherit (addDriverRunpath) driverLink;
})
# Fix Requires in gstreamer-analytics-1.0.pc
# https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8661
(fetchpatch {
url = "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/commit/bc93bbf5c87ec994ea136bb40accc09dfa35ae98.patch";
stripLen = 2;
hash = "sha256-QQDpHe363iPxTuthITRbLUKaAXS2F9s5zfCn/ps14WE=";
})
];
nativeBuildInputs = [
meson
ninja
pkg-config
orc # for orcc
python3
gettext
gstreamer # for gst-tester-1.0
gobject-introspection
]
++ lib.optionals enableDocumentation [
hotdoc
]
++ lib.optionals (gst-plugins-base.waylandEnabled && stdenv.hostPlatform.isLinux) [
wayland-scanner
];
buildInputs = [
gst-plugins-base
orc
json-glib
lcms2
liblc3
libass
libbs2b
libmodplug
openjpeg
libopenmpt
libopus
librsvg
curl.dev
fdk_aac
gsm
libaom
libdc1394
libde265
libdvdnav
libdvdread
libnice
qrencode
libsndfile
libusb1
neon
openal
openexr
rtmpdump
pango
soundtouch
srtp
fluidsynth
libwebp
gnutls
game-music-emu
openssl
libxml2
libintl
srt
vo-aacenc
libfreeaptx
zxing-cpp
usrsctp
wildmidi
svt-av1
]
++ lib.optionals opencvSupport [
opencv4
]
++ lib.optionals enableZbar [
zbar
]
++ lib.optionals faacSupport [
faac
]
++ lib.optionals enableGplPlugins [
libmpeg2
mjpegtools
faad2
x265
]
++ lib.optionals bluezSupport [
bluez
]
++ lib.optionals microdnsSupport [
libmicrodns
]
++ lib.optionals openh264Support [
openh264
]
++ lib.optionals ajaSupport [
libajantv2
]
++ lib.optionals (gst-plugins-base.waylandEnabled && stdenv.hostPlatform.isLinux) [
libva # vaapi requires libva -> libdrm -> libpciaccess, which is Linux-only in nixpkgs
wayland
wayland-protocols
]
++ lib.optionals (!stdenv.hostPlatform.isDarwin) [
# TODO: mjpegtools uint64_t is not compatible with guint64 on Darwin
mjpegtools
chromaprint
flite
libdrm
libgudev
sbc
spandsp
# ladspa plug-in
ladspaH
lrdf # TODO: make build on Darwin
# lv2 plug-in
lilv
lv2
serd
sord
sratom
libGL
]
++ lib.optionals guiSupport [
gtk3
]
++ lib.optionals lcevcdecSupport [
lcevcdec
]
++ lib.optionals ldacbtSupport [
ldacbt
]
++ lib.optionals webrtcAudioProcessingSupport [
webrtc-audio-processing_1
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
apple-sdk_gstreamer
];
mesonFlags = [
"-Dexamples=disabled" # requires many dependencies and probably not useful for our users
"-Dglib_debug=disabled" # cast checks should be disabled on stable releases
"-Damfcodec=disabled" # Windows-only
"-Dandroidmedia=disabled" # Requires Android system.
"-Davtp=disabled"
"-Dcuda-nvmm=disabled"
"-Ddirectshow=disabled" # Windows-only
"-Dqt6d3d11=disabled" # Windows-only
"-Ddts=disabled" # required `libdca` library not packaged in nixpkgs as of writing, and marked as "BIG FAT WARNING: libdca is still in early development"
"-Dzbar=${if enableZbar then "enabled" else "disabled"}"
"-Dfaac=${if faacSupport then "enabled" else "disabled"}"
"-Diqa=disabled" # required `dssim` library not packaging in nixpkgs as of writing, also this is AGPL so update license when adding support
"-Dlcevcencoder=disabled" # not packaged in nixpkgs as of writing
"-Dmagicleap=disabled" # required `ml_audio` library not packaged in nixpkgs as of writing
"-Dmsdk=disabled" # not packaged in nixpkgs as of writing / no Windows support
# As of writing, with `libmpcdec` in `buildInputs` we get
# "Could not find libmpcdec header files, but Musepack was enabled via options"
# This is likely because nixpkgs has the header in libmpc/mpcdec.h
# instead of mpc/mpcdec.h, like Arch does. The situation is not trivial.
# There are apparently 2 things called `libmpcdec` from the same author:
# * http://svn.musepack.net/libmpcdec/trunk/src/
# * http://svn.musepack.net/libmpc/trunk/include/mpc/
# Fixing it likely requires to first figure out with upstream which one
# is needed, and then patching upstream to find it (though it probably
# already works on Arch?).
"-Dmusepack=disabled"
"-Dnvcomp=disabled"
"-Dnvdswrapper=disabled"
"-Dopenni2=disabled" # not packaged in nixpkgs as of writing
"-Dopensles=disabled" # not packaged in nixpkgs as of writing
"-Dsvthevcenc=disabled" # required `SvtHevcEnc` library not packaged in nixpkgs as of writing
"-Dsvtjpegxs=disabled" # not packaged in nixpkgs as of writing
"-Dteletext=disabled" # required `zvbi` library not packaged in nixpkgs as of writing
"-Dtinyalsa=disabled" # not packaged in nixpkgs as of writing
"-Dvoamrwbenc=disabled" # required `vo-amrwbenc` library not packaged in nixpkgs as of writing
"-Dvulkan=disabled" # Linux-only, and we haven't figured out yet which of the vulkan nixpkgs it needs
"-Dwasapi=disabled" # not packaged in nixpkgs as of writing / no Windows support
"-Dwasapi2=disabled" # not packaged in nixpkgs as of writing / no Windows support
"-Dwpe=disabled" # required `wpe-webkit` library not packaged in nixpkgs as of writing
"-Dgs=disabled" # depends on `google-cloud-cpp`
"-Donnx=disabled" # depends on `libonnxruntime` not packaged in nixpkgs as of writing
"-Dopenaptx=enabled" # since gstreamer-1.20.1 `libfreeaptx` is supported for circumventing the dubious license conflict with `libopenaptx`
"-Dopencv=${if opencvSupport then "enabled" else "disabled"}" # Reduces rebuild size when `config.cudaSupport = true`
"-Daja=${if ajaSupport then "enabled" else "disabled"}"
"-Dmicrodns=${if microdnsSupport then "enabled" else "disabled"}"
"-Dbluez=${if bluezSupport then "enabled" else "disabled"}"
(lib.mesonEnable "openh264" openh264Support)
(lib.mesonEnable "doc" enableDocumentation)
(lib.mesonEnable "directfb" false)
(lib.mesonEnable "lcevcdecoder" lcevcdecSupport)
]
++ lib.optionals (!stdenv.hostPlatform.isLinux) [
"-Ddoc=disabled" # needs gstcuda to be enabled which is Linux-only
]
++ lib.optionals (!stdenv.hostPlatform.isLinux || !stdenv.hostPlatform.isx86) [
"-Dnvcodec=disabled" # Linux-only, broken on non-x86
]
++ lib.optionals (!stdenv.hostPlatform.isLinux || !gst-plugins-base.waylandEnabled) [
"-Dva=disabled" # see comment on `libva` in `buildInputs`
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
"-Daja=disabled"
"-Dchromaprint=disabled"
"-Dflite=disabled"
"-Dkms=disabled" # renders to libdrm output
"-Dlv2=disabled"
"-Dsbc=disabled"
"-Dspandsp=disabled"
"-Ddvb=disabled"
"-Dfbdev=disabled"
"-Duvcgadget=disabled" # requires gudev
"-Duvch264=disabled" # requires gudev
"-Dv4l2codecs=disabled" # requires gudev
"-Dladspa=disabled" # requires lrdf
]
++
lib.optionals
(!stdenv.hostPlatform.isLinux || !stdenv.hostPlatform.isx86_64 || !gst-plugins-base.waylandEnabled)
[
"-Dqsv=disabled" # Linux (and Windows) x86 only, makes va required
]
++ lib.optionals (!gst-plugins-base.glEnabled) [
"-Dgl=disabled"
]
++ lib.optionals (!gst-plugins-base.waylandEnabled || !guiSupport) [
"-Dgtk3=disabled" # Wayland-based GTK sink
"-Dwayland=disabled"
]
++ lib.optionals (!gst-plugins-base.glEnabled) [
# `applemedia/videotexturecache.h` requires `gst/gl/gl.h`,
# but its meson build system does not declare the dependency.
"-Dapplemedia=disabled"
]
++ (
if enableGplPlugins then
[
"-Dgpl=enabled"
]
else
[
"-Ddts=disabled"
"-Dfaad=disabled"
"-Diqa=disabled"
"-Dmpeg2enc=disabled"
"-Dmplex=disabled"
"-Dresindvd=disabled"
"-Dx265=disabled"
]
);
# Argument list too long
strictDeps = true;
postPatch = ''
patchShebangs \
scripts/extract-release-date-from-doap-file.py
'';
# This package has some `_("string literal")` string formats
# that trip up clang with format security enabled.
hardeningDisable = [ "format" ];
doCheck = false; # fails 20 out of 58 tests, expensive
passthru = {
tests = {
full = gst-plugins-bad.override {
enableZbar = true;
faacSupport = true;
opencvSupport = true;
};
lgplOnly = gst-plugins-bad.override {
enableGplPlugins = false;
};
};
updateScript = directoryListingUpdater { };
};
meta = with lib; {
description = "GStreamer Bad Plugins";
mainProgram = "gst-transcoder-1.0";
homepage = "https://gstreamer.freedesktop.org";
longDescription = ''
a set of plug-ins that aren't up to par compared to the
rest. They might be close to being good quality, but they're missing
something - be it a good code review, some documentation, a set of tests,
a real live maintainer, or some actual wide use.
'';
license = if enableGplPlugins then licenses.gpl2Plus else licenses.lgpl2Plus;
platforms = platforms.linux ++ platforms.darwin;
maintainers = with maintainers; [ matthewbauer ];
};
})