# syntax=docker/dockerfile:1 # # FFmpeg's AAC decoder compiled to WebAssembly for johnmcm.com's Video Repair # (/repair-video): it tells the page how many bytes each raw AAC frame takes, # so the sound of a recording cut off before its index can be found and # copied without a working clip. FFmpeg 5.1.6 (LGPL-2.1-or-later), the same # release and tarball as the site's FFmpeg (wasm-src/ffmpeg/, published at # /source/ffmpeg/), built with the AAC decoder and nothing else; the glue is # src/aacscan.c. The Emscripten image is pinned by version and digest. # # Built from wasm-src/ so the FFmpeg tarball is shared, not copied: # ./build.ps1 (or, in wasm-src) docker build -f aacscan/Dockerfile --target export --output type=local,dest=aacscan/dist . ARG EMSDK_IMAGE=emscripten/emsdk:6.0.10@sha256:e077d54e2b8970575ebc4f185ac1de0b95c05f2b266134d4ba27449af7aebf65 FROM ${EMSDK_IMAGE} AS build ARG FFMPEG_SHA256=f4fa066278f7a47feab316fef905f4db0d5e9b589451949740f83972b30901bd COPY ffmpeg/source/ffmpeg-5.1.6.tar.xz /src/ RUN cd /src \ && echo "${FFMPEG_SHA256} ffmpeg-5.1.6.tar.xz" | sha256sum -c - \ && tar xf ffmpeg-5.1.6.tar.xz RUN cd /src/ffmpeg-5.1.6 \ && emconfigure ./configure \ --target-os=none --arch=x86_32 --enable-cross-compile \ --cc=emcc --cxx=em++ --ar=emar --ranlib=emranlib --nm=emnm --objcc=emcc --dep-cc=emcc \ --extra-cflags="-O3" \ --disable-asm --disable-x86asm --disable-inline-asm --disable-stripping --disable-runtime-cpudetect \ --disable-autodetect --disable-network --disable-doc --disable-debug \ --disable-pthreads --disable-w32threads --disable-os2threads \ --disable-programs --disable-everything \ --disable-avdevice --disable-avformat --disable-avfilter --disable-swscale --disable-swresample --disable-postproc \ --enable-decoder=aac \ && emmake make -j"$(nproc)" libavcodec/libavcodec.a libavutil/libavutil.a WORKDIR /build COPY aacscan/src/aacscan.c . RUN mkdir -p /out \ && emcc -O3 -I/src/ffmpeg-5.1.6 aacscan.c /src/ffmpeg-5.1.6/libavcodec/libavcodec.a /src/ffmpeg-5.1.6/libavutil/libavutil.a -o /out/aacscan.mjs \ -sMODULARIZE=1 -sEXPORT_ES6=1 -sEXPORT_NAME=createAacScan \ -sENVIRONMENT=web,worker,node \ -sALLOW_MEMORY_GROWTH=1 \ -sFILESYSTEM=0 \ -sDYNAMIC_EXECUTION=0 \ -sINCOMING_MODULE_JS_API=print,printErr,locateFile \ -sEXPORTED_FUNCTIONS=_aacs_alloc,_aacs_free,_aacs_open,_aacs_close,_aacs_frame,_aacs_samples,_aacs_channels \ -sEXPORTED_RUNTIME_METHODS=HEAPU8 FROM scratch AS export COPY --from=build /out/ /