#!/usr/bin/env bash
# Kyvo TV — programowy dźwięk FFmpeg na LICENCJI LGPL 2.1+ (bez --enable-gpl / --enable-nonfree).
# Uruchamiane w kontenerze Linux (Docker Desktop):
#   docker run --rm -v C:/KyvoTV/android/ffmpeg:/work ubuntu:22.04 bash /work/build_in_docker.sh
# Przepis = oficjalny moduł androidx/media decoder_ffmpeg (Apache 2.0) w wersji zgodnej z odtwarzaczem (1.5.1)
# + FFmpeg release/6.0. Wynik (w /work/out):
#   jniLibs/<abi>/libffmpegJNI.so   — biblioteka do aplikacji (dynamicznie ładowana, 16 KB wyrównanie)
#   java/androidx/media3/decoder/ffmpeg/*.java — kod Media3 (Apache 2.0) wkompilowany w aplikację
#   ffmpeg-<wersja>-source.tar.xz   — dokładne źródła FFmpeg (wymóg LGPL), udostępniane na kyvotv.com/licenses
#   build-info.txt                  — wersje, opcje configure, licencja z config.h
set -euo pipefail

MEDIA3_TAG=1.5.1
FFMPEG_BRANCH=release/6.0
NDK_VER=r27c
MIN_SDK=23
DECODERS=(vorbis opus flac alac pcm_mulaw pcm_alaw mp3 aac ac3 eac3 dca mlp truehd)

export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -y -qq git unzip wget xz-utils make cmake pkg-config python3 ca-certificates file > /dev/null

W=/build
mkdir -p "$W" && cd "$W"

echo "== NDK $NDK_VER"
wget -q "https://dl.google.com/android/repository/android-ndk-${NDK_VER}-linux.zip" -O ndk.zip
unzip -q ndk.zip && rm ndk.zip
NDK="$W/android-ndk-${NDK_VER}"

echo "== androidx/media $MEDIA3_TAG (tylko moduł decoder_ffmpeg)"
git clone -q --depth 1 --branch "$MEDIA3_TAG" --filter=blob:none --sparse https://github.com/androidx/media.git media
(cd media && git sparse-checkout set libraries/decoder_ffmpeg)
MOD="$W/media/libraries/decoder_ffmpeg/src/main"

echo "== FFmpeg $FFMPEG_BRANCH"
git clone -q --depth 1 --branch "$FFMPEG_BRANCH" https://github.com/FFmpeg/FFmpeg.git "$MOD/jni/ffmpeg"
FFREV=$(cd "$MOD/jni/ffmpeg" && git rev-parse HEAD)
FFVER=$(cat "$MOD/jni/ffmpeg/RELEASE" 2>/dev/null || echo 6.0)

mkdir -p /work/out
# dokładne źródła FFmpeg (przed budowaniem, bez .git) — do udostępnienia zgodnie z LGPL
tar -C "$MOD/jni" --exclude=.git -cJf "/work/out/ffmpeg-${FFVER}-source.tar.xz" ffmpeg

echo "== budowanie FFmpeg (4 architektury)"
cd "$MOD/jni"
bash build_ffmpeg.sh "$MOD" "$NDK" linux-x86_64 "$MIN_SDK" "${DECODERS[@]}" > /work/out/ffmpeg-build.log 2>&1

# licencja wynikowej kompilacji: musi być LGPL (configure zapisuje ją w config.h ostatniej architektury)
LIC=$(grep -h 'FFMPEG_LICENSE' "$MOD/jni/ffmpeg/config.h" 2>/dev/null || true)
GPL=$(grep -h 'define CONFIG_GPL ' "$MOD/jni/ffmpeg/config.h" 2>/dev/null || true)
NONFREE=$(grep -h 'define CONFIG_NONFREE ' "$MOD/jni/ffmpeg/config.h" 2>/dev/null || true)
CONF=$(grep -h 'FFMPEG_CONFIGURATION' "$MOD/jni/ffmpeg/config.h" 2>/dev/null || true)
echo "$LIC / $GPL / $NONFREE"
case "$GPL$NONFREE" in *" 1"*) echo "BŁĄD: kompilacja GPL/nonfree"; exit 1;; esac

echo "== libffmpegJNI.so (CMake z modułu Media3)"
for ABI in armeabi-v7a arm64-v8a x86 x86_64; do
  B="$W/jni-$ABI"
  cmake -S "$MOD/jni" -B "$B" -DCMAKE_TOOLCHAIN_FILE="$NDK/build/cmake/android.toolchain.cmake" \
        -DANDROID_ABI="$ABI" -DANDROID_PLATFORM="android-$MIN_SDK" -DCMAKE_BUILD_TYPE=Release > /dev/null
  cmake --build "$B" -j"$(nproc)" > /dev/null
  mkdir -p "/work/out/jniLibs/$ABI"
  "$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip" --strip-unneeded -o "/work/out/jniLibs/$ABI/libffmpegJNI.so" "$B/libffmpegJNI.so"
done

echo "== kod Java Media3 decoder_ffmpeg"
rm -rf /work/out/java && mkdir -p /work/out/java
cp -r "$MOD/java/." /work/out/java/

{
  echo "Kyvo TV — FFmpeg (programowy dźwięk), kompilacja $(date -u +%Y-%m-%dT%H:%MZ)"
  echo "androidx/media: $MEDIA3_TAG (libraries/decoder_ffmpeg, Apache License 2.0)"
  echo "FFmpeg: $FFMPEG_BRANCH, wersja $FFVER, commit $FFREV (https://github.com/FFmpeg/FFmpeg)"
  echo "NDK: $NDK_VER, minSdk: $MIN_SDK"
  echo "Dekodery: ${DECODERS[*]}"
  echo "$LIC"
  echo "$GPL"
  echo "$NONFREE"
  echo "$CONF"
} > /work/out/build-info.txt
for ABI in armeabi-v7a arm64-v8a x86 x86_64; do file "/work/out/jniLibs/$ABI/libffmpegJNI.so"; done >> /work/out/build-info.txt
echo "== GOTOWE"; cat /work/out/build-info.txt
