#!/bin/sh
# Baut ein schlankes FFmpeg + FFprobe nur zum Lesen von Ton (LGPL, keine GPL-Teile, kein Netzwerk).
# Ergebnis: third_party/ffmpeg/<ziel>/ (ffmpeg, ffprobe bzw. .exe) – wird in die App gepackt.
#
#   tools-dev/ffmpeg-build.sh mac        # Apple Silicon + Intel, zusammengefügt (universal)
#   tools-dev/ffmpeg-build.sh windows    # Windows x64 (braucht: brew install mingw-w64)
#
# Die Quelle wird von ffmpeg.org geladen und per SHA-256 geprüft (Signatur am 08.10.2026 mit dem
# FFmpeg-Release-Schlüssel gegengeprüft). Konfiguration und Version stehen in third_party/ffmpeg/BUILD.txt.
set -e
cd "$(dirname "$0")/.."
export PATH="/opt/homebrew/bin:$PATH"

VERSION=9.0.2
SHA256=8c3850283eb25fa026482078a04051e0be17347b09ef81a0849bec15a96e002e
CACHE="${FFMPEG_BUILD_CACHE:-$PWD/.ffmpeg-build}"
OUT="$PWD/third_party/ffmpeg"
JOBS=$(sysctl -n hw.ncpu 2>/dev/null || echo 4)
EXE=

mkdir -p "$CACHE" "$OUT"
TARBALL="$CACHE/ffmpeg-$VERSION.tar.xz"
if [ ! -f "$TARBALL" ]; then
	curl -sSfL "https://ffmpeg.org/releases/ffmpeg-$VERSION.tar.xz" -o "$TARBALL.part"
	mv "$TARBALL.part" "$TARBALL"
fi
echo "$SHA256  $TARBALL" | shasum -a 256 -c - >/dev/null || { echo "Prüfsumme der FFmpeg-Quelle stimmt nicht"; exit 1; }
SRC="$CACHE/ffmpeg-$VERSION"
[ -d "$SRC" ] || tar -xJf "$TARBALL" -C "$CACHE"

# Nur was der SFX-Trimmer braucht: Ton aus gängigen Audio- und Videoformaten lesen, als 32-Bit-Float
# über eine Pipe ausgeben (-ac/-ar über aresample) und mit ffprobe die Eckdaten abfragen.
DEMUXERS=wav,w64,aiff,mp3,mov,matroska,ogg,flac,aac,caf,asf,avi,mpegts,mpegps,flv,amr,ac3,eac3,ape,wv,au,dts,truehd,mlp,loas,mxf,xwma
DECODERS=aac,aac_latm,alac,flac,mp1,mp2,mp3,mp1float,mp2float,mp3float,opus,vorbis,ac3,eac3,wmav1,wmav2,wmapro,wmalossless,amrnb,amrwb,ape,wavpack,dca,truehd,mlp,gsm,gsm_ms,adpcm_ima_wav,adpcm_ms,adpcm_ima_qt
DECODERS=$DECODERS,pcm_s8,pcm_u8,pcm_s16le,pcm_s16be,pcm_s24le,pcm_s24be,pcm_s32le,pcm_s32be,pcm_f32le,pcm_f32be,pcm_f64le,pcm_f64be,pcm_alaw,pcm_mulaw,pcm_s16le_planar,pcm_s24daud
PARSERS=aac,aac_latm,ac3,flac,mpegaudio,opus,vorbis,dca,mlp
COMMON="--disable-everything --disable-autodetect --disable-network --disable-doc --disable-debug
 --disable-ffplay --enable-ffmpeg --enable-ffprobe --disable-avdevice --disable-swscale
 --enable-small --enable-static --disable-shared --disable-iconv
 --enable-protocol=file,pipe --enable-demuxer=$DEMUXERS --enable-decoder=$DECODERS --enable-parser=$PARSERS
 --enable-encoder=pcm_f32le --enable-muxer=pcm_f32le --enable-filter=abuffer,abuffersink,aformat,aresample,anull"

build() { # $1 = Name, Rest = zusätzliche configure-Optionen
	name=$1
	shift
	dir="$CACHE/build-$name"
	rm -rf "$dir"
	mkdir -p "$dir"
	(cd "$dir" && "$SRC/configure" $COMMON "$@" >configure.log 2>&1) || { tail -30 "$dir/configure.log" >&2; exit 1; }
	if grep -q "did not match" "$dir/configure.log"; then # Tippfehler in Bauteil-Namen sofort melden
		grep "did not match" "$dir/configure.log" >&2
		exit 1
	fi
	make -C "$dir" -j"$JOBS" "ffmpeg$EXE" "ffprobe$EXE" >"$dir/make.log" 2>&1 || { tail -40 "$dir/make.log" >&2; exit 1; }
	echo "$dir"
}

case "$1" in
mac)
	MIN="-mmacosx-version-min=11.0"
	A=$(build mac-arm64 --arch=arm64 --target-os=darwin --cc="clang -arch arm64" --extra-cflags="$MIN" --extra-ldflags="$MIN")
	X=$(build mac-x86_64 --arch=x86_64 --target-os=darwin --enable-cross-compile --cc="clang -arch x86_64" \
		--extra-cflags="$MIN" --extra-ldflags="$MIN" --disable-x86asm)
	mkdir -p "$OUT/mac"
	for t in ffmpeg ffprobe; do
		lipo -create "$A/$t" "$X/$t" -output "$OUT/mac/$t"
		strip -x "$OUT/mac/$t"
	done
	lipo -info "$OUT/mac/ffmpeg" "$OUT/mac/ffprobe"
	;;
windows)
	command -v x86_64-w64-mingw32-gcc >/dev/null || { echo "Fehlt: brew install mingw-w64"; exit 1; }
	EXE=.exe
	W=$(build win-x64 --arch=x86_64 --target-os=mingw32 --cross-prefix=x86_64-w64-mingw32- --enable-cross-compile \
		--disable-x86asm --extra-ldflags="-static -static-libgcc")
	mkdir -p "$OUT/windows"
	for t in ffmpeg ffprobe; do
		cp "$W/$t.exe" "$OUT/windows/$t.exe"
		x86_64-w64-mingw32-strip "$OUT/windows/$t.exe"
	done
	;;
*)
	echo "Aufruf: $0 mac|windows"
	exit 2
	;;
esac

cat >"$OUT/BUILD.txt" <<EOF
FFmpeg $VERSION, built with tools-dev/ffmpeg-build.sh (LGPL v2.1 or later, without --enable-gpl/--enable-nonfree).
Source: https://ffmpeg.org/releases/ffmpeg-$VERSION.tar.xz (SHA-256 $SHA256)
configure: $(echo $COMMON)
EOF
ls -la "$OUT"/*/
