@stream-io/video-filters-web 0.8.6 → 0.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/src/BaseVideoProcessor.js +107 -0
- package/dist/esm/src/BaseVideoProcessor.js.map +1 -0
- package/dist/esm/src/FallbackGenerator.js +58 -0
- package/dist/esm/src/FallbackGenerator.js.map +1 -0
- package/dist/esm/src/FallbackProcessor.js +89 -0
- package/dist/esm/src/FallbackProcessor.js.map +1 -0
- package/dist/esm/src/FullScreenBlur.js +41 -0
- package/dist/esm/src/FullScreenBlur.js.map +1 -0
- package/dist/esm/src/FullScreenBlurRenderer.js +276 -0
- package/dist/esm/src/FullScreenBlurRenderer.js.map +1 -0
- package/dist/esm/src/VirtualBackground.js +143 -0
- package/dist/esm/src/VirtualBackground.js.map +1 -0
- package/dist/esm/src/WebGLRenderer.js +723 -0
- package/dist/esm/src/WebGLRenderer.js.map +1 -0
- package/dist/esm/src/compatibility.js +48 -0
- package/dist/esm/src/compatibility.js.map +1 -0
- package/dist/esm/src/legacy/createRenderer.js +33 -0
- package/dist/esm/src/legacy/createRenderer.js.map +1 -0
- package/dist/esm/src/legacy/helpers/webglHelper.js +94 -0
- package/dist/esm/src/legacy/helpers/webglHelper.js.map +1 -0
- package/dist/esm/src/legacy/segmentation.js +14 -0
- package/dist/esm/src/legacy/segmentation.js.map +1 -0
- package/dist/esm/src/legacy/tflite-simd.js +728 -0
- package/dist/esm/src/legacy/tflite-simd.js.map +1 -0
- package/dist/esm/src/legacy/tflite.js +31 -0
- package/dist/esm/src/legacy/tflite.js.map +1 -0
- package/dist/esm/src/legacy/webgl2/backgroundBlurStage.js +202 -0
- package/dist/esm/src/legacy/webgl2/backgroundBlurStage.js.map +1 -0
- package/dist/esm/src/legacy/webgl2/backgroundImageStage.js +157 -0
- package/dist/esm/src/legacy/webgl2/backgroundImageStage.js.map +1 -0
- package/dist/esm/src/legacy/webgl2/jointBilateralFilterStage.js +113 -0
- package/dist/esm/src/legacy/webgl2/jointBilateralFilterStage.js.map +1 -0
- package/dist/esm/src/legacy/webgl2/resizingStage.js +57 -0
- package/dist/esm/src/legacy/webgl2/resizingStage.js.map +1 -0
- package/dist/esm/src/legacy/webgl2/softmaxStage.js +51 -0
- package/dist/esm/src/legacy/webgl2/softmaxStage.js.map +1 -0
- package/dist/esm/src/legacy/webgl2/webgl2Pipeline.js +105 -0
- package/dist/esm/src/legacy/webgl2/webgl2Pipeline.js.map +1 -0
- package/dist/esm/src/mediapipe.js +16 -0
- package/dist/esm/src/mediapipe.js.map +1 -0
- package/dist/esm/src/types.js +11 -0
- package/dist/esm/src/types.js.map +1 -0
- package/dist/esm/src/version.js +5 -0
- package/dist/esm/src/version.js.map +1 -0
- package/dist/index.cjs.js +1 -1
- package/package.json +3 -3
- package/dist/index.es.js +0 -3022
- package/dist/index.es.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tflite-simd.js","sources":["../../../../src/legacy/tflite-simd.js"],"sourcesContent":["export const createTFLiteSIMDModule = (__Module) => {\n __Module = __Module || {};\n\n var _scriptDir =\n typeof document !== 'undefined' && document.currentScript\n ? document.currentScript.src\n : undefined;\n\n var Module = typeof __Module != 'undefined' ? __Module : {};\n var readyPromiseResolve, readyPromiseReject;\n Module['ready'] = new Promise(function (resolve, reject) {\n readyPromiseResolve = resolve;\n readyPromiseReject = reject;\n });\n var moduleOverrides = Object.assign({}, Module);\n var arguments_ = [];\n var thisProgram = './this.program';\n var quit_ = (status, toThrow) => {\n throw toThrow;\n };\n var ENVIRONMENT_IS_WEB = true;\n var ENVIRONMENT_IS_WORKER = false;\n var scriptDirectory = '';\n\n function locateFile(path) {\n if (Module['locateFile']) {\n return Module['locateFile'](path, scriptDirectory);\n }\n return scriptDirectory + path;\n }\n\n var read_, readAsync, readBinary, setWindowTitle;\n if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n if (ENVIRONMENT_IS_WORKER) {\n // eslint-disable-next-line no-restricted-globals\n scriptDirectory = self.location.href;\n } else if (typeof document != 'undefined' && document.currentScript) {\n scriptDirectory = document.currentScript.src;\n }\n if (_scriptDir) {\n scriptDirectory = _scriptDir;\n }\n if (scriptDirectory.indexOf('blob:') !== 0) {\n scriptDirectory = scriptDirectory.substr(\n 0,\n scriptDirectory.replace(/[?#].*/, '').lastIndexOf('/') + 1,\n );\n } else {\n scriptDirectory = '';\n }\n {\n read_ = (url) => {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, false);\n xhr.send(null);\n return xhr.responseText;\n };\n if (ENVIRONMENT_IS_WORKER) {\n readBinary = (url) => {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, false);\n xhr.responseType = 'arraybuffer';\n xhr.send(null);\n return new Uint8Array(xhr.response);\n };\n }\n readAsync = (url, onload, onerror) => {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.responseType = 'arraybuffer';\n xhr.onload = () => {\n if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {\n onload(xhr.response);\n return;\n }\n onerror();\n };\n xhr.onerror = onerror;\n xhr.send(null);\n };\n }\n setWindowTitle = (title) => (document.title = title);\n } else {\n }\n var out = Module['print'] || console.log.bind(console);\n var err = Module['printErr'] || console.warn.bind(console);\n Object.assign(Module, moduleOverrides);\n moduleOverrides = null;\n if (Module['arguments']) arguments_ = Module['arguments'];\n if (Module['thisProgram']) thisProgram = Module['thisProgram'];\n if (Module['quit']) quit_ = Module['quit'];\n var POINTER_SIZE = 4;\n var wasmBinary;\n if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];\n var noExitRuntime = Module['noExitRuntime'] || true;\n if (typeof WebAssembly != 'object') {\n abort('no native wasm support detected');\n }\n var wasmMemory;\n var ABORT = false;\n var EXITSTATUS;\n\n function assert(condition, text) {\n if (!condition) {\n abort(text);\n }\n }\n\n var UTF8Decoder =\n typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined;\n\n function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead) {\n var endIdx = idx + maxBytesToRead;\n var endPtr = idx;\n while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\n if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\n return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));\n }\n var str = '';\n while (idx < endPtr) {\n var u0 = heapOrArray[idx++];\n if (!(u0 & 128)) {\n str += String.fromCharCode(u0);\n continue;\n }\n var u1 = heapOrArray[idx++] & 63;\n if ((u0 & 224) == 192) {\n str += String.fromCharCode(((u0 & 31) << 6) | u1);\n continue;\n }\n var u2 = heapOrArray[idx++] & 63;\n if ((u0 & 240) == 224) {\n u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;\n } else {\n u0 =\n ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63);\n }\n if (u0 < 65536) {\n str += String.fromCharCode(u0);\n } else {\n var ch = u0 - 65536;\n str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));\n }\n }\n return str;\n }\n\n function UTF8ToString(ptr, maxBytesToRead) {\n return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';\n }\n\n function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {\n if (!(maxBytesToWrite > 0)) return 0;\n var startIdx = outIdx;\n var endIdx = outIdx + maxBytesToWrite - 1;\n for (var i = 0; i < str.length; ++i) {\n var u = str.charCodeAt(i);\n if (u >= 55296 && u <= 57343) {\n var u1 = str.charCodeAt(++i);\n u = (65536 + ((u & 1023) << 10)) | (u1 & 1023);\n }\n if (u <= 127) {\n if (outIdx >= endIdx) break;\n heap[outIdx++] = u;\n } else if (u <= 2047) {\n if (outIdx + 1 >= endIdx) break;\n heap[outIdx++] = 192 | (u >> 6);\n heap[outIdx++] = 128 | (u & 63);\n } else if (u <= 65535) {\n if (outIdx + 2 >= endIdx) break;\n heap[outIdx++] = 224 | (u >> 12);\n heap[outIdx++] = 128 | ((u >> 6) & 63);\n heap[outIdx++] = 128 | (u & 63);\n } else {\n if (outIdx + 3 >= endIdx) break;\n heap[outIdx++] = 240 | (u >> 18);\n heap[outIdx++] = 128 | ((u >> 12) & 63);\n heap[outIdx++] = 128 | ((u >> 6) & 63);\n heap[outIdx++] = 128 | (u & 63);\n }\n }\n heap[outIdx] = 0;\n return outIdx - startIdx;\n }\n\n var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n\n function updateGlobalBufferAndViews(buf) {\n buffer = buf;\n Module['HEAP8'] = HEAP8 = new Int8Array(buf);\n Module['HEAP16'] = HEAP16 = new Int16Array(buf);\n Module['HEAP32'] = HEAP32 = new Int32Array(buf);\n Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf);\n Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf);\n Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf);\n Module['HEAPF32'] = HEAPF32 = new Float32Array(buf);\n Module['HEAPF64'] = HEAPF64 = new Float64Array(buf);\n }\n\n var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;\n var wasmTable;\n var __ATPRERUN__ = [];\n var __ATINIT__ = [];\n var __ATPOSTRUN__ = [];\n var runtimeInitialized = false;\n\n function keepRuntimeAlive() {\n return noExitRuntime;\n }\n\n function preRun() {\n if (Module['preRun']) {\n if (typeof Module['preRun'] == 'function')\n Module['preRun'] = [Module['preRun']];\n while (Module['preRun'].length) {\n addOnPreRun(Module['preRun'].shift());\n }\n }\n callRuntimeCallbacks(__ATPRERUN__);\n }\n\n function initRuntime() {\n runtimeInitialized = true;\n callRuntimeCallbacks(__ATINIT__);\n }\n\n function postRun() {\n if (Module['postRun']) {\n if (typeof Module['postRun'] == 'function')\n Module['postRun'] = [Module['postRun']];\n while (Module['postRun'].length) {\n addOnPostRun(Module['postRun'].shift());\n }\n }\n callRuntimeCallbacks(__ATPOSTRUN__);\n }\n\n function addOnPreRun(cb) {\n __ATPRERUN__.unshift(cb);\n }\n\n function addOnInit(cb) {\n __ATINIT__.unshift(cb);\n }\n\n function addOnPostRun(cb) {\n __ATPOSTRUN__.unshift(cb);\n }\n\n var runDependencies = 0;\n var runDependencyWatcher = null;\n var dependenciesFulfilled = null;\n\n function addRunDependency(id) {\n runDependencies++;\n if (Module['monitorRunDependencies']) {\n Module['monitorRunDependencies'](runDependencies);\n }\n }\n\n function removeRunDependency(id) {\n runDependencies--;\n if (Module['monitorRunDependencies']) {\n Module['monitorRunDependencies'](runDependencies);\n }\n if (runDependencies == 0) {\n if (runDependencyWatcher !== null) {\n clearInterval(runDependencyWatcher);\n runDependencyWatcher = null;\n }\n if (dependenciesFulfilled) {\n var callback = dependenciesFulfilled;\n dependenciesFulfilled = null;\n callback();\n }\n }\n }\n\n function abort(what) {\n {\n if (Module['onAbort']) {\n Module['onAbort'](what);\n }\n }\n what = 'Aborted(' + what + ')';\n err(what);\n ABORT = true;\n EXITSTATUS = 1;\n what += '. Build with -sASSERTIONS for more info.';\n var e = new WebAssembly.RuntimeError(what);\n readyPromiseReject(e);\n throw e;\n }\n\n var dataURIPrefix = 'data:application/octet-stream;base64,';\n\n function isDataURI(filename) {\n return filename.startsWith(dataURIPrefix);\n }\n\n var wasmBinaryFile;\n wasmBinaryFile = 'tflite-simd.wasm';\n if (!isDataURI(wasmBinaryFile)) {\n wasmBinaryFile = locateFile(wasmBinaryFile);\n }\n\n function getBinary(file) {\n try {\n if (file == wasmBinaryFile && wasmBinary) {\n return new Uint8Array(wasmBinary);\n }\n if (readBinary) {\n return readBinary(file);\n }\n throw 'both async and sync fetching of the wasm failed';\n // eslint-disable-next-line @typescript-eslint/no-shadow\n } catch (err) {\n abort(err);\n }\n }\n\n function getBinaryPromise() {\n if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {\n if (typeof fetch == 'function') {\n return fetch(wasmBinaryFile, { credentials: 'same-origin' })\n .then(function (response) {\n if (!response['ok']) {\n throw (\n \"failed to load wasm binary file at '\" + wasmBinaryFile + \"'\"\n );\n }\n return response['arrayBuffer']();\n })\n .catch(function () {\n return getBinary(wasmBinaryFile);\n });\n }\n }\n return Promise.resolve().then(function () {\n return getBinary(wasmBinaryFile);\n });\n }\n\n function createWasm() {\n var info = {\n env: asmLibraryArg,\n wasi_snapshot_preview1: asmLibraryArg,\n };\n\n function receiveInstance(instance, module) {\n var exports = instance.exports;\n Module['asm'] = exports;\n wasmMemory = Module['asm']['memory'];\n updateGlobalBufferAndViews(wasmMemory.buffer);\n wasmTable = Module['asm']['__indirect_function_table'];\n addOnInit(Module['asm']['__wasm_call_ctors']);\n removeRunDependency('wasm-instantiate');\n }\n\n addRunDependency('wasm-instantiate');\n\n function receiveInstantiationResult(result) {\n receiveInstance(result['instance']);\n }\n\n function instantiateArrayBuffer(receiver) {\n return getBinaryPromise()\n .then(function (binary) {\n return WebAssembly.instantiate(binary, info);\n })\n .then(function (instance) {\n return instance;\n })\n .then(receiver, function (reason) {\n err('failed to asynchronously prepare wasm: ' + reason);\n abort(reason);\n });\n }\n\n function instantiateAsync() {\n if (\n !wasmBinary &&\n typeof WebAssembly.instantiateStreaming == 'function' &&\n !isDataURI(wasmBinaryFile) &&\n typeof fetch == 'function'\n ) {\n return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(\n function (response) {\n var result = WebAssembly.instantiateStreaming(response, info);\n return result.then(receiveInstantiationResult, function (reason) {\n err('wasm streaming compile failed: ' + reason);\n err('falling back to ArrayBuffer instantiation');\n return instantiateArrayBuffer(receiveInstantiationResult);\n });\n },\n );\n } else {\n return instantiateArrayBuffer(receiveInstantiationResult);\n }\n }\n\n if (Module['instantiateWasm']) {\n try {\n var exports = Module['instantiateWasm'](info, receiveInstance);\n return exports;\n } catch (e) {\n err('Module.instantiateWasm callback failed with error: ' + e);\n readyPromiseReject(e);\n }\n }\n instantiateAsync().catch(readyPromiseReject);\n return {};\n }\n\n var tempDouble;\n var tempI64;\n\n function ExitStatus(status) {\n this.name = 'ExitStatus';\n this.message = 'Program terminated with exit(' + status + ')';\n this.status = status;\n }\n\n function callRuntimeCallbacks(callbacks) {\n while (callbacks.length > 0) {\n callbacks.shift()(Module);\n }\n }\n\n function demangle(func) {\n return func;\n }\n\n function demangleAll(text) {\n var regex = /\\b_Z[\\w\\d_]+/g;\n return text.replace(regex, function (x) {\n var y = demangle(x);\n return x === y ? x : y + ' [' + x + ']';\n });\n }\n\n function jsStackTrace() {\n var error = new Error();\n if (!error.stack) {\n try {\n throw new Error();\n } catch (e) {\n error = e;\n }\n if (!error.stack) {\n return '(no stack trace available)';\n }\n }\n return error.stack.toString();\n }\n\n function __dlinit(main_dso_handle) {}\n\n var dlopenMissingError =\n 'To use dlopen, you need enable dynamic linking, see https://github.com/emscripten-core/emscripten/wiki/Linking';\n\n function __dlopen_js(filename, flag) {\n abort(dlopenMissingError);\n }\n\n function __dlsym_js(handle, symbol) {\n abort(dlopenMissingError);\n }\n\n var nowIsMonotonic = true;\n\n function __emscripten_get_now_is_monotonic() {\n return nowIsMonotonic;\n }\n\n var SYSCALLS = {\n varargs: undefined,\n get: function () {\n SYSCALLS.varargs += 4;\n var ret = HEAP32[(SYSCALLS.varargs - 4) >> 2];\n return ret;\n },\n getStr: function (ptr) {\n var ret = UTF8ToString(ptr);\n return ret;\n },\n };\n\n function __mmap_js(len, prot, flags, fd, off, allocated) {\n return -52;\n }\n\n function __munmap_js(addr, len, prot, flags, fd, offset) {}\n\n function _abort() {\n abort('');\n }\n\n function _emscripten_date_now() {\n return Date.now();\n }\n\n function getHeapMax() {\n return 2147483648;\n }\n\n function _emscripten_get_heap_max() {\n return getHeapMax();\n }\n\n var _emscripten_get_now;\n _emscripten_get_now = () => performance.now();\n\n function _emscripten_memcpy_big(dest, src, num) {\n HEAPU8.copyWithin(dest, src, src + num);\n }\n\n function emscripten_realloc_buffer(size) {\n try {\n wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16);\n updateGlobalBufferAndViews(wasmMemory.buffer);\n return 1;\n } catch (e) {}\n }\n\n function _emscripten_resize_heap(requestedSize) {\n var oldSize = HEAPU8.length;\n requestedSize = requestedSize >>> 0;\n var maxHeapSize = getHeapMax();\n if (requestedSize > maxHeapSize) {\n return false;\n }\n let alignUp = (x, multiple) => x + ((multiple - (x % multiple)) % multiple);\n for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);\n overGrownHeapSize = Math.min(\n overGrownHeapSize,\n requestedSize + 100663296,\n );\n var newSize = Math.min(\n maxHeapSize,\n alignUp(Math.max(requestedSize, overGrownHeapSize), 65536),\n );\n var replacement = emscripten_realloc_buffer(newSize);\n if (replacement) {\n return true;\n }\n }\n return false;\n }\n\n var ENV = {};\n\n function getExecutableName() {\n return thisProgram || './this.program';\n }\n\n function getEnvStrings() {\n if (!getEnvStrings.strings) {\n var lang =\n (\n (typeof navigator == 'object' &&\n navigator.languages &&\n navigator.languages[0]) ||\n 'C'\n ).replace('-', '_') + '.UTF-8';\n var env = {\n USER: 'web_user',\n LOGNAME: 'web_user',\n PATH: '/',\n PWD: '/',\n HOME: '/home/web_user',\n LANG: lang,\n _: getExecutableName(),\n };\n for (var x in ENV) {\n if (ENV[x] === undefined) delete env[x];\n else env[x] = ENV[x];\n }\n var strings = [];\n for (var x in env) {\n strings.push(x + '=' + env[x]);\n }\n getEnvStrings.strings = strings;\n }\n return getEnvStrings.strings;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n function writeAsciiToMemory(str, buffer, dontAddNull) {\n for (var i = 0; i < str.length; ++i) {\n HEAP8[buffer++ >> 0] = str.charCodeAt(i);\n }\n if (!dontAddNull) HEAP8[buffer >> 0] = 0;\n }\n\n function _environ_get(__environ, environ_buf) {\n var bufSize = 0;\n getEnvStrings().forEach(function (string, i) {\n var ptr = environ_buf + bufSize;\n HEAPU32[(__environ + i * 4) >> 2] = ptr;\n writeAsciiToMemory(string, ptr);\n bufSize += string.length + 1;\n });\n return 0;\n }\n\n function _environ_sizes_get(penviron_count, penviron_buf_size) {\n var strings = getEnvStrings();\n HEAPU32[penviron_count >> 2] = strings.length;\n var bufSize = 0;\n strings.forEach(function (string) {\n bufSize += string.length + 1;\n });\n HEAPU32[penviron_buf_size >> 2] = bufSize;\n return 0;\n }\n\n function _proc_exit(code) {\n EXITSTATUS = code;\n if (!keepRuntimeAlive()) {\n if (Module['onExit']) Module['onExit'](code);\n ABORT = true;\n }\n quit_(code, new ExitStatus(code));\n }\n\n function exitJS(status, implicit) {\n EXITSTATUS = status;\n _proc_exit(status);\n }\n\n var _exit = exitJS;\n\n function _fd_close(fd) {\n return 52;\n }\n\n function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {\n return 70;\n }\n\n var printCharBuffers = [null, [], []];\n\n function printChar(stream, curr) {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n var buffer = printCharBuffers[stream];\n if (curr === 0 || curr === 10) {\n (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));\n buffer.length = 0;\n } else {\n buffer.push(curr);\n }\n }\n\n function _fd_write(fd, iov, iovcnt, pnum) {\n var num = 0;\n for (var i = 0; i < iovcnt; i++) {\n var ptr = HEAPU32[iov >> 2];\n var len = HEAPU32[(iov + 4) >> 2];\n iov += 8;\n for (var j = 0; j < len; j++) {\n printChar(fd, HEAPU8[ptr + j]);\n }\n num += len;\n }\n HEAPU32[pnum >> 2] = num;\n return 0;\n }\n\n function getRandomDevice() {\n if (\n typeof crypto == 'object' &&\n typeof crypto['getRandomValues'] == 'function'\n ) {\n var randomBuffer = new Uint8Array(1);\n return () => {\n crypto.getRandomValues(randomBuffer);\n return randomBuffer[0];\n };\n } else return () => abort('randomDevice');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n function _getentropy(buffer, size) {\n if (!_getentropy.randomDevice) {\n _getentropy.randomDevice = getRandomDevice();\n }\n for (var i = 0; i < size; i++) {\n HEAP8[(buffer + i) >> 0] = _getentropy.randomDevice();\n }\n return 0;\n }\n\n var asmLibraryArg = {\n _dlinit: __dlinit,\n _dlopen_js: __dlopen_js,\n _dlsym_js: __dlsym_js,\n _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic,\n _mmap_js: __mmap_js,\n _munmap_js: __munmap_js,\n abort: _abort,\n emscripten_date_now: _emscripten_date_now,\n emscripten_get_heap_max: _emscripten_get_heap_max,\n emscripten_get_now: _emscripten_get_now,\n emscripten_memcpy_big: _emscripten_memcpy_big,\n emscripten_resize_heap: _emscripten_resize_heap,\n environ_get: _environ_get,\n environ_sizes_get: _environ_sizes_get,\n exit: _exit,\n fd_close: _fd_close,\n fd_seek: _fd_seek,\n fd_write: _fd_write,\n getentropy: _getentropy,\n };\n var asm = createWasm();\n var ___wasm_call_ctors = (Module['___wasm_call_ctors'] = function () {\n return (___wasm_call_ctors = Module['___wasm_call_ctors'] =\n Module['asm']['__wasm_call_ctors']).apply(null, arguments);\n });\n var _getModelBufferMemoryOffset = (Module['_getModelBufferMemoryOffset'] =\n function () {\n return (_getModelBufferMemoryOffset = Module[\n '_getModelBufferMemoryOffset'\n ] =\n Module['asm']['getModelBufferMemoryOffset']).apply(null, arguments);\n });\n var _getInputMemoryOffset = (Module['_getInputMemoryOffset'] = function () {\n return (_getInputMemoryOffset = Module['_getInputMemoryOffset'] =\n Module['asm']['getInputMemoryOffset']).apply(null, arguments);\n });\n var _getInputHeight = (Module['_getInputHeight'] = function () {\n return (_getInputHeight = Module['_getInputHeight'] =\n Module['asm']['getInputHeight']).apply(null, arguments);\n });\n var _getInputWidth = (Module['_getInputWidth'] = function () {\n return (_getInputWidth = Module['_getInputWidth'] =\n Module['asm']['getInputWidth']).apply(null, arguments);\n });\n var _getInputChannelCount = (Module['_getInputChannelCount'] = function () {\n return (_getInputChannelCount = Module['_getInputChannelCount'] =\n Module['asm']['getInputChannelCount']).apply(null, arguments);\n });\n var _getOutputMemoryOffset = (Module['_getOutputMemoryOffset'] = function () {\n return (_getOutputMemoryOffset = Module['_getOutputMemoryOffset'] =\n Module['asm']['getOutputMemoryOffset']).apply(null, arguments);\n });\n var _getOutputHeight = (Module['_getOutputHeight'] = function () {\n return (_getOutputHeight = Module['_getOutputHeight'] =\n Module['asm']['getOutputHeight']).apply(null, arguments);\n });\n var _getOutputWidth = (Module['_getOutputWidth'] = function () {\n return (_getOutputWidth = Module['_getOutputWidth'] =\n Module['asm']['getOutputWidth']).apply(null, arguments);\n });\n var _getOutputChannelCount = (Module['_getOutputChannelCount'] = function () {\n return (_getOutputChannelCount = Module['_getOutputChannelCount'] =\n Module['asm']['getOutputChannelCount']).apply(null, arguments);\n });\n var _loadModel = (Module['_loadModel'] = function () {\n return (_loadModel = Module['_loadModel'] =\n Module['asm']['loadModel']).apply(null, arguments);\n });\n var _runInference = (Module['_runInference'] = function () {\n return (_runInference = Module['_runInference'] =\n Module['asm']['runInference']).apply(null, arguments);\n });\n var _malloc = (Module['_malloc'] = function () {\n return (_malloc = Module['_malloc'] = Module['asm']['malloc']).apply(\n null,\n arguments,\n );\n });\n var ___errno_location = (Module['___errno_location'] = function () {\n return (___errno_location = Module['___errno_location'] =\n Module['asm']['__errno_location']).apply(null, arguments);\n });\n var ___dl_seterr = (Module['___dl_seterr'] = function () {\n return (___dl_seterr = Module['___dl_seterr'] =\n Module['asm']['__dl_seterr']).apply(null, arguments);\n });\n var stackSave = (Module['stackSave'] = function () {\n return (stackSave = Module['stackSave'] = Module['asm']['stackSave']).apply(\n null,\n arguments,\n );\n });\n var stackRestore = (Module['stackRestore'] = function () {\n return (stackRestore = Module['stackRestore'] =\n Module['asm']['stackRestore']).apply(null, arguments);\n });\n var stackAlloc = (Module['stackAlloc'] = function () {\n return (stackAlloc = Module['stackAlloc'] =\n Module['asm']['stackAlloc']).apply(null, arguments);\n });\n var dynCall_jjj = (Module['dynCall_jjj'] = function () {\n return (dynCall_jjj = Module['dynCall_jjj'] =\n Module['asm']['dynCall_jjj']).apply(null, arguments);\n });\n var dynCall_jiii = (Module['dynCall_jiii'] = function () {\n return (dynCall_jiii = Module['dynCall_jiii'] =\n Module['asm']['dynCall_jiii']).apply(null, arguments);\n });\n var dynCall_iiiijj = (Module['dynCall_iiiijj'] = function () {\n return (dynCall_iiiijj = Module['dynCall_iiiijj'] =\n Module['asm']['dynCall_iiiijj']).apply(null, arguments);\n });\n var dynCall_viijj = (Module['dynCall_viijj'] = function () {\n return (dynCall_viijj = Module['dynCall_viijj'] =\n Module['asm']['dynCall_viijj']).apply(null, arguments);\n });\n var dynCall_viiijjj = (Module['dynCall_viiijjj'] = function () {\n return (dynCall_viiijjj = Module['dynCall_viiijjj'] =\n Module['asm']['dynCall_viiijjj']).apply(null, arguments);\n });\n var dynCall_iijjiiii = (Module['dynCall_iijjiiii'] = function () {\n return (dynCall_iijjiiii = Module['dynCall_iijjiiii'] =\n Module['asm']['dynCall_iijjiiii']).apply(null, arguments);\n });\n var dynCall_jiji = (Module['dynCall_jiji'] = function () {\n return (dynCall_jiji = Module['dynCall_jiji'] =\n Module['asm']['dynCall_jiji']).apply(null, arguments);\n });\n var calledRun;\n dependenciesFulfilled = function runCaller() {\n if (!calledRun) run();\n if (!calledRun) dependenciesFulfilled = runCaller;\n };\n\n function run(args) {\n args = args || arguments_;\n if (runDependencies > 0) {\n return;\n }\n preRun();\n if (runDependencies > 0) {\n return;\n }\n\n function doRun() {\n if (calledRun) return;\n calledRun = true;\n Module['calledRun'] = true;\n if (ABORT) return;\n initRuntime();\n readyPromiseResolve(Module);\n if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();\n postRun();\n }\n\n if (Module['setStatus']) {\n Module['setStatus']('Running...');\n setTimeout(function () {\n setTimeout(function () {\n Module['setStatus']('');\n }, 1);\n doRun();\n }, 1);\n } else {\n doRun();\n }\n }\n\n if (Module['preInit']) {\n if (typeof Module['preInit'] == 'function')\n Module['preInit'] = [Module['preInit']];\n while (Module['preInit'].length > 0) {\n Module['preInit'].pop()();\n }\n }\n run();\n\n return __Module.ready;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createTFLiteSIMDModule } from './tflite-simd.js';
|
|
2
|
+
import { packageName, version } from '../version.js';
|
|
3
|
+
|
|
4
|
+
// @ts-expect-error - module is not declared
|
|
5
|
+
// This is a WebAssembly module compiled from the TensorFlow Lite C++ library.
|
|
6
|
+
const createTFLite = createTFLiteSIMDModule;
|
|
7
|
+
const loadTFLite = async (options = {}) => {
|
|
8
|
+
const { basePath = `https://unpkg.com/${packageName}@${version}/tf`, tfFilePath = `${basePath}/tflite/tflite-simd.wasm`, modelFilePath = `${basePath}/models/segm_full_v679.tflite`, } = options;
|
|
9
|
+
const [tfLite, model] = await Promise.all([
|
|
10
|
+
createTFLite({ locateFile: () => tfFilePath }),
|
|
11
|
+
fetchModel(modelFilePath),
|
|
12
|
+
]);
|
|
13
|
+
const modelBufferOffset = tfLite._getModelBufferMemoryOffset();
|
|
14
|
+
tfLite.HEAPU8.set(new Uint8Array(model), modelBufferOffset);
|
|
15
|
+
tfLite._loadModel(model.byteLength);
|
|
16
|
+
return tfLite;
|
|
17
|
+
};
|
|
18
|
+
let lastModelFilePath = '';
|
|
19
|
+
let modelFileCache;
|
|
20
|
+
const fetchModel = async (modelFilePath) => {
|
|
21
|
+
const model = modelFilePath === lastModelFilePath && modelFileCache
|
|
22
|
+
? modelFileCache
|
|
23
|
+
: await fetch(modelFilePath).then((r) => r.arrayBuffer());
|
|
24
|
+
// Cache the model file for future use.
|
|
25
|
+
modelFileCache = model;
|
|
26
|
+
lastModelFilePath = modelFilePath;
|
|
27
|
+
return model;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export { loadTFLite };
|
|
31
|
+
//# sourceMappingURL=tflite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tflite.js","sources":["../../../../../../src/legacy/tflite.ts"],"sourcesContent":["// @ts-expect-error - module is not declared\nimport { createTFLiteSIMDModule } from './tflite-simd.js';\nimport { packageName, version } from '../version';\n\n// This is a WebAssembly module compiled from the TensorFlow Lite C++ library.\nconst createTFLite = createTFLiteSIMDModule as (opts?: any) => Promise<TFLite>;\n\nexport interface TFLite extends EmscriptenModule {\n _getModelBufferMemoryOffset(): number;\n _getInputMemoryOffset(): number;\n _getInputHeight(): number;\n _getInputWidth(): number;\n _getInputChannelCount(): number;\n _getOutputMemoryOffset(): number;\n _getOutputHeight(): number;\n _getOutputWidth(): number;\n _getOutputChannelCount(): number;\n _loadModel(bufferSize: number): number;\n _runInference(): number;\n}\n\nexport const loadTFLite = async (\n options: {\n basePath?: string;\n tfFilePath?: string;\n modelFilePath?: string;\n } = {},\n) => {\n const {\n basePath = `https://unpkg.com/${packageName}@${version}/tf`,\n tfFilePath = `${basePath}/tflite/tflite-simd.wasm`,\n modelFilePath = `${basePath}/models/segm_full_v679.tflite`,\n } = options;\n\n const [tfLite, model] = await Promise.all([\n createTFLite({ locateFile: () => tfFilePath }),\n fetchModel(modelFilePath),\n ]);\n\n const modelBufferOffset = tfLite._getModelBufferMemoryOffset();\n tfLite.HEAPU8.set(new Uint8Array(model), modelBufferOffset);\n tfLite._loadModel(model.byteLength);\n\n return tfLite;\n};\n\nlet lastModelFilePath = '';\nlet modelFileCache: ArrayBuffer | undefined;\nconst fetchModel = async (modelFilePath: string) => {\n const model =\n modelFilePath === lastModelFilePath && modelFileCache\n ? modelFileCache\n : await fetch(modelFilePath).then((r) => r.arrayBuffer());\n\n // Cache the model file for future use.\n modelFileCache = model;\n lastModelFilePath = modelFilePath;\n return model;\n};\n"],"names":[],"mappings":";;;AAAA;AAIA;AACA,MAAM,YAAY,GAAG,sBAAyD;MAgBjE,UAAU,GAAG,OACxB,OAAA,GAII,EAAE,KACJ;IACF,MAAM,EACJ,QAAQ,GAAG,CAAA,kBAAA,EAAqB,WAAW,CAAA,CAAA,EAAI,OAAO,CAAA,GAAA,CAAK,EAC3D,UAAU,GAAG,GAAG,QAAQ,CAAA,wBAAA,CAA0B,EAClD,aAAa,GAAG,CAAA,EAAG,QAAQ,CAAA,6BAAA,CAA+B,GAC3D,GAAG,OAAO;IAEX,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxC,YAAY,CAAC,EAAE,UAAU,EAAE,MAAM,UAAU,EAAE,CAAC;QAC9C,UAAU,CAAC,aAAa,CAAC;AAC1B,KAAA,CAAC;AAEF,IAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,2BAA2B,EAAE;AAC9D,IAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;AAC3D,IAAA,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;AAEnC,IAAA,OAAO,MAAM;AACf;AAEA,IAAI,iBAAiB,GAAG,EAAE;AAC1B,IAAI,cAAuC;AAC3C,MAAM,UAAU,GAAG,OAAO,aAAqB,KAAI;AACjD,IAAA,MAAM,KAAK,GACT,aAAa,KAAK,iBAAiB,IAAI;AACrC,UAAE;AACF,UAAE,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;;IAG7D,cAAc,GAAG,KAAK;IACtB,iBAAiB,GAAG,aAAa;AACjC,IAAA,OAAO,KAAK;AACd,CAAC;;;;"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { glsl, compileShader, createPipelineStageProgram, createTexture } from '../helpers/webglHelper.js';
|
|
2
|
+
|
|
3
|
+
function buildBackgroundBlurStage(gl, vertexShader, positionBuffer, texCoordBuffer, personMaskTexture, canvas, blurLevel) {
|
|
4
|
+
const blurPass = buildBlurPass(gl, vertexShader, positionBuffer, texCoordBuffer, personMaskTexture, canvas, blurLevel);
|
|
5
|
+
const blendPass = buildBlendPass(gl, positionBuffer, texCoordBuffer, canvas);
|
|
6
|
+
function render() {
|
|
7
|
+
blurPass.render();
|
|
8
|
+
blendPass.render();
|
|
9
|
+
}
|
|
10
|
+
function updateCoverage(coverage) {
|
|
11
|
+
blendPass.updateCoverage(coverage);
|
|
12
|
+
}
|
|
13
|
+
function cleanUp() {
|
|
14
|
+
blendPass.cleanUp();
|
|
15
|
+
blurPass.cleanUp();
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
render,
|
|
19
|
+
updateCoverage,
|
|
20
|
+
cleanUp,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function buildBlurPass(gl, vertexShader, positionBuffer, texCoordBuffer, personMaskTexture, canvas, blurLevel) {
|
|
24
|
+
const sigma = typeof blurLevel === 'number'
|
|
25
|
+
? blurLevel
|
|
26
|
+
: blurLevel === 'low'
|
|
27
|
+
? 2
|
|
28
|
+
: blurLevel === 'medium'
|
|
29
|
+
? 4
|
|
30
|
+
: 6;
|
|
31
|
+
const windowSize = Math.max(1, Math.floor(sigma * 3));
|
|
32
|
+
const offset = new Array(windowSize).fill(0).map((v, index) => index);
|
|
33
|
+
const variance = sigma ** 2;
|
|
34
|
+
const weights = offset.map((x) => {
|
|
35
|
+
const m = sigma * Math.sqrt(2 * Math.PI);
|
|
36
|
+
const e = Math.exp(-(x ** 2) / (2 * variance));
|
|
37
|
+
return e / m;
|
|
38
|
+
});
|
|
39
|
+
const fragmentShaderSource = glsl `#version 300 es
|
|
40
|
+
|
|
41
|
+
precision highp float;
|
|
42
|
+
|
|
43
|
+
uniform sampler2D u_inputFrame;
|
|
44
|
+
uniform sampler2D u_personMask;
|
|
45
|
+
uniform vec2 u_texelSize;
|
|
46
|
+
|
|
47
|
+
in vec2 v_texCoord;
|
|
48
|
+
out vec4 outColor;
|
|
49
|
+
|
|
50
|
+
const float offset[${windowSize}] = float[](${offset.map((i) => i.toFixed(10)).join(', ')});
|
|
51
|
+
const float weight[${windowSize}] = float[](${weights.map((i) => i.toFixed(10)).join(', ')});
|
|
52
|
+
|
|
53
|
+
void main() {
|
|
54
|
+
vec4 centerColor = texture(u_inputFrame, v_texCoord);
|
|
55
|
+
float personMask = texture(u_personMask, v_texCoord).a;
|
|
56
|
+
|
|
57
|
+
vec4 frameColor = centerColor * weight[0] * (1.0 - personMask);
|
|
58
|
+
|
|
59
|
+
for (int i = 1; i < ${windowSize}; i++) {
|
|
60
|
+
vec2 offset = vec2(offset[i]) * u_texelSize;
|
|
61
|
+
|
|
62
|
+
vec2 texCoord = v_texCoord + offset;
|
|
63
|
+
frameColor += texture(u_inputFrame, texCoord)
|
|
64
|
+
* weight[i]
|
|
65
|
+
* (1.0 - texture(u_personMask, texCoord).a);
|
|
66
|
+
|
|
67
|
+
texCoord = v_texCoord - offset;
|
|
68
|
+
frameColor += texture(u_inputFrame, texCoord)
|
|
69
|
+
* weight[i]
|
|
70
|
+
* (1.0 - texture(u_personMask, texCoord).a);
|
|
71
|
+
}
|
|
72
|
+
outColor = vec4(frameColor.rgb + (1.0 - frameColor.a) * centerColor.rgb, 1.0);
|
|
73
|
+
}
|
|
74
|
+
`;
|
|
75
|
+
const scale = 0.5;
|
|
76
|
+
const outputWidth = canvas.width * scale;
|
|
77
|
+
const outputHeight = canvas.height * scale;
|
|
78
|
+
const texelWidth = 1 / outputWidth;
|
|
79
|
+
const texelHeight = 1 / outputHeight;
|
|
80
|
+
const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
|
|
81
|
+
const program = createPipelineStageProgram(gl, vertexShader, fragmentShader, positionBuffer, texCoordBuffer);
|
|
82
|
+
const inputFrameLocation = gl.getUniformLocation(program, 'u_inputFrame');
|
|
83
|
+
const personMaskLocation = gl.getUniformLocation(program, 'u_personMask');
|
|
84
|
+
const texelSizeLocation = gl.getUniformLocation(program, 'u_texelSize');
|
|
85
|
+
const texture1 = createTexture(gl, gl.RGBA8, outputWidth, outputHeight, gl.NEAREST,
|
|
86
|
+
// @ts-expect-error types are incomplete
|
|
87
|
+
gl.LINEAR);
|
|
88
|
+
const texture2 = createTexture(gl, gl.RGBA8, outputWidth, outputHeight, gl.NEAREST,
|
|
89
|
+
// @ts-expect-error types are incomplete
|
|
90
|
+
gl.LINEAR);
|
|
91
|
+
const frameBuffer1 = gl.createFramebuffer();
|
|
92
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer1);
|
|
93
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture1, 0);
|
|
94
|
+
const frameBuffer2 = gl.createFramebuffer();
|
|
95
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer2);
|
|
96
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture2, 0);
|
|
97
|
+
gl.useProgram(program);
|
|
98
|
+
gl.uniform1i(personMaskLocation, 1);
|
|
99
|
+
function render() {
|
|
100
|
+
gl.viewport(0, 0, outputWidth, outputHeight);
|
|
101
|
+
gl.useProgram(program);
|
|
102
|
+
gl.uniform1i(inputFrameLocation, 0);
|
|
103
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
104
|
+
gl.bindTexture(gl.TEXTURE_2D, personMaskTexture);
|
|
105
|
+
for (let i = 0; i < 3; i++) {
|
|
106
|
+
gl.uniform2f(texelSizeLocation, 0, texelHeight);
|
|
107
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer1);
|
|
108
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
109
|
+
gl.activeTexture(gl.TEXTURE2);
|
|
110
|
+
gl.bindTexture(gl.TEXTURE_2D, texture1);
|
|
111
|
+
gl.uniform1i(inputFrameLocation, 2);
|
|
112
|
+
gl.uniform2f(texelSizeLocation, texelWidth, 0);
|
|
113
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer2);
|
|
114
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
115
|
+
gl.bindTexture(gl.TEXTURE_2D, texture2);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function cleanUp() {
|
|
119
|
+
gl.deleteFramebuffer(frameBuffer2);
|
|
120
|
+
gl.deleteFramebuffer(frameBuffer1);
|
|
121
|
+
gl.deleteTexture(texture2);
|
|
122
|
+
gl.deleteTexture(texture1);
|
|
123
|
+
gl.deleteProgram(program);
|
|
124
|
+
gl.deleteShader(fragmentShader);
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
render,
|
|
128
|
+
cleanUp,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function buildBlendPass(gl, positionBuffer, texCoordBuffer, canvas) {
|
|
132
|
+
const vertexShaderSource = glsl `#version 300 es
|
|
133
|
+
|
|
134
|
+
in vec2 a_position;
|
|
135
|
+
in vec2 a_texCoord;
|
|
136
|
+
|
|
137
|
+
out vec2 v_texCoord;
|
|
138
|
+
|
|
139
|
+
void main() {
|
|
140
|
+
// Flipping Y is required when rendering to canvas
|
|
141
|
+
gl_Position = vec4(a_position * vec2(1.0, -1.0), 0.0, 1.0);
|
|
142
|
+
v_texCoord = a_texCoord;
|
|
143
|
+
}
|
|
144
|
+
`;
|
|
145
|
+
const fragmentShaderSource = glsl `#version 300 es
|
|
146
|
+
|
|
147
|
+
precision highp float;
|
|
148
|
+
|
|
149
|
+
uniform sampler2D u_inputFrame;
|
|
150
|
+
uniform sampler2D u_personMask;
|
|
151
|
+
uniform sampler2D u_blurredInputFrame;
|
|
152
|
+
uniform vec2 u_coverage;
|
|
153
|
+
|
|
154
|
+
in vec2 v_texCoord;
|
|
155
|
+
|
|
156
|
+
out vec4 outColor;
|
|
157
|
+
|
|
158
|
+
void main() {
|
|
159
|
+
vec3 color = texture(u_inputFrame, v_texCoord).rgb;
|
|
160
|
+
vec3 blurredColor = texture(u_blurredInputFrame, v_texCoord).rgb;
|
|
161
|
+
float personMask = texture(u_personMask, v_texCoord).a;
|
|
162
|
+
personMask = smoothstep(u_coverage.x, u_coverage.y, personMask);
|
|
163
|
+
outColor = vec4(mix(blurredColor, color, personMask), 1.0);
|
|
164
|
+
}
|
|
165
|
+
`;
|
|
166
|
+
const { width: outputWidth, height: outputHeight } = canvas;
|
|
167
|
+
const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
|
|
168
|
+
const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
|
|
169
|
+
const program = createPipelineStageProgram(gl, vertexShader, fragmentShader, positionBuffer, texCoordBuffer);
|
|
170
|
+
const inputFrameLocation = gl.getUniformLocation(program, 'u_inputFrame');
|
|
171
|
+
const personMaskLocation = gl.getUniformLocation(program, 'u_personMask');
|
|
172
|
+
const blurredInputFrame = gl.getUniformLocation(program, 'u_blurredInputFrame');
|
|
173
|
+
const coverageLocation = gl.getUniformLocation(program, 'u_coverage');
|
|
174
|
+
gl.useProgram(program);
|
|
175
|
+
gl.uniform1i(inputFrameLocation, 0);
|
|
176
|
+
gl.uniform1i(personMaskLocation, 1);
|
|
177
|
+
gl.uniform1i(blurredInputFrame, 2);
|
|
178
|
+
gl.uniform2f(coverageLocation, 0, 1);
|
|
179
|
+
function render() {
|
|
180
|
+
gl.viewport(0, 0, outputWidth, outputHeight);
|
|
181
|
+
gl.useProgram(program);
|
|
182
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
183
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
184
|
+
}
|
|
185
|
+
function updateCoverage(coverage) {
|
|
186
|
+
gl.useProgram(program);
|
|
187
|
+
gl.uniform2f(coverageLocation, coverage[0], coverage[1]);
|
|
188
|
+
}
|
|
189
|
+
function cleanUp() {
|
|
190
|
+
gl.deleteProgram(program);
|
|
191
|
+
gl.deleteShader(fragmentShader);
|
|
192
|
+
gl.deleteShader(vertexShader);
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
render,
|
|
196
|
+
updateCoverage,
|
|
197
|
+
cleanUp,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export { buildBackgroundBlurStage };
|
|
202
|
+
//# sourceMappingURL=backgroundBlurStage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backgroundBlurStage.js","sources":["../../../../../../../src/legacy/webgl2/backgroundBlurStage.ts"],"sourcesContent":["import {\n compileShader,\n createPipelineStageProgram,\n createTexture,\n glsl,\n} from '../helpers/webglHelper';\nimport { BackgroundBlurLevel } from '../../types';\n\nexport type BackgroundBlurStage = {\n render(): void;\n updateCoverage(coverage: [number, number]): void;\n cleanUp(): void;\n};\n\nexport function buildBackgroundBlurStage(\n gl: WebGL2RenderingContext,\n vertexShader: WebGLShader,\n positionBuffer: WebGLBuffer,\n texCoordBuffer: WebGLBuffer,\n personMaskTexture: WebGLTexture,\n canvas: HTMLCanvasElement,\n blurLevel: BackgroundBlurLevel,\n): BackgroundBlurStage {\n const blurPass = buildBlurPass(\n gl,\n vertexShader,\n positionBuffer,\n texCoordBuffer,\n personMaskTexture,\n canvas,\n blurLevel,\n );\n const blendPass = buildBlendPass(gl, positionBuffer, texCoordBuffer, canvas);\n\n function render() {\n blurPass.render();\n blendPass.render();\n }\n\n function updateCoverage(coverage: [number, number]) {\n blendPass.updateCoverage(coverage);\n }\n\n function cleanUp() {\n blendPass.cleanUp();\n blurPass.cleanUp();\n }\n\n return {\n render,\n updateCoverage,\n cleanUp,\n };\n}\n\nfunction buildBlurPass(\n gl: WebGL2RenderingContext,\n vertexShader: WebGLShader,\n positionBuffer: WebGLBuffer,\n texCoordBuffer: WebGLBuffer,\n personMaskTexture: WebGLTexture,\n canvas: HTMLCanvasElement,\n blurLevel: BackgroundBlurLevel,\n) {\n const sigma =\n typeof blurLevel === 'number'\n ? blurLevel\n : blurLevel === 'low'\n ? 2\n : blurLevel === 'medium'\n ? 4\n : 6;\n const windowSize = Math.max(1, Math.floor(sigma * 3));\n const offset = new Array<number>(windowSize).fill(0).map((v, index) => index);\n const variance = sigma ** 2;\n const weights = offset.map((x) => {\n const m = sigma * Math.sqrt(2 * Math.PI);\n const e = Math.exp(-(x ** 2) / (2 * variance));\n return e / m;\n });\n\n const fragmentShaderSource = glsl`#version 300 es\n\n precision highp float;\n\n uniform sampler2D u_inputFrame;\n uniform sampler2D u_personMask;\n uniform vec2 u_texelSize;\n\n in vec2 v_texCoord;\n out vec4 outColor;\n\n const float offset[${windowSize}] = float[](${offset.map((i) => i.toFixed(10)).join(', ')});\n const float weight[${windowSize}] = float[](${weights.map((i) => i.toFixed(10)).join(', ')});\n\n void main() {\n vec4 centerColor = texture(u_inputFrame, v_texCoord);\n float personMask = texture(u_personMask, v_texCoord).a;\n\n vec4 frameColor = centerColor * weight[0] * (1.0 - personMask);\n\n for (int i = 1; i < ${windowSize}; i++) {\n vec2 offset = vec2(offset[i]) * u_texelSize;\n\n vec2 texCoord = v_texCoord + offset;\n frameColor += texture(u_inputFrame, texCoord)\n * weight[i]\n * (1.0 - texture(u_personMask, texCoord).a);\n\n texCoord = v_texCoord - offset;\n frameColor += texture(u_inputFrame, texCoord)\n * weight[i]\n * (1.0 - texture(u_personMask, texCoord).a);\n }\n outColor = vec4(frameColor.rgb + (1.0 - frameColor.a) * centerColor.rgb, 1.0);\n }\n `;\n\n const scale = 0.5;\n const outputWidth = canvas.width * scale;\n const outputHeight = canvas.height * scale;\n const texelWidth = 1 / outputWidth;\n const texelHeight = 1 / outputHeight;\n\n const fragmentShader = compileShader(\n gl,\n gl.FRAGMENT_SHADER,\n fragmentShaderSource,\n );\n const program = createPipelineStageProgram(\n gl,\n vertexShader,\n fragmentShader,\n positionBuffer,\n texCoordBuffer,\n );\n const inputFrameLocation = gl.getUniformLocation(program, 'u_inputFrame');\n const personMaskLocation = gl.getUniformLocation(program, 'u_personMask');\n const texelSizeLocation = gl.getUniformLocation(program, 'u_texelSize');\n const texture1 = createTexture(\n gl,\n gl.RGBA8,\n outputWidth,\n outputHeight,\n gl.NEAREST,\n // @ts-expect-error types are incomplete\n gl.LINEAR,\n );\n const texture2 = createTexture(\n gl,\n gl.RGBA8,\n outputWidth,\n outputHeight,\n gl.NEAREST,\n // @ts-expect-error types are incomplete\n gl.LINEAR,\n );\n\n const frameBuffer1 = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer1);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n texture1,\n 0,\n );\n\n const frameBuffer2 = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer2);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n texture2,\n 0,\n );\n\n gl.useProgram(program);\n gl.uniform1i(personMaskLocation, 1);\n\n function render() {\n gl.viewport(0, 0, outputWidth, outputHeight);\n gl.useProgram(program);\n gl.uniform1i(inputFrameLocation, 0);\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, personMaskTexture);\n\n for (let i = 0; i < 3; i++) {\n gl.uniform2f(texelSizeLocation, 0, texelHeight);\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer1);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\n gl.activeTexture(gl.TEXTURE2);\n gl.bindTexture(gl.TEXTURE_2D, texture1);\n gl.uniform1i(inputFrameLocation, 2);\n\n gl.uniform2f(texelSizeLocation, texelWidth, 0);\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer2);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\n gl.bindTexture(gl.TEXTURE_2D, texture2);\n }\n }\n\n function cleanUp() {\n gl.deleteFramebuffer(frameBuffer2);\n gl.deleteFramebuffer(frameBuffer1);\n gl.deleteTexture(texture2);\n gl.deleteTexture(texture1);\n gl.deleteProgram(program);\n gl.deleteShader(fragmentShader);\n }\n\n return {\n render,\n cleanUp,\n };\n}\n\nfunction buildBlendPass(\n gl: WebGL2RenderingContext,\n positionBuffer: WebGLBuffer,\n texCoordBuffer: WebGLBuffer,\n canvas: HTMLCanvasElement,\n) {\n const vertexShaderSource = glsl`#version 300 es\n\n in vec2 a_position;\n in vec2 a_texCoord;\n\n out vec2 v_texCoord;\n\n void main() {\n // Flipping Y is required when rendering to canvas\n gl_Position = vec4(a_position * vec2(1.0, -1.0), 0.0, 1.0);\n v_texCoord = a_texCoord;\n }\n `;\n\n const fragmentShaderSource = glsl`#version 300 es\n\n precision highp float;\n\n uniform sampler2D u_inputFrame;\n uniform sampler2D u_personMask;\n uniform sampler2D u_blurredInputFrame;\n uniform vec2 u_coverage;\n\n in vec2 v_texCoord;\n\n out vec4 outColor;\n\n void main() {\n vec3 color = texture(u_inputFrame, v_texCoord).rgb;\n vec3 blurredColor = texture(u_blurredInputFrame, v_texCoord).rgb;\n float personMask = texture(u_personMask, v_texCoord).a;\n personMask = smoothstep(u_coverage.x, u_coverage.y, personMask);\n outColor = vec4(mix(blurredColor, color, personMask), 1.0);\n }\n `;\n\n const { width: outputWidth, height: outputHeight } = canvas;\n\n const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSource);\n const fragmentShader = compileShader(\n gl,\n gl.FRAGMENT_SHADER,\n fragmentShaderSource,\n );\n const program = createPipelineStageProgram(\n gl,\n vertexShader,\n fragmentShader,\n positionBuffer,\n texCoordBuffer,\n );\n const inputFrameLocation = gl.getUniformLocation(program, 'u_inputFrame');\n const personMaskLocation = gl.getUniformLocation(program, 'u_personMask');\n const blurredInputFrame = gl.getUniformLocation(\n program,\n 'u_blurredInputFrame',\n );\n const coverageLocation = gl.getUniformLocation(program, 'u_coverage');\n\n gl.useProgram(program);\n gl.uniform1i(inputFrameLocation, 0);\n gl.uniform1i(personMaskLocation, 1);\n gl.uniform1i(blurredInputFrame, 2);\n gl.uniform2f(coverageLocation, 0, 1);\n\n function render() {\n gl.viewport(0, 0, outputWidth, outputHeight);\n gl.useProgram(program);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n function updateCoverage(coverage: [number, number]) {\n gl.useProgram(program);\n gl.uniform2f(coverageLocation, coverage[0], coverage[1]);\n }\n\n function cleanUp() {\n gl.deleteProgram(program);\n gl.deleteShader(fragmentShader);\n gl.deleteShader(vertexShader);\n }\n\n return {\n render,\n updateCoverage,\n cleanUp,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { compileShader, createPipelineStageProgram, createTexture, glsl } from '../helpers/webglHelper.js';
|
|
2
|
+
|
|
3
|
+
function buildBackgroundImageStage(gl, positionBuffer, texCoordBuffer, personMaskTexture, backgroundImage, canvas) {
|
|
4
|
+
const vertexShaderSource = glsl `#version 300 es
|
|
5
|
+
|
|
6
|
+
uniform vec2 u_backgroundScale;
|
|
7
|
+
uniform vec2 u_backgroundOffset;
|
|
8
|
+
|
|
9
|
+
in vec2 a_position;
|
|
10
|
+
in vec2 a_texCoord;
|
|
11
|
+
|
|
12
|
+
out vec2 v_texCoord;
|
|
13
|
+
out vec2 v_backgroundCoord;
|
|
14
|
+
|
|
15
|
+
void main() {
|
|
16
|
+
// Flipping Y is required when rendering to canvas
|
|
17
|
+
gl_Position = vec4(a_position * vec2(1.0, -1.0), 0.0, 1.0);
|
|
18
|
+
v_texCoord = a_texCoord;
|
|
19
|
+
v_backgroundCoord = a_texCoord * u_backgroundScale + u_backgroundOffset;
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
22
|
+
const fragmentShaderSource = glsl `#version 300 es
|
|
23
|
+
|
|
24
|
+
precision highp float;
|
|
25
|
+
|
|
26
|
+
uniform sampler2D u_inputFrame;
|
|
27
|
+
uniform sampler2D u_personMask;
|
|
28
|
+
uniform sampler2D u_background;
|
|
29
|
+
uniform vec2 u_coverage;
|
|
30
|
+
uniform float u_lightWrapping;
|
|
31
|
+
uniform float u_blendMode;
|
|
32
|
+
|
|
33
|
+
in vec2 v_texCoord;
|
|
34
|
+
in vec2 v_backgroundCoord;
|
|
35
|
+
|
|
36
|
+
out vec4 outColor;
|
|
37
|
+
|
|
38
|
+
vec3 screen(vec3 a, vec3 b) {
|
|
39
|
+
return 1.0 - (1.0 - a) * (1.0 - b);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
vec3 linearDodge(vec3 a, vec3 b) {
|
|
43
|
+
return a + b;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
void main() {
|
|
47
|
+
vec3 frameColor = texture(u_inputFrame, v_texCoord).rgb;
|
|
48
|
+
vec3 backgroundColor = texture(u_background, v_backgroundCoord).rgb;
|
|
49
|
+
float personMask = texture(u_personMask, v_texCoord).a;
|
|
50
|
+
float lightWrapMask = 1.0 - max(0.0, personMask - u_coverage.y) / (1.0 - u_coverage.y);
|
|
51
|
+
vec3 lightWrap = u_lightWrapping * lightWrapMask * backgroundColor;
|
|
52
|
+
|
|
53
|
+
frameColor = u_blendMode * linearDodge(frameColor, lightWrap)
|
|
54
|
+
+ (1.0 - u_blendMode) * screen(frameColor, lightWrap);
|
|
55
|
+
personMask = smoothstep(u_coverage.x, u_coverage.y, personMask);
|
|
56
|
+
outColor = vec4(frameColor * personMask + backgroundColor * (1.0 - personMask), 1.0);
|
|
57
|
+
}
|
|
58
|
+
`;
|
|
59
|
+
const { width: outputWidth, height: outputHeight } = canvas;
|
|
60
|
+
const outputRatio = outputWidth / outputHeight;
|
|
61
|
+
const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
|
|
62
|
+
const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
|
|
63
|
+
const program = createPipelineStageProgram(gl, vertexShader, fragmentShader, positionBuffer, texCoordBuffer);
|
|
64
|
+
const backgroundScaleLocation = gl.getUniformLocation(program, 'u_backgroundScale');
|
|
65
|
+
const backgroundOffsetLocation = gl.getUniformLocation(program, 'u_backgroundOffset');
|
|
66
|
+
const inputFrameLocation = gl.getUniformLocation(program, 'u_inputFrame');
|
|
67
|
+
const personMaskLocation = gl.getUniformLocation(program, 'u_personMask');
|
|
68
|
+
const backgroundLocation = gl.getUniformLocation(program, 'u_background');
|
|
69
|
+
const coverageLocation = gl.getUniformLocation(program, 'u_coverage');
|
|
70
|
+
const lightWrappingLocation = gl.getUniformLocation(program, 'u_lightWrapping');
|
|
71
|
+
const blendModeLocation = gl.getUniformLocation(program, 'u_blendMode');
|
|
72
|
+
gl.useProgram(program);
|
|
73
|
+
gl.uniform2f(backgroundScaleLocation, 1, 1);
|
|
74
|
+
gl.uniform2f(backgroundOffsetLocation, 0, 0);
|
|
75
|
+
gl.uniform1i(inputFrameLocation, 0);
|
|
76
|
+
gl.uniform1i(personMaskLocation, 1);
|
|
77
|
+
gl.uniform2f(coverageLocation, 0, 1);
|
|
78
|
+
gl.uniform1f(lightWrappingLocation, 0);
|
|
79
|
+
gl.uniform1f(blendModeLocation, 0);
|
|
80
|
+
let backgroundTexture = null;
|
|
81
|
+
// TODO Find a better to handle background being loaded
|
|
82
|
+
if (backgroundImage?.complete) {
|
|
83
|
+
updateBackgroundImage(backgroundImage);
|
|
84
|
+
}
|
|
85
|
+
else if (backgroundImage) {
|
|
86
|
+
backgroundImage.onload = () => {
|
|
87
|
+
updateBackgroundImage(backgroundImage);
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function render() {
|
|
91
|
+
gl.viewport(0, 0, outputWidth, outputHeight);
|
|
92
|
+
gl.useProgram(program);
|
|
93
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
94
|
+
gl.bindTexture(gl.TEXTURE_2D, personMaskTexture);
|
|
95
|
+
if (backgroundTexture !== null) {
|
|
96
|
+
gl.activeTexture(gl.TEXTURE2);
|
|
97
|
+
gl.bindTexture(gl.TEXTURE_2D, backgroundTexture);
|
|
98
|
+
// TODO Handle correctly the background not loaded yet
|
|
99
|
+
gl.uniform1i(backgroundLocation, 2);
|
|
100
|
+
}
|
|
101
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
102
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
103
|
+
}
|
|
104
|
+
function updateBackgroundImage(bgImage) {
|
|
105
|
+
backgroundTexture = createTexture(gl, gl.RGBA8, bgImage.naturalWidth, bgImage.naturalHeight,
|
|
106
|
+
// @ts-expect-error types are incomplete
|
|
107
|
+
gl.LINEAR, gl.LINEAR);
|
|
108
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, bgImage.naturalWidth, bgImage.naturalHeight, gl.RGBA, gl.UNSIGNED_BYTE, bgImage);
|
|
109
|
+
let xOffset = 0;
|
|
110
|
+
let yOffset = 0;
|
|
111
|
+
let backgroundWidth = bgImage.naturalWidth;
|
|
112
|
+
let backgroundHeight = bgImage.naturalHeight;
|
|
113
|
+
const backgroundRatio = backgroundWidth / backgroundHeight;
|
|
114
|
+
if (backgroundRatio < outputRatio) {
|
|
115
|
+
backgroundHeight = backgroundWidth / outputRatio;
|
|
116
|
+
yOffset = (bgImage.naturalHeight - backgroundHeight) / 2;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
backgroundWidth = backgroundHeight * outputRatio;
|
|
120
|
+
xOffset = (bgImage.naturalWidth - backgroundWidth) / 2;
|
|
121
|
+
}
|
|
122
|
+
const xScale = backgroundWidth / bgImage.naturalWidth;
|
|
123
|
+
const yScale = backgroundHeight / bgImage.naturalHeight;
|
|
124
|
+
xOffset /= bgImage.naturalWidth;
|
|
125
|
+
yOffset /= bgImage.naturalHeight;
|
|
126
|
+
gl.uniform2f(backgroundScaleLocation, xScale, yScale);
|
|
127
|
+
gl.uniform2f(backgroundOffsetLocation, xOffset, yOffset);
|
|
128
|
+
}
|
|
129
|
+
function updateCoverage(coverage) {
|
|
130
|
+
gl.useProgram(program);
|
|
131
|
+
gl.uniform2f(coverageLocation, coverage[0], coverage[1]);
|
|
132
|
+
}
|
|
133
|
+
function updateLightWrapping(lightWrapping) {
|
|
134
|
+
gl.useProgram(program);
|
|
135
|
+
gl.uniform1f(lightWrappingLocation, lightWrapping);
|
|
136
|
+
}
|
|
137
|
+
function updateBlendMode(blendMode) {
|
|
138
|
+
gl.useProgram(program);
|
|
139
|
+
gl.uniform1f(blendModeLocation, blendMode === 'screen' ? 0 : 1);
|
|
140
|
+
}
|
|
141
|
+
function cleanUp() {
|
|
142
|
+
gl.deleteTexture(backgroundTexture);
|
|
143
|
+
gl.deleteProgram(program);
|
|
144
|
+
gl.deleteShader(fragmentShader);
|
|
145
|
+
gl.deleteShader(vertexShader);
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
render,
|
|
149
|
+
updateCoverage,
|
|
150
|
+
updateLightWrapping,
|
|
151
|
+
updateBlendMode,
|
|
152
|
+
cleanUp,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export { buildBackgroundImageStage };
|
|
157
|
+
//# sourceMappingURL=backgroundImageStage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backgroundImageStage.js","sources":["../../../../../../../src/legacy/webgl2/backgroundImageStage.ts"],"sourcesContent":["import {\n compileShader,\n createPipelineStageProgram,\n createTexture,\n glsl,\n} from '../helpers/webglHelper';\n\nexport type BackgroundImageStage = {\n render(): void;\n updateCoverage(coverage: [number, number]): void;\n updateLightWrapping(lightWrapping: number): void;\n updateBlendMode(blendMode: 'screen' | 'linearDodge'): void;\n cleanUp(): void;\n};\n\nexport function buildBackgroundImageStage(\n gl: WebGL2RenderingContext,\n positionBuffer: WebGLBuffer,\n texCoordBuffer: WebGLBuffer,\n personMaskTexture: WebGLTexture,\n backgroundImage: HTMLImageElement | undefined,\n canvas: HTMLCanvasElement,\n): BackgroundImageStage {\n const vertexShaderSource = glsl`#version 300 es\n\n uniform vec2 u_backgroundScale;\n uniform vec2 u_backgroundOffset;\n\n in vec2 a_position;\n in vec2 a_texCoord;\n\n out vec2 v_texCoord;\n out vec2 v_backgroundCoord;\n\n void main() {\n // Flipping Y is required when rendering to canvas\n gl_Position = vec4(a_position * vec2(1.0, -1.0), 0.0, 1.0);\n v_texCoord = a_texCoord;\n v_backgroundCoord = a_texCoord * u_backgroundScale + u_backgroundOffset;\n }\n `;\n\n const fragmentShaderSource = glsl`#version 300 es\n\n precision highp float;\n\n uniform sampler2D u_inputFrame;\n uniform sampler2D u_personMask;\n uniform sampler2D u_background;\n uniform vec2 u_coverage;\n uniform float u_lightWrapping;\n uniform float u_blendMode;\n\n in vec2 v_texCoord;\n in vec2 v_backgroundCoord;\n\n out vec4 outColor;\n\n vec3 screen(vec3 a, vec3 b) {\n return 1.0 - (1.0 - a) * (1.0 - b);\n }\n\n vec3 linearDodge(vec3 a, vec3 b) {\n return a + b;\n }\n\n void main() {\n vec3 frameColor = texture(u_inputFrame, v_texCoord).rgb;\n vec3 backgroundColor = texture(u_background, v_backgroundCoord).rgb;\n float personMask = texture(u_personMask, v_texCoord).a;\n float lightWrapMask = 1.0 - max(0.0, personMask - u_coverage.y) / (1.0 - u_coverage.y);\n vec3 lightWrap = u_lightWrapping * lightWrapMask * backgroundColor;\n\n frameColor = u_blendMode * linearDodge(frameColor, lightWrap)\n + (1.0 - u_blendMode) * screen(frameColor, lightWrap);\n personMask = smoothstep(u_coverage.x, u_coverage.y, personMask);\n outColor = vec4(frameColor * personMask + backgroundColor * (1.0 - personMask), 1.0);\n }\n `;\n\n const { width: outputWidth, height: outputHeight } = canvas;\n const outputRatio = outputWidth / outputHeight;\n\n const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSource);\n const fragmentShader = compileShader(\n gl,\n gl.FRAGMENT_SHADER,\n fragmentShaderSource,\n );\n const program = createPipelineStageProgram(\n gl,\n vertexShader,\n fragmentShader,\n positionBuffer,\n texCoordBuffer,\n );\n const backgroundScaleLocation = gl.getUniformLocation(\n program,\n 'u_backgroundScale',\n );\n const backgroundOffsetLocation = gl.getUniformLocation(\n program,\n 'u_backgroundOffset',\n );\n const inputFrameLocation = gl.getUniformLocation(program, 'u_inputFrame');\n const personMaskLocation = gl.getUniformLocation(program, 'u_personMask');\n const backgroundLocation = gl.getUniformLocation(program, 'u_background');\n const coverageLocation = gl.getUniformLocation(program, 'u_coverage');\n const lightWrappingLocation = gl.getUniformLocation(\n program,\n 'u_lightWrapping',\n );\n const blendModeLocation = gl.getUniformLocation(program, 'u_blendMode');\n\n gl.useProgram(program);\n gl.uniform2f(backgroundScaleLocation, 1, 1);\n gl.uniform2f(backgroundOffsetLocation, 0, 0);\n gl.uniform1i(inputFrameLocation, 0);\n gl.uniform1i(personMaskLocation, 1);\n gl.uniform2f(coverageLocation, 0, 1);\n gl.uniform1f(lightWrappingLocation, 0);\n gl.uniform1f(blendModeLocation, 0);\n\n let backgroundTexture: WebGLTexture | null = null;\n // TODO Find a better to handle background being loaded\n if (backgroundImage?.complete) {\n updateBackgroundImage(backgroundImage);\n } else if (backgroundImage) {\n backgroundImage.onload = () => {\n updateBackgroundImage(backgroundImage);\n };\n }\n\n function render() {\n gl.viewport(0, 0, outputWidth, outputHeight);\n gl.useProgram(program);\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, personMaskTexture);\n if (backgroundTexture !== null) {\n gl.activeTexture(gl.TEXTURE2);\n gl.bindTexture(gl.TEXTURE_2D, backgroundTexture);\n // TODO Handle correctly the background not loaded yet\n gl.uniform1i(backgroundLocation, 2);\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n function updateBackgroundImage(bgImage: HTMLImageElement) {\n backgroundTexture = createTexture(\n gl,\n gl.RGBA8,\n bgImage.naturalWidth,\n bgImage.naturalHeight,\n // @ts-expect-error types are incomplete\n gl.LINEAR,\n gl.LINEAR,\n );\n gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0,\n 0,\n 0,\n bgImage.naturalWidth,\n bgImage.naturalHeight,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n bgImage,\n );\n\n let xOffset = 0;\n let yOffset = 0;\n let backgroundWidth = bgImage.naturalWidth;\n let backgroundHeight = bgImage.naturalHeight;\n const backgroundRatio = backgroundWidth / backgroundHeight;\n if (backgroundRatio < outputRatio) {\n backgroundHeight = backgroundWidth / outputRatio;\n yOffset = (bgImage.naturalHeight - backgroundHeight) / 2;\n } else {\n backgroundWidth = backgroundHeight * outputRatio;\n xOffset = (bgImage.naturalWidth - backgroundWidth) / 2;\n }\n\n const xScale = backgroundWidth / bgImage.naturalWidth;\n const yScale = backgroundHeight / bgImage.naturalHeight;\n xOffset /= bgImage.naturalWidth;\n yOffset /= bgImage.naturalHeight;\n\n gl.uniform2f(backgroundScaleLocation, xScale, yScale);\n gl.uniform2f(backgroundOffsetLocation, xOffset, yOffset);\n }\n\n function updateCoverage(coverage: [number, number]) {\n gl.useProgram(program);\n gl.uniform2f(coverageLocation, coverage[0], coverage[1]);\n }\n\n function updateLightWrapping(lightWrapping: number) {\n gl.useProgram(program);\n gl.uniform1f(lightWrappingLocation, lightWrapping);\n }\n\n function updateBlendMode(blendMode: 'screen' | 'linearDodge') {\n gl.useProgram(program);\n gl.uniform1f(blendModeLocation, blendMode === 'screen' ? 0 : 1);\n }\n\n function cleanUp() {\n gl.deleteTexture(backgroundTexture);\n gl.deleteProgram(program);\n gl.deleteShader(fragmentShader);\n gl.deleteShader(vertexShader);\n }\n\n return {\n render,\n updateCoverage,\n updateLightWrapping,\n updateBlendMode,\n cleanUp,\n };\n}\n"],"names":[],"mappings":";;AAeM,SAAU,yBAAyB,CACvC,EAA0B,EAC1B,cAA2B,EAC3B,cAA2B,EAC3B,iBAA+B,EAC/B,eAA6C,EAC7C,MAAyB,EAAA;IAEzB,MAAM,kBAAkB,GAAG,IAAI,CAAA,CAAA;;;;;;;;;;;;;;;;;GAiB9B;IAED,MAAM,oBAAoB,GAAG,IAAI,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoChC;IAED,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM;AAC3D,IAAA,MAAM,WAAW,GAAG,WAAW,GAAG,YAAY;AAE9C,IAAA,MAAM,YAAY,GAAG,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,EAAE,kBAAkB,CAAC;AAC5E,IAAA,MAAM,cAAc,GAAG,aAAa,CAClC,EAAE,EACF,EAAE,CAAC,eAAe,EAClB,oBAAoB,CACrB;AACD,IAAA,MAAM,OAAO,GAAG,0BAA0B,CACxC,EAAE,EACF,YAAY,EACZ,cAAc,EACd,cAAc,EACd,cAAc,CACf;IACD,MAAM,uBAAuB,GAAG,EAAE,CAAC,kBAAkB,CACnD,OAAO,EACP,mBAAmB,CACpB;IACD,MAAM,wBAAwB,GAAG,EAAE,CAAC,kBAAkB,CACpD,OAAO,EACP,oBAAoB,CACrB;IACD,MAAM,kBAAkB,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,cAAc,CAAC;IACzE,MAAM,kBAAkB,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,cAAc,CAAC;IACzE,MAAM,kBAAkB,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,cAAc,CAAC;IACzE,MAAM,gBAAgB,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC;IACrE,MAAM,qBAAqB,GAAG,EAAE,CAAC,kBAAkB,CACjD,OAAO,EACP,iBAAiB,CAClB;IACD,MAAM,iBAAiB,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC;AAEvE,IAAA,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;IACtB,EAAE,CAAC,SAAS,CAAC,uBAAuB,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3C,EAAE,CAAC,SAAS,CAAC,wBAAwB,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5C,IAAA,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACnC,IAAA,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACnC,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC;AACpC,IAAA,EAAE,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC,CAAC;AACtC,IAAA,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAElC,IAAI,iBAAiB,GAAwB,IAAI;;AAEjD,IAAA,IAAI,eAAe,EAAE,QAAQ,EAAE;QAC7B,qBAAqB,CAAC,eAAe,CAAC;IACxC;SAAO,IAAI,eAAe,EAAE;AAC1B,QAAA,eAAe,CAAC,MAAM,GAAG,MAAK;YAC5B,qBAAqB,CAAC,eAAe,CAAC;AACxC,QAAA,CAAC;IACH;AAEA,IAAA,SAAS,MAAM,GAAA;QACb,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC;AAC5C,QAAA,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;AACtB,QAAA,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC;QAC7B,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC;AAChD,QAAA,IAAI,iBAAiB,KAAK,IAAI,EAAE;AAC9B,YAAA,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC;YAC7B,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC;;AAEhD,YAAA,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACrC;QACA,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC;QACxC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;IACxC;IAEA,SAAS,qBAAqB,CAAC,OAAyB,EAAA;AACtD,QAAA,iBAAiB,GAAG,aAAa,CAC/B,EAAE,EACF,EAAE,CAAC,KAAK,EACR,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,aAAa;;AAErB,QAAA,EAAE,CAAC,MAAM,EACT,EAAE,CAAC,MAAM,CACV;AACD,QAAA,EAAE,CAAC,aAAa,CACd,EAAE,CAAC,UAAU,EACb,CAAC,EACD,CAAC,EACD,CAAC,EACD,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,aAAa,EACrB,EAAE,CAAC,IAAI,EACP,EAAE,CAAC,aAAa,EAChB,OAAO,CACR;QAED,IAAI,OAAO,GAAG,CAAC;QACf,IAAI,OAAO,GAAG,CAAC;AACf,QAAA,IAAI,eAAe,GAAG,OAAO,CAAC,YAAY;AAC1C,QAAA,IAAI,gBAAgB,GAAG,OAAO,CAAC,aAAa;AAC5C,QAAA,MAAM,eAAe,GAAG,eAAe,GAAG,gBAAgB;AAC1D,QAAA,IAAI,eAAe,GAAG,WAAW,EAAE;AACjC,YAAA,gBAAgB,GAAG,eAAe,GAAG,WAAW;YAChD,OAAO,GAAG,CAAC,OAAO,CAAC,aAAa,GAAG,gBAAgB,IAAI,CAAC;QAC1D;aAAO;AACL,YAAA,eAAe,GAAG,gBAAgB,GAAG,WAAW;YAChD,OAAO,GAAG,CAAC,OAAO,CAAC,YAAY,GAAG,eAAe,IAAI,CAAC;QACxD;AAEA,QAAA,MAAM,MAAM,GAAG,eAAe,GAAG,OAAO,CAAC,YAAY;AACrD,QAAA,MAAM,MAAM,GAAG,gBAAgB,GAAG,OAAO,CAAC,aAAa;AACvD,QAAA,OAAO,IAAI,OAAO,CAAC,YAAY;AAC/B,QAAA,OAAO,IAAI,OAAO,CAAC,aAAa;QAEhC,EAAE,CAAC,SAAS,CAAC,uBAAuB,EAAE,MAAM,EAAE,MAAM,CAAC;QACrD,EAAE,CAAC,SAAS,CAAC,wBAAwB,EAAE,OAAO,EAAE,OAAO,CAAC;IAC1D;IAEA,SAAS,cAAc,CAAC,QAA0B,EAAA;AAChD,QAAA,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;AACtB,QAAA,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1D;IAEA,SAAS,mBAAmB,CAAC,aAAqB,EAAA;AAChD,QAAA,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;AACtB,QAAA,EAAE,CAAC,SAAS,CAAC,qBAAqB,EAAE,aAAa,CAAC;IACpD;IAEA,SAAS,eAAe,CAAC,SAAmC,EAAA;AAC1D,QAAA,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;AACtB,QAAA,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,SAAS,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;IACjE;AAEA,IAAA,SAAS,OAAO,GAAA;AACd,QAAA,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC;AACnC,QAAA,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC;AACzB,QAAA,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC;AAC/B,QAAA,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC;IAC/B;IAEA,OAAO;QACL,MAAM;QACN,cAAc;QACd,mBAAmB;QACnB,eAAe;QACf,OAAO;KACR;AACH;;;;"}
|