116 lines
3.2 KiB
Bash
116 lines
3.2 KiB
Bash
#!/bin/sh
|
|
|
|
|
|
# Build the .wasm Module first
|
|
|
|
# Since we're compiling a side module here, so that we can load it without the
|
|
# runtime cruft, we have to explicitly compile in support for malloc and
|
|
# friends.
|
|
# Note memcpy, memmove and memset are explicitly exported, otherwise they will
|
|
# be eliminated by the SIDE_MODULE=2 setting - not sure why that happens.
|
|
|
|
# This NEEDS to be compiled with emscripten 1.38.47. Newer versions mess with
|
|
# malloc and friends and need some more glue code for side modules that I
|
|
# haven't quite worked out yet. If you have any idea how to build a SIDE_MODULE
|
|
# (or STANDALONE_WASM - as seems to be the new deal) with support for malloc,
|
|
# please let me know or file a PR.
|
|
|
|
# To install the correct version, issue the following in your emsdk directory:
|
|
# ./emsdk install 1.38.47
|
|
# ./emsdk activate 1.38.47
|
|
# source ./emsdk_env.sh
|
|
|
|
# The $EMSCRIPTEN_LIB var needs to point to the correct directory within the sdk
|
|
# that has emmalloc.cpp. This is usually $EMSDK/fastcomp/emscripten/system/lib
|
|
# but it might differ per system. I don't know.
|
|
# There used to be an $EMSCRIPTEN var set by the emsdk_env script that pointed
|
|
# to the correct directory, but this seems to have gone now.
|
|
|
|
# In conclusion, emscripten encapsulates everything that I hate about native
|
|
# development :/
|
|
|
|
EMSCRIPTEN_LIB=$EMSDK/fastcomp/emscripten/system/lib
|
|
|
|
emcc \
|
|
src/wasm/mpeg1.c \
|
|
src/wasm/mp2.c \
|
|
src/wasm/buffer.c \
|
|
$EMSCRIPTEN_LIB/emmalloc.cpp \
|
|
$EMSCRIPTEN_LIB/libc/musl/src/string/memcpy.c \
|
|
$EMSCRIPTEN_LIB/libc/musl/src/string/memmove.c \
|
|
$EMSCRIPTEN_LIB/libc/musl/src/string/memset.c \
|
|
-s WASM=1 \
|
|
-s SIDE_MODULE=2 \
|
|
-s TOTAL_STACK=5242880\
|
|
-s USE_PTHREADS=0 \
|
|
-s LEGALIZE_JS_FFI=0\
|
|
-s NO_FILESYSTEM=1 \
|
|
-s DEFAULT_LIBRARY_FUNCS_TO_INCLUDE="[]" \
|
|
-s "EXPORTED_FUNCTIONS=[
|
|
'_memcpy',
|
|
'_memmove',
|
|
'_memset',
|
|
'_mpeg1_decoder_create',
|
|
'_mpeg1_decoder_destroy',
|
|
'_mpeg1_decoder_get_write_ptr',
|
|
'_mpeg1_decoder_get_index',
|
|
'_mpeg1_decoder_set_index',
|
|
'_mpeg1_decoder_did_write',
|
|
'_mpeg1_decoder_has_sequence_header',
|
|
'_mpeg1_decoder_get_frame_rate',
|
|
'_mpeg1_decoder_get_coded_size',
|
|
'_mpeg1_decoder_get_width',
|
|
'_mpeg1_decoder_get_height',
|
|
'_mpeg1_decoder_get_y_ptr',
|
|
'_mpeg1_decoder_get_cr_ptr',
|
|
'_mpeg1_decoder_get_cb_ptr',
|
|
'_mpeg1_decoder_decode',
|
|
'_mp2_decoder_create',
|
|
'_mp2_decoder_destroy',
|
|
'_mp2_decoder_get_write_ptr',
|
|
'_mp2_decoder_get_index',
|
|
'_mp2_decoder_set_index',
|
|
'_mp2_decoder_did_write',
|
|
'_mp2_decoder_get_left_channel_ptr',
|
|
'_mp2_decoder_get_right_channel_ptr',
|
|
'_mp2_decoder_get_sample_rate',
|
|
'_mp2_decoder_decode']" \
|
|
-O3 \
|
|
-o jsmpeg.wasm
|
|
|
|
|
|
# Concat all .js sources
|
|
cat \
|
|
src/jsmpeg.js \
|
|
src/video-element.js \
|
|
src/player.js \
|
|
src/buffer.js \
|
|
src/ajax.js \
|
|
src/fetch.js \
|
|
src/ajax-progressive.js \
|
|
src/websocket.js \
|
|
src/ts.js \
|
|
src/decoder.js \
|
|
src/mpeg1.js \
|
|
src/mpeg1-wasm.js \
|
|
src/mp2.js \
|
|
src/mp2-wasm.js \
|
|
src/webgl.js \
|
|
src/canvas2d.js \
|
|
src/webaudio.js \
|
|
src/wasm-module.js \
|
|
> jsmpeg.js
|
|
|
|
# Append the .wasm module to the .js source as base64 string
|
|
echo "JSMpeg.WASM_BINARY_INLINED='$(base64 -w 0 jsmpeg.wasm)';" \
|
|
>> jsmpeg.js
|
|
|
|
|
|
# Minify
|
|
uglifyjs jsmpeg.js -o jsmpeg.min.js
|
|
|
|
# Cleanup
|
|
rm jsmpeg.js
|
|
rm jsmpeg.wasm
|
|
|