97 lines
2.8 KiB
Bash
Executable File
97 lines
2.8 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIRECTORY="$(cd "$(dirname "$0")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIRECTORY/.." && pwd)"
|
|
FFMPEG_ROOT="$PROJECT_ROOT/ThirdParty/FFmpeg"
|
|
SOURCE_ARCHIVE="$FFMPEG_ROOT/Source/ffmpeg-8.1.2.tar.xz"
|
|
OUTPUT_BINARY="$FFMPEG_ROOT/macOS/ffmpeg"
|
|
EXPECTED_SHA256="464beb5e7bf0c311e68b45ae2f04e9cc2af88851abb4082231742a74d97b524c"
|
|
BUILD_ROOT="$(mktemp -d /tmp/projectquint-ffmpeg-build.XXXXXX)"
|
|
BUILD_JOBS="$(sysctl -n hw.ncpu)"
|
|
|
|
cleanup() {
|
|
rm -rf "$BUILD_ROOT"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
if [[ ! -f "$SOURCE_ARCHIVE" ]]; then
|
|
echo "Missing pinned source archive: $SOURCE_ARCHIVE" >&2
|
|
exit 1
|
|
fi
|
|
|
|
ACTUAL_SHA256="$(shasum -a 256 "$SOURCE_ARCHIVE" | awk '{print $1}')"
|
|
if [[ "$ACTUAL_SHA256" != "$EXPECTED_SHA256" ]]; then
|
|
echo "FFmpeg source hash mismatch: $ACTUAL_SHA256" >&2
|
|
exit 1
|
|
fi
|
|
|
|
tar -xf "$SOURCE_ARCHIVE" -C "$BUILD_ROOT"
|
|
SOURCE_ROOT="$BUILD_ROOT/ffmpeg-8.1.2"
|
|
|
|
COMMON_OPTIONS=(
|
|
--target-os=darwin
|
|
--cc=clang
|
|
--disable-everything
|
|
--disable-autodetect
|
|
--disable-doc
|
|
--disable-debug
|
|
--disable-network
|
|
--disable-x86asm
|
|
--enable-small
|
|
--enable-ffmpeg
|
|
--disable-ffprobe
|
|
--disable-ffplay
|
|
--enable-avcodec
|
|
--enable-avformat
|
|
--enable-avfilter
|
|
--enable-swscale
|
|
--enable-protocol=file
|
|
--enable-demuxer=asf,avi
|
|
--enable-decoder=wmv1,wmv2,wmv3,vc1,mpeg4,msmpeg4v1,msmpeg4v2,msmpeg4v3,mjpeg,h263,h264,rawvideo
|
|
--enable-parser=vc1,mpeg4video,mjpeg,h263,h264
|
|
--enable-encoder=h264_videotoolbox
|
|
--enable-muxer=mp4
|
|
--enable-filter=format,scale
|
|
--enable-videotoolbox
|
|
)
|
|
|
|
build_architecture() {
|
|
local architecture="$1"
|
|
local build_directory="$BUILD_ROOT/build-$architecture"
|
|
local install_directory="$BUILD_ROOT/install-$architecture"
|
|
mkdir -p "$build_directory" "$install_directory"
|
|
(
|
|
cd "$build_directory"
|
|
"$SOURCE_ROOT/configure" \
|
|
"--prefix=$install_directory" \
|
|
"--arch=$architecture" \
|
|
"--extra-cflags=-arch $architecture -mmacosx-version-min=12.0" \
|
|
"--extra-ldflags=-arch $architecture -mmacosx-version-min=12.0" \
|
|
"${COMMON_OPTIONS[@]}"
|
|
make -j"$BUILD_JOBS"
|
|
make install
|
|
)
|
|
}
|
|
|
|
build_architecture arm64
|
|
build_architecture x86_64
|
|
|
|
mkdir -p "$(dirname "$OUTPUT_BINARY")"
|
|
lipo -create \
|
|
"$BUILD_ROOT/install-arm64/bin/ffmpeg" \
|
|
"$BUILD_ROOT/install-x86_64/bin/ffmpeg" \
|
|
-output "$OUTPUT_BINARY"
|
|
chmod 755 "$OUTPUT_BINARY"
|
|
lipo "$OUTPUT_BINARY" -verify_arch arm64 x86_64
|
|
|
|
VERSION_OUTPUT="$($OUTPUT_BINARY -version)"
|
|
if [[ "$VERSION_OUTPUT" == *"--enable-gpl"* ||
|
|
"$VERSION_OUTPUT" == *"--enable-nonfree"* ||
|
|
"$VERSION_OUTPUT" == *"libx264"* ]]; then
|
|
echo "Refusing non-LGPL FFmpeg configuration." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "Built Universal LGPL FFmpeg: $OUTPUT_BINARY"
|