Drop-in (mostly) API-compatible implementation of `nacl-decoder`, but using Samsung's WASM EMSS (ElementaryMediaStreamSource) + a `<video>` element.
npm install @signageos/samsung-wasm-decoderDrop-in (mostly) API-compatible implementation of nacl-decoder, but using Samsung's WASM EMSS (ElementaryMediaStreamSource) + a element.
This package exports the same symbols as nacl-decoder:
- createNaClDecoder() (creates a WASM-backed decoder)
- isNaClSupported() (checks WebAssembly + Samsung EMSS bindings)
- NaClDecoder (class)
- VideoDecoder, VideoProfile, HWAcceleration, ResultStatus
Rendering happens via a element (default id: video-element).
The TS wrapper expects an Emscripten module instance available as:
- globalThis.SamsungWasmDecoderModule
The native module must export the C functions declared in native/decoder.cpp.
This project is intended to be built with Samsung-customized Emscripten SDK (the one that provides Tizen WebAssembly extensions). The upstream emsdk typically will not have the samsung/* headers and EMSS runtime.
If you only need a local emcc toolchain on your dev machine, native/Makefile also includes an optional upstream emsdk bootstrap (downloaded into ./emscripten/). This is useful to get emcc into PATH, but it still won’t provide Samsung’s EMSS headers unless you use Samsung’s customized SDK.
- Samsung customized Emscripten SDK installed and activated (so emcc is on PATH).
- A shell session where the SDK env is loaded (often via source /path/to/emsdk_env.sh).
``bash
cd /mnt/data/home/misak113/dev/supraio/samsung-wasm-decoder/native
make clean
make
`
If you don’t have emcc available, you can bootstrap an upstream emsdk into this repo:
`bash
cd /mnt/data/home/misak113/dev/supraio/samsung-wasm-decoder/native
make emsdk
make all-emsdk
`
This downloads emsdk into samsung-wasm-decoder/emscripten/emsdk and builds in a subshell that sources emsdk_env.sh.
Outputs:
- native/dist/samsung_wasm_decoder.jsnative/dist/samsung_wasm_decoder.wasm
-
The native/Makefile uses the same required flags described in Samsung’s WebAssemblyDemos EMSS samples:
- -s ENVIRONMENT_MAY_BE_TIZEN (enables Samsung Tizen Emscripten extensions; required for EMSS)-pthread -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=1
- (EMSS samples use threads; pool size must be >= threads you create)
If your SDK does not expose the Samsung extension headers on default include paths, pass extra include/link flags:
`bash`
make EXTRA_CFLAGS='-I/path/to/samsung/extensions/include' \
EXTRA_LDFLAGS='-L/path/to/samsung/extensions/lib'
The native build is modularized (-s MODULARIZE=1 -s EXPORT_NAME=SamsungWasmDecoderModule). That means native/dist/samsung_wasm_decoder.js defines a factory function.
You must instantiate it and assign the resulting module instance to globalThis.SamsungWasmDecoderModule before calling createNaClDecoder():
`js
// Option A: include the generated JS via