# Recut's ffmpeg core: FFmpeg n5.1.4 compiled to WebAssembly (one thread) under the LGPL v2.1+. # # No --enable-gpl, no --enable-nonfree and no GPL libraries: x264 and x265, which the stock # @ffmpeg/core includes (making it GPL), are left out. What is linked in: # OpenH264 v2.6.0 BSD 2-clause H.264 encoding # libvpx v1.13.1 BSD 3-clause VP8 / VP9 (WebM) # libvorbis, libogg BSD 3-clause Vorbis (WebM sound) # LAME LGPL v2 MP3 encoding # libwebp v1.3.2 BSD 3-clause WebP # zlib v1.2.11 zlib PNG # The JavaScript binding, the patched fftools and the per-library build scripts come from # ffmpeg.wasm (MIT) at a pinned commit. Every source is fetched as a pinned tarball. # # Build with ./build.sh, which also copies the result and the licence texts into public/ffmpeg. # This file and build.sh are the build scripts the LGPL asks to be kept with the binary. # 3.1.47 is the closest release to ffmpeg.wasm's 3.1.40 that is also published for arm64 # (pass --build-arg EMSDK=emscripten/emsdk:3.1.47-arm64 on Apple silicon to build natively). ARG EMSDK=emscripten/emsdk:3.1.47 FROM ${EMSDK} AS emsdk-base ENV INSTALL_DIR=/opt ENV FFMPEG_ST=yes # No -msimd128: measured in Chrome it gains under 15% here (the encoders have no hand-written # WebAssembly SIMD), and without it the core also loads in WebKit older than Safari 16.4, which # is what the Mac app's window is on macOS 12. ENV CFLAGS="-I$INSTALL_DIR/include -O3" ENV CXXFLAGS="$CFLAGS" ENV LDFLAGS="-L$INSTALL_DIR/lib $CFLAGS" ENV 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=$EM_PKG_CONFIG_PATH RUN apt-get update && apt-get install -y pkg-config autoconf automake libtool # fetch : a pinned source tarball, unpacked. RUN printf '#!/bin/bash\nset -euo pipefail\nmkdir -p "$2"\ncurl -fL --retry 8 --retry-delay 3 --retry-all-errors -o /tmp/src.tar.gz "$1"\ntar -xzf /tmp/src.tar.gz -C "$2" --strip-components=1\nrm /tmp/src.tar.gz\n' > /usr/local/bin/fetch && chmod +x /usr/local/bin/fetch # ffmpeg.wasm's build scripts, binding and patched fftools (MIT; fftools are FFmpeg's, LGPL). FROM emsdk-base AS ffmpegwasm RUN fetch https://github.com/ffmpegwasm/ffmpeg.wasm/archive/f876f907c7e9b9bf51d4ed0b913a855a63ae63fc.tar.gz /ffmpegwasm # OpenH264 v2.6.0 (BSD 2-clause), plain C++ without assembly. FROM emsdk-base AS openh264-builder RUN fetch https://github.com/cisco/openh264/archive/refs/tags/v2.6.0.tar.gz /src WORKDIR /src RUN sed -i 's/ -fPIC//' build/platform-gnu-chain.mk && \ emmake make -j8 OS=linux ARCH=wasm32 USE_ASM=No USE_STACK_PROTECTOR=No CC=emcc CXX=em++ AR=emar libopenh264.a && \ emmake make OS=linux ARCH=wasm32 USE_ASM=No USE_STACK_PROTECTOR=No CC=emcc CXX=em++ AR=emar PREFIX=$INSTALL_DIR install-static # libvpx v1.13.1 (BSD) FROM emsdk-base AS libvpx-builder RUN fetch https://github.com/ffmpegwasm/libvpx/archive/9d36fd0ac716fb3357b498ec9c04f71c6ab1022b.tar.gz /src WORKDIR /src COPY --from=ffmpegwasm /ffmpegwasm/build/libvpx.sh /src/build.sh RUN bash -x /src/build.sh # LAME (LGPL) FROM emsdk-base AS lame-builder RUN fetch https://github.com/ffmpegwasm/lame/archive/2badea1974ae36cb8312afe99cff1e6b3b5decee.tar.gz /src WORKDIR /src COPY --from=ffmpegwasm /ffmpegwasm/build/lame.sh /src/build.sh RUN bash -x /src/build.sh # Ogg v1.3.4 and Vorbis v1.3.3 (BSD), for WebM sound FROM emsdk-base AS ogg-builder RUN fetch https://github.com/ffmpegwasm/Ogg/archive/3328abd152508614f7ce4cd491dc98d14eba7ffc.tar.gz /src WORKDIR /src COPY --from=ffmpegwasm /ffmpegwasm/build/ogg.sh /src/build.sh RUN bash -x /src/build.sh FROM emsdk-base AS vorbis-builder COPY --from=ogg-builder $INSTALL_DIR $INSTALL_DIR RUN fetch https://github.com/ffmpegwasm/vorbis/archive/beb80fd33dc125d7aa9ddd6a2a3e64c6ca82a46d.tar.gz /src WORKDIR /src COPY --from=ffmpegwasm /ffmpegwasm/build/vorbis.sh /src/build.sh RUN bash -x /src/build.sh # zlib v1.2.11 FROM emsdk-base AS zlib-builder RUN fetch https://github.com/ffmpegwasm/zlib/archive/7085a61bce3ed39d5e56ca4d01d80f4338c8a4a6.tar.gz /src WORKDIR /src COPY --from=ffmpegwasm /ffmpegwasm/build/zlib.sh /src/build.sh RUN bash -x /src/build.sh # libwebp v1.3.2 (BSD) FROM emsdk-base AS libwebp-builder COPY --from=zlib-builder $INSTALL_DIR $INSTALL_DIR RUN fetch https://github.com/ffmpegwasm/libwebp/archive/004d0a19143abc4494474da905b4eca34c7763db.tar.gz /src WORKDIR /src COPY --from=ffmpegwasm /ffmpegwasm/build/libwebp.sh /src/build.sh RUN bash -x /src/build.sh FROM emsdk-base AS ffmpeg-base RUN fetch https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n5.1.4.tar.gz /src WORKDIR /src COPY --from=openh264-builder $INSTALL_DIR $INSTALL_DIR COPY --from=libvpx-builder $INSTALL_DIR $INSTALL_DIR COPY --from=lame-builder $INSTALL_DIR $INSTALL_DIR COPY --from=vorbis-builder $INSTALL_DIR $INSTALL_DIR COPY --from=zlib-builder $INSTALL_DIR $INSTALL_DIR COPY --from=libwebp-builder $INSTALL_DIR $INSTALL_DIR # FFmpeg itself: LGPL (no --enable-gpl, no --enable-nonfree). H.264 is decoded by FFmpeg's own # decoder; OpenH264's decoder is left out (it needs threads this build does not have). FROM ffmpeg-base AS ffmpeg-builder COPY --from=ffmpegwasm /ffmpegwasm/build/ffmpeg.sh /src/build.sh RUN sed -i 's/emmake make -j$/emmake make -j8/' /src/build.sh && bash -x /src/build.sh \ --disable-network \ --disable-outdevs \ --enable-libopenh264 \ --disable-decoder=libopenh264 \ --enable-libvpx \ --enable-libmp3lame \ --enable-libvorbis \ --enable-zlib \ --enable-libwebp FROM ffmpeg-builder AS ffmpeg-wasm-builder COPY --from=ffmpegwasm /ffmpegwasm/src/bind /src/src/bind COPY --from=ffmpegwasm /ffmpegwasm/src/fftools /src/src/fftools COPY --from=ffmpegwasm /ffmpegwasm/build/ffmpeg-wasm.sh build.sh # postproc is GPL-only and SDL is not used. RUN sed -i -e '/-Llibpostproc/d' -e '/-lpostproc/d' -e '/-sUSE_SDL=2/d' build.sh ENV FFMPEG_LIBS="-lopenh264 -lvpx -lmp3lame -logg -lvorbis -lvorbisenc -lvorbisfile -lz -lwebpmux -lwebp -lsharpyuv" RUN mkdir -p /src/dist/esm && bash -x /src/build.sh \ ${FFMPEG_LIBS} \ -sEXPORT_ES6 \ -o dist/esm/ffmpeg-core.js RUN grep -E "^#define (FFMPEG_CONFIGURATION|FFMPEG_LICENSE|CONFIG_GPL|CONFIG_NONFREE|CONFIG_VERSION3) " /src/config.h > /src/dist/config.txt # The licence texts that travel with the binary. FROM emsdk-base AS licenses COPY --from=ffmpeg-base /src/COPYING.LGPLv2.1 /licenses/FFmpeg-COPYING.LGPLv2.1.txt COPY --from=ffmpeg-base /src/LICENSE.md /licenses/FFmpeg-LICENSE.md COPY --from=openh264-builder /src/LICENSE /licenses/openh264-LICENSE.txt COPY --from=libvpx-builder /src/LICENSE /licenses/libvpx-LICENSE.txt COPY --from=libvpx-builder /src/PATENTS /licenses/libvpx-PATENTS.txt COPY --from=lame-builder /src/COPYING /licenses/lame-COPYING.txt COPY --from=ogg-builder /src/COPYING /licenses/libogg-COPYING.txt COPY --from=vorbis-builder /src/COPYING /licenses/libvorbis-COPYING.txt COPY --from=zlib-builder /src/README /licenses/zlib-README.txt COPY --from=libwebp-builder /src/COPYING /licenses/libwebp-COPYING.txt COPY --from=libwebp-builder /src/PATENTS /licenses/libwebp-PATENTS.txt COPY --from=ffmpegwasm /ffmpegwasm/LICENSE /licenses/ffmpeg.wasm-LICENSE.txt FROM scratch AS exportor COPY --from=ffmpeg-wasm-builder /src/dist/esm /core COPY --from=ffmpeg-wasm-builder /src/dist/config.txt /core/config.txt COPY --from=licenses /licenses /licenses