@signageos/samsung-wasm-decoder
v0.0.0
Published
Drop-in (mostly) API-compatible implementation of `nacl-decoder`, but using Samsung's WASM EMSS (ElementaryMediaStreamSource) + a `<video>` element.
Keywords
Readme
samsung-wasm-decoder
Drop-in (mostly) API-compatible implementation of nacl-decoder, but using Samsung's WASM EMSS (ElementaryMediaStreamSource) + a <video> element.
JS/TS API
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 <video> element (default id: video-element).
Expected runtime
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.
Build (native / emscripten CLI)
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.
Prerequisites
- Samsung customized Emscripten SDK installed and activated (so
emccis onPATH). - A shell session where the SDK env is loaded (often via
source /path/to/emsdk_env.sh).
Compile
cd /mnt/data/home/misak113/dev/supraio/samsung-wasm-decoder/native
# If your Samsung emsdk isn't already active:
source /path/to/samsung-emsdk/emsdk_env.sh
make clean
makeBootstrap emcc locally (optional)
If you don’t have emcc available, you can bootstrap an upstream emsdk into this repo:
cd /mnt/data/home/misak113/dev/supraio/samsung-wasm-decoder/native
make emsdk
make all-emsdkThis 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
Build flags (why they matter)
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 headers/libs aren’t found
If your SDK does not expose the Samsung extension headers on default include paths, pass extra include/link flags:
make EXTRA_CFLAGS='-I/path/to/samsung/extensions/include' \
EXTRA_LDFLAGS='-L/path/to/samsung/extensions/lib'Runtime loading
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():
// Option A: include the generated JS via <script> and then:
globalThis.SamsungWasmDecoderModule = await SamsungWasmDecoderModule({});
// Option B: if you bundle/pack it, ensure the factory is reachable and do the same.After that:
import { createNaClDecoder, VideoProfile, HWAcceleration } from 'samsung-wasm-decoder';
const decoder = createNaClDecoder({ videoElementId: 'video-element' });
await decoder.initialize({
graphics3DContext: { width: 1920, height: 1080 },
profile: VideoProfile.H264High,
acceleration: HWAcceleration.WithFallback,
minPictureCount: 4,
});
// Feed Annex-B H264 access units:
await decoder.decode({ decodeId: 0, data: someNalAccessUnitArrayBuffer });Notes
- Input to
decode()/decodeAndRender()is expected to be H264 NAL access-unit bytes (commonly Annex-B). Keyframe detection is best-effort (IDR NAL type 5). getPicture()/render()/recyclePicture()are compatibility shims; for display usedecoder.videoElement.
