pkgname=ffmpeg pkgver=7.1.3 _ver=${pkgver%.*} pkgdesc='Complete solution to record, convert and stream audio and video' arch=(x86_64) homepage=https://ffmpeg.org license=(GPL-3.0-only) depends=( bzip2 dav1d fontconfig freetype glibc harfbuzz libass libdrm libgl libpulse libraw1394 libva libwebp libxml2 opus x264 x265 xz zlib ) makedepends=( mesa nasm vulkan-headers ) sources=("${pkgname}-${pkgver}.tar.xz" "${pkgname}-${_ver}-patchset-2.tar.xz" #from gentoo ) urls=("https://ffmpeg.org/releases/ffmpeg-${pkgver}.tar.xz" "https://dev.gentoo.org/~ionen/distfiles/${sources[1]}" ) sha512sums=("1231cb6fe8305e040565d9c2a05228af6e90ded88b8548b24b1e7c46964ea25e43db44eb2b677837c0d68bc4e2a10ea5db101c2d2a24d2e3132cd20d599b0da0" "bde2e07e2284f9c59bfc3dd448d46f34e14e3983d01baac6b89efac1093dd804318c4770cebe16d84830b34325dcd0aa88cf56136b3529bd36651bb32d73632b" ) USE="bzip2 dav1d drm fontconfig gpl libass openssl opus postproc pulseaudio truetype vaapi vulkan webp x264 x265 xml zlib" FFMPEG_IUSE_MAP=( # [+]flag[:[^][!]opt1,...][@]], ^ = native-only, ! = override # remember to keep LICENSE, REQUIRED_USE, and RESTRICT in sync X:libxcb,libxcb-shape,libxcb-shm,libxcb-xfixes,xlib alsa amf amrenc:libvo-amrwbenc@v3 amr:libopencore-amrnb,libopencore-amrwb@v3 appkit bluray:libbluray bs2b:libbs2b bzip2:bzlib cdio:libcdio chromaprint codec2:libcodec2 cuda:cuda-llvm +dav1d:libdav1d ${FFMPEG_UNSLOTTED:+doc:^htmlpages} +drm:libdrm dvd:libdvdnav,libdvdread fdk:libfdk-aac@nonfree flite:libflite +fontconfig:libfontconfig frei0r fribidi:libfribidi gcrypt gme:libgme gmp:@v3 +gnutls # unused if USE=openssl, default for bug #905113,#917627 +gpl gsm:libgsm iec61883:libiec61883 ieee1394:libdc1394 jack:libjack jpeg2k:libopenjpeg jpegxl:libjxl kvazaar:libkvazaar ladspa lame:libmp3lame lcms:lcms2 libaom libaribb24:@v3 # reminder: req use on gpl unneeded if >=1.0.4 (not in tree) +libass libcaca libilbc liblc3 libplacebo librtmp:librtmp libsoxr lv2 lzma modplug:libmodplug nvenc:cuvid,ffnvcodec,nvdec,nvenc ocr:libtesseract openal opencl opengl openh264:libopenh264 openmpt:libopenmpt openssl:openssl,!gnutls@v3ifgpl # still LGPL2.1+ if USE=-gpl opus:libopus +postproc # exposed as a USE for clarity with the GPL requirement pulseaudio:libpulse qrcode:libqrencode qsv:libvpl quirc:libquirc rabbitmq:^librabbitmq # no multilib rav1e:^librav1e # no multilib rubberband:librubberband samba:libsmbclient@v3 # GPL-3+ only sdl:sdl2 shaderc:libshaderc snappy:libsnappy sndio speex:libspeex srt:libsrt ssh:libssh svg:librsvg svt-av1:libsvtav1 theora:libtheora +truetype:libfreetype,libharfbuzz twolame:libtwolame v4l:libv4l2 vaapi vdpau vidstab:libvidstab vorbis:libvorbis vpx:libvpx vulkan webp:libwebp x264:libx264 x265:libx265 +xml:libxml2 xvid:libxvid zeromq:^libzmq # no multilib zimg:libzimg +zlib zvbi:libzvbi ) use() { local f=" $1 " [[ " ${USE} " == *"${f}"* ]] } use_enable() { local flag="$1" opt="${2:-$1}" if use "${flag}"; then printf -- '--enable-%s' "${opt}" else printf -- '--disable-%s' "${opt}" fi } multilib_native_use_enable() { local flag="$1" opt="${2:-$1}" use_enable "${flag}" "${opt}" } src_prepare() { tar -xf ${distdir}/${sources[0]} --strip-components=1 tar -xf ${distdir}/${sources[1]} for _patch in patches/*; do patch -p1 -i ${_patch} done } ffmpeg_build_optmap() { local -n _map_ref="$1" # nameref: FFMPEG_IUSE_MAP local -n _out_ref="$2" # nameref: 输出数组 conf_opts local v flag_raw flag license opt mod local -A optmap=() licensemap=() for v in "${_map_ref[@]}"; do # ebuild: [[ ${v} =~ \+?([^:]+):?([^@]*)@?(.*) ]] # 例: # "+drm:libdrm" # "openssl:openssl,!gnutls@v3ifgpl" # "fdk:libfdk-aac@nonfree" if [[ ! "${v}" =~ ^\+?([^:]+):?([^@]*)@?(.*)$ ]]; then echo "bad map entry: ${v}" >&2 return 1 fi flag_raw="${BASH_REMATCH[1]}" # 不含前导 + flag="${flag_raw}" opt="${BASH_REMATCH[2]}" license="${BASH_REMATCH[3]}" # 省略 opt 列表则默认等于 flag [[ -n "${opt}" ]] || opt="${flag}" # 逗号分隔的 opt 列表 local optlist="${opt//,/ }" for opt in ${optlist}; do mod="${opt:0:1}" # ebuild: v=${v#[\!\^]} opt="${opt#!}" opt="${opt#^}" if [[ "${mod}" == "!" ]]; then # override: 若 flag enabled,则强制 disable 该 opt if use "${flag}"; then optmap["${opt}"]="--disable-${opt}" unset 'licensemap["'"${opt}"'"]' || true fi else # 若该 opt 尚未被写入,才生成(避免重复/被前面覆盖) if [[ -z "${optmap["${opt}"]+x}" ]]; then if [[ "${mod}" == "^" ]]; then optmap["${opt}"]="$(multilib_native_use_enable "${flag}" "${opt}")" else optmap["${opt}"]="$(use_enable "${flag}" "${opt}")" fi if use "${flag}"; then licensemap["${opt}"]="${license}" fi fi fi done done # 处理 license 聚合开关(ebuild:for license in "${licensemap[@]}") local lic for lic in "${licensemap[@]}"; do case "${lic}" in v3ifgpl) use gpl || continue ;& # fallthrough(bash >=4) v3) optmap["v3"]="--enable-version3" ;; nonfree) use gpl && optmap["nonfree"]="--enable-nonfree" ;; esac done # 输出:把 optmap 的值都塞进 _out_ref(顺序不保证;需要稳定顺序可再排序) local k for k in "${!optmap[@]}"; do _out_ref+=( "${optmap[$k]}" ) done } src_build() { sed -i '/cflags -fdiagnostics-color/d' configure local prefix="/usr" local conf_args=( --prefix="${prefix}" --libdir="${prefix}"/lib --shlibdir="${prefix}"/lib --mandir="${prefix}"/share/man --docdir=/usr/share/doc/${pkgname}-${pkgver}/html --disable-stripping --disable-debug --disable-optimizations --optflags=' ' # basic defaults that should not really need a USE --enable-iconv --enable-pic --enable-shared --disable-static --enable-manpages --disable-podpages --disable-txtpages # disabled primarily due to being unpackaged --disable-decklink --disable-libaribcaption --disable-libdavs2 --disable-libklvanc --disable-liblcevc-dec --disable-libmysofa --disable-libopenvino --disable-libshine --disable-libtls --disable-libuavs3d --disable-libvvenc --disable-libxavs --disable-libxavs2 --disable-libxevd --disable-libxeve --disable-pocketsphinx --disable-rkmpp --disable-vapoursynth # disabled for other or additional reasons --disable-cuda-nvcc # prefer cuda-llvm for less issues --disable-libcelt # obsolete (bug #664158) --disable-libglslang # prefer USE=shaderc (bug #918989,#920283,#922333) --disable-liblensfun # https://trac.ffmpeg.org/ticket/9112 (abandoned?) --disable-libmfx # prefer libvpl for USE=qsv --disable-libnpp # deprecated and not supported for cuda 13.0+ --disable-libopencv # leaving for later due to circular opencv[ffmpeg] --disable-librist # librist itself needs attention first (bug #822012) --disable-libtensorflow # causes headaches, and is gone --disable-libtorch # support may need special attention (bug #936127) --disable-libvmaf # use ffmpeg-8+ instead, needs old vmaf (bug#968554) --disable-mbedtls # messy with slots, tests underlinking issues --disable-mmal # prefer USE=soc --disable-omx # unsupported (bug #653386) --disable-omx-rpi # ^ ) ffmpeg_build_optmap FFMPEG_IUSE_MAP conf_args leaf_info "${conf_args[*]}" ./configure "${conf_args[@]}" make V=1 } src_check() { local -x LD_LIBRARY_PATH=$(printf %s: "${srcdir}"/lib*)${LD_LIBRARY_PATH} make V=1 -k fate } src_install() { make DESTDIR="${pkgdir}" install } # vim:ft=sh syn=sh et sw=2: