# syntax=docker/dockerfile-upstream:master-labs # 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=4729204c17f756e186d622060088371d10b34f7e 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=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 x265 FROM emsdk-base AS x265-builder ENV X265_BRANCH=2bb5520e9596f361bf0ed81b3b8da0d7fd999069 ADD https://github.com/ffmpegwasm/x265.git#$X265_BRANCH /src COPY build/x265.sh /src/build.sh RUN bash -x /src/build.sh # Build libvpx FROM emsdk-base AS libvpx-builder ENV LIBVPX_BRANCH=10b9492dcf05b652e2e4b370e205bd605d421972 ADD https://github.com/ffmpegwasm/libvpx.git#$LIBVPX_BRANCH /src COPY build/libvpx.sh /src/build.sh RUN bash -x /src/build.sh # Build lame FROM emsdk-base AS lame-builder ENV LAME_BRANCH=2badea1974ae36cb8312afe99cff1e6b3b5decee ADD https://github.com/ffmpegwasm/lame.git#$LAME_BRANCH /src COPY build/lame.sh /src/build.sh RUN bash -x /src/build.sh # Build ogg FROM emsdk-base AS ogg-builder ENV OGG_BRANCH=bada45718453ac27b56773ae663f7e65112f6a6e ADD https://github.com/ffmpegwasm/Ogg.git#$OGG_BRANCH /src 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=7ffd8b2ecfc2d93ae5e16028e7528e609266bfbf ADD https://github.com/ffmpegwasm/theora.git#$THEORA_BRANCH /src COPY build/theora.sh /src/build.sh RUN bash -x /src/build.sh # Build opus FROM emsdk-base AS opus-builder ENV OPUS_BRANCH=e85ed7726db5d677c9c0677298ea0cb9c65bdd23 ADD https://github.com/ffmpegwasm/opus.git#$OPUS_BRANCH /src 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=7798164043197d7e33f02de4353ce2aa5b248225 ADD https://github.com/ffmpegwasm/vorbis.git#$VORBIS_BRANCH /src COPY build/vorbis.sh /src/build.sh RUN bash -x /src/build.sh # Build zlib FROM emsdk-base AS zlib-builder ENV ZLIB_BRANCH=cacf7f1d4e3d44d871b605da3b647f07d718623f ADD https://github.com/ffmpegwasm/zlib.git#$ZLIB_BRANCH /src 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=ca332209cb5567c9b249c86788cb2dbf8847e760 ADD https://github.com/ffmpegwasm/libwebp.git#$LIBWEBP_BRANCH /src COPY build/libwebp.sh /src/build.sh RUN bash -x /src/build.sh # Build freetype2 FROM emsdk-base AS freetype2-builder ENV FREETYPE2_BRANCH=6a2b3e4007e794bfc6c91030d0ed987f925164a8 ADD https://github.com/ffmpegwasm/freetype2.git#$FREETYPE2_BRANCH /src COPY build/freetype2.sh /src/build.sh RUN bash -x /src/build.sh # Build fribidi FROM emsdk-base AS fribidi-builder ENV FRIBIDI_BRANCH=f9e8e71a6fbf4a4619481284c9f484d10e559995 ADD https://github.com/fribidi/fribidi.git#$FRIBIDI_BRANCH /src COPY build/fribidi.sh /src/build.sh RUN bash -x /src/build.sh # Build harfbuzz FROM emsdk-base AS harfbuzz-builder ENV HARFBUZZ_BRANCH=4a1d891c6317d2c83e5f3c2607ec5f5ccedffcde ADD https://github.com/harfbuzz/harfbuzz.git#$HARFBUZZ_BRANCH /src 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=d149636f502f5774ae1a8fb4c554b122674393b2 ADD https://github.com/libass/libass.git#$LIBASS_BRANCH /src COPY build/libass.sh /src/build.sh RUN bash -x /src/build.sh # Build zimg FROM emsdk-base AS zimg-builder ENV ZIMG_BRANCH=e5b0de6bebbcbc66732ed5afaafef6b2c7dfef87 RUN apt-get update && apt-get install -y git RUN git clone --recursive -b $ZIMG_BRANCH https://github.com/sekrit-twc/zimg.git /src 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 ADD https://github.com/FFmpeg/FFmpeg.git#$FFMPEG_VERSION /src 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