@stream-io/video-filters-web 0.10.0 → 1.0.0-beta.1

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.
Files changed (59) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.md +1 -1
  3. package/dist/esm/index.js +1 -4
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/src/compatibility.js +1 -18
  6. package/dist/esm/src/compatibility.js.map +1 -1
  7. package/dist/esm/src/version.js +1 -1
  8. package/dist/index.cjs.js +1 -1559
  9. package/dist/index.cjs.js.map +1 -1
  10. package/dist/index.d.ts +0 -3
  11. package/dist/src/compatibility.d.ts +0 -5
  12. package/index.ts +0 -3
  13. package/package.json +2 -5
  14. package/src/compatibility.ts +0 -22
  15. package/dist/esm/src/legacy/createRenderer.js +0 -33
  16. package/dist/esm/src/legacy/createRenderer.js.map +0 -1
  17. package/dist/esm/src/legacy/helpers/webglHelper.js +0 -94
  18. package/dist/esm/src/legacy/helpers/webglHelper.js.map +0 -1
  19. package/dist/esm/src/legacy/segmentation.js +0 -14
  20. package/dist/esm/src/legacy/segmentation.js.map +0 -1
  21. package/dist/esm/src/legacy/tflite-simd.js +0 -728
  22. package/dist/esm/src/legacy/tflite-simd.js.map +0 -1
  23. package/dist/esm/src/legacy/tflite.js +0 -31
  24. package/dist/esm/src/legacy/tflite.js.map +0 -1
  25. package/dist/esm/src/legacy/webgl2/backgroundBlurStage.js +0 -202
  26. package/dist/esm/src/legacy/webgl2/backgroundBlurStage.js.map +0 -1
  27. package/dist/esm/src/legacy/webgl2/backgroundImageStage.js +0 -157
  28. package/dist/esm/src/legacy/webgl2/backgroundImageStage.js.map +0 -1
  29. package/dist/esm/src/legacy/webgl2/jointBilateralFilterStage.js +0 -113
  30. package/dist/esm/src/legacy/webgl2/jointBilateralFilterStage.js.map +0 -1
  31. package/dist/esm/src/legacy/webgl2/resizingStage.js +0 -57
  32. package/dist/esm/src/legacy/webgl2/resizingStage.js.map +0 -1
  33. package/dist/esm/src/legacy/webgl2/softmaxStage.js +0 -51
  34. package/dist/esm/src/legacy/webgl2/softmaxStage.js.map +0 -1
  35. package/dist/esm/src/legacy/webgl2/webgl2Pipeline.js +0 -105
  36. package/dist/esm/src/legacy/webgl2/webgl2Pipeline.js.map +0 -1
  37. package/dist/src/legacy/createRenderer.d.ts +0 -16
  38. package/dist/src/legacy/helpers/webglHelper.d.ts +0 -17
  39. package/dist/src/legacy/segmentation.d.ts +0 -9
  40. package/dist/src/legacy/tflite.d.ts +0 -18
  41. package/dist/src/legacy/webgl2/backgroundBlurStage.d.ts +0 -7
  42. package/dist/src/legacy/webgl2/backgroundImageStage.d.ts +0 -8
  43. package/dist/src/legacy/webgl2/jointBilateralFilterStage.d.ts +0 -7
  44. package/dist/src/legacy/webgl2/resizingStage.d.ts +0 -6
  45. package/dist/src/legacy/webgl2/softmaxStage.d.ts +0 -6
  46. package/dist/src/legacy/webgl2/webgl2Pipeline.d.ts +0 -8
  47. package/src/legacy/createRenderer.ts +0 -73
  48. package/src/legacy/helpers/webglHelper.ts +0 -144
  49. package/src/legacy/segmentation.ts +0 -18
  50. package/src/legacy/tflite-simd.js +0 -874
  51. package/src/legacy/tflite.ts +0 -59
  52. package/src/legacy/webgl2/backgroundBlurStage.ts +0 -315
  53. package/src/legacy/webgl2/backgroundImageStage.ts +0 -222
  54. package/src/legacy/webgl2/jointBilateralFilterStage.ts +0 -159
  55. package/src/legacy/webgl2/resizingStage.ts +0 -106
  56. package/src/legacy/webgl2/softmaxStage.ts +0 -103
  57. package/src/legacy/webgl2/webgl2Pipeline.ts +0 -203
  58. package/tf/models/segm_full_v679.tflite +0 -0
  59. package/tf/tflite/tflite-simd.wasm +0 -0
package/dist/index.cjs.js CHANGED
@@ -1,6 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var wasmFeatureDetect = require('wasm-feature-detect');
4
3
  var workerTimer = require('@stream-io/worker-timer');
5
4
  var tasksVision = require('@mediapipe/tasks-vision');
6
5
 
@@ -15,21 +14,6 @@ const isMobile = () => /Mobi/i.test(navigator.userAgent);
15
14
  * Checks whether the current browser is Safari.
16
15
  */
17
16
  const isSafari = () => /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
18
- /**
19
- * Runs a check to see if the current platform supports
20
- * the necessary APIs required for the video filters.
21
- */
22
- const isPlatformSupported = async ({ forceMobileSupport = false, forceSafariSupport = false, } = {}) => typeof document !== 'undefined' &&
23
- typeof window !== 'undefined' &&
24
- typeof navigator !== 'undefined' &&
25
- // we don't support mobile devices yet due to performance issues
26
- (forceMobileSupport || !isMobile()) &&
27
- // Safari has issues with timer throttling, causing low FPS when the tab goes to the background
28
- (forceSafariSupport || !isSafari()) &&
29
- typeof WebAssembly !== 'undefined' &&
30
- !!window.WebGL2RenderingContext && // WebGL2 is required for the video filters
31
- !!document.createElement('canvas').getContext('webgl2') &&
32
- (await wasmFeatureDetect.simd()); // SIMD is required for the wasm module
33
17
  /**
34
18
  * Runs a check to see if the current platform supports
35
19
  * the necessary APIs required for the MediaPipe-based video filters.
@@ -48,1548 +32,9 @@ const isMediaPipePlatformSupported = async ({ forceMobileSupport = false, forceS
48
32
  typeof VideoFrame !== 'undefined' && // VideoFrame API is required for frame processing
49
33
  typeof createImageBitmap !== 'undefined'; // createImageBitmap is required for background image processing
50
34
 
51
- /**
52
- * Use it along with boyswan.glsl-literal VSCode extension
53
- * to get GLSL syntax highlighting.
54
- * https://marketplace.visualstudio.com/items?itemName=boyswan.glsl-literal
55
- *
56
- * On VSCode OSS, boyswan.glsl-literal requires slevesque.shader extension
57
- * to be installed as well.
58
- * https://marketplace.visualstudio.com/items?itemName=slevesque.shader
59
- */
60
- const glsl = String.raw;
61
- function createPipelineStageProgram(gl, vertexShader, fragmentShader, positionBuffer, texCoordBuffer) {
62
- const program = createProgram(gl, vertexShader, fragmentShader);
63
- const positionAttributeLocation = gl.getAttribLocation(program, 'a_position');
64
- gl.enableVertexAttribArray(positionAttributeLocation);
65
- gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
66
- gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
67
- const texCoordAttributeLocation = gl.getAttribLocation(program, 'a_texCoord');
68
- gl.enableVertexAttribArray(texCoordAttributeLocation);
69
- gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
70
- gl.vertexAttribPointer(texCoordAttributeLocation, 2, gl.FLOAT, false, 0, 0);
71
- return program;
72
- }
73
- function createProgram(gl, vertexShader, fragmentShader) {
74
- const program = gl.createProgram();
75
- gl.attachShader(program, vertexShader);
76
- gl.attachShader(program, fragmentShader);
77
- gl.linkProgram(program);
78
- if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
79
- throw new Error(`Could not link WebGL program: ${gl.getProgramInfoLog(program)}`);
80
- }
81
- return program;
82
- }
83
- function compileShader(gl, shaderType, shaderSource) {
84
- const shader = gl.createShader(shaderType);
85
- gl.shaderSource(shader, shaderSource);
86
- gl.compileShader(shader);
87
- if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
88
- throw new Error(`Could not compile shader: ${gl.getShaderInfoLog(shader)}`);
89
- }
90
- return shader;
91
- }
92
- function createTexture(gl, internalformat, width, height, minFilter = gl.NEAREST, magFilter = gl.NEAREST) {
93
- const texture = gl.createTexture();
94
- gl.bindTexture(gl.TEXTURE_2D, texture);
95
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
96
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
97
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter);
98
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter);
99
- gl.texStorage2D(gl.TEXTURE_2D, 1, internalformat, width, height);
100
- return texture;
101
- }
102
- async function readPixelsAsync(gl, x, y, width, height, format, type, dest) {
103
- const buf = gl.createBuffer();
104
- gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buf);
105
- gl.bufferData(gl.PIXEL_PACK_BUFFER, dest.byteLength, gl.STREAM_READ);
106
- gl.readPixels(x, y, width, height, format, type, 0);
107
- gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);
108
- await getBufferSubDataAsync(gl, gl.PIXEL_PACK_BUFFER, buf, 0, dest);
109
- gl.deleteBuffer(buf);
110
- return dest;
111
- }
112
- async function getBufferSubDataAsync(gl, target, buffer, srcByteOffset, dstBuffer, dstOffset, length) {
113
- const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
114
- gl.flush();
115
- if (!sync)
116
- return;
117
- const res = await clientWaitAsync(gl, sync);
118
- gl.deleteSync(sync);
119
- if (res !== gl.WAIT_FAILED) {
120
- gl.bindBuffer(target, buffer);
121
- gl.getBufferSubData(target, srcByteOffset, dstBuffer, dstOffset, length);
122
- gl.bindBuffer(target, null);
123
- }
124
- }
125
- function clientWaitAsync(gl, sync) {
126
- return new Promise((resolve) => {
127
- function test() {
128
- const res = gl.clientWaitSync(sync, 0, 0);
129
- if (res === gl.WAIT_FAILED) {
130
- resolve(res);
131
- return;
132
- }
133
- if (res === gl.TIMEOUT_EXPIRED) {
134
- setTimeout(test);
135
- return;
136
- }
137
- resolve(res);
138
- }
139
- setTimeout(test);
140
- });
141
- }
142
-
143
- function buildBackgroundBlurStage(gl, vertexShader, positionBuffer, texCoordBuffer, personMaskTexture, canvas, blurLevel) {
144
- const blurPass = buildBlurPass(gl, vertexShader, positionBuffer, texCoordBuffer, personMaskTexture, canvas, blurLevel);
145
- const blendPass = buildBlendPass(gl, positionBuffer, texCoordBuffer, canvas);
146
- function render() {
147
- blurPass.render();
148
- blendPass.render();
149
- }
150
- function updateCoverage(coverage) {
151
- blendPass.updateCoverage(coverage);
152
- }
153
- function cleanUp() {
154
- blendPass.cleanUp();
155
- blurPass.cleanUp();
156
- }
157
- return {
158
- render,
159
- updateCoverage,
160
- cleanUp,
161
- };
162
- }
163
- function buildBlurPass(gl, vertexShader, positionBuffer, texCoordBuffer, personMaskTexture, canvas, blurLevel) {
164
- const sigma = typeof blurLevel === 'number'
165
- ? blurLevel
166
- : blurLevel === 'low'
167
- ? 2
168
- : blurLevel === 'medium'
169
- ? 4
170
- : 6;
171
- const windowSize = Math.max(1, Math.floor(sigma * 3));
172
- const offset = new Array(windowSize).fill(0).map((v, index) => index);
173
- const variance = sigma ** 2;
174
- const weights = offset.map((x) => {
175
- const m = sigma * Math.sqrt(2 * Math.PI);
176
- const e = Math.exp(-(x ** 2) / (2 * variance));
177
- return e / m;
178
- });
179
- const fragmentShaderSource = glsl `#version 300 es
180
-
181
- precision highp float;
182
-
183
- uniform sampler2D u_inputFrame;
184
- uniform sampler2D u_personMask;
185
- uniform vec2 u_texelSize;
186
-
187
- in vec2 v_texCoord;
188
- out vec4 outColor;
189
-
190
- const float offset[${windowSize}] = float[](${offset.map((i) => i.toFixed(10)).join(', ')});
191
- const float weight[${windowSize}] = float[](${weights.map((i) => i.toFixed(10)).join(', ')});
192
-
193
- void main() {
194
- vec4 centerColor = texture(u_inputFrame, v_texCoord);
195
- float personMask = texture(u_personMask, v_texCoord).a;
196
-
197
- vec4 frameColor = centerColor * weight[0] * (1.0 - personMask);
198
-
199
- for (int i = 1; i < ${windowSize}; i++) {
200
- vec2 offset = vec2(offset[i]) * u_texelSize;
201
-
202
- vec2 texCoord = v_texCoord + offset;
203
- frameColor += texture(u_inputFrame, texCoord)
204
- * weight[i]
205
- * (1.0 - texture(u_personMask, texCoord).a);
206
-
207
- texCoord = v_texCoord - offset;
208
- frameColor += texture(u_inputFrame, texCoord)
209
- * weight[i]
210
- * (1.0 - texture(u_personMask, texCoord).a);
211
- }
212
- outColor = vec4(frameColor.rgb + (1.0 - frameColor.a) * centerColor.rgb, 1.0);
213
- }
214
- `;
215
- const scale = 0.5;
216
- const outputWidth = canvas.width * scale;
217
- const outputHeight = canvas.height * scale;
218
- const texelWidth = 1 / outputWidth;
219
- const texelHeight = 1 / outputHeight;
220
- const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
221
- const program = createPipelineStageProgram(gl, vertexShader, fragmentShader, positionBuffer, texCoordBuffer);
222
- const inputFrameLocation = gl.getUniformLocation(program, 'u_inputFrame');
223
- const personMaskLocation = gl.getUniformLocation(program, 'u_personMask');
224
- const texelSizeLocation = gl.getUniformLocation(program, 'u_texelSize');
225
- const texture1 = createTexture(gl, gl.RGBA8, outputWidth, outputHeight, gl.NEAREST,
226
- // @ts-expect-error types are incomplete
227
- gl.LINEAR);
228
- const texture2 = createTexture(gl, gl.RGBA8, outputWidth, outputHeight, gl.NEAREST,
229
- // @ts-expect-error types are incomplete
230
- gl.LINEAR);
231
- const frameBuffer1 = gl.createFramebuffer();
232
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer1);
233
- gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture1, 0);
234
- const frameBuffer2 = gl.createFramebuffer();
235
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer2);
236
- gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture2, 0);
237
- gl.useProgram(program);
238
- gl.uniform1i(personMaskLocation, 1);
239
- function render() {
240
- gl.viewport(0, 0, outputWidth, outputHeight);
241
- gl.useProgram(program);
242
- gl.uniform1i(inputFrameLocation, 0);
243
- gl.activeTexture(gl.TEXTURE1);
244
- gl.bindTexture(gl.TEXTURE_2D, personMaskTexture);
245
- for (let i = 0; i < 3; i++) {
246
- gl.uniform2f(texelSizeLocation, 0, texelHeight);
247
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer1);
248
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
249
- gl.activeTexture(gl.TEXTURE2);
250
- gl.bindTexture(gl.TEXTURE_2D, texture1);
251
- gl.uniform1i(inputFrameLocation, 2);
252
- gl.uniform2f(texelSizeLocation, texelWidth, 0);
253
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer2);
254
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
255
- gl.bindTexture(gl.TEXTURE_2D, texture2);
256
- }
257
- }
258
- function cleanUp() {
259
- gl.deleteFramebuffer(frameBuffer2);
260
- gl.deleteFramebuffer(frameBuffer1);
261
- gl.deleteTexture(texture2);
262
- gl.deleteTexture(texture1);
263
- gl.deleteProgram(program);
264
- gl.deleteShader(fragmentShader);
265
- }
266
- return {
267
- render,
268
- cleanUp,
269
- };
270
- }
271
- function buildBlendPass(gl, positionBuffer, texCoordBuffer, canvas) {
272
- const vertexShaderSource = glsl `#version 300 es
273
-
274
- in vec2 a_position;
275
- in vec2 a_texCoord;
276
-
277
- out vec2 v_texCoord;
278
-
279
- void main() {
280
- // Flipping Y is required when rendering to canvas
281
- gl_Position = vec4(a_position * vec2(1.0, -1.0), 0.0, 1.0);
282
- v_texCoord = a_texCoord;
283
- }
284
- `;
285
- const fragmentShaderSource = glsl `#version 300 es
286
-
287
- precision highp float;
288
-
289
- uniform sampler2D u_inputFrame;
290
- uniform sampler2D u_personMask;
291
- uniform sampler2D u_blurredInputFrame;
292
- uniform vec2 u_coverage;
293
-
294
- in vec2 v_texCoord;
295
-
296
- out vec4 outColor;
297
-
298
- void main() {
299
- vec3 color = texture(u_inputFrame, v_texCoord).rgb;
300
- vec3 blurredColor = texture(u_blurredInputFrame, v_texCoord).rgb;
301
- float personMask = texture(u_personMask, v_texCoord).a;
302
- personMask = smoothstep(u_coverage.x, u_coverage.y, personMask);
303
- outColor = vec4(mix(blurredColor, color, personMask), 1.0);
304
- }
305
- `;
306
- const { width: outputWidth, height: outputHeight } = canvas;
307
- const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
308
- const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
309
- const program = createPipelineStageProgram(gl, vertexShader, fragmentShader, positionBuffer, texCoordBuffer);
310
- const inputFrameLocation = gl.getUniformLocation(program, 'u_inputFrame');
311
- const personMaskLocation = gl.getUniformLocation(program, 'u_personMask');
312
- const blurredInputFrame = gl.getUniformLocation(program, 'u_blurredInputFrame');
313
- const coverageLocation = gl.getUniformLocation(program, 'u_coverage');
314
- gl.useProgram(program);
315
- gl.uniform1i(inputFrameLocation, 0);
316
- gl.uniform1i(personMaskLocation, 1);
317
- gl.uniform1i(blurredInputFrame, 2);
318
- gl.uniform2f(coverageLocation, 0, 1);
319
- function render() {
320
- gl.viewport(0, 0, outputWidth, outputHeight);
321
- gl.useProgram(program);
322
- gl.bindFramebuffer(gl.FRAMEBUFFER, null);
323
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
324
- }
325
- function updateCoverage(coverage) {
326
- gl.useProgram(program);
327
- gl.uniform2f(coverageLocation, coverage[0], coverage[1]);
328
- }
329
- function cleanUp() {
330
- gl.deleteProgram(program);
331
- gl.deleteShader(fragmentShader);
332
- gl.deleteShader(vertexShader);
333
- }
334
- return {
335
- render,
336
- updateCoverage,
337
- cleanUp,
338
- };
339
- }
340
-
341
- function buildBackgroundImageStage(gl, positionBuffer, texCoordBuffer, personMaskTexture, backgroundImage, canvas) {
342
- const vertexShaderSource = glsl `#version 300 es
343
-
344
- uniform vec2 u_backgroundScale;
345
- uniform vec2 u_backgroundOffset;
346
-
347
- in vec2 a_position;
348
- in vec2 a_texCoord;
349
-
350
- out vec2 v_texCoord;
351
- out vec2 v_backgroundCoord;
352
-
353
- void main() {
354
- // Flipping Y is required when rendering to canvas
355
- gl_Position = vec4(a_position * vec2(1.0, -1.0), 0.0, 1.0);
356
- v_texCoord = a_texCoord;
357
- v_backgroundCoord = a_texCoord * u_backgroundScale + u_backgroundOffset;
358
- }
359
- `;
360
- const fragmentShaderSource = glsl `#version 300 es
361
-
362
- precision highp float;
363
-
364
- uniform sampler2D u_inputFrame;
365
- uniform sampler2D u_personMask;
366
- uniform sampler2D u_background;
367
- uniform vec2 u_coverage;
368
- uniform float u_lightWrapping;
369
- uniform float u_blendMode;
370
-
371
- in vec2 v_texCoord;
372
- in vec2 v_backgroundCoord;
373
-
374
- out vec4 outColor;
375
-
376
- vec3 screen(vec3 a, vec3 b) {
377
- return 1.0 - (1.0 - a) * (1.0 - b);
378
- }
379
-
380
- vec3 linearDodge(vec3 a, vec3 b) {
381
- return a + b;
382
- }
383
-
384
- void main() {
385
- vec3 frameColor = texture(u_inputFrame, v_texCoord).rgb;
386
- vec3 backgroundColor = texture(u_background, v_backgroundCoord).rgb;
387
- float personMask = texture(u_personMask, v_texCoord).a;
388
- float lightWrapMask = 1.0 - max(0.0, personMask - u_coverage.y) / (1.0 - u_coverage.y);
389
- vec3 lightWrap = u_lightWrapping * lightWrapMask * backgroundColor;
390
-
391
- frameColor = u_blendMode * linearDodge(frameColor, lightWrap)
392
- + (1.0 - u_blendMode) * screen(frameColor, lightWrap);
393
- personMask = smoothstep(u_coverage.x, u_coverage.y, personMask);
394
- outColor = vec4(frameColor * personMask + backgroundColor * (1.0 - personMask), 1.0);
395
- }
396
- `;
397
- const { width: outputWidth, height: outputHeight } = canvas;
398
- const outputRatio = outputWidth / outputHeight;
399
- const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
400
- const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
401
- const program = createPipelineStageProgram(gl, vertexShader, fragmentShader, positionBuffer, texCoordBuffer);
402
- const backgroundScaleLocation = gl.getUniformLocation(program, 'u_backgroundScale');
403
- const backgroundOffsetLocation = gl.getUniformLocation(program, 'u_backgroundOffset');
404
- const inputFrameLocation = gl.getUniformLocation(program, 'u_inputFrame');
405
- const personMaskLocation = gl.getUniformLocation(program, 'u_personMask');
406
- const backgroundLocation = gl.getUniformLocation(program, 'u_background');
407
- const coverageLocation = gl.getUniformLocation(program, 'u_coverage');
408
- const lightWrappingLocation = gl.getUniformLocation(program, 'u_lightWrapping');
409
- const blendModeLocation = gl.getUniformLocation(program, 'u_blendMode');
410
- gl.useProgram(program);
411
- gl.uniform2f(backgroundScaleLocation, 1, 1);
412
- gl.uniform2f(backgroundOffsetLocation, 0, 0);
413
- gl.uniform1i(inputFrameLocation, 0);
414
- gl.uniform1i(personMaskLocation, 1);
415
- gl.uniform2f(coverageLocation, 0, 1);
416
- gl.uniform1f(lightWrappingLocation, 0);
417
- gl.uniform1f(blendModeLocation, 0);
418
- let backgroundTexture = null;
419
- // TODO Find a better to handle background being loaded
420
- if (backgroundImage?.complete) {
421
- updateBackgroundImage(backgroundImage);
422
- }
423
- else if (backgroundImage) {
424
- backgroundImage.onload = () => {
425
- updateBackgroundImage(backgroundImage);
426
- };
427
- }
428
- function render() {
429
- gl.viewport(0, 0, outputWidth, outputHeight);
430
- gl.useProgram(program);
431
- gl.activeTexture(gl.TEXTURE1);
432
- gl.bindTexture(gl.TEXTURE_2D, personMaskTexture);
433
- if (backgroundTexture !== null) {
434
- gl.activeTexture(gl.TEXTURE2);
435
- gl.bindTexture(gl.TEXTURE_2D, backgroundTexture);
436
- // TODO Handle correctly the background not loaded yet
437
- gl.uniform1i(backgroundLocation, 2);
438
- }
439
- gl.bindFramebuffer(gl.FRAMEBUFFER, null);
440
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
441
- }
442
- function updateBackgroundImage(bgImage) {
443
- backgroundTexture = createTexture(gl, gl.RGBA8, bgImage.naturalWidth, bgImage.naturalHeight,
444
- // @ts-expect-error types are incomplete
445
- gl.LINEAR, gl.LINEAR);
446
- gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, bgImage.naturalWidth, bgImage.naturalHeight, gl.RGBA, gl.UNSIGNED_BYTE, bgImage);
447
- let xOffset = 0;
448
- let yOffset = 0;
449
- let backgroundWidth = bgImage.naturalWidth;
450
- let backgroundHeight = bgImage.naturalHeight;
451
- const backgroundRatio = backgroundWidth / backgroundHeight;
452
- if (backgroundRatio < outputRatio) {
453
- backgroundHeight = backgroundWidth / outputRatio;
454
- yOffset = (bgImage.naturalHeight - backgroundHeight) / 2;
455
- }
456
- else {
457
- backgroundWidth = backgroundHeight * outputRatio;
458
- xOffset = (bgImage.naturalWidth - backgroundWidth) / 2;
459
- }
460
- const xScale = backgroundWidth / bgImage.naturalWidth;
461
- const yScale = backgroundHeight / bgImage.naturalHeight;
462
- xOffset /= bgImage.naturalWidth;
463
- yOffset /= bgImage.naturalHeight;
464
- gl.uniform2f(backgroundScaleLocation, xScale, yScale);
465
- gl.uniform2f(backgroundOffsetLocation, xOffset, yOffset);
466
- }
467
- function updateCoverage(coverage) {
468
- gl.useProgram(program);
469
- gl.uniform2f(coverageLocation, coverage[0], coverage[1]);
470
- }
471
- function updateLightWrapping(lightWrapping) {
472
- gl.useProgram(program);
473
- gl.uniform1f(lightWrappingLocation, lightWrapping);
474
- }
475
- function updateBlendMode(blendMode) {
476
- gl.useProgram(program);
477
- gl.uniform1f(blendModeLocation, blendMode === 'screen' ? 0 : 1);
478
- }
479
- function cleanUp() {
480
- gl.deleteTexture(backgroundTexture);
481
- gl.deleteProgram(program);
482
- gl.deleteShader(fragmentShader);
483
- gl.deleteShader(vertexShader);
484
- }
485
- return {
486
- render,
487
- updateCoverage,
488
- updateLightWrapping,
489
- updateBlendMode,
490
- cleanUp,
491
- };
492
- }
493
-
494
- function buildJointBilateralFilterStage(gl, vertexShader, positionBuffer, texCoordBuffer, inputTexture, outputTexture, canvas, segmentationConfig) {
495
- const fragmentShaderSource = glsl `#version 300 es
496
-
497
- precision highp float;
498
-
499
- uniform sampler2D u_inputFrame;
500
- uniform sampler2D u_segmentationMask;
501
- uniform vec2 u_texelSize;
502
- uniform float u_step;
503
- uniform float u_radius;
504
- uniform float u_offset;
505
- uniform float u_sigmaTexel;
506
- uniform float u_sigmaColor;
507
-
508
- in vec2 v_texCoord;
509
- out vec4 outColor;
510
-
511
- float gaussian(float x, float sigma) {
512
- float coeff = -0.5 / (sigma * sigma * 4.0 + 1.0e-6);
513
- return exp((x * x) * coeff);
514
- }
515
-
516
- void main() {
517
- vec2 centerCoord = v_texCoord;
518
- vec3 centerColor = texture(u_inputFrame, centerCoord).rgb;
519
- float newVal = 0.0;
520
-
521
- float spaceWeight = 0.0;
522
- float colorWeight = 0.0;
523
- float totalWeight = 0.0;
524
-
525
- // Subsample kernel space.
526
- for (float i = -u_radius + u_offset; i <= u_radius; i += u_step) {
527
- for (float j = -u_radius + u_offset; j <= u_radius; j += u_step) {
528
- vec2 shift = vec2(j, i) * u_texelSize;
529
- vec2 coord = vec2(centerCoord + shift);
530
- vec3 frameColor = texture(u_inputFrame, coord).rgb;
531
- float outVal = texture(u_segmentationMask, coord).a;
532
-
533
- spaceWeight = gaussian(distance(centerCoord, coord), u_sigmaTexel);
534
- colorWeight = gaussian(distance(centerColor, frameColor), u_sigmaColor);
535
- totalWeight += spaceWeight * colorWeight;
536
-
537
- newVal += spaceWeight * colorWeight * outVal;
538
- }
539
- }
540
- newVal /= totalWeight;
541
-
542
- outColor = vec4(vec3(0.0), newVal);
543
- }
544
- `;
545
- const { width: segmentationWidth, height: segmentationHeight } = segmentationConfig;
546
- const { width: outputWidth, height: outputHeight } = canvas;
547
- const texelWidth = 1 / outputWidth;
548
- const texelHeight = 1 / outputHeight;
549
- const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
550
- const program = createPipelineStageProgram(gl, vertexShader, fragmentShader, positionBuffer, texCoordBuffer);
551
- const inputFrameLocation = gl.getUniformLocation(program, 'u_inputFrame');
552
- const segmentationMaskLocation = gl.getUniformLocation(program, 'u_segmentationMask');
553
- const texelSizeLocation = gl.getUniformLocation(program, 'u_texelSize');
554
- const stepLocation = gl.getUniformLocation(program, 'u_step');
555
- const radiusLocation = gl.getUniformLocation(program, 'u_radius');
556
- const offsetLocation = gl.getUniformLocation(program, 'u_offset');
557
- const sigmaTexelLocation = gl.getUniformLocation(program, 'u_sigmaTexel');
558
- const sigmaColorLocation = gl.getUniformLocation(program, 'u_sigmaColor');
559
- const frameBuffer = gl.createFramebuffer();
560
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
561
- gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, outputTexture, 0);
562
- gl.useProgram(program);
563
- gl.uniform1i(inputFrameLocation, 0);
564
- gl.uniform1i(segmentationMaskLocation, 1);
565
- gl.uniform2f(texelSizeLocation, texelWidth, texelHeight);
566
- // Ensures default values are configured to prevent infinite
567
- // loop in fragment shader
568
- updateSigmaSpace(0);
569
- updateSigmaColor(0);
570
- function render() {
571
- gl.viewport(0, 0, outputWidth, outputHeight);
572
- gl.useProgram(program);
573
- gl.activeTexture(gl.TEXTURE1);
574
- gl.bindTexture(gl.TEXTURE_2D, inputTexture);
575
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
576
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
577
- }
578
- function updateSigmaSpace(sigmaSpace) {
579
- sigmaSpace *= Math.max(outputWidth / segmentationWidth, outputHeight / segmentationHeight);
580
- const kSparsityFactor = 0.66; // Higher is sparser.
581
- const step = Math.max(1, Math.sqrt(sigmaSpace) * kSparsityFactor);
582
- const radius = sigmaSpace;
583
- const offset = step > 1 ? step * 0.5 : 0;
584
- const sigmaTexel = Math.max(texelWidth, texelHeight) * sigmaSpace;
585
- gl.useProgram(program);
586
- gl.uniform1f(stepLocation, step);
587
- gl.uniform1f(radiusLocation, radius);
588
- gl.uniform1f(offsetLocation, offset);
589
- gl.uniform1f(sigmaTexelLocation, sigmaTexel);
590
- }
591
- function updateSigmaColor(sigmaColor) {
592
- gl.useProgram(program);
593
- gl.uniform1f(sigmaColorLocation, sigmaColor);
594
- }
595
- function cleanUp() {
596
- gl.deleteFramebuffer(frameBuffer);
597
- gl.deleteProgram(program);
598
- gl.deleteShader(fragmentShader);
599
- }
600
- return { render, updateSigmaSpace, updateSigmaColor, cleanUp };
601
- }
602
-
603
- function buildResizingStage(gl, vertexShader, positionBuffer, texCoordBuffer, tflite, segmentationConfig, onError) {
604
- const fragmentShaderSource = glsl `#version 300 es
605
-
606
- precision highp float;
607
- uniform sampler2D u_inputFrame;
608
- in vec2 v_texCoord;
609
- out vec4 outColor;
610
-
611
- void main() {
612
- outColor = texture(u_inputFrame, v_texCoord);
613
- }
614
- `;
615
- // TFLite memory will be accessed as float32
616
- const tfliteInputMemoryOffset = tflite._getInputMemoryOffset() / 4;
617
- const { width: outputWidth, height: outputHeight } = segmentationConfig;
618
- const outputPixelCount = outputWidth * outputHeight;
619
- const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
620
- const program = createPipelineStageProgram(gl, vertexShader, fragmentShader, positionBuffer, texCoordBuffer);
621
- const inputFrameLocation = gl.getUniformLocation(program, 'u_inputFrame');
622
- const outputTexture = createTexture(gl, gl.RGBA8, outputWidth, outputHeight);
623
- const frameBuffer = gl.createFramebuffer();
624
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
625
- gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, outputTexture, 0);
626
- const outputPixels = new Uint8Array(outputPixelCount * 4);
627
- gl.useProgram(program);
628
- gl.uniform1i(inputFrameLocation, 0);
629
- function render() {
630
- gl.viewport(0, 0, outputWidth, outputHeight);
631
- gl.useProgram(program);
632
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
633
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
634
- // Downloads pixels asynchronously from GPU while rendering the current frame.
635
- // The pixels will be available in the next frame render which results
636
- // in offsets in the segmentation output but increases the frame rate.
637
- readPixelsAsync(gl, 0, 0, outputWidth, outputHeight, gl.RGBA, gl.UNSIGNED_BYTE, outputPixels).catch((error) => {
638
- });
639
- for (let i = 0; i < outputPixelCount; i++) {
640
- const tfliteIndex = tfliteInputMemoryOffset + i * 3;
641
- const outputIndex = i * 4;
642
- tflite.HEAPF32[tfliteIndex] = outputPixels[outputIndex] / 255;
643
- tflite.HEAPF32[tfliteIndex + 1] = outputPixels[outputIndex + 1] / 255;
644
- tflite.HEAPF32[tfliteIndex + 2] = outputPixels[outputIndex + 2] / 255;
645
- }
646
- }
647
- function cleanUp() {
648
- gl.deleteFramebuffer(frameBuffer);
649
- gl.deleteTexture(outputTexture);
650
- gl.deleteProgram(program);
651
- gl.deleteShader(fragmentShader);
652
- }
653
- return { render, cleanUp };
654
- }
655
-
656
- function buildSoftmaxStage(gl, vertexShader, positionBuffer, texCoordBuffer, tflite, outputTexture, segmentationConfig) {
657
- const fragmentShaderSource = glsl `#version 300 es
658
-
659
- precision highp float;
660
-
661
- uniform sampler2D u_inputSegmentation;
662
- in vec2 v_texCoord;
663
- out vec4 outColor;
664
-
665
- void main() {
666
- vec2 segmentation = texture(u_inputSegmentation, v_texCoord).rg;
667
- float shift = max(segmentation.r, segmentation.g);
668
- float backgroundExp = exp(segmentation.r - shift);
669
- float personExp = exp(segmentation.g - shift);
670
- outColor = vec4(vec3(0.0), personExp / (backgroundExp + personExp));
671
- }
672
- `;
673
- // TFLite memory will be accessed as float32
674
- const tfliteOutputMemoryOffset = tflite._getOutputMemoryOffset() / 4;
675
- const { width: segmentationWidth, height: segmentationHeight } = segmentationConfig;
676
- const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
677
- const program = createPipelineStageProgram(gl, vertexShader, fragmentShader, positionBuffer, texCoordBuffer);
678
- const inputLocation = gl.getUniformLocation(program, 'u_inputSegmentation');
679
- const inputTexture = createTexture(gl, gl.RG32F, segmentationWidth, segmentationHeight);
680
- const frameBuffer = gl.createFramebuffer();
681
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
682
- gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, outputTexture, 0);
683
- gl.useProgram(program);
684
- gl.uniform1i(inputLocation, 1);
685
- function render() {
686
- gl.viewport(0, 0, segmentationWidth, segmentationHeight);
687
- gl.useProgram(program);
688
- gl.activeTexture(gl.TEXTURE1);
689
- gl.bindTexture(gl.TEXTURE_2D, inputTexture);
690
- gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, segmentationWidth, segmentationHeight, gl.RG, gl.FLOAT, tflite.HEAPF32, tfliteOutputMemoryOffset);
691
- gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
692
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
693
- }
694
- function cleanUp() {
695
- gl.deleteFramebuffer(frameBuffer);
696
- gl.deleteTexture(inputTexture);
697
- gl.deleteProgram(program);
698
- gl.deleteShader(fragmentShader);
699
- }
700
- return { render, cleanUp };
701
- }
702
-
703
- function buildWebGL2Pipeline(videoSource, backgroundImage, blurLevel, backgroundFilter, canvas, tflite, segmentationConfig, onError) {
704
- const gl = canvas.getContext('webgl2');
705
- if (!gl)
706
- throw new Error('WebGL2 is not supported');
707
- if (gl.isContextLost())
708
- throw new Error('WebGL2 context was lost');
709
- const { width: frameWidth, height: frameHeight } = videoSource;
710
- const { width: segmentationWidth, height: segmentationHeight } = segmentationConfig;
711
- const vertexShaderSource = glsl `#version 300 es
712
-
713
- in vec2 a_position;
714
- in vec2 a_texCoord;
715
- out vec2 v_texCoord;
716
-
717
- void main() {
718
- gl_Position = vec4(a_position, 0.0, 1.0);
719
- v_texCoord = a_texCoord;
720
- }
721
- `;
722
- const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
723
- const vertexArray = gl.createVertexArray();
724
- gl.bindVertexArray(vertexArray);
725
- const positionBuffer = gl.createBuffer();
726
- gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
727
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1.0, -1, -1, 1.0, 1.0, 1.0]), gl.STATIC_DRAW);
728
- const texCoordBuffer = gl.createBuffer();
729
- gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
730
- gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0]), gl.STATIC_DRAW);
731
- // We don't use texStorage2D here because texImage2D seems faster
732
- // to upload video texture than texSubImage2D even though the latter
733
- // is supposed to be the recommended way:
734
- // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#use_texstorage_to_create_textures
735
- const inputFrameTexture = gl.createTexture();
736
- gl.bindTexture(gl.TEXTURE_2D, inputFrameTexture);
737
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
738
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
739
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
740
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
741
- // TODO Rename segmentation and person mask to be more specific
742
- const segmentationTexture = createTexture(gl, gl.RGBA8, segmentationWidth, segmentationHeight);
743
- const personMaskTexture = createTexture(gl, gl.RGBA8, frameWidth, frameHeight);
744
- const resizingStage = buildResizingStage(gl, vertexShader, positionBuffer, texCoordBuffer, tflite, segmentationConfig);
745
- const loadSegmentationStage = buildSoftmaxStage(gl, vertexShader, positionBuffer, texCoordBuffer, tflite, segmentationTexture, segmentationConfig);
746
- const jointBilateralFilterStage = buildJointBilateralFilterStage(gl, vertexShader, positionBuffer, texCoordBuffer, segmentationTexture, personMaskTexture, canvas, segmentationConfig);
747
- const backgroundStage = backgroundFilter === 'blur'
748
- ? buildBackgroundBlurStage(gl, vertexShader, positionBuffer, texCoordBuffer, personMaskTexture, canvas, blurLevel || 'high')
749
- : buildBackgroundImageStage(gl, positionBuffer, texCoordBuffer, personMaskTexture, backgroundImage, canvas);
750
- function render() {
751
- gl.activeTexture(gl.TEXTURE0);
752
- gl.bindTexture(gl.TEXTURE_2D, inputFrameTexture);
753
- // texImage2D seems faster than texSubImage2D to upload
754
- // video texture
755
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, videoSource);
756
- gl.bindVertexArray(vertexArray);
757
- resizingStage.render();
758
- tflite._runInference();
759
- loadSegmentationStage.render();
760
- jointBilateralFilterStage.render();
761
- backgroundStage.render();
762
- }
763
- function updatePostProcessingConfig() {
764
- jointBilateralFilterStage.updateSigmaSpace(1);
765
- jointBilateralFilterStage.updateSigmaColor(0.1);
766
- if (backgroundFilter === 'image') {
767
- const backgroundImageStage = backgroundStage;
768
- backgroundImageStage.updateCoverage([0.5, 0.75]);
769
- backgroundImageStage.updateLightWrapping(0.3);
770
- backgroundImageStage.updateBlendMode('screen');
771
- }
772
- else if (backgroundFilter === 'blur') {
773
- const backgroundBlurStage = backgroundStage;
774
- backgroundBlurStage.updateCoverage([0.5, 0.75]);
775
- }
776
- else {
777
- // TODO Handle no background in a separate pipeline path
778
- const backgroundImageStage = backgroundStage;
779
- backgroundImageStage.updateCoverage([0, 0.9999]);
780
- backgroundImageStage.updateLightWrapping(0);
781
- }
782
- }
783
- function cleanUp() {
784
- backgroundStage.cleanUp();
785
- jointBilateralFilterStage.cleanUp();
786
- loadSegmentationStage.cleanUp();
787
- resizingStage.cleanUp();
788
- gl.deleteTexture(personMaskTexture);
789
- gl.deleteTexture(segmentationTexture);
790
- gl.deleteTexture(inputFrameTexture);
791
- gl.deleteBuffer(texCoordBuffer);
792
- gl.deleteBuffer(positionBuffer);
793
- gl.deleteVertexArray(vertexArray);
794
- gl.deleteShader(vertexShader);
795
- }
796
- return { render, updatePostProcessingConfig, cleanUp };
797
- }
798
-
799
- exports.SegmentationLevel = void 0;
800
- (function (SegmentationLevel) {
801
- SegmentationLevel["LOW"] = "low";
802
- SegmentationLevel["HIGH"] = "high";
803
- })(exports.SegmentationLevel || (exports.SegmentationLevel = {}));
804
- const getSegmentationParams = (level) => {
805
- if (level === exports.SegmentationLevel.HIGH) {
806
- return { width: 256, height: 144 };
807
- }
808
- return { width: 160, height: 96 };
809
- };
810
-
811
- function createRenderer(tflite, videoSource, targetCanvas, options, onError) {
812
- const { backgroundFilter, backgroundImage, backgroundBlurLevel, segmentationLevel = exports.SegmentationLevel.HIGH, fps = 30, } = options;
813
- if (backgroundFilter === 'image' && !backgroundImage) {
814
- throw new Error(`backgroundImage element is required when backgroundFilter is image`);
815
- }
816
- const pipeline = buildWebGL2Pipeline(videoSource, backgroundImage, backgroundBlurLevel, backgroundFilter, targetCanvas, tflite, getSegmentationParams(segmentationLevel));
817
- const timers = new workerTimer.WorkerTimer({ useWorker: true });
818
- const id = timers.setInterval(() => {
819
- try {
820
- pipeline.render();
821
- if (backgroundFilter === 'image') {
822
- pipeline.updatePostProcessingConfig();
823
- }
824
- }
825
- catch (error) {
826
- onError?.(error);
827
- }
828
- }, Math.floor(1000 / (fps <= 0 ? 30 : fps)));
829
- return {
830
- dispose: () => {
831
- pipeline.cleanUp();
832
- timers.clearInterval(id);
833
- timers.destroy();
834
- },
835
- };
836
- }
837
-
838
- const createTFLiteSIMDModule = (__Module) => {
839
- __Module = __Module || {};
840
-
841
- var _scriptDir =
842
- typeof document !== 'undefined' && document.currentScript
843
- ? document.currentScript.src
844
- : undefined;
845
-
846
- var Module = typeof __Module != 'undefined' ? __Module : {};
847
- var readyPromiseResolve, readyPromiseReject;
848
- Module['ready'] = new Promise(function (resolve, reject) {
849
- readyPromiseResolve = resolve;
850
- readyPromiseReject = reject;
851
- });
852
- var moduleOverrides = Object.assign({}, Module);
853
- var thisProgram = './this.program';
854
- var quit_ = (status, toThrow) => {
855
- throw toThrow;
856
- };
857
- var ENVIRONMENT_IS_WEB = true;
858
- var scriptDirectory = '';
859
-
860
- function locateFile(path) {
861
- if (Module['locateFile']) {
862
- return Module['locateFile'](path, scriptDirectory);
863
- }
864
- return scriptDirectory + path;
865
- }
866
-
867
- var readBinary;
868
- {
869
- if (typeof document != 'undefined' && document.currentScript) {
870
- scriptDirectory = document.currentScript.src;
871
- }
872
- if (_scriptDir) {
873
- scriptDirectory = _scriptDir;
874
- }
875
- if (scriptDirectory.indexOf('blob:') !== 0) {
876
- scriptDirectory = scriptDirectory.substr(
877
- 0,
878
- scriptDirectory.replace(/[?#].*/, '').lastIndexOf('/') + 1,
879
- );
880
- } else {
881
- scriptDirectory = '';
882
- }
883
- }
884
- var out = Module['print'] || console.log.bind(console);
885
- var err = Module['printErr'] || console.warn.bind(console);
886
- Object.assign(Module, moduleOverrides);
887
- moduleOverrides = null;
888
- if (Module['arguments']) Module['arguments'];
889
- if (Module['thisProgram']) thisProgram = Module['thisProgram'];
890
- if (Module['quit']) quit_ = Module['quit'];
891
- var wasmBinary;
892
- if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];
893
- Module['noExitRuntime'] || true;
894
- if (typeof WebAssembly != 'object') {
895
- abort('no native wasm support detected');
896
- }
897
- var wasmMemory;
898
- var ABORT = false;
899
-
900
- var UTF8Decoder =
901
- typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined;
902
-
903
- function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead) {
904
- var endIdx = idx + maxBytesToRead;
905
- var endPtr = idx;
906
- while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;
907
- if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
908
- return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));
909
- }
910
- var str = '';
911
- while (idx < endPtr) {
912
- var u0 = heapOrArray[idx++];
913
- if (!(u0 & 128)) {
914
- str += String.fromCharCode(u0);
915
- continue;
916
- }
917
- var u1 = heapOrArray[idx++] & 63;
918
- if ((u0 & 224) == 192) {
919
- str += String.fromCharCode(((u0 & 31) << 6) | u1);
920
- continue;
921
- }
922
- var u2 = heapOrArray[idx++] & 63;
923
- if ((u0 & 240) == 224) {
924
- u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
925
- } else {
926
- u0 =
927
- ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63);
928
- }
929
- if (u0 < 65536) {
930
- str += String.fromCharCode(u0);
931
- } else {
932
- var ch = u0 - 65536;
933
- str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));
934
- }
935
- }
936
- return str;
937
- }
938
-
939
- var buffer, HEAP8, HEAPU8, HEAPU32;
940
-
941
- function updateGlobalBufferAndViews(buf) {
942
- buffer = buf;
943
- Module['HEAP8'] = HEAP8 = new Int8Array(buf);
944
- Module['HEAP16'] = new Int16Array(buf);
945
- Module['HEAP32'] = new Int32Array(buf);
946
- Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf);
947
- Module['HEAPU16'] = new Uint16Array(buf);
948
- Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf);
949
- Module['HEAPF32'] = new Float32Array(buf);
950
- Module['HEAPF64'] = new Float64Array(buf);
951
- }
952
-
953
- Module['INITIAL_MEMORY'] || 16777216;
954
- var __ATPRERUN__ = [];
955
- var __ATINIT__ = [];
956
- var __ATPOSTRUN__ = [];
957
-
958
- function preRun() {
959
- if (Module['preRun']) {
960
- if (typeof Module['preRun'] == 'function')
961
- Module['preRun'] = [Module['preRun']];
962
- while (Module['preRun'].length) {
963
- addOnPreRun(Module['preRun'].shift());
964
- }
965
- }
966
- callRuntimeCallbacks(__ATPRERUN__);
967
- }
968
-
969
- function initRuntime() {
970
- callRuntimeCallbacks(__ATINIT__);
971
- }
972
-
973
- function postRun() {
974
- if (Module['postRun']) {
975
- if (typeof Module['postRun'] == 'function')
976
- Module['postRun'] = [Module['postRun']];
977
- while (Module['postRun'].length) {
978
- addOnPostRun(Module['postRun'].shift());
979
- }
980
- }
981
- callRuntimeCallbacks(__ATPOSTRUN__);
982
- }
983
-
984
- function addOnPreRun(cb) {
985
- __ATPRERUN__.unshift(cb);
986
- }
987
-
988
- function addOnInit(cb) {
989
- __ATINIT__.unshift(cb);
990
- }
991
-
992
- function addOnPostRun(cb) {
993
- __ATPOSTRUN__.unshift(cb);
994
- }
995
-
996
- var runDependencies = 0;
997
- var dependenciesFulfilled = null;
998
-
999
- function addRunDependency(id) {
1000
- runDependencies++;
1001
- if (Module['monitorRunDependencies']) {
1002
- Module['monitorRunDependencies'](runDependencies);
1003
- }
1004
- }
1005
-
1006
- function removeRunDependency(id) {
1007
- runDependencies--;
1008
- if (Module['monitorRunDependencies']) {
1009
- Module['monitorRunDependencies'](runDependencies);
1010
- }
1011
- if (runDependencies == 0) {
1012
- if (dependenciesFulfilled) {
1013
- var callback = dependenciesFulfilled;
1014
- dependenciesFulfilled = null;
1015
- callback();
1016
- }
1017
- }
1018
- }
1019
-
1020
- function abort(what) {
1021
- {
1022
- if (Module['onAbort']) {
1023
- Module['onAbort'](what);
1024
- }
1025
- }
1026
- what = 'Aborted(' + what + ')';
1027
- err(what);
1028
- ABORT = true;
1029
- what += '. Build with -sASSERTIONS for more info.';
1030
- var e = new WebAssembly.RuntimeError(what);
1031
- readyPromiseReject(e);
1032
- throw e;
1033
- }
1034
-
1035
- var dataURIPrefix = 'data:application/octet-stream;base64,';
1036
-
1037
- function isDataURI(filename) {
1038
- return filename.startsWith(dataURIPrefix);
1039
- }
1040
-
1041
- var wasmBinaryFile;
1042
- wasmBinaryFile = 'tflite-simd.wasm';
1043
- if (!isDataURI(wasmBinaryFile)) {
1044
- wasmBinaryFile = locateFile(wasmBinaryFile);
1045
- }
1046
-
1047
- function getBinary(file) {
1048
- try {
1049
- if (file == wasmBinaryFile && wasmBinary) {
1050
- return new Uint8Array(wasmBinary);
1051
- }
1052
- if (readBinary) ;
1053
- throw 'both async and sync fetching of the wasm failed';
1054
- // eslint-disable-next-line @typescript-eslint/no-shadow
1055
- } catch (err) {
1056
- abort(err);
1057
- }
1058
- }
1059
-
1060
- function getBinaryPromise() {
1061
- if (!wasmBinary && (ENVIRONMENT_IS_WEB)) {
1062
- if (typeof fetch == 'function') {
1063
- return fetch(wasmBinaryFile, { credentials: 'same-origin' })
1064
- .then(function (response) {
1065
- if (!response['ok']) {
1066
- throw (
1067
- "failed to load wasm binary file at '" + wasmBinaryFile + "'"
1068
- );
1069
- }
1070
- return response['arrayBuffer']();
1071
- })
1072
- .catch(function () {
1073
- return getBinary(wasmBinaryFile);
1074
- });
1075
- }
1076
- }
1077
- return Promise.resolve().then(function () {
1078
- return getBinary(wasmBinaryFile);
1079
- });
1080
- }
1081
-
1082
- function createWasm() {
1083
- var info = {
1084
- env: asmLibraryArg,
1085
- wasi_snapshot_preview1: asmLibraryArg,
1086
- };
1087
-
1088
- function receiveInstance(instance, module) {
1089
- var exports = instance.exports;
1090
- Module['asm'] = exports;
1091
- wasmMemory = Module['asm']['memory'];
1092
- updateGlobalBufferAndViews(wasmMemory.buffer);
1093
- Module['asm']['__indirect_function_table'];
1094
- addOnInit(Module['asm']['__wasm_call_ctors']);
1095
- removeRunDependency();
1096
- }
1097
-
1098
- addRunDependency();
1099
-
1100
- function receiveInstantiationResult(result) {
1101
- receiveInstance(result['instance']);
1102
- }
1103
-
1104
- function instantiateArrayBuffer(receiver) {
1105
- return getBinaryPromise()
1106
- .then(function (binary) {
1107
- return WebAssembly.instantiate(binary, info);
1108
- })
1109
- .then(function (instance) {
1110
- return instance;
1111
- })
1112
- .then(receiver, function (reason) {
1113
- err('failed to asynchronously prepare wasm: ' + reason);
1114
- abort(reason);
1115
- });
1116
- }
1117
-
1118
- function instantiateAsync() {
1119
- if (
1120
- !wasmBinary &&
1121
- typeof WebAssembly.instantiateStreaming == 'function' &&
1122
- !isDataURI(wasmBinaryFile) &&
1123
- typeof fetch == 'function'
1124
- ) {
1125
- return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(
1126
- function (response) {
1127
- var result = WebAssembly.instantiateStreaming(response, info);
1128
- return result.then(receiveInstantiationResult, function (reason) {
1129
- err('wasm streaming compile failed: ' + reason);
1130
- err('falling back to ArrayBuffer instantiation');
1131
- return instantiateArrayBuffer(receiveInstantiationResult);
1132
- });
1133
- },
1134
- );
1135
- } else {
1136
- return instantiateArrayBuffer(receiveInstantiationResult);
1137
- }
1138
- }
1139
-
1140
- if (Module['instantiateWasm']) {
1141
- try {
1142
- var exports = Module['instantiateWasm'](info, receiveInstance);
1143
- return exports;
1144
- } catch (e) {
1145
- err('Module.instantiateWasm callback failed with error: ' + e);
1146
- readyPromiseReject(e);
1147
- }
1148
- }
1149
- instantiateAsync().catch(readyPromiseReject);
1150
- return {};
1151
- }
1152
-
1153
- function ExitStatus(status) {
1154
- this.name = 'ExitStatus';
1155
- this.message = 'Program terminated with exit(' + status + ')';
1156
- this.status = status;
1157
- }
1158
-
1159
- function callRuntimeCallbacks(callbacks) {
1160
- while (callbacks.length > 0) {
1161
- callbacks.shift()(Module);
1162
- }
1163
- }
1164
-
1165
- function __dlinit(main_dso_handle) {}
1166
-
1167
- var dlopenMissingError =
1168
- 'To use dlopen, you need enable dynamic linking, see https://github.com/emscripten-core/emscripten/wiki/Linking';
1169
-
1170
- function __dlopen_js(filename, flag) {
1171
- abort(dlopenMissingError);
1172
- }
1173
-
1174
- function __dlsym_js(handle, symbol) {
1175
- abort(dlopenMissingError);
1176
- }
1177
-
1178
- var nowIsMonotonic = true;
1179
-
1180
- function __emscripten_get_now_is_monotonic() {
1181
- return nowIsMonotonic;
1182
- }
1183
-
1184
- function __mmap_js(len, prot, flags, fd, off, allocated) {
1185
- return -52;
1186
- }
1187
-
1188
- function __munmap_js(addr, len, prot, flags, fd, offset) {}
1189
-
1190
- function _abort() {
1191
- abort('');
1192
- }
1193
-
1194
- function _emscripten_date_now() {
1195
- return Date.now();
1196
- }
1197
-
1198
- function getHeapMax() {
1199
- return 2147483648;
1200
- }
1201
-
1202
- function _emscripten_get_heap_max() {
1203
- return getHeapMax();
1204
- }
1205
-
1206
- var _emscripten_get_now;
1207
- _emscripten_get_now = () => performance.now();
1208
-
1209
- function _emscripten_memcpy_big(dest, src, num) {
1210
- HEAPU8.copyWithin(dest, src, src + num);
1211
- }
1212
-
1213
- function emscripten_realloc_buffer(size) {
1214
- try {
1215
- wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16);
1216
- updateGlobalBufferAndViews(wasmMemory.buffer);
1217
- return 1;
1218
- } catch (e) {}
1219
- }
1220
-
1221
- function _emscripten_resize_heap(requestedSize) {
1222
- var oldSize = HEAPU8.length;
1223
- requestedSize = requestedSize >>> 0;
1224
- var maxHeapSize = getHeapMax();
1225
- if (requestedSize > maxHeapSize) {
1226
- return false;
1227
- }
1228
- let alignUp = (x, multiple) => x + ((multiple - (x % multiple)) % multiple);
1229
- for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
1230
- var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);
1231
- overGrownHeapSize = Math.min(
1232
- overGrownHeapSize,
1233
- requestedSize + 100663296,
1234
- );
1235
- var newSize = Math.min(
1236
- maxHeapSize,
1237
- alignUp(Math.max(requestedSize, overGrownHeapSize), 65536),
1238
- );
1239
- var replacement = emscripten_realloc_buffer(newSize);
1240
- if (replacement) {
1241
- return true;
1242
- }
1243
- }
1244
- return false;
1245
- }
1246
-
1247
- var ENV = {};
1248
-
1249
- function getExecutableName() {
1250
- return thisProgram || './this.program';
1251
- }
1252
-
1253
- function getEnvStrings() {
1254
- if (!getEnvStrings.strings) {
1255
- var lang =
1256
- (
1257
- (typeof navigator == 'object' &&
1258
- navigator.languages &&
1259
- navigator.languages[0]) ||
1260
- 'C'
1261
- ).replace('-', '_') + '.UTF-8';
1262
- var env = {
1263
- USER: 'web_user',
1264
- LOGNAME: 'web_user',
1265
- PATH: '/',
1266
- PWD: '/',
1267
- HOME: '/home/web_user',
1268
- LANG: lang,
1269
- _: getExecutableName(),
1270
- };
1271
- for (var x in ENV) {
1272
- if (ENV[x] === undefined) delete env[x];
1273
- else env[x] = ENV[x];
1274
- }
1275
- var strings = [];
1276
- for (var x in env) {
1277
- strings.push(x + '=' + env[x]);
1278
- }
1279
- getEnvStrings.strings = strings;
1280
- }
1281
- return getEnvStrings.strings;
1282
- }
1283
-
1284
- // eslint-disable-next-line @typescript-eslint/no-shadow
1285
- function writeAsciiToMemory(str, buffer, dontAddNull) {
1286
- for (var i = 0; i < str.length; ++i) {
1287
- HEAP8[buffer++ >> 0] = str.charCodeAt(i);
1288
- }
1289
- HEAP8[buffer >> 0] = 0;
1290
- }
1291
-
1292
- function _environ_get(__environ, environ_buf) {
1293
- var bufSize = 0;
1294
- getEnvStrings().forEach(function (string, i) {
1295
- var ptr = environ_buf + bufSize;
1296
- HEAPU32[(__environ + i * 4) >> 2] = ptr;
1297
- writeAsciiToMemory(string, ptr);
1298
- bufSize += string.length + 1;
1299
- });
1300
- return 0;
1301
- }
1302
-
1303
- function _environ_sizes_get(penviron_count, penviron_buf_size) {
1304
- var strings = getEnvStrings();
1305
- HEAPU32[penviron_count >> 2] = strings.length;
1306
- var bufSize = 0;
1307
- strings.forEach(function (string) {
1308
- bufSize += string.length + 1;
1309
- });
1310
- HEAPU32[penviron_buf_size >> 2] = bufSize;
1311
- return 0;
1312
- }
1313
-
1314
- function _proc_exit(code) {
1315
- quit_(code, new ExitStatus(code));
1316
- }
1317
-
1318
- function exitJS(status, implicit) {
1319
- _proc_exit(status);
1320
- }
1321
-
1322
- var _exit = exitJS;
1323
-
1324
- function _fd_close(fd) {
1325
- return 52;
1326
- }
1327
-
1328
- function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
1329
- return 70;
1330
- }
1331
-
1332
- var printCharBuffers = [null, [], []];
1333
-
1334
- function printChar(stream, curr) {
1335
- // eslint-disable-next-line @typescript-eslint/no-shadow
1336
- var buffer = printCharBuffers[stream];
1337
- if (curr === 0 || curr === 10) {
1338
- (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
1339
- buffer.length = 0;
1340
- } else {
1341
- buffer.push(curr);
1342
- }
1343
- }
1344
-
1345
- function _fd_write(fd, iov, iovcnt, pnum) {
1346
- var num = 0;
1347
- for (var i = 0; i < iovcnt; i++) {
1348
- var ptr = HEAPU32[iov >> 2];
1349
- var len = HEAPU32[(iov + 4) >> 2];
1350
- iov += 8;
1351
- for (var j = 0; j < len; j++) {
1352
- printChar(fd, HEAPU8[ptr + j]);
1353
- }
1354
- num += len;
1355
- }
1356
- HEAPU32[pnum >> 2] = num;
1357
- return 0;
1358
- }
1359
-
1360
- function getRandomDevice() {
1361
- if (
1362
- typeof crypto == 'object' &&
1363
- typeof crypto['getRandomValues'] == 'function'
1364
- ) {
1365
- var randomBuffer = new Uint8Array(1);
1366
- return () => {
1367
- crypto.getRandomValues(randomBuffer);
1368
- return randomBuffer[0];
1369
- };
1370
- } else return () => abort('randomDevice');
1371
- }
1372
-
1373
- // eslint-disable-next-line @typescript-eslint/no-shadow
1374
- function _getentropy(buffer, size) {
1375
- if (!_getentropy.randomDevice) {
1376
- _getentropy.randomDevice = getRandomDevice();
1377
- }
1378
- for (var i = 0; i < size; i++) {
1379
- HEAP8[(buffer + i) >> 0] = _getentropy.randomDevice();
1380
- }
1381
- return 0;
1382
- }
1383
-
1384
- var asmLibraryArg = {
1385
- _dlinit: __dlinit,
1386
- _dlopen_js: __dlopen_js,
1387
- _dlsym_js: __dlsym_js,
1388
- _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic,
1389
- _mmap_js: __mmap_js,
1390
- _munmap_js: __munmap_js,
1391
- abort: _abort,
1392
- emscripten_date_now: _emscripten_date_now,
1393
- emscripten_get_heap_max: _emscripten_get_heap_max,
1394
- emscripten_get_now: _emscripten_get_now,
1395
- emscripten_memcpy_big: _emscripten_memcpy_big,
1396
- emscripten_resize_heap: _emscripten_resize_heap,
1397
- environ_get: _environ_get,
1398
- environ_sizes_get: _environ_sizes_get,
1399
- exit: _exit,
1400
- fd_close: _fd_close,
1401
- fd_seek: _fd_seek,
1402
- fd_write: _fd_write,
1403
- getentropy: _getentropy,
1404
- };
1405
- createWasm();
1406
- (Module['___wasm_call_ctors'] = function () {
1407
- return (Module['___wasm_call_ctors'] =
1408
- Module['asm']['__wasm_call_ctors']).apply(null, arguments);
1409
- });
1410
- (Module['_getModelBufferMemoryOffset'] =
1411
- function () {
1412
- return (Module[
1413
- '_getModelBufferMemoryOffset'
1414
- ] =
1415
- Module['asm']['getModelBufferMemoryOffset']).apply(null, arguments);
1416
- });
1417
- (Module['_getInputMemoryOffset'] = function () {
1418
- return (Module['_getInputMemoryOffset'] =
1419
- Module['asm']['getInputMemoryOffset']).apply(null, arguments);
1420
- });
1421
- (Module['_getInputHeight'] = function () {
1422
- return (Module['_getInputHeight'] =
1423
- Module['asm']['getInputHeight']).apply(null, arguments);
1424
- });
1425
- (Module['_getInputWidth'] = function () {
1426
- return (Module['_getInputWidth'] =
1427
- Module['asm']['getInputWidth']).apply(null, arguments);
1428
- });
1429
- (Module['_getInputChannelCount'] = function () {
1430
- return (Module['_getInputChannelCount'] =
1431
- Module['asm']['getInputChannelCount']).apply(null, arguments);
1432
- });
1433
- (Module['_getOutputMemoryOffset'] = function () {
1434
- return (Module['_getOutputMemoryOffset'] =
1435
- Module['asm']['getOutputMemoryOffset']).apply(null, arguments);
1436
- });
1437
- (Module['_getOutputHeight'] = function () {
1438
- return (Module['_getOutputHeight'] =
1439
- Module['asm']['getOutputHeight']).apply(null, arguments);
1440
- });
1441
- (Module['_getOutputWidth'] = function () {
1442
- return (Module['_getOutputWidth'] =
1443
- Module['asm']['getOutputWidth']).apply(null, arguments);
1444
- });
1445
- (Module['_getOutputChannelCount'] = function () {
1446
- return (Module['_getOutputChannelCount'] =
1447
- Module['asm']['getOutputChannelCount']).apply(null, arguments);
1448
- });
1449
- (Module['_loadModel'] = function () {
1450
- return (Module['_loadModel'] =
1451
- Module['asm']['loadModel']).apply(null, arguments);
1452
- });
1453
- (Module['_runInference'] = function () {
1454
- return (Module['_runInference'] =
1455
- Module['asm']['runInference']).apply(null, arguments);
1456
- });
1457
- (Module['_malloc'] = function () {
1458
- return (Module['_malloc'] = Module['asm']['malloc']).apply(
1459
- null,
1460
- arguments,
1461
- );
1462
- });
1463
- (Module['___errno_location'] = function () {
1464
- return (Module['___errno_location'] =
1465
- Module['asm']['__errno_location']).apply(null, arguments);
1466
- });
1467
- (Module['___dl_seterr'] = function () {
1468
- return (Module['___dl_seterr'] =
1469
- Module['asm']['__dl_seterr']).apply(null, arguments);
1470
- });
1471
- (Module['stackSave'] = function () {
1472
- return (Module['stackSave'] = Module['asm']['stackSave']).apply(
1473
- null,
1474
- arguments,
1475
- );
1476
- });
1477
- (Module['stackRestore'] = function () {
1478
- return (Module['stackRestore'] =
1479
- Module['asm']['stackRestore']).apply(null, arguments);
1480
- });
1481
- (Module['stackAlloc'] = function () {
1482
- return (Module['stackAlloc'] =
1483
- Module['asm']['stackAlloc']).apply(null, arguments);
1484
- });
1485
- (Module['dynCall_jjj'] = function () {
1486
- return (Module['dynCall_jjj'] =
1487
- Module['asm']['dynCall_jjj']).apply(null, arguments);
1488
- });
1489
- (Module['dynCall_jiii'] = function () {
1490
- return (Module['dynCall_jiii'] =
1491
- Module['asm']['dynCall_jiii']).apply(null, arguments);
1492
- });
1493
- (Module['dynCall_iiiijj'] = function () {
1494
- return (Module['dynCall_iiiijj'] =
1495
- Module['asm']['dynCall_iiiijj']).apply(null, arguments);
1496
- });
1497
- (Module['dynCall_viijj'] = function () {
1498
- return (Module['dynCall_viijj'] =
1499
- Module['asm']['dynCall_viijj']).apply(null, arguments);
1500
- });
1501
- (Module['dynCall_viiijjj'] = function () {
1502
- return (Module['dynCall_viiijjj'] =
1503
- Module['asm']['dynCall_viiijjj']).apply(null, arguments);
1504
- });
1505
- (Module['dynCall_iijjiiii'] = function () {
1506
- return (Module['dynCall_iijjiiii'] =
1507
- Module['asm']['dynCall_iijjiiii']).apply(null, arguments);
1508
- });
1509
- (Module['dynCall_jiji'] = function () {
1510
- return (Module['dynCall_jiji'] =
1511
- Module['asm']['dynCall_jiji']).apply(null, arguments);
1512
- });
1513
- var calledRun;
1514
- dependenciesFulfilled = function runCaller() {
1515
- if (!calledRun) run();
1516
- if (!calledRun) dependenciesFulfilled = runCaller;
1517
- };
1518
-
1519
- function run(args) {
1520
- if (runDependencies > 0) {
1521
- return;
1522
- }
1523
- preRun();
1524
- if (runDependencies > 0) {
1525
- return;
1526
- }
1527
-
1528
- function doRun() {
1529
- if (calledRun) return;
1530
- calledRun = true;
1531
- Module['calledRun'] = true;
1532
- if (ABORT) return;
1533
- initRuntime();
1534
- readyPromiseResolve(Module);
1535
- if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();
1536
- postRun();
1537
- }
1538
-
1539
- if (Module['setStatus']) {
1540
- Module['setStatus']('Running...');
1541
- setTimeout(function () {
1542
- setTimeout(function () {
1543
- Module['setStatus']('');
1544
- }, 1);
1545
- doRun();
1546
- }, 1);
1547
- } else {
1548
- doRun();
1549
- }
1550
- }
1551
-
1552
- if (Module['preInit']) {
1553
- if (typeof Module['preInit'] == 'function')
1554
- Module['preInit'] = [Module['preInit']];
1555
- while (Module['preInit'].length > 0) {
1556
- Module['preInit'].pop()();
1557
- }
1558
- }
1559
- run();
1560
-
1561
- return __Module.ready;
1562
- };
1563
-
1564
- const version = "0.10.0";
35
+ const version = "1.0.0-beta.1";
1565
36
  const packageName = "@stream-io/video-filters-web";
1566
37
 
1567
- // @ts-expect-error - module is not declared
1568
- // This is a WebAssembly module compiled from the TensorFlow Lite C++ library.
1569
- const createTFLite = createTFLiteSIMDModule;
1570
- const loadTFLite = async (options = {}) => {
1571
- const { basePath = `https://unpkg.com/${packageName}@${version}/tf`, tfFilePath = `${basePath}/tflite/tflite-simd.wasm`, modelFilePath = `${basePath}/models/segm_full_v679.tflite`, } = options;
1572
- const [tfLite, model] = await Promise.all([
1573
- createTFLite({ locateFile: () => tfFilePath }),
1574
- fetchModel(modelFilePath),
1575
- ]);
1576
- const modelBufferOffset = tfLite._getModelBufferMemoryOffset();
1577
- tfLite.HEAPU8.set(new Uint8Array(model), modelBufferOffset);
1578
- tfLite._loadModel(model.byteLength);
1579
- return tfLite;
1580
- };
1581
- let lastModelFilePath$1 = '';
1582
- let modelFileCache$1;
1583
- const fetchModel = async (modelFilePath) => {
1584
- const model = modelFilePath === lastModelFilePath$1 && modelFileCache$1
1585
- ? modelFileCache$1
1586
- : await fetch(modelFilePath).then((r) => r.arrayBuffer());
1587
- // Cache the model file for future use.
1588
- modelFileCache$1 = model;
1589
- lastModelFilePath$1 = modelFilePath;
1590
- return model;
1591
- };
1592
-
1593
38
  let lastModelFilePath = '';
1594
39
  let modelFileCache;
1595
40
  const loadMediaPipe = async (options = {}) => {
@@ -3049,9 +1494,6 @@ exports.BACKGROUND_BLUR_MAP = BACKGROUND_BLUR_MAP;
3049
1494
  exports.BaseVideoProcessor = BaseVideoProcessor;
3050
1495
  exports.FullScreenBlur = FullScreenBlur;
3051
1496
  exports.VirtualBackground = VirtualBackground;
3052
- exports.createRenderer = createRenderer;
3053
1497
  exports.isMediaPipePlatformSupported = isMediaPipePlatformSupported;
3054
- exports.isPlatformSupported = isPlatformSupported;
3055
1498
  exports.loadMediaPipe = loadMediaPipe;
3056
- exports.loadTFLite = loadTFLite;
3057
1499
  //# sourceMappingURL=index.cjs.js.map