From 1fd52fd851a0ee3025e7c015ffc2ed95ae46f7a4 Mon Sep 17 00:00:00 2001 From: Jerome Wu Date: Tue, 4 Oct 2022 14:53:42 +0800 Subject: [PATCH] Add x265 and lame --- Dockerfile | 40 ++++++++++++++++++++++----- Makefile | 2 +- build/ffmpeg-wasm.sh | 3 ++- build/ffmpeg.sh | 10 +++---- build/lame.sh | 15 +++++++++++ build/x265.sh | 64 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 120 insertions(+), 14 deletions(-) create mode 100755 build/lame.sh create mode 100755 build/x265.sh diff --git a/Dockerfile b/Dockerfile index 568df6b..b364e2a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,22 +6,38 @@ ARG EXTRA_CFLAGS ARG EXTRA_LDFLAGS ARG FFMPEG_ST ARG FFMPEG_MT -ENV INSTALL_DIR=/src/build +ENV INSTALL_DIR=/build ENV FFMPEG_VERSION=n5.1 -ENV X264_BRANCH=4-cores -ENV CFLAGS="$CFLAGS $EXTRA_CFLAGS" +ENV CFLAGS="-I$INSTALL_DIR/include $CFLAGS $EXTRA_CFLAGS" +ENV CXXFLAGS="$CFLAGS" ENV LDFLAGS="$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 # Build x264 FROM emsdk-base AS x264-builder +ENV X264_BRANCH=4-cores 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=3.4 +ADD https://github.com/ffmpegwasm/x265.git#$X265_BRANCH /src +COPY build/x265.sh /src/build.sh +RUN bash -x /src/build.sh + +# Build lame +FROM emsdk-base AS lame-builder +ENV LAME_BRANCH=master +ADD https://github.com/ffmpegwasm/lame.git#$LAME_BRANCH /src +COPY build/lame.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 apt-get update && \ @@ -29,19 +45,31 @@ RUN apt-get update && \ 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=lame-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 +RUN bash -x /src/build.sh \ + --enable-gpl \ + --enable-libx264 \ + --enable-libx265 \ + --enable-libmp3lame # 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 -RUN mkdir -p /src/dist/umd && bash -x /src/build.sh -o dist/umd/ffmpeg-core.js -RUN mkdir -p /src/dist/esm && bash -x /src/build.sh -sEXPORT_ES6 -o dist/esm/ffmpeg-core.js +ENV FFMPEG_LIBS="-lx264 -lx265 -lmp3lame" +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 diff --git a/Makefile b/Makefile index 6c9dd92..80cb152 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all: dev MT_FLAGS := -sUSE_PTHREADS -pthread -DEV_ARGS := --progress=plain +# DEV_ARGS := --progress=plain DEV_CFLAGS := --profiling DEV_MT_CFLAGS := $(DEV_CFLAGS) $(MT_FLAGS) PROD_CFLAGS := -O3 -msimd128 diff --git a/build/ffmpeg-wasm.sh b/build/ffmpeg-wasm.sh index a22665e..e4bf51b 100755 --- a/build/ffmpeg-wasm.sh +++ b/build/ffmpeg-wasm.sh @@ -3,6 +3,8 @@ # ex: # bash ffmpeg-wasm.sh -o ffmpeg.js +set -euo pipefail + EXPORT_NAME="createFFmpegCore" CONF_FLAGS=( @@ -26,7 +28,6 @@ CONF_FLAGS=( -lpostproc -lswresample -lswscale - -lx264 -Wno-deprecated-declarations $LDFLAGS -sUSE_SDL=2 # use emscripten SDL2 lib port diff --git a/build/ffmpeg.sh b/build/ffmpeg.sh index 7091249..486111a 100755 --- a/build/ffmpeg.sh +++ b/build/ffmpeg.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -euo pipefail + CONF_FLAGS=( --target-os=none # disable target specific configs --arch=x86_32 # use x86_32 arch @@ -21,15 +23,11 @@ CONF_FLAGS=( --objcc=emcc --dep-cc=emcc --extra-cflags="$CFLAGS" - --extra-cxxflags="$CFLAGS" + --extra-cxxflags="$CXXFLAGS" # disable thread when FFMPEG_ST is NOT defined ${FFMPEG_ST:+ --disable-pthreads --disable-w32threads --disable-os2threads} - - # extra libraries - --enable-gpl - --enable-libx264 ) -emconfigure ./configure "${CONF_FLAGS[@]}" +emconfigure ./configure "${CONF_FLAGS[@]}" $@ emmake make -j diff --git a/build/lame.sh b/build/lame.sh new file mode 100755 index 0000000..59e6758 --- /dev/null +++ b/build/lame.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -euo pipefail + +CONF_FLAGS=( + --prefix=$INSTALL_DIR # install library in a build directory for FFmpeg to include + --host=i686-linux # use i686 linux + --disable-shared # disable shared library + --disable-frontend # exclude lame executable + --disable-analyzer-hooks # exclude analyzer hooks + --disable-dependency-tracking # speed up one-time build + --disable-gtktest +) +CFLAGS=$CFLAGS emconfigure ./configure "${CONF_FLAGS[@]}" +emmake make install -j diff --git a/build/x265.sh b/build/x265.sh new file mode 100755 index 0000000..d264b2f --- /dev/null +++ b/build/x265.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +set -euo pipefail + +BASE_FLAGS=( + -DCMAKE_TOOLCHAIN_FILE=$EM_TOOLCHAIN_FILE + -DENABLE_LIBNUMA=OFF + -DENABLE_SHARED=OFF + -DENABLE_CLI=OFF +) + +FLAGS_12BIT=( + ${BASE_FLAGS[@]} + -DHIGH_BIT_DEPTH=ON + -DEXPORT_C_API=OFF + -DMAIN12=ON +) + +FLAGS_10BIT=( + ${BASE_FLAGS[@]} + -DHIGH_BIT_DEPTH=ON + -DEXPORT_C_API=OFF +) + +FLAGS_MAIN=( + ${BASE_FLAGS[@]} + -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR + -DEXTRA_LIB="x265_main10.a;x265_main12.a" + -DEXTRA_LINK_FLAGS=-L. + -DLINKED_10BIT=ON + -DLINKED_12BIT=ON +) + +cd source +rm -rf build +mkdir -p build +cd build +mkdir -p main 10bit 12bit + +cd 12bit +emmake cmake ../.. -DCMAKE_CXX_FLAGS="$CXXFLAGS" ${FLAGS_12BIT[@]} +emmake make -j + +cd ../10bit +emmake cmake ../.. -DCMAKE_CXX_FLAGS="$CXXFLAGS" ${FLAGS_10BIT[@]} +emmake make -j + +cd ../main +ln -sf ../10bit/libx265.a libx265_main10.a +ln -sf ../12bit/libx265.a libx265_main12.a +emmake cmake ../.. -DCMAKE_CXX_FLAGS="$CXXFLAGS" ${FLAGS_MAIN[@]} +emmake make -j +mv libx265.a libx265_main.a + +# Merge static libraries +emar -M <