File PKGBUILD of Package media-ffmpeg-god-git
# Maintainer: neycrol <330578697@qq.com>
# Based on Arch Linux ffmpeg PKGBUILD
pkgname=ffmpeg-god-git
pkgver=8.1.dev.r1654.gecd2919174
pkgrel=6
epoch=2
pkgdesc='Complete solution to record, convert and stream audio and video (God Mode build)'
arch=(x86_64)
url=https://ffmpeg.org
license=(GPL-3.0-only)
depends=( alsa-lib
aom
bzip2
cairo
dav1d
fontconfig
freetype2
fribidi
glib2
glibc
glslang
spirv-tools
gmp
gnutls
gsm
harfbuzz
jack
lame
libass
libavc1394
libbluray
libbs2b
libdrm
libdvdnav
libdvdread
libgl
libiec61883
libjxl
libmodplug
libopenmpt
libplacebo
libpulse
libraw1394
librsvg
libsoxr
libssh
libtheora
libva
libvdpau
libvorbis
libvpx
libwebp
libx11
libxcb
libxext
libxml2
libxv
ocl-icd
onevpl
opencore-amr
openjpeg2
opus
rav1e
rubberband
sdl2
snappy
speex
srt
svt-av1
v4l-utils
vapoursynth
vid.stab
vmaf
vulkan-icd-loader
x264
x265
xvidcore
xz
zeromq
zimg
zlib
)
makedepends=( amf-headers
avisynthplus
clang
ffnvcodec-headers
frei0r-plugins
git
ladspa
mesa
nasm
opencl-headers
vulkan-headers
gcc-git-god
llvm-god-mlgo
)
optdepends=( 'avisynthplus: AviSynthPlus support'
'frei0r-plugins: Frei0r video effects support'
'intel-media-sdk: Intel QuickSync support (legacy)'
'ladspa: LADSPA filters'
'nvidia-utils: Nvidia NVDEC/NVENC support'
'onevpl-intel-gpu: Intel QuickSync support'
)
provides=( ffmpeg
ffmpeg-git
libavcodec.so
libavdevice.so
libavfilter.so
libavformat.so
libavutil.so
libswresample.so
libswscale.so
)
conflicts=(ffmpeg ffmpeg-git ffmpeg-full ffmpeg-full-git)
source=( "ffmpeg.tar.gz"
"0001-Add-av_stream_get_first_dts-for-Chromium.patch"
"0002-x86inc-extern-hidden.patch"
"0003-keep-asm-tables-lto.patch"
"0004-keep-fspp-dither-lto.patch"
"0005-fix-gcc15-sys-select.patch"
"0006-libsvtav1-svt4-aq-compat.patch"
"workload.sh"
)
b2sums=( 'SKIP'
'e5f7b79f7731be9ee5a7280a9221fb531ac5a2d9820fc5870b68b0eabea667dfbe8f39f41c1e1763a4c84982896afaa54c81ff57847d203b70afafd726689e5d'
'ca45a262d8dbeeb59b5bf7efffa7f2385b2cff0f815df67711d88f687ce8d4f3159312ec39b8b35c9af7dc0261c8a8e125cea26ea3735fdd22e7d3d2a16d162c'
'b7de5e40af43eb66bf7b4f239fc49d89e688e8b80679067ed287f4b04138e48dfecf49f2048b0e61e1276aa8503d9e1c3ac29a6f76dc5221e0fce82c267aabea'
'7d3c5332ee3f40bf00f8f55adcf15bea2724482ac2ca41fdc72f32332bc465e379a43a7f7fab5223a79117463f86d2e95f30324e0ed2d3da9aa5913327a20c04'
'aaafe5e92a239bb27a4f2f0244f6b53b103b66e2ddb37722e4bd89dc8f44d4f1666335d1e8ec52f48e9841edfc56f7eb8a23722cebd87a613b03c5178aad9a1e'
'37f75d89c1f5714342c8ebf04d2476637cb00957b2e09ad65ecc3eed746ace916f7ca6a6c9ccb38488aaa892170858d36c9a83d33a1e9b6f7b8139c60cbb6834'
'b033ebc796bd1efd3cc8e201f37080927a35e2d930bf8fab8738b31fc5d69a6c5231508fd1a5299131f3aee6b9ae94e8d5be531c455ff38fe1965a5d59ae5c98'
)
_resolve_ffmpeg_srcdir() {
local _ffmpeg_src="$srcdir/ffmpeg"
if [[ -d "$_ffmpeg_src" ]]; then
printf '%s\n' "$_ffmpeg_src"
return 0
fi
_ffmpeg_src=$(find "$srcdir" -maxdepth 1 -mindepth 1 -type d -name 'ffmpeg*' | head -n1)
if [[ -n "$_ffmpeg_src" ]]; then
printf '%s\n' "$_ffmpeg_src"
return 0
fi
return 1
}
pkgver() {
local _ver _ts
if [[ -f "${srcdir}/ffmpeg.obsinfo" ]]; then
_ver=$(sed -n 's/^version: //p' "${srcdir}/ffmpeg.obsinfo" | head -n1)
fi
if [[ -z "$_ver" && -f "${srcdir}/._servicedata" ]]; then
_ver=$(sed -n 's/.*<param name="version">\(.*\)<\/param>.*/\1/p' "${srcdir}/._servicedata" | head -n1)
fi
if [[ -z "$_ver" && -d "${srcdir}/ffmpeg" ]]; then
_ts=$(find "${srcdir}/ffmpeg" -type f -printf '%T@\n' 2>/dev/null | sort -n | tail -n1 | cut -d. -f1)
if [[ -n "$_ts" ]]; then
_ver=$(date -u -d "@${_ts}" +%Y%m%d.%H%M%S 2>/dev/null)
fi
fi
if [[ -z "$_ver" ]]; then
_ver="${pkgver}"
fi
echo "${_ver//-/_}"
}
prepare() {
local _ffmpeg_src
_ffmpeg_src=$(_resolve_ffmpeg_srcdir) || {
echo "ffmpeg source directory not found under $srcdir"
return 1
}
cd "$_ffmpeg_src"
# https://crbug.com/1251779
patch -Np1 -N -i "$srcdir/0001-Add-av_stream_get_first_dts-for-Chromium.patch" || true
patch -Np1 -N -i "$srcdir/0002-x86inc-extern-hidden.patch" || true
patch -Np1 -N -i "$srcdir/0003-keep-asm-tables-lto.patch" || true
patch -Np1 -N -i "$srcdir/0004-keep-fspp-dither-lto.patch" || true
# GCC 15 fix: sys/select.h not implicitly included
patch -Np1 -N -i "$srcdir/0005-fix-gcc15-sys-select.patch" || true
# SVT-AV1 4.x API compatibility (enable_adaptive_quantization -> aq_mode)
patch -Np1 -N -i "$srcdir/0006-libsvtav1-svt4-aq-compat.patch" || true
chmod +x "$srcdir/workload.sh"
}
build() {
export PKG_CONFIG_PATH='/usr/lib/mbedtls2/pkgconfig'
local _ffmpeg_src
_ffmpeg_src=$(_resolve_ffmpeg_srcdir) || {
echo "ffmpeg source directory not found under $srcdir"
return 1
}
cd "$_ffmpeg_src"
# --- GOD MODE TOOLCHAIN ---
msg2 "Injecting God Mode compiler and flags..."
if [ ! -x /opt/gcc-git-god/bin/gcc ]; then
echo "gcc-git-god missing in /opt/gcc-git-god"
return 1
fi
export PATH="/opt/llvm-god/bin:/opt/gcc-git-god/bin:${PATH}"
export CC="gcc"
export CXX="g++"
export AR="gcc-ar"
export NM="gcc-nm"
export RANLIB="gcc-ranlib"
# Keep profiling binaries executable on generic OBS builders.
export GOD_CFLAGS="-O3 -march=x86-64 -mtune=generic -flto=auto -fgraphite-identity -floop-nest-optimize -pipe -fno-semantic-interposition"
export GOD_LDFLAGS="-L/usr/lib -flto=auto -fuse-ld=bfd -Wl,-Bsymbolic -Wl,--emit-relocs"
export CFLAGS="${CFLAGS:-} ${GOD_CFLAGS}"
export CXXFLAGS="${CXXFLAGS:-} ${GOD_CFLAGS}"
export LDFLAGS="${LDFLAGS:-} ${GOD_LDFLAGS}"
local cuda_llvm_flag="--disable-cuda-llvm"
if command -v llvm-config >/dev/null 2>&1 && llvm-config --targets-built | grep -q NVPTX; then
cuda_llvm_flag="--enable-cuda-llvm"
fi
local pgo="${FFMPEG_GOD_PGO:-1}"
if [[ "$pgo" == "1" ]]; then
msg2 "PGO Stage 1: instrumentation"
rm -rf "$srcdir/pgo-data"
make distclean || true
export CFLAGS="${GOD_CFLAGS} -fprofile-generate=$srcdir/pgo-data"
export CXXFLAGS="$CFLAGS"
export LDFLAGS="${GOD_LDFLAGS} -fprofile-generate=$srcdir/pgo-data"
./configure \
--prefix=/usr \
--disable-debug \
--disable-static \
--disable-stripping \
--enable-pic \
--enable-amf \
--enable-avisynth \
"${cuda_llvm_flag}" \
--enable-lto \
--enable-fontconfig \
--enable-frei0r \
--enable-gmp \
--enable-gnutls \
--enable-gpl \
--enable-ladspa \
--enable-libaom \
--enable-libass \
--enable-libbluray \
--enable-libbs2b \
--enable-libdav1d \
--enable-libdrm \
--enable-libdvdnav \
--enable-libdvdread \
--enable-libfreetype \
--enable-libfribidi \
--enable-libglslang \
--enable-libgsm \
--enable-libharfbuzz \
--enable-libiec61883 \
--enable-libjack \
--enable-libjxl \
--enable-libmodplug \
--enable-libmp3lame \
--enable-libopencore_amrnb \
--enable-libopencore_amrwb \
--enable-libopenjpeg \
--enable-libopenmpt \
--enable-libopus \
--enable-libplacebo \
--enable-libpulse \
--enable-librav1e \
--enable-librsvg \
--enable-librubberband \
--enable-libsnappy \
--enable-libsoxr \
--enable-libspeex \
--enable-libsrt \
--enable-libssh \
--enable-libsvtav1 \
--enable-libtheora \
--enable-libv4l2 \
--enable-libvidstab \
--enable-libvmaf \
--enable-libvorbis \
--enable-libvpl \
--enable-libvpx \
--enable-libwebp \
--enable-libx264 \
--enable-libx265 \
--enable-libxcb \
--enable-libxml2 \
--enable-libxvid \
--enable-libzimg \
--enable-libzmq \
--enable-nvdec \
--enable-nvenc \
--enable-opencl \
--enable-opengl \
--enable-shared \
--enable-vapoursynth \
--enable-version3 \
--enable-vulkan
make
msg2 "PGO Stage 2: workload training"
"$srcdir/workload.sh" ./ffmpeg "$srcdir/pgo-workload"
msg2 "PGO Stage 3: profile use"
make distclean || true
export CFLAGS="${GOD_CFLAGS} -fprofile-use=$srcdir/pgo-data -fprofile-correction"
export CXXFLAGS="$CFLAGS"
export LDFLAGS="${GOD_LDFLAGS} -fprofile-use=$srcdir/pgo-data"
fi
./configure \
--prefix=/usr \
--disable-debug \
--disable-static \
--disable-stripping \
--enable-pic \
--enable-amf \
--enable-avisynth \
"${cuda_llvm_flag}" \
--enable-lto \
--enable-fontconfig \
--enable-frei0r \
--enable-gmp \
--enable-gnutls \
--enable-gpl \
--enable-ladspa \
--enable-libaom \
--enable-libass \
--enable-libbluray \
--enable-libbs2b \
--enable-libdav1d \
--enable-libdrm \
--enable-libdvdnav \
--enable-libdvdread \
--enable-libfreetype \
--enable-libfribidi \
--enable-libglslang \
--enable-libgsm \
--enable-libharfbuzz \
--enable-libiec61883 \
--enable-libjack \
--enable-libjxl \
--enable-libmodplug \
--enable-libmp3lame \
--enable-libopencore_amrnb \
--enable-libopencore_amrwb \
--enable-libopenjpeg \
--enable-libopenmpt \
--enable-libopus \
--enable-libplacebo \
--enable-libpulse \
--enable-librav1e \
--enable-librsvg \
--enable-librubberband \
--enable-libsnappy \
--enable-libsoxr \
--enable-libspeex \
--enable-libsrt \
--enable-libssh \
--enable-libsvtav1 \
--enable-libtheora \
--enable-libv4l2 \
--enable-libvidstab \
--enable-libvmaf \
--enable-libvorbis \
--enable-libvpl \
--enable-libvpx \
--enable-libwebp \
--enable-libx264 \
--enable-libx265 \
--enable-libxcb \
--enable-libxml2 \
--enable-libxvid \
--enable-libzimg \
--enable-libzmq \
--enable-nvdec \
--enable-nvenc \
--enable-opencl \
--enable-opengl \
--enable-shared \
--enable-vapoursynth \
--enable-version3 \
--enable-vulkan
make
make tools/qt-faststart
make doc/ff{mpeg,play}.1
if [[ "${FFMPEG_GOD_BOLT:-0}" == "1" ]]; then
local bolt_bin merge_fdata_bin
bolt_bin="${BOLT_BIN:-$(command -v llvm-bolt || true)}"
merge_fdata_bin="${MERGE_FDATA_BIN:-$(command -v merge-fdata || true)}"
for d in /opt/llvm-god/bin /opt/llvm-god /usr/lib/llvm*/bin /usr/lib/llvm*; do
if [[ -z "$bolt_bin" && -x "$d/llvm-bolt" ]]; then
bolt_bin="$d/llvm-bolt"
fi
if [[ -z "$merge_fdata_bin" && -x "$d/merge-fdata" ]]; then
merge_fdata_bin="$d/merge-fdata"
fi
done
if [[ -x "$bolt_bin" && -x "$merge_fdata_bin" ]]; then
if ! "$bolt_bin" --help >/dev/null 2>&1 || ! "$merge_fdata_bin" --help >/dev/null 2>&1; then
msg2 "BOLT tools are present but not runnable on this builder; skipping BOLT optimization."
else
bolt_rt=""
for d in /opt/llvm-god/lib /opt/llvm-god/lib64 /usr/lib /usr/lib/llvm*/lib /usr/lib/llvm*/lib64; do
if [[ -f "$d/libbolt_rt_instr.a" ]]; then
bolt_rt="$d/libbolt_rt_instr.a"
break
fi
done
if [[ -z "$bolt_rt" ]]; then
msg2 "BOLT runtime not found (libbolt_rt_instr.a); skipping BOLT optimization."
else
msg2 "BOLT profiling ffmpeg..."
"$bolt_bin" ./ffmpeg -o ./ffmpeg.inst \
-instrument \
-instrumentation-file="$srcdir/bolt-ffmpeg.fdata" \
-instrumentation-file-append-pid
"$srcdir/workload.sh" ./ffmpeg.inst "$srcdir/bolt-workload" || true
if ls "$srcdir/bolt-ffmpeg.fdata".* &>/dev/null; then
"$merge_fdata_bin" "$srcdir"/bolt-ffmpeg.fdata.* > "$srcdir/bolt-ffmpeg.fdata"
fi
if [[ -s "$srcdir/bolt-ffmpeg.fdata" ]]; then
"$bolt_bin" ./ffmpeg -o ./ffmpeg.bolt \
-data "$srcdir/bolt-ffmpeg.fdata" \
-reorder-blocks=ext-tsp \
-reorder-functions=hfsort \
-split-functions \
-split-all-cold \
-icf=1 \
-dyno-stats
mv ./ffmpeg.bolt ./ffmpeg
else
msg2 "No BOLT profile data collected; keeping non-BOLT ffmpeg binary."
fi
fi
fi
else
msg2 "BOLT tools not found; skipping BOLT optimization."
fi
fi
}
package() {
depends+=( libass.so
libbluray.so
libbs2b.so
libdav1d.so
libfreetype.so
libharfbuzz.so
libjxl.so
libopenmpt.so
libplacebo.so
librav1e.so
librsvg-2.so
librubberband.so
libva.so
libva-drm.so
libva-x11.so
libvidstab.so
libvorbisenc.so
libvorbis.so
libvpx.so
libx264.so
libx265.so
libxvidcore.so
libzimg.so
libzmq.so
)
local _ffmpeg_src
_ffmpeg_src=$(_resolve_ffmpeg_srcdir) || {
echo "ffmpeg source directory not found under $srcdir"
return 1
}
make DESTDIR="${pkgdir}" -C "$_ffmpeg_src" install install-man
install -Dm 755 "$_ffmpeg_src/tools/qt-faststart" "${pkgdir}"/usr/bin/
}
# vim: ts=2 sw=2 et: