# syntax=docker/dockerfile-upstream:master-labs
#
# Tebleny 向けに最小化した ffmpeg.wasm コアのビルド。
# 元の Dockerfile（Dockerfile.orig）は x265/libvpx/opus/vorbis/libass/zimg など
# 多数のライブラリを同梱して ~36MB のコアを作るが、Tebleny が実際に使うのは
#   - scale / unsharp / deshake … FFmpeg 内蔵フィルタ（外部ライブラリ不要）
#   - vidstabdetect / vidstabtransform … libvidstab
#   - libx264 エンコーダ … x264（GPL）
#   - AAC エンコーダ … FFmpeg 内蔵（外部ライブラリ不要）
# だけ。よって x264 + zlib + vidstab のみを同梱し、公式(32MB)より軽量な
# シングルスレッド(SharedArrayBuffer 不要＝iOS Safari 対応)コアを作る。

# Base emsdk image with environment variables.
FROM emscripten/emsdk:3.1.40 AS emsdk-base
ARG EXTRA_CFLAGS
ARG EXTRA_LDFLAGS
ARG FFMPEG_ST
ARG FFMPEG_MT
ENV INSTALL_DIR=/opt
# We cannot upgrade to n6.0 as ffmpeg bin only supports multithread at the moment.
ENV FFMPEG_VERSION=n5.1.4
ENV CFLAGS="-I$INSTALL_DIR/include $CFLAGS $EXTRA_CFLAGS"
ENV CXXFLAGS="$CFLAGS"
ENV LDFLAGS="-L$INSTALL_DIR/lib $LDFLAGS $CFLAGS $EXTRA_LDFLAGS"
ENV EM_PKG_CONFIG_PATH=$EM_PKG_CONFIG_PATH:$INSTALL_DIR/lib/pkgconfig:/emsdk/upstream/emscripten/system/lib/pkgconfig
ENV EM_TOOLCHAIN_FILE=$EMSDK/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake
ENV PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$EM_PKG_CONFIG_PATH
ENV FFMPEG_ST=$FFMPEG_ST
ENV FFMPEG_MT=$FFMPEG_MT
RUN apt-get update && \
      apt-get install -y pkg-config autoconf automake libtool ragel

# Build x264 (libx264 encoder, GPL)
# GPL対応ソース要件のため、可変ブランチ(4-cores)ではなく固定コミットSHAで取得する。
# 33cac6b = ffmpegwasm/x264 の 4-cores ブランチHEAD（"Use 4 logical cores by default"）。
FROM emsdk-base AS x264-builder
ENV X264_BRANCH=33cac6b77d5b9259c552156013a817ab23119612
ADD https://github.com/ffmpegwasm/x264.git#$X264_BRANCH /src
COPY build/x264.sh /src/build.sh
RUN bash -x /src/build.sh

# Build zlib
FROM emsdk-base AS zlib-builder
ENV ZLIB_BRANCH=v1.2.11
ADD https://github.com/ffmpegwasm/zlib.git#$ZLIB_BRANCH /src
COPY build/zlib.sh /src/build.sh
RUN bash -x /src/build.sh

# Build vidstab (vidstabdetect / vidstabtransform filters, GPL)
FROM emsdk-base AS vidstab-builder
ENV VIDSTAB_BRANCH=v1.1.1
ADD https://github.com/georgmartius/vid.stab.git#$VIDSTAB_BRANCH /src
COPY build/vidstab.sh /src/build.sh
RUN bash -x /src/build.sh

# Base ffmpeg image with dependencies and source code populated.
FROM emsdk-base AS ffmpeg-base
RUN embuilder build sdl2 sdl2-mt
ADD https://github.com/FFmpeg/FFmpeg.git#$FFMPEG_VERSION /src
COPY --from=x264-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=zlib-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=vidstab-builder $INSTALL_DIR $INSTALL_DIR

# Build ffmpeg
FROM ffmpeg-base AS ffmpeg-builder
COPY build/ffmpeg.sh /src/build.sh
RUN bash -x /src/build.sh \
      --enable-gpl \
      --enable-libx264 \
      --enable-zlib \
      --enable-libvidstab

# Build ffmpeg.wasm
FROM ffmpeg-builder AS ffmpeg-wasm-builder
COPY src/bind /src/src/bind
COPY src/fftools /src/src/fftools
COPY build/ffmpeg-wasm.sh build.sh
# libraries to link
ENV FFMPEG_LIBS \
      -lx264 \
      -lz \
      -lvidstab
RUN mkdir -p /src/dist/umd && bash -x /src/build.sh \
      ${FFMPEG_LIBS} \
      -o dist/umd/ffmpeg-core.js
RUN mkdir -p /src/dist/esm && bash -x /src/build.sh \
      ${FFMPEG_LIBS} \
      -sEXPORT_ES6 \
      -o dist/esm/ffmpeg-core.js

# Export ffmpeg-core.wasm to dist/, use `docker buildx build -o . .` to get assets
FROM scratch AS exportor
COPY --from=ffmpeg-wasm-builder /src/dist /dist