
# Base emsdk image with environment variables.
FROM emscripten/emsdk@sha256:c1e807a6e03ac5bd5b37bae2ace3c46c08579e2ddeb951037a3b8dac7067f2cc AS emsdk-base
ARG EXTRA_CFLAGS="-O3 -msimd128"
ARG EXTRA_LDFLAGS
ARG FFMPEG_ST=yes
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
FROM emsdk-base AS x264-builder
ENV X264_BRANCH=4-cores
COPY sources/x264-33cac6b77d5b.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/x264.sh /src/build.sh
RUN bash -x /src/build.sh

# Build x265
FROM emsdk-base AS x265-builder
ENV X265_BRANCH=3.4
COPY sources/x265-2bb5520e9596.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/x265.sh /src/build.sh
RUN bash -x /src/build.sh

# Build libvpx
FROM emsdk-base AS libvpx-builder
ENV LIBVPX_BRANCH=v1.13.1
COPY sources/libvpx-10b9492dcf05.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/libvpx.sh /src/build.sh
RUN bash -x /src/build.sh

# Build lame
FROM emsdk-base AS lame-builder
ENV LAME_BRANCH=master
COPY sources/lame-2badea1974ae.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/lame.sh /src/build.sh
RUN bash -x /src/build.sh

# Build ogg
FROM emsdk-base AS ogg-builder
ENV OGG_BRANCH=v1.3.4
COPY sources/ogg-bada45718453.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/ogg.sh /src/build.sh
RUN bash -x /src/build.sh

# Build theora
FROM emsdk-base AS theora-builder
COPY --from=ogg-builder $INSTALL_DIR $INSTALL_DIR
ENV THEORA_BRANCH=v1.1.1
COPY sources/theora-7ffd8b2ecfc2.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/theora.sh /src/build.sh
RUN bash -x /src/build.sh

# Build opus
FROM emsdk-base AS opus-builder
ENV OPUS_BRANCH=v1.3.1
COPY sources/opus-e85ed7726db5.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/opus.sh /src/build.sh
RUN bash -x /src/build.sh

# Build vorbis
FROM emsdk-base AS vorbis-builder
COPY --from=ogg-builder $INSTALL_DIR $INSTALL_DIR
ENV VORBIS_BRANCH=v1.3.3
COPY sources/vorbis-779816404319.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/vorbis.sh /src/build.sh
RUN bash -x /src/build.sh

# Build zlib
FROM emsdk-base AS zlib-builder
ENV ZLIB_BRANCH=v1.2.11
COPY sources/zlib-cacf7f1d4e3d.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/zlib.sh /src/build.sh
RUN bash -x /src/build.sh

# Build libwebp
FROM emsdk-base AS libwebp-builder
COPY --from=zlib-builder $INSTALL_DIR $INSTALL_DIR
ENV LIBWEBP_BRANCH=v1.3.2
COPY sources/libwebp-ca332209cb55.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/libwebp.sh /src/build.sh
RUN bash -x /src/build.sh

# Build freetype2
FROM emsdk-base AS freetype2-builder
ENV FREETYPE2_BRANCH=VER-2-10-4
COPY sources/freetype2-6a2b3e4007e7.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/freetype2.sh /src/build.sh
RUN bash -x /src/build.sh

# Build fribidi
FROM emsdk-base AS fribidi-builder
ENV FRIBIDI_BRANCH=v1.0.9
COPY sources/fribidi-f9e8e71a6fbf.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/fribidi.sh /src/build.sh
RUN bash -x /src/build.sh

# Build harfbuzz
FROM emsdk-base AS harfbuzz-builder
ENV HARFBUZZ_BRANCH=5.2.0
COPY sources/harfbuzz-4a1d891c6317.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/harfbuzz.sh /src/build.sh
RUN bash -x /src/build.sh

# Build libass
FROM emsdk-base AS libass-builder
COPY --from=freetype2-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=fribidi-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=harfbuzz-builder $INSTALL_DIR $INSTALL_DIR
ENV LIBASS_BRANCH=0.15.0
COPY sources/libass-d149636f502f.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/libass.sh /src/build.sh
RUN bash -x /src/build.sh

# Build zimg
FROM emsdk-base AS zimg-builder
ENV ZIMG_BRANCH=release-3.0.5
RUN apt-get update && apt-get install -y git
COPY sources/zimg-e5b0de6bebbc.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY build/zimg.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
COPY sources/FFmpeg-4729204c17f7.tar.gz /tmp/vision-source.tar.gz
RUN mkdir -p /src && tar -xzf /tmp/vision-source.tar.gz --strip-components=1 -C /src && rm /tmp/vision-source.tar.gz
COPY --from=x264-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=x265-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=libvpx-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=lame-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=opus-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=theora-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=vorbis-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=libwebp-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=libass-builder $INSTALL_DIR $INSTALL_DIR
COPY --from=zimg-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-libx265 \
      --enable-libvpx \
      --enable-libmp3lame \
      --enable-libtheora \
      --enable-libvorbis \
      --enable-libopus \
      --enable-zlib \
      --enable-libwebp \
      --enable-libfreetype \
      --enable-libfribidi \
      --enable-libass \
      --enable-libzimg 

# 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 \
      -lx265 \
      -lvpx \
      -lmp3lame \
      -logg \
      -ltheora \
      -lvorbis \
      -lvorbisenc \
      -lvorbisfile \
      -lopus \
      -lz \
      -lwebpmux \
      -lwebp \
      -lsharpyuv \
      -lfreetype \
      -lfribidi \
      -lharfbuzz \
      -lass \
      -lzimg
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
