@stream-io/video-filters-web 0.8.6 → 0.9.0
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 +12 -0
- package/README.md +38 -1
- 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 +168 -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 +26 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/src/VirtualBackground.d.ts +3 -2
- package/dist/src/types.d.ts +7 -5
- package/package.json +3 -3
- package/src/VirtualBackground.ts +29 -1
- package/src/types.ts +8 -5
- package/dist/index.es.js +0 -3022
- package/dist/index.es.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebGLRenderer.js","sources":["../../../../../src/WebGLRenderer.ts"],"sourcesContent":["import { BackgroundSource } from './types';\n\ntype ImageInfo = {\n type: 'image';\n texture: WebGLTexture;\n width: number;\n height: number;\n url: string;\n};\n\ntype VideoInfo = {\n type: 'video';\n texture: WebGLTexture;\n url: string;\n media: ReadableStream;\n canvas: OffscreenCanvas;\n};\n\ntype ColorInfo = {\n type: 'color';\n texture: WebGLTexture;\n color: readonly [number, number, number, number];\n};\n\ntype BackgroundRenderInfo = ImageInfo | VideoInfo | ColorInfo;\n\nexport class WebGLRenderer {\n readonly canvas: OffscreenCanvas;\n readonly gl: WebGL2RenderingContext;\n\n readonly stateUpdateProgram: WebGLProgram;\n readonly maskRefineProgram: WebGLProgram;\n readonly blurProgram: WebGLProgram;\n readonly blendProgram: WebGLProgram;\n\n readonly stateUpdateLocations: {\n position: number;\n texCoord: number;\n categoryTexture: WebGLUniformLocation | null;\n confidenceTexture: WebGLUniformLocation | null;\n prevStateTexture: WebGLUniformLocation | null;\n smoothingFactor: WebGLUniformLocation | null;\n smoothstepMin: WebGLUniformLocation | null;\n smoothstepMax: WebGLUniformLocation | null;\n selfieModel: WebGLUniformLocation | null;\n };\n readonly maskRefineLocations: {\n position: number;\n texCoord: number;\n maskTexture: WebGLUniformLocation | null;\n frameTexture: WebGLUniformLocation | null;\n texelSize: WebGLUniformLocation | null;\n sigmaSpatial: WebGLUniformLocation | null;\n sigmaRange: WebGLUniformLocation | null;\n };\n readonly blurLocations: {\n position: number;\n texCoord: number;\n image: WebGLUniformLocation | null;\n texelSize: WebGLUniformLocation | null;\n sigma: WebGLUniformLocation | null;\n radiusScale: WebGLUniformLocation | null;\n personMask: WebGLUniformLocation | null;\n direction: WebGLUniformLocation | null;\n };\n readonly blendLocations: {\n position: number;\n texCoord: number;\n frameTexture: WebGLUniformLocation | null;\n currentStateTexture: WebGLUniformLocation | null;\n backgroundTexture: WebGLUniformLocation | null;\n bgImageDimensions: WebGLUniformLocation | null;\n canvasDimensions: WebGLUniformLocation | null;\n borderSmooth: WebGLUniformLocation | null;\n bgBlur: WebGLUniformLocation | null;\n bgBlurRadius: WebGLUniformLocation | null;\n enabled: WebGLUniformLocation | null;\n };\n readonly positionBuffer: WebGLBuffer | null;\n readonly texCoordBuffer: WebGLBuffer | null;\n readonly storedStateTextures: (WebGLTexture | null)[];\n readonly fbo: WebGLFramebuffer | null;\n readonly refineFbo: WebGLFramebuffer | null;\n readonly refinedMaskTexture: WebGLTexture | null;\n readonly frameTexture: WebGLTexture | null;\n readonly blurTexture1: WebGLTexture | null;\n readonly blurTexture2: WebGLTexture | null;\n readonly blurFbo1: WebGLFramebuffer | null;\n readonly blurFbo2: WebGLFramebuffer | null;\n\n private running = false;\n private static readonly DEFAULT_BG_COLOR: readonly [\n number,\n number,\n number,\n number,\n ] = [33, 150, 243, 255];\n private currentStateIndex = 0;\n private backgroundRenderInfo: BackgroundRenderInfo | null = null;\n private activeBackgroundSourceIdentifier: string | null = null;\n\n constructor(canvas: OffscreenCanvas) {\n this.canvas = canvas;\n const gl = this.canvas.getContext('webgl2', {\n alpha: false,\n antialias: false,\n desynchronized: true,\n });\n if (!gl) throw new Error('WebGL2 not supported');\n this.gl = gl;\n\n const stateUpdateVertexShaderSource = `attribute vec2 a_position; attribute vec2 a_texCoord; varying vec2 v_texCoord; void main() { gl_Position = vec4(a_position, 0.0, 1.0); v_texCoord = a_texCoord; }`;\n const stateUpdateFragmentShaderSource = `\n precision mediump float;\n varying vec2 v_texCoord;\n uniform sampler2D u_categoryTexture;\n uniform sampler2D u_confidenceTexture;\n uniform sampler2D u_prevStateTexture;\n uniform float u_smoothingFactor;\n uniform float u_smoothstepMin;\n uniform float u_smoothstepMax;\n uniform int u_selfieModel;\n\n void main() {\n vec2 prevCoord = vec2(v_texCoord.x, 1.0 - v_texCoord.y);\n float categoryValue = texture2D(u_categoryTexture, v_texCoord).r;\n float confidenceValue = texture2D(u_confidenceTexture, v_texCoord).r;\n\n if (u_selfieModel == 1) {\n categoryValue = 1.0 - categoryValue;\n confidenceValue = 1.0 - confidenceValue;\n }\n\n if (categoryValue > 0.0) {\n categoryValue = 1.0;\n confidenceValue = 1.0 - confidenceValue;\n }\n\n float nonLinearConfidence = smoothstep(u_smoothstepMin, u_smoothstepMax, confidenceValue);\n float prevCategoryValue = texture2D(u_prevStateTexture, prevCoord).r;\n float alpha = u_smoothingFactor * nonLinearConfidence;\n float newCategoryValue = alpha * categoryValue + (1.0 - alpha) * prevCategoryValue;\n\n gl_FragColor = vec4(newCategoryValue, 0.0, 0.0, 0.0);\n }\n `;\n this.stateUpdateProgram = this.createAndLinkProgram(\n stateUpdateVertexShaderSource,\n stateUpdateFragmentShaderSource,\n );\n this.stateUpdateLocations = {\n position: gl.getAttribLocation(this.stateUpdateProgram, 'a_position'),\n texCoord: gl.getAttribLocation(this.stateUpdateProgram, 'a_texCoord'),\n categoryTexture: gl.getUniformLocation(\n this.stateUpdateProgram,\n 'u_categoryTexture',\n ),\n confidenceTexture: gl.getUniformLocation(\n this.stateUpdateProgram,\n 'u_confidenceTexture',\n ),\n prevStateTexture: gl.getUniformLocation(\n this.stateUpdateProgram,\n 'u_prevStateTexture',\n ),\n smoothingFactor: gl.getUniformLocation(\n this.stateUpdateProgram,\n 'u_smoothingFactor',\n ),\n smoothstepMin: gl.getUniformLocation(\n this.stateUpdateProgram,\n 'u_smoothstepMin',\n ),\n smoothstepMax: gl.getUniformLocation(\n this.stateUpdateProgram,\n 'u_smoothstepMax',\n ),\n selfieModel: gl.getUniformLocation(\n this.stateUpdateProgram,\n 'u_selfieModel',\n ),\n };\n\n const maskRefineVertexShaderSource = stateUpdateVertexShaderSource;\n const maskRefineFragmentShaderSource = `\n precision mediump float;\n varying vec2 v_texCoord;\n\n uniform sampler2D u_maskTexture;\n uniform sampler2D u_frameTexture;\n uniform vec2 u_texelSize;\n uniform float u_sigmaSpatial;\n uniform float u_sigmaRange;\n\n void main() {\n vec2 flippedCoord = v_texCoord;\n vec3 centerPixelColor = texture2D(u_frameTexture, v_texCoord).rgb;\n float totalWeight = 0.0;\n float weightedMaskSum = 0.0;\n\n for (int offsetX = -2; offsetX <= 2; offsetX++) {\n for (int offsetY = -2; offsetY <= 2; offsetY++) {\n vec2 shift = vec2(float(offsetX), float(offsetY)) * u_texelSize;\n vec2 frameCoord = v_texCoord + shift;\n vec2 maskCoord = flippedCoord + shift;\n\n vec3 neighborPixelColor = texture2D(u_frameTexture, frameCoord).rgb;\n float neighborMaskValue = texture2D(u_maskTexture, maskCoord).r;\n\n float spatialWeight = exp(-dot(shift, shift) / (2.0 * u_sigmaSpatial * u_sigmaSpatial));\n vec3 colorDifference = neighborPixelColor - centerPixelColor;\n float rangeWeight = exp(-(dot(colorDifference, colorDifference)) / (2.0 * u_sigmaRange * u_sigmaRange));\n\n float combinedWeight = spatialWeight * rangeWeight;\n weightedMaskSum += neighborMaskValue * combinedWeight;\n totalWeight += combinedWeight;\n }\n }\n\n float refinedMaskValue = weightedMaskSum / max(totalWeight, 1e-6);\n gl_FragColor = vec4(refinedMaskValue, refinedMaskValue, refinedMaskValue, 1.0);\n }\n `;\n\n this.maskRefineProgram = this.createAndLinkProgram(\n maskRefineVertexShaderSource,\n maskRefineFragmentShaderSource,\n );\n this.maskRefineLocations = {\n position: gl.getAttribLocation(this.maskRefineProgram, 'a_position'),\n texCoord: gl.getAttribLocation(this.maskRefineProgram, 'a_texCoord'),\n maskTexture: gl.getUniformLocation(\n this.maskRefineProgram,\n 'u_maskTexture',\n ),\n frameTexture: gl.getUniformLocation(\n this.maskRefineProgram,\n 'u_frameTexture',\n ),\n texelSize: gl.getUniformLocation(this.maskRefineProgram, 'u_texelSize'),\n sigmaSpatial: gl.getUniformLocation(\n this.maskRefineProgram,\n 'u_sigmaSpatial',\n ),\n sigmaRange: gl.getUniformLocation(this.maskRefineProgram, 'u_sigmaRange'),\n };\n\n const blurVertexShaderSource = stateUpdateVertexShaderSource;\n const blurFragmentShaderSource = `\n precision highp float;\n varying vec2 v_texCoord;\n\n uniform sampler2D u_image;\n uniform sampler2D u_personMask;\n uniform vec2 u_texelSize;\n uniform float u_sigma;\n uniform float u_radiusScale;\n uniform vec2 u_direction;\n\n const int KERNEL_RADIUS = 10;\n\n float gauss(float x, float s) {\n return exp(-(x * x) / (2.0 * s * s));\n }\n\n void main() {\n vec2 maskCoord = u_direction.y > 0.5 ? vec2(v_texCoord.x, 1.0 - v_texCoord.y) : v_texCoord;\n float mCenter = texture2D(u_personMask, maskCoord).r;\n float wCenter = gauss(0.0, u_sigma);\n vec4 accum = texture2D(u_image, v_texCoord) * wCenter * (1.0 - mCenter);\n float weightSum = wCenter * (1.0 - mCenter);\n\n for (int i = 1; i <= KERNEL_RADIUS; i++) {\n float f = float(i);\n float offset = f * u_radiusScale;\n float w = gauss(offset, u_sigma);\n vec2 texOffset = u_direction * offset * u_texelSize;\n\n vec2 uvPlus = v_texCoord + texOffset;\n vec2 maskCoordPlus = u_direction.y > 0.5 ? vec2(uvPlus.x, 1.0 - uvPlus.y) : uvPlus;\n float mPlus = texture2D(u_personMask, maskCoordPlus).r;\n accum += texture2D(u_image, uvPlus) * w * (1.0 - mPlus);\n weightSum += w * (1.0 - mPlus);\n\n vec2 uvMinus = v_texCoord - texOffset;\n vec2 maskCoordMinus = u_direction.y > 0.5 ? vec2(uvMinus.x, 1.0 - uvMinus.y) : uvMinus;\n float mMinus = texture2D(u_personMask, maskCoordMinus).r;\n accum += texture2D(u_image, uvMinus) * w * (1.0 - mMinus);\n weightSum += w * (1.0 - mMinus);\n }\n\n vec4 blurred = accum / max(weightSum, 1e-6);\n gl_FragColor = blurred;\n }\n `;\n\n this.blurProgram = this.createAndLinkProgram(\n blurVertexShaderSource,\n blurFragmentShaderSource,\n );\n this.blurLocations = {\n position: gl.getAttribLocation(this.blurProgram, 'a_position'),\n texCoord: gl.getAttribLocation(this.blurProgram, 'a_texCoord'),\n image: gl.getUniformLocation(this.blurProgram, 'u_image'),\n personMask: gl.getUniformLocation(this.blurProgram, 'u_personMask'),\n texelSize: gl.getUniformLocation(this.blurProgram, 'u_texelSize'),\n sigma: gl.getUniformLocation(this.blurProgram, 'u_sigma'),\n radiusScale: gl.getUniformLocation(this.blurProgram, 'u_radiusScale'),\n direction: gl.getUniformLocation(this.blurProgram, 'u_direction'),\n };\n\n const blendVertexShaderSource = stateUpdateVertexShaderSource;\n const blendFragmentShaderSource = `\n precision mediump float;\n varying vec2 v_texCoord;\n\n uniform sampler2D u_frameTexture;\n uniform sampler2D u_currentStateTexture;\n uniform sampler2D u_backgroundTexture;\n uniform vec2 u_bgImageDimensions;\n uniform vec2 u_canvasDimensions;\n uniform float u_borderSmooth;\n uniform float u_bgBlur;\n uniform float u_bgBlurRadius;\n uniform int u_enabled;\n\n vec4 getMixedFragColor(vec2 bgTexCoord, vec2 categoryCoord, vec2 offset) {\n vec4 backgroundColor = texture2D(u_backgroundTexture, bgTexCoord + offset);\n vec4 frameColor = texture2D(u_frameTexture, v_texCoord + offset);\n float categoryValue = texture2D(u_currentStateTexture, categoryCoord + offset).r;\n return mix(backgroundColor, frameColor, categoryValue);\n }\n\n void main() {\n if (u_enabled == 0) {\n gl_FragColor = texture2D(u_frameTexture, v_texCoord);\n return;\n }\n\n vec2 categoryCoord = v_texCoord;\n float categoryValue = texture2D(u_currentStateTexture, categoryCoord).r;\n\n float canvasAspect = u_canvasDimensions.x / u_canvasDimensions.y;\n float bgAspect = u_bgImageDimensions.x / u_bgImageDimensions.y;\n\n vec2 bgTexCoord = v_texCoord;\n float scaleX = 1.0;\n float scaleY = 1.0;\n float offsetX = 0.0;\n float offsetY = 0.0;\n\n if (canvasAspect < bgAspect) {\n scaleY = 1.0;\n scaleX = bgAspect / canvasAspect;\n offsetX = (1.0 - scaleX) / 2.0;\n } else {\n scaleX = 1.0;\n scaleY = canvasAspect / bgAspect;\n offsetY = (1.0 - scaleY) / 2.0;\n }\n\n bgTexCoord = vec2((v_texCoord.x - offsetX) / scaleX, (v_texCoord.y - offsetY) / scaleY);\n gl_FragColor = getMixedFragColor(bgTexCoord, categoryCoord, vec2(0.0, 0.0));\n }`;\n\n this.blendProgram = this.createAndLinkProgram(\n blendVertexShaderSource,\n blendFragmentShaderSource,\n );\n this.blendLocations = {\n position: gl.getAttribLocation(this.blendProgram, 'a_position'),\n texCoord: gl.getAttribLocation(this.blendProgram, 'a_texCoord'),\n frameTexture: gl.getUniformLocation(this.blendProgram, 'u_frameTexture'),\n currentStateTexture: gl.getUniformLocation(\n this.blendProgram,\n 'u_currentStateTexture',\n ),\n backgroundTexture: gl.getUniformLocation(\n this.blendProgram,\n 'u_backgroundTexture',\n ),\n bgImageDimensions: gl.getUniformLocation(\n this.blendProgram,\n 'u_bgImageDimensions',\n ),\n canvasDimensions: gl.getUniformLocation(\n this.blendProgram,\n 'u_canvasDimensions',\n ),\n borderSmooth: gl.getUniformLocation(this.blendProgram, 'u_borderSmooth'),\n bgBlur: gl.getUniformLocation(this.blendProgram, 'u_bgBlur'),\n bgBlurRadius: gl.getUniformLocation(this.blendProgram, 'u_bgBlurRadius'),\n enabled: gl.getUniformLocation(this.blendProgram, 'u_enabled'),\n };\n\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]),\n gl.STATIC_DRAW,\n );\n\n this.texCoordBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.texCoordBuffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0]),\n gl.STATIC_DRAW,\n );\n\n this.storedStateTextures = Array.from({ length: 2 }, () => {\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n 1,\n 1,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n new Uint8Array([0, 0, 0, 255]),\n );\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n return tex;\n });\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n this.fbo = gl.createFramebuffer();\n this.refineFbo = gl.createFramebuffer();\n\n const refinedTex = gl.createTexture();\n this.frameTexture = gl.createTexture();\n if (!refinedTex) throw new Error('Failed to create refined mask texture');\n gl.bindTexture(gl.TEXTURE_2D, refinedTex);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n 1,\n 1,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.bindTexture(gl.TEXTURE_2D, null);\n this.refinedMaskTexture = refinedTex;\n\n const mkColorTex = () => {\n const t = gl.createTexture();\n if (!t) throw new Error('Failed to create blur texture');\n gl.bindTexture(gl.TEXTURE_2D, t);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n 1,\n 1,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.bindTexture(gl.TEXTURE_2D, null);\n return t;\n };\n this.blurTexture1 = mkColorTex();\n this.blurTexture2 = mkColorTex();\n\n const mkFbo = (tex: WebGLTexture | null) => {\n const fb = gl.createFramebuffer();\n if (!fb || !tex) throw new Error('Failed to create blur FBO');\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n tex,\n 0,\n );\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return fb;\n };\n this.blurFbo1 = mkFbo(this.blurTexture1);\n this.blurFbo2 = mkFbo(this.blurTexture2);\n\n this.running = true;\n }\n\n private createAndLinkProgram(\n vsSource: string,\n fsSource: string,\n ): WebGLProgram {\n const vs = this.createShader(this.gl.VERTEX_SHADER, vsSource);\n const fs = this.createShader(this.gl.FRAGMENT_SHADER, fsSource);\n const prog = this.gl.createProgram();\n if (!prog) throw new Error('Failed to create program');\n this.gl.attachShader(prog, vs);\n this.gl.attachShader(prog, fs);\n this.gl.linkProgram(prog);\n if (!this.gl.getProgramParameter(prog, this.gl.LINK_STATUS)) {\n console.error('Program link error:', this.gl.getProgramInfoLog(prog));\n this.gl.deleteProgram(prog);\n throw new Error('Link fail');\n }\n this.gl.detachShader(prog, vs);\n this.gl.detachShader(prog, fs);\n this.gl.deleteShader(vs);\n this.gl.deleteShader(fs);\n return prog;\n }\n\n private createShader(type: number, source: string): WebGLShader {\n const shader = this.gl.createShader(type);\n if (!shader) throw new Error(`Failed to create shader type: ${type}`);\n this.gl.shaderSource(shader, source);\n this.gl.compileShader(shader);\n if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n console.error('Shader compile error:', this.gl.getShaderInfoLog(shader));\n this.gl.deleteShader(shader);\n throw new Error('Failed to compile shader');\n }\n return shader;\n }\n\n private createColorTexture(\n r: number,\n g: number,\n b: number,\n a: number,\n ): {\n texture: WebGLTexture;\n color: readonly [number, number, number, number];\n } {\n const texture = this.gl.createTexture();\n if (!texture) throw new Error('Failed to create texture for color');\n this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n const pixel = new Uint8Array([r, g, b, a]);\n this.gl.texImage2D(\n this.gl.TEXTURE_2D,\n 0,\n this.gl.RGBA,\n 1,\n 1,\n 0,\n this.gl.RGBA,\n this.gl.UNSIGNED_BYTE,\n pixel,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_WRAP_S,\n this.gl.CLAMP_TO_EDGE,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_WRAP_T,\n this.gl.CLAMP_TO_EDGE,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_MIN_FILTER,\n this.gl.NEAREST,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_MAG_FILTER,\n this.gl.NEAREST,\n );\n this.gl.bindTexture(this.gl.TEXTURE_2D, null);\n return { texture, color: [r, g, b, a] as const };\n }\n\n private updateBackgroundIfNeeded(newSource?: BackgroundSource | null) {\n const gl = this.gl;\n let newIdentifier: string;\n\n if (!newSource) {\n const [r, g, b, a] = WebGLRenderer.DEFAULT_BG_COLOR;\n newIdentifier = `color(${r},${g},${b},${a})`;\n } else {\n newIdentifier = newSource.url;\n }\n\n if (\n newIdentifier === this.activeBackgroundSourceIdentifier &&\n this.backgroundRenderInfo\n ) {\n return;\n }\n\n if (this.backgroundRenderInfo) {\n gl.deleteTexture(this.backgroundRenderInfo.texture);\n this.backgroundRenderInfo = null;\n }\n this.activeBackgroundSourceIdentifier = newIdentifier;\n\n if (!newSource) {\n const [r, g, b, a] = WebGLRenderer.DEFAULT_BG_COLOR;\n const colorTexData = this.createColorTexture(r, g, b, a);\n this.backgroundRenderInfo = {\n type: 'color',\n texture: colorTexData.texture,\n color: colorTexData.color,\n };\n this.activeBackgroundSourceIdentifier = `color(${r},${g},${b},${a})`;\n } else {\n if (newSource.type === 'image') {\n const { media, url } = newSource as { media: ImageBitmap; url: string };\n const texture = this.gl.createTexture();\n if (!texture) {\n throw new Error('Failed to create texture object for image.');\n }\n this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n this.gl.texImage2D(\n this.gl.TEXTURE_2D,\n 0,\n this.gl.RGBA,\n this.gl.RGBA,\n this.gl.UNSIGNED_BYTE,\n media,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_WRAP_S,\n this.gl.CLAMP_TO_EDGE,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_WRAP_T,\n this.gl.CLAMP_TO_EDGE,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_MIN_FILTER,\n this.gl.LINEAR,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_MAG_FILTER,\n this.gl.LINEAR,\n );\n this.gl.bindTexture(this.gl.TEXTURE_2D, null);\n\n this.backgroundRenderInfo = {\n type: 'image',\n texture,\n width: media.width,\n height: media.height,\n url,\n };\n } else if (newSource.type === 'video') {\n const { media, url } = newSource as {\n media: ReadableStream;\n url: string;\n };\n\n const canvas = new OffscreenCanvas(1, 1);\n const ctx = canvas.getContext('2d');\n const writer = new WritableStream({\n write(videoFrame: VideoFrame) {\n canvas.width = videoFrame.codedWidth;\n canvas.height = videoFrame.codedHeight;\n ctx?.drawImage(videoFrame, 0, 0);\n videoFrame.close();\n },\n close() {\n console.log('[virtual-background] video background close');\n },\n });\n media.pipeTo(writer).catch((err) => {\n console.error('media.pipeTo(writer) error', err);\n });\n\n const texture = this.gl.createTexture();\n if (!texture) throw new Error('Failed to create texture for video');\n this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n this.gl.texImage2D(\n this.gl.TEXTURE_2D,\n 0,\n this.gl.RGBA,\n 1,\n 1,\n 0,\n this.gl.RGBA,\n this.gl.UNSIGNED_BYTE,\n null,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_WRAP_S,\n this.gl.CLAMP_TO_EDGE,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_WRAP_T,\n this.gl.CLAMP_TO_EDGE,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_MIN_FILTER,\n this.gl.LINEAR,\n );\n this.gl.texParameteri(\n this.gl.TEXTURE_2D,\n this.gl.TEXTURE_MAG_FILTER,\n this.gl.LINEAR,\n );\n this.gl.bindTexture(this.gl.TEXTURE_2D, null);\n\n this.backgroundRenderInfo = {\n type: 'video',\n texture,\n url,\n media,\n canvas,\n };\n }\n }\n\n if (!this.backgroundRenderInfo) {\n console.error(\n 'Critical: backgroundRenderInfo is null after processing new source. Setting default color.',\n );\n const [r, g, b, a] = WebGLRenderer.DEFAULT_BG_COLOR;\n const colorTexData = this.createColorTexture(r, g, b, a);\n this.backgroundRenderInfo = {\n type: 'color',\n texture: colorTexData.texture,\n color: colorTexData.color,\n };\n this.activeBackgroundSourceIdentifier = `color(${r},${g},${b},${a})`;\n }\n }\n\n public render(\n videoFrame: VideoFrame,\n options: {\n backgroundSource?: BackgroundSource | null;\n bgBlur: number;\n bgBlurRadius: number;\n isSelfieMode: boolean;\n segmentationOptions?: {\n smoothingFactor?: number;\n smoothstepMin?: number;\n smoothstepMax?: number;\n };\n },\n categoryTexture?: WebGLTexture,\n confidenceTexture?: WebGLTexture,\n ) {\n if (!this.running) return;\n const {\n gl,\n fbo,\n frameTexture,\n storedStateTextures,\n stateUpdateProgram,\n stateUpdateLocations,\n refineFbo,\n refinedMaskTexture,\n maskRefineProgram,\n maskRefineLocations,\n blendProgram,\n blendLocations,\n blurFbo1,\n blurFbo2,\n blurTexture1,\n blurTexture2,\n } = this;\n\n const { displayWidth: width, displayHeight: height } = videoFrame;\n if (this.canvas.width !== width || this.canvas.height !== height) {\n this.canvas.width = width;\n this.canvas.height = height;\n }\n\n if (!categoryTexture || !confidenceTexture) {\n gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n gl.useProgram(blendProgram);\n\n const frame = gl.createTexture();\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, frame);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n videoFrame,\n );\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.uniform1i(blendLocations.frameTexture, 0);\n gl.uniform1i(blendLocations.enabled, 0);\n\n gl.enableVertexAttribArray(blendLocations.position);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.vertexAttribPointer(blendLocations.position, 2, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray(blendLocations.texCoord);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.texCoordBuffer);\n gl.vertexAttribPointer(blendLocations.texCoord, 2, gl.FLOAT, false, 0, 0);\n\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n gl.deleteTexture(frame);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return;\n }\n\n const readStateIndex = this.currentStateIndex;\n const writeStateIndex = (this.currentStateIndex + 1) % 2;\n const prevStateTexture = storedStateTextures[readStateIndex];\n const newStateTexture = storedStateTextures[writeStateIndex];\n\n this.updateBackgroundIfNeeded(options.backgroundSource);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n newStateTexture,\n 0,\n );\n\n gl.bindTexture(gl.TEXTURE_2D, newStateTexture);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n width,\n height,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n\n gl.viewport(0, 0, width, height);\n gl.useProgram(stateUpdateProgram);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, categoryTexture);\n gl.uniform1i(stateUpdateLocations.categoryTexture, 0);\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, confidenceTexture);\n gl.uniform1i(stateUpdateLocations.confidenceTexture, 1);\n gl.activeTexture(gl.TEXTURE2);\n gl.bindTexture(gl.TEXTURE_2D, prevStateTexture);\n gl.uniform1i(stateUpdateLocations.prevStateTexture, 2);\n\n gl.uniform1f(\n stateUpdateLocations.smoothingFactor,\n options.segmentationOptions?.smoothingFactor ?? 0.8,\n );\n gl.uniform1f(\n stateUpdateLocations.smoothstepMin,\n options.segmentationOptions?.smoothstepMin ?? 0.6,\n );\n gl.uniform1f(\n stateUpdateLocations.smoothstepMax,\n options.segmentationOptions?.smoothstepMax ?? 0.9,\n );\n\n gl.uniform1i(\n stateUpdateLocations.selfieModel,\n options.isSelfieMode ? 1 : 0,\n );\n\n gl.enableVertexAttribArray(stateUpdateLocations.position);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.vertexAttribPointer(\n stateUpdateLocations.position,\n 2,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n gl.enableVertexAttribArray(stateUpdateLocations.texCoord);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.texCoordBuffer);\n gl.vertexAttribPointer(\n stateUpdateLocations.texCoord,\n 2,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, refineFbo);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0,\n gl.TEXTURE_2D,\n refinedMaskTexture,\n 0,\n );\n\n gl.bindTexture(gl.TEXTURE_2D, refinedMaskTexture);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n width,\n height,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n\n gl.viewport(0, 0, width, height);\n gl.useProgram(maskRefineProgram);\n\n gl.enableVertexAttribArray(maskRefineLocations.position);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.vertexAttribPointer(\n maskRefineLocations.position,\n 2,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n gl.enableVertexAttribArray(maskRefineLocations.texCoord);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.texCoordBuffer);\n gl.vertexAttribPointer(\n maskRefineLocations.texCoord,\n 2,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, newStateTexture);\n gl.uniform1i(maskRefineLocations.maskTexture, 0);\n\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, frameTexture);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n videoFrame,\n );\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.uniform1i(maskRefineLocations.frameTexture, 1);\n\n gl.uniform2f(maskRefineLocations.texelSize, 1.0 / width, 1.0 / height);\n gl.uniform1f(maskRefineLocations.sigmaSpatial, 2.0);\n gl.uniform1f(maskRefineLocations.sigmaRange, 0.1);\n\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n gl.disableVertexAttribArray(maskRefineLocations.position);\n gl.disableVertexAttribArray(maskRefineLocations.texCoord);\n\n let backgroundTexToUse: WebGLTexture | null;\n let bgWToSend = width;\n let bgHToSend = height;\n\n if (options.bgBlur > 0 && options.bgBlurRadius > 0) {\n const downscale = 0.5;\n const blurW = Math.floor(width * downscale);\n const blurH = Math.floor(height * downscale);\n\n gl.bindTexture(gl.TEXTURE_2D, blurTexture1);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n blurW,\n blurH,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n gl.bindTexture(gl.TEXTURE_2D, blurTexture2);\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.RGBA,\n blurW,\n blurH,\n 0,\n gl.RGBA,\n gl.UNSIGNED_BYTE,\n null,\n );\n\n const KERNEL_RADIUS = 10.0;\n const radiusScale = Math.max(0.0, options.bgBlurRadius) / KERNEL_RADIUS;\n\n gl.useProgram(this.blurProgram);\n\n gl.enableVertexAttribArray(this.blurLocations.position);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.vertexAttribPointer(\n this.blurLocations.position,\n 2,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n gl.enableVertexAttribArray(this.blurLocations.texCoord);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.texCoordBuffer);\n gl.vertexAttribPointer(\n this.blurLocations.texCoord,\n 2,\n gl.FLOAT,\n false,\n 0,\n 0,\n );\n\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, refinedMaskTexture);\n gl.uniform1i(this.blurLocations.personMask, 1);\n gl.uniform1f(this.blurLocations.sigma, options.bgBlur * 0.7);\n gl.uniform1f(this.blurLocations.radiusScale, radiusScale);\n\n const blurPasses = [\n {\n direction: [1.0, 0.0],\n input: frameTexture,\n output: blurFbo1,\n texelSize: [1.0 / width, 1.0 / height],\n },\n {\n direction: [0.0, 1.0],\n input: blurTexture1,\n output: blurFbo2,\n texelSize: [1.0 / blurW, 1.0 / blurH],\n },\n {\n direction: [1.0, 0.0],\n input: blurTexture2,\n output: blurFbo1,\n texelSize: [1.0 / blurW, 1.0 / blurH],\n },\n {\n direction: [0.0, 1.0],\n input: blurTexture1,\n output: blurFbo2,\n texelSize: [1.0 / blurW, 1.0 / blurH],\n },\n ];\n\n for (const pass of blurPasses) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, pass.output);\n gl.viewport(0, 0, blurW, blurH);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, pass.input);\n gl.uniform1i(this.blurLocations.image, 0);\n gl.uniform2f(\n this.blurLocations.texelSize,\n pass.texelSize[0],\n pass.texelSize[1],\n );\n gl.uniform2f(\n this.blurLocations.direction,\n pass.direction[0],\n pass.direction[1],\n );\n\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n }\n\n backgroundTexToUse = blurTexture2!;\n bgWToSend = blurW;\n bgHToSend = blurH;\n } else if (options.backgroundSource && this.backgroundRenderInfo) {\n backgroundTexToUse = this.backgroundRenderInfo.texture;\n if (this.backgroundRenderInfo.type === 'video') {\n const { canvas } = this.backgroundRenderInfo;\n bgWToSend = canvas.width || width;\n bgHToSend = canvas.height || height;\n } else if (this.backgroundRenderInfo.type === 'image') {\n bgWToSend = this.backgroundRenderInfo.width;\n bgHToSend = this.backgroundRenderInfo.height;\n } else {\n bgWToSend = width;\n bgHToSend = height;\n }\n } else {\n backgroundTexToUse = this.backgroundRenderInfo?.texture ?? null;\n }\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n gl.useProgram(blendProgram);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, frameTexture);\n gl.uniform1i(blendLocations.frameTexture, 0);\n gl.uniform1f(blendLocations.borderSmooth, 0);\n gl.uniform1f(blendLocations.bgBlur, options.bgBlur);\n gl.uniform1f(blendLocations.bgBlurRadius, options.bgBlurRadius);\n gl.uniform1i(blendLocations.enabled, 1);\n\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, refinedMaskTexture);\n gl.uniform1i(blendLocations.currentStateTexture, 1);\n\n if (backgroundTexToUse) {\n gl.activeTexture(gl.TEXTURE2);\n gl.bindTexture(gl.TEXTURE_2D, backgroundTexToUse);\n\n gl.uniform1i(blendLocations.backgroundTexture, 2);\n gl.uniform2f(blendLocations.bgImageDimensions, bgWToSend, bgHToSend);\n gl.uniform2f(blendLocations.canvasDimensions, width, height);\n } else {\n gl.uniform2f(blendLocations.bgImageDimensions, width, height);\n gl.uniform2f(blendLocations.canvasDimensions, width, height);\n }\n\n gl.enableVertexAttribArray(blendLocations.position);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.vertexAttribPointer(blendLocations.position, 2, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray(blendLocations.texCoord);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.texCoordBuffer);\n gl.vertexAttribPointer(blendLocations.texCoord, 2, gl.FLOAT, false, 0, 0);\n\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n for (let i = 0; i < 3; ++i) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n\n this.currentStateIndex = writeStateIndex;\n }\n\n public close() {\n if (!this.running) return;\n this.running = false;\n\n const { gl, fbo, refineFbo, refinedMaskTexture, blurFbo1, blurFbo2 } = this;\n\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n if (fbo) gl.deleteFramebuffer(fbo);\n if (refineFbo) gl.deleteFramebuffer(refineFbo);\n if (blurFbo1) gl.deleteFramebuffer(blurFbo1);\n if (blurFbo2) gl.deleteFramebuffer(blurFbo2);\n\n gl.deleteProgram(this.stateUpdateProgram);\n gl.deleteProgram(this.maskRefineProgram);\n gl.deleteProgram(this.blurProgram);\n gl.deleteProgram(this.blendProgram);\n\n if (this.positionBuffer) gl.deleteBuffer(this.positionBuffer);\n if (this.texCoordBuffer) gl.deleteBuffer(this.texCoordBuffer);\n\n if (refinedMaskTexture) gl.deleteTexture(refinedMaskTexture);\n if (this.blurTexture1) gl.deleteTexture(this.blurTexture1);\n if (this.blurTexture2) gl.deleteTexture(this.blurTexture2);\n this.storedStateTextures.forEach((t) => t && gl.deleteTexture(t));\n this.storedStateTextures.splice(0, this.storedStateTextures.length);\n if (this.backgroundRenderInfo?.texture) {\n gl.deleteTexture(this.backgroundRenderInfo.texture);\n this.backgroundRenderInfo = null;\n }\n this.activeBackgroundSourceIdentifier = null;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { simd } from 'wasm-feature-detect';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Checks if the current platform is a mobile device.
|
|
5
|
+
*
|
|
6
|
+
* See:
|
|
7
|
+
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent
|
|
8
|
+
*/
|
|
9
|
+
const isMobile = () => /Mobi/i.test(navigator.userAgent);
|
|
10
|
+
/**
|
|
11
|
+
* Checks whether the current browser is Safari.
|
|
12
|
+
*/
|
|
13
|
+
const isSafari = () => /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
14
|
+
/**
|
|
15
|
+
* Runs a check to see if the current platform supports
|
|
16
|
+
* the necessary APIs required for the video filters.
|
|
17
|
+
*/
|
|
18
|
+
const isPlatformSupported = async ({ forceMobileSupport = false, forceSafariSupport = false, } = {}) => typeof document !== 'undefined' &&
|
|
19
|
+
typeof window !== 'undefined' &&
|
|
20
|
+
typeof navigator !== 'undefined' &&
|
|
21
|
+
// we don't support mobile devices yet due to performance issues
|
|
22
|
+
(forceMobileSupport || !isMobile()) &&
|
|
23
|
+
// Safari has issues with timer throttling, causing low FPS when the tab goes to the background
|
|
24
|
+
(forceSafariSupport || !isSafari()) &&
|
|
25
|
+
typeof WebAssembly !== 'undefined' &&
|
|
26
|
+
!!window.WebGL2RenderingContext && // WebGL2 is required for the video filters
|
|
27
|
+
!!document.createElement('canvas').getContext('webgl2') &&
|
|
28
|
+
(await simd()); // SIMD is required for the wasm module
|
|
29
|
+
/**
|
|
30
|
+
* Runs a check to see if the current platform supports
|
|
31
|
+
* the necessary APIs required for the MediaPipe-based video filters.
|
|
32
|
+
*/
|
|
33
|
+
const isMediaPipePlatformSupported = async ({ forceMobileSupport = false, forceSafariSupport = false, } = {}) => typeof document !== 'undefined' &&
|
|
34
|
+
typeof window !== 'undefined' &&
|
|
35
|
+
typeof navigator !== 'undefined' &&
|
|
36
|
+
// we don't support mobile devices yet due to performance issues
|
|
37
|
+
(forceMobileSupport || !isMobile()) &&
|
|
38
|
+
// Safari has issues with timer throttling, causing low FPS when the tab goes to the background
|
|
39
|
+
(forceSafariSupport || !isSafari()) &&
|
|
40
|
+
typeof WebAssembly !== 'undefined' &&
|
|
41
|
+
typeof OffscreenCanvas !== 'undefined' && // OffscreenCanvas is required for efficient rendering
|
|
42
|
+
!!window.WebGL2RenderingContext && // WebGL2 is required for the video filters
|
|
43
|
+
!!new OffscreenCanvas(1, 1).getContext('webgl2') &&
|
|
44
|
+
typeof VideoFrame !== 'undefined' && // VideoFrame API is required for frame processing
|
|
45
|
+
typeof createImageBitmap !== 'undefined'; // createImageBitmap is required for background image processing
|
|
46
|
+
|
|
47
|
+
export { isMediaPipePlatformSupported, isPlatformSupported };
|
|
48
|
+
//# sourceMappingURL=compatibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatibility.js","sources":["../../../../../src/compatibility.ts"],"sourcesContent":["import { simd } from 'wasm-feature-detect';\n\nexport type PlatformSupportFlags = {\n /**\n * Forces support for mobile devices, although performance isn't optimal.\n */\n forceMobileSupport?: boolean;\n\n /**\n * Forces support for Safari, although in cases where the tab is put in the background,\n * the FPS can drop significantly or freeze completely due to intensive timer throttling.\n */\n forceSafariSupport?: boolean;\n};\n\n/**\n * Checks if the current platform is a mobile device.\n *\n * See:\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent\n */\nconst isMobile = () => /Mobi/i.test(navigator.userAgent);\n\n/**\n * Checks whether the current browser is Safari.\n */\nconst isSafari = () =>\n /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\n/**\n * Runs a check to see if the current platform supports\n * the necessary APIs required for the video filters.\n */\nexport const isPlatformSupported = async ({\n forceMobileSupport = false,\n forceSafariSupport = false,\n}: PlatformSupportFlags = {}) =>\n typeof document !== 'undefined' &&\n typeof window !== 'undefined' &&\n typeof navigator !== 'undefined' &&\n // we don't support mobile devices yet due to performance issues\n (forceMobileSupport || !isMobile()) &&\n // Safari has issues with timer throttling, causing low FPS when the tab goes to the background\n (forceSafariSupport || !isSafari()) &&\n typeof WebAssembly !== 'undefined' &&\n !!window.WebGL2RenderingContext && // WebGL2 is required for the video filters\n !!document.createElement('canvas').getContext('webgl2') &&\n (await simd()); // SIMD is required for the wasm module\n\n/**\n * Runs a check to see if the current platform supports\n * the necessary APIs required for the MediaPipe-based video filters.\n */\nexport const isMediaPipePlatformSupported = async ({\n forceMobileSupport = false,\n forceSafariSupport = false,\n}: PlatformSupportFlags = {}) =>\n typeof document !== 'undefined' &&\n typeof window !== 'undefined' &&\n typeof navigator !== 'undefined' &&\n // we don't support mobile devices yet due to performance issues\n (forceMobileSupport || !isMobile()) &&\n // Safari has issues with timer throttling, causing low FPS when the tab goes to the background\n (forceSafariSupport || !isSafari()) &&\n typeof WebAssembly !== 'undefined' &&\n typeof OffscreenCanvas !== 'undefined' && // OffscreenCanvas is required for efficient rendering\n !!window.WebGL2RenderingContext && // WebGL2 is required for the video filters\n !!new OffscreenCanvas(1, 1).getContext('webgl2') &&\n typeof VideoFrame !== 'undefined' && // VideoFrame API is required for frame processing\n typeof createImageBitmap !== 'undefined'; // createImageBitmap is required for background image processing\n"],"names":[],"mappings":";;AAeA;;;;;AAKG;AACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;AAExD;;AAEG;AACH,MAAM,QAAQ,GAAG,MACf,gCAAgC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;AAE5D;;;AAGG;MACU,mBAAmB,GAAG,OAAO,EACxC,kBAAkB,GAAG,KAAK,EAC1B,kBAAkB,GAAG,KAAK,MACF,EAAE,KAC1B,OAAO,QAAQ,KAAK,WAAW;IAC/B,OAAO,MAAM,KAAK,WAAW;IAC7B,OAAO,SAAS,KAAK,WAAW;;AAEhC,KAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC;;AAEnC,KAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC;IACnC,OAAO,WAAW,KAAK,WAAW;AAClC,IAAA,CAAC,CAAC,MAAM,CAAC,sBAAsB;IAC/B,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC;AACvD,KAAC,MAAM,IAAI,EAAE,EAAE;AAEjB;;;AAGG;MACU,4BAA4B,GAAG,OAAO,EACjD,kBAAkB,GAAG,KAAK,EAC1B,kBAAkB,GAAG,KAAK,MACF,EAAE,KAC1B,OAAO,QAAQ,KAAK,WAAW;IAC/B,OAAO,MAAM,KAAK,WAAW;IAC7B,OAAO,SAAS,KAAK,WAAW;;AAEhC,KAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC;;AAEnC,KAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC;IACnC,OAAO,WAAW,KAAK,WAAW;AAClC,IAAA,OAAO,eAAe,KAAK,WAAW;AACtC,IAAA,CAAC,CAAC,MAAM,CAAC,sBAAsB;AAC/B,IAAA,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC;AAChD,IAAA,OAAO,UAAU,KAAK,WAAW;AACjC,IAAA,OAAO,iBAAiB,KAAK,YAAY;;;;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { WorkerTimer } from '@stream-io/worker-timer';
|
|
2
|
+
import { buildWebGL2Pipeline } from './webgl2/webgl2Pipeline.js';
|
|
3
|
+
import { SegmentationLevel, getSegmentationParams } from './segmentation.js';
|
|
4
|
+
|
|
5
|
+
function createRenderer(tflite, videoSource, targetCanvas, options, onError) {
|
|
6
|
+
const { backgroundFilter, backgroundImage, backgroundBlurLevel, segmentationLevel = SegmentationLevel.HIGH, fps = 30, } = options;
|
|
7
|
+
if (backgroundFilter === 'image' && !backgroundImage) {
|
|
8
|
+
throw new Error(`backgroundImage element is required when backgroundFilter is image`);
|
|
9
|
+
}
|
|
10
|
+
const pipeline = buildWebGL2Pipeline(videoSource, backgroundImage, backgroundBlurLevel, backgroundFilter, targetCanvas, tflite, getSegmentationParams(segmentationLevel));
|
|
11
|
+
const timers = new WorkerTimer({ useWorker: true });
|
|
12
|
+
const id = timers.setInterval(() => {
|
|
13
|
+
try {
|
|
14
|
+
pipeline.render();
|
|
15
|
+
if (backgroundFilter === 'image') {
|
|
16
|
+
pipeline.updatePostProcessingConfig();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
onError?.(error);
|
|
21
|
+
}
|
|
22
|
+
}, Math.floor(1000 / (fps <= 0 ? 30 : fps)));
|
|
23
|
+
return {
|
|
24
|
+
dispose: () => {
|
|
25
|
+
pipeline.cleanUp();
|
|
26
|
+
timers.clearInterval(id);
|
|
27
|
+
timers.destroy();
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { createRenderer };
|
|
33
|
+
//# sourceMappingURL=createRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRenderer.js","sources":["../../../../../../src/legacy/createRenderer.ts"],"sourcesContent":["import { WorkerTimer } from '@stream-io/worker-timer';\nimport { TFLite } from './tflite';\nimport { buildWebGL2Pipeline } from './webgl2/webgl2Pipeline';\nimport { getSegmentationParams, SegmentationLevel } from './segmentation';\nimport { BackgroundBlurLevel, BackgroundFilter } from '../types';\n\nexport type Renderer = {\n /**\n * Disposes of the renderer.\n */\n dispose: () => void;\n};\n\nexport function createRenderer(\n tflite: TFLite,\n videoSource: HTMLVideoElement,\n targetCanvas: HTMLCanvasElement,\n options: {\n backgroundFilter: BackgroundFilter;\n segmentationLevel?: SegmentationLevel;\n backgroundImage?: HTMLImageElement;\n backgroundBlurLevel?: BackgroundBlurLevel;\n fps?: number;\n },\n onError?: (error: any) => void,\n): Renderer {\n const {\n backgroundFilter,\n backgroundImage,\n backgroundBlurLevel,\n segmentationLevel = SegmentationLevel.HIGH,\n fps = 30,\n } = options;\n if (backgroundFilter === 'image' && !backgroundImage) {\n throw new Error(\n `backgroundImage element is required when backgroundFilter is image`,\n );\n }\n\n const pipeline = buildWebGL2Pipeline(\n videoSource,\n backgroundImage,\n backgroundBlurLevel,\n backgroundFilter,\n targetCanvas,\n tflite,\n getSegmentationParams(segmentationLevel),\n );\n\n const timers = new WorkerTimer({ useWorker: true });\n const id = timers.setInterval(\n () => {\n try {\n pipeline.render();\n\n if (backgroundFilter === 'image') {\n pipeline.updatePostProcessingConfig();\n }\n } catch (error) {\n onError?.(error);\n }\n },\n Math.floor(1000 / (fps <= 0 ? 30 : fps)),\n );\n\n return {\n dispose: () => {\n pipeline.cleanUp();\n timers.clearInterval(id);\n timers.destroy();\n },\n };\n}\n"],"names":[],"mappings":";;;;AAaM,SAAU,cAAc,CAC5B,MAAc,EACd,WAA6B,EAC7B,YAA+B,EAC/B,OAMC,EACD,OAA8B,EAAA;AAE9B,IAAA,MAAM,EACJ,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,EAC1C,GAAG,GAAG,EAAE,GACT,GAAG,OAAO;AACX,IAAA,IAAI,gBAAgB,KAAK,OAAO,IAAI,CAAC,eAAe,EAAE;AACpD,QAAA,MAAM,IAAI,KAAK,CACb,CAAA,kEAAA,CAAoE,CACrE;IACH;IAEA,MAAM,QAAQ,GAAG,mBAAmB,CAClC,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,MAAM,EACN,qBAAqB,CAAC,iBAAiB,CAAC,CACzC;IAED,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACnD,IAAA,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAC3B,MAAK;AACH,QAAA,IAAI;YACF,QAAQ,CAAC,MAAM,EAAE;AAEjB,YAAA,IAAI,gBAAgB,KAAK,OAAO,EAAE;gBAChC,QAAQ,CAAC,0BAA0B,EAAE;YACvC;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,GAAG,KAAK,CAAC;QAClB;IACF,CAAC,EACD,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CACzC;IAED,OAAO;QACL,OAAO,EAAE,MAAK;YACZ,QAAQ,CAAC,OAAO,EAAE;AAClB,YAAA,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE;QAClB,CAAC;KACF;AACH;;;;"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use it along with boyswan.glsl-literal VSCode extension
|
|
3
|
+
* to get GLSL syntax highlighting.
|
|
4
|
+
* https://marketplace.visualstudio.com/items?itemName=boyswan.glsl-literal
|
|
5
|
+
*
|
|
6
|
+
* On VSCode OSS, boyswan.glsl-literal requires slevesque.shader extension
|
|
7
|
+
* to be installed as well.
|
|
8
|
+
* https://marketplace.visualstudio.com/items?itemName=slevesque.shader
|
|
9
|
+
*/
|
|
10
|
+
const glsl = String.raw;
|
|
11
|
+
function createPipelineStageProgram(gl, vertexShader, fragmentShader, positionBuffer, texCoordBuffer) {
|
|
12
|
+
const program = createProgram(gl, vertexShader, fragmentShader);
|
|
13
|
+
const positionAttributeLocation = gl.getAttribLocation(program, 'a_position');
|
|
14
|
+
gl.enableVertexAttribArray(positionAttributeLocation);
|
|
15
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
|
|
16
|
+
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
|
|
17
|
+
const texCoordAttributeLocation = gl.getAttribLocation(program, 'a_texCoord');
|
|
18
|
+
gl.enableVertexAttribArray(texCoordAttributeLocation);
|
|
19
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
|
|
20
|
+
gl.vertexAttribPointer(texCoordAttributeLocation, 2, gl.FLOAT, false, 0, 0);
|
|
21
|
+
return program;
|
|
22
|
+
}
|
|
23
|
+
function createProgram(gl, vertexShader, fragmentShader) {
|
|
24
|
+
const program = gl.createProgram();
|
|
25
|
+
gl.attachShader(program, vertexShader);
|
|
26
|
+
gl.attachShader(program, fragmentShader);
|
|
27
|
+
gl.linkProgram(program);
|
|
28
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
29
|
+
throw new Error(`Could not link WebGL program: ${gl.getProgramInfoLog(program)}`);
|
|
30
|
+
}
|
|
31
|
+
return program;
|
|
32
|
+
}
|
|
33
|
+
function compileShader(gl, shaderType, shaderSource) {
|
|
34
|
+
const shader = gl.createShader(shaderType);
|
|
35
|
+
gl.shaderSource(shader, shaderSource);
|
|
36
|
+
gl.compileShader(shader);
|
|
37
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
38
|
+
throw new Error(`Could not compile shader: ${gl.getShaderInfoLog(shader)}`);
|
|
39
|
+
}
|
|
40
|
+
return shader;
|
|
41
|
+
}
|
|
42
|
+
function createTexture(gl, internalformat, width, height, minFilter = gl.NEAREST, magFilter = gl.NEAREST) {
|
|
43
|
+
const texture = gl.createTexture();
|
|
44
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
45
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
46
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
47
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter);
|
|
48
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter);
|
|
49
|
+
gl.texStorage2D(gl.TEXTURE_2D, 1, internalformat, width, height);
|
|
50
|
+
return texture;
|
|
51
|
+
}
|
|
52
|
+
async function readPixelsAsync(gl, x, y, width, height, format, type, dest) {
|
|
53
|
+
const buf = gl.createBuffer();
|
|
54
|
+
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buf);
|
|
55
|
+
gl.bufferData(gl.PIXEL_PACK_BUFFER, dest.byteLength, gl.STREAM_READ);
|
|
56
|
+
gl.readPixels(x, y, width, height, format, type, 0);
|
|
57
|
+
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);
|
|
58
|
+
await getBufferSubDataAsync(gl, gl.PIXEL_PACK_BUFFER, buf, 0, dest);
|
|
59
|
+
gl.deleteBuffer(buf);
|
|
60
|
+
return dest;
|
|
61
|
+
}
|
|
62
|
+
async function getBufferSubDataAsync(gl, target, buffer, srcByteOffset, dstBuffer, dstOffset, length) {
|
|
63
|
+
const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
|
|
64
|
+
gl.flush();
|
|
65
|
+
if (!sync)
|
|
66
|
+
return;
|
|
67
|
+
const res = await clientWaitAsync(gl, sync);
|
|
68
|
+
gl.deleteSync(sync);
|
|
69
|
+
if (res !== gl.WAIT_FAILED) {
|
|
70
|
+
gl.bindBuffer(target, buffer);
|
|
71
|
+
gl.getBufferSubData(target, srcByteOffset, dstBuffer, dstOffset, length);
|
|
72
|
+
gl.bindBuffer(target, null);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function clientWaitAsync(gl, sync) {
|
|
76
|
+
return new Promise((resolve) => {
|
|
77
|
+
function test() {
|
|
78
|
+
const res = gl.clientWaitSync(sync, 0, 0);
|
|
79
|
+
if (res === gl.WAIT_FAILED) {
|
|
80
|
+
resolve(res);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (res === gl.TIMEOUT_EXPIRED) {
|
|
84
|
+
setTimeout(test);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
resolve(res);
|
|
88
|
+
}
|
|
89
|
+
setTimeout(test);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export { compileShader, createPipelineStageProgram, createProgram, createTexture, glsl, readPixelsAsync };
|
|
94
|
+
//# sourceMappingURL=webglHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webglHelper.js","sources":["../../../../../../../src/legacy/helpers/webglHelper.ts"],"sourcesContent":["/**\n * Use it along with boyswan.glsl-literal VSCode extension\n * to get GLSL syntax highlighting.\n * https://marketplace.visualstudio.com/items?itemName=boyswan.glsl-literal\n *\n * On VSCode OSS, boyswan.glsl-literal requires slevesque.shader extension\n * to be installed as well.\n * https://marketplace.visualstudio.com/items?itemName=slevesque.shader\n */\nexport const glsl = String.raw;\n\nexport function createPipelineStageProgram(\n gl: WebGL2RenderingContext,\n vertexShader: WebGLShader,\n fragmentShader: WebGLShader,\n positionBuffer: WebGLBuffer,\n texCoordBuffer: WebGLBuffer,\n) {\n const program = createProgram(gl, vertexShader, fragmentShader);\n\n const positionAttributeLocation = gl.getAttribLocation(program, 'a_position');\n gl.enableVertexAttribArray(positionAttributeLocation);\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);\n\n const texCoordAttributeLocation = gl.getAttribLocation(program, 'a_texCoord');\n gl.enableVertexAttribArray(texCoordAttributeLocation);\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n gl.vertexAttribPointer(texCoordAttributeLocation, 2, gl.FLOAT, false, 0, 0);\n\n return program;\n}\n\nexport function createProgram(\n gl: WebGL2RenderingContext,\n vertexShader: WebGLShader,\n fragmentShader: WebGLShader,\n) {\n const program = gl.createProgram()!;\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(\n `Could not link WebGL program: ${gl.getProgramInfoLog(program)}`,\n );\n }\n return program;\n}\n\nexport function compileShader(\n gl: WebGL2RenderingContext,\n shaderType: number,\n shaderSource: string,\n) {\n const shader = gl.createShader(shaderType)!;\n gl.shaderSource(shader, shaderSource);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n throw new Error(`Could not compile shader: ${gl.getShaderInfoLog(shader)}`);\n }\n return shader;\n}\n\nexport function createTexture(\n gl: WebGL2RenderingContext,\n internalformat: number,\n width: number,\n height: number,\n minFilter = gl.NEAREST,\n magFilter = gl.NEAREST,\n) {\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter);\n gl.texStorage2D(gl.TEXTURE_2D, 1, internalformat, width, height);\n return texture;\n}\n\nexport async function readPixelsAsync(\n gl: WebGL2RenderingContext,\n x: number,\n y: number,\n width: number,\n height: number,\n format: number,\n type: number,\n dest: ArrayBufferView,\n) {\n const buf = gl.createBuffer()!;\n gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buf);\n gl.bufferData(gl.PIXEL_PACK_BUFFER, dest.byteLength, gl.STREAM_READ);\n gl.readPixels(x, y, width, height, format, type, 0);\n gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);\n\n await getBufferSubDataAsync(gl, gl.PIXEL_PACK_BUFFER, buf, 0, dest);\n\n gl.deleteBuffer(buf);\n return dest;\n}\n\nasync function getBufferSubDataAsync(\n gl: WebGL2RenderingContext,\n target: number,\n buffer: WebGLBuffer,\n srcByteOffset: number,\n dstBuffer: ArrayBufferView,\n dstOffset?: number,\n length?: number,\n) {\n const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);\n gl.flush();\n if (!sync) return;\n\n const res = await clientWaitAsync(gl, sync);\n gl.deleteSync(sync);\n\n if (res !== gl.WAIT_FAILED) {\n gl.bindBuffer(target, buffer);\n gl.getBufferSubData(target, srcByteOffset, dstBuffer, dstOffset, length);\n gl.bindBuffer(target, null);\n }\n}\n\nfunction clientWaitAsync(gl: WebGL2RenderingContext, sync: WebGLSync) {\n return new Promise<number>((resolve) => {\n function test() {\n const res = gl.clientWaitSync(sync, 0, 0);\n if (res === gl.WAIT_FAILED) {\n resolve(res);\n return;\n }\n if (res === gl.TIMEOUT_EXPIRED) {\n setTimeout(test);\n return;\n }\n resolve(res);\n }\n setTimeout(test);\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
var SegmentationLevel;
|
|
2
|
+
(function (SegmentationLevel) {
|
|
3
|
+
SegmentationLevel["LOW"] = "low";
|
|
4
|
+
SegmentationLevel["HIGH"] = "high";
|
|
5
|
+
})(SegmentationLevel || (SegmentationLevel = {}));
|
|
6
|
+
const getSegmentationParams = (level) => {
|
|
7
|
+
if (level === SegmentationLevel.HIGH) {
|
|
8
|
+
return { width: 256, height: 144 };
|
|
9
|
+
}
|
|
10
|
+
return { width: 160, height: 96 };
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { SegmentationLevel, getSegmentationParams };
|
|
14
|
+
//# sourceMappingURL=segmentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segmentation.js","sources":["../../../../../../src/legacy/segmentation.ts"],"sourcesContent":["export type SegmentationParams = {\n width: number;\n height: number;\n};\n\nexport enum SegmentationLevel {\n LOW = 'low',\n HIGH = 'high',\n}\n\nexport const getSegmentationParams = (\n level: SegmentationLevel,\n): SegmentationParams => {\n if (level === SegmentationLevel.HIGH) {\n return { width: 256, height: 144 };\n }\n return { width: 160, height: 96 };\n};\n"],"names":[],"mappings":"IAKY;AAAZ,CAAA,UAAY,iBAAiB,EAAA;AAC3B,IAAA,iBAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EAHW,iBAAiB,KAAjB,iBAAiB,GAAA,EAAA,CAAA,CAAA;AAKtB,MAAM,qBAAqB,GAAG,CACnC,KAAwB,KACF;AACtB,IAAA,IAAI,KAAK,KAAK,iBAAiB,CAAC,IAAI,EAAE;QACpC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IACpC;IACA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;AACnC;;;;"}
|