#!/usr/bin/env bash
# build-ffmpeg-ios.sh — 从源码构建 LGPL 子集 FFmpeg,交叉编译 iOS(arm64 设备 + arm64 模拟器)→ xcframework。
#
# 决策见 docs/decisions/audio-engine-ffmpeg-migration.md。LGPL 合规:--disable-gpl --disable-nonfree,
# 只启用无损/常见音频 demuxer+decoder(APE/FLAC/ALAC/WAV/AAC/MP3),不含 x264 等 GPL 组件。
# --disable-asm:避开 nasm/gas-preprocessor 依赖(arm64 C 解码器足够;P4 可加 gas-preprocessor 开 NEON 提速)。
#
# 用法:bash build-ffmpeg-ios.sh   (输出到本目录 FFmpeg.xcframework + 源码/中间物在 build/,已 gitignore)
set -euo pipefail

FF_VERSION="n7.1.1"                 # pin,可复现
MIN_IOS="16.0"
HERE="$(cd "$(dirname "$0")" && pwd)"
BUILD="$HERE/build"
SRC="$BUILD/ffmpeg-src"
mkdir -p "$BUILD"

# 只启用需要的组件(无损优先 + 常见有损),保持最小 + LGPL
# VLCKit→FFmpeg 格式对齐(vlckit-to-ffmpeg-format-parity):补齐迁移掉队的非主流格式,让 FFmpeg 覆盖面
# 对齐 VLCKit。新增均 LGPL/decode-only(wmav1/2/pro/lossless、vorbis、opus、ac3/eac3、tta),不碰 GPL/nonfree。
DECODERS="ape,flac,alac,mp3float,aac,pcm_s16le,pcm_s24le,pcm_s32le,pcm_u8,pcm_f32le,pcm_s16be,pcm_s24be,wavpack,tak,wmav1,wmav2,wmapro,wmalossless,vorbis,opus,ac3,eac3,tta"
DEMUXERS="ape,flac,mov,wav,aac,mp3,wv,tak,asf,ogg,ac3,eac3,tta"
PARSERS="flac,aac,mpegaudio,tak,vorbis,opus,ac3"

# 1) 取源码(浅克隆 pin 的 tag)
if [ ! -d "$SRC/.git" ]; then
  echo "== 克隆 FFmpeg $FF_VERSION =="
  git clone --depth 1 --branch "$FF_VERSION" https://github.com/FFmpeg/FFmpeg.git "$SRC"
fi

build_arch() {
  local PLATFORM="$1"   # iphoneos | iphonesimulator
  local TRIPLE="$2"     # arm64-apple-ios16.0 | arm64-apple-ios16.0-simulator
  local TAG="$3"        # device | sim
  local SDKPATH; SDKPATH="$(xcrun --sdk "$PLATFORM" --show-sdk-path)"
  local PREFIX="$BUILD/thin/$TAG"
  local CFLAGS="-arch arm64 -target $TRIPLE -isysroot $SDKPATH -O2"

  echo "== 配置+构建 FFmpeg [$TAG] ($TRIPLE) =="
  ( cd "$SRC" && make distclean >/dev/null 2>&1 || true )
  ( cd "$SRC" && ./configure \
      --prefix="$PREFIX" \
      --enable-cross-compile --target-os=darwin --arch=arm64 \
      --cc="xcrun -sdk $PLATFORM clang" \
      --as="xcrun -sdk $PLATFORM clang" \
      --sysroot="$SDKPATH" \
      --extra-cflags="$CFLAGS" \
      --extra-ldflags="-arch arm64 -target $TRIPLE -isysroot $SDKPATH" \
      --disable-gpl --disable-nonfree \
      --disable-programs --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \
      --disable-avdevice --disable-avfilter --disable-postproc --disable-swscale --disable-network --disable-debug \
      --disable-everything \
      --enable-swresample \
      --enable-decoder="$DECODERS" \
      --enable-demuxer="$DEMUXERS" \
      --enable-parser="$PARSERS" \
      --enable-protocol=file \
      --disable-asm --enable-pic --enable-static --disable-shared )
  # LGPL 卡口(client-ffmpeg-lgpl-compliance.md §二):configure 产物 config.h 必须
  # CONFIG_GPL=0 / CONFIG_NONFREE=0 / 无 LIBX264·LIBX265,任一不过即失败(产物不生成,防合规漂移)。
  bash "$HERE/../../scripts/verify-ffmpeg-lgpl.sh" "$SRC"

  ( cd "$SRC" && make -j"$(sysctl -n hw.ncpu)" && make install )

  # 合并 4 个 .a 成单个 libffmpeg.a(便于 xcframework 单库封装)
  libtool -static -o "$PREFIX/lib/libffmpeg.a" \
    "$PREFIX/lib/libavformat.a" "$PREFIX/lib/libavcodec.a" \
    "$PREFIX/lib/libavutil.a" "$PREFIX/lib/libswresample.a"
}

build_arch iphoneos          "arm64-apple-ios${MIN_IOS}"            device
build_arch iphonesimulator   "arm64-apple-ios${MIN_IOS}-simulator" sim

# 1.5) 同步许可文本(LGPL 发行合规,LICENSE-NOTICE.md):从 pin 的源码 tag 拷贝,版本升级自动跟进。
cp "$SRC/COPYING.LGPLv2.1" "$HERE/COPYING.LGPLv2.1"
cp "$SRC/LICENSE.md"       "$HERE/FFMPEG-LICENSE.md"

# 2) 打 xcframework(**纯库,不带 -headers**):静态库 xcframework 的 Headers 顶层 module.modulemap
#    会被 ProcessXCFramework 拷到 BUILT_PRODUCTS_DIR/include/module.modulemap——iroh-ffi 1.1.0 起
#    也带顶层 modulemap,两包撞名致 "Multiple commands produce"。headers 改由本地 SPM C target
#    CFFmpeg(Sources/CFFmpeg/include)提供,见 Package.swift。
echo "== 打包 FFmpeg.xcframework(纯库) =="
rm -rf "$HERE/FFmpeg.xcframework"
xcodebuild -create-xcframework \
  -library "$BUILD/thin/device/lib/libffmpeg.a" \
  -library "$BUILD/thin/sim/lib/libffmpeg.a" \
  -output "$HERE/FFmpeg.xcframework"

# 3) 同步公共头 + module.modulemap 到 CFFmpeg target(Swift `import CFFmpeg` 的单一来源)
echo "== 同步 headers → Sources/CFFmpeg/include =="
rm -rf "$HERE/Sources/CFFmpeg/include"
mkdir -p "$HERE/Sources/CFFmpeg/include"
cp -R "$BUILD/thin/device/include/" "$HERE/Sources/CFFmpeg/include/"
cat > "$HERE/Sources/CFFmpeg/include/module.modulemap" <<'MMEOF'
module CFFmpeg [system] {
    header "libavcodec/avcodec.h"
    header "libavformat/avformat.h"
    header "libavutil/avutil.h"
    header "libavutil/channel_layout.h"
    header "libavutil/samplefmt.h"
    header "libavutil/frame.h"
    header "libavutil/opt.h"
    header "libavutil/error.h"
    header "libavutil/dict.h"
    header "libavutil/mem.h"
    header "libavutil/imgutils.h"
    header "libswresample/swresample.h"
    export *
}
MMEOF

echo ""
echo "✅ 完成:$HERE/FFmpeg.xcframework"
echo "   启用 decoders: $DECODERS"
echo "   LGPL 合规:--disable-gpl --disable-nonfree(无 GPL 组件)"
