@webex/ladon-ts 4.3.0 → 4.5.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 +24 -0
- package/build/module/lib/config.d.ts +19 -15
- package/build/module/lib/config.js +32 -12
- package/build/module/lib/generator.d.ts +24 -13
- package/build/module/lib/generator.js +99 -63
- package/build/module/lib/pipeline.d.ts +67 -6
- package/build/module/lib/pipeline.js +143 -22
- package/build/module/lib/renderer/blur-renderer.d.ts +2 -2
- package/build/module/lib/renderer/blur-renderer.js +28 -35
- package/build/module/lib/renderer/ladon-renderer.d.ts +2 -2
- package/build/module/lib/renderer/passthrough-renderer.d.ts +2 -2
- package/build/module/lib/renderer/passthrough-renderer.js +1 -1
- package/build/module/lib/renderer/replacement-renderer.d.ts +2 -2
- package/build/module/lib/renderer/replacement-renderer.js +24 -17
- package/build/module/lib/renderer/webgl-renderer.d.ts +1 -1
- package/build/module/lib/renderer/webgl-renderer.js +15 -7
- package/build/module/lib/shared-resource-manager.js +1 -1
- package/build/module/lib/util.d.ts +35 -3
- package/build/module/lib/util.js +141 -36
- package/build/module/lib/version.d.ts +1 -1
- package/build/module/lib/version.js +1 -1
- package/package.json +1 -1
|
@@ -1,21 +1,82 @@
|
|
|
1
1
|
import { PipelineConfig } from './config';
|
|
2
|
+
import { FacesAndLandmarks } from './generator';
|
|
3
|
+
export interface IFrameInferenceResult {
|
|
4
|
+
facesAndLandmarks: FacesAndLandmarks;
|
|
5
|
+
gesture: Float32Array;
|
|
6
|
+
motion: number;
|
|
7
|
+
skipped: boolean;
|
|
8
|
+
timestamp: number;
|
|
9
|
+
}
|
|
2
10
|
export interface IPipeline {
|
|
3
|
-
onFrame(): Promise<
|
|
11
|
+
onFrame(timestamp: number, maskNeeded?: boolean, videoElement?: HTMLVideoElement): Promise<IFrameInferenceResult>;
|
|
4
12
|
isLoaded(): boolean;
|
|
5
13
|
load(): Promise<void>;
|
|
6
14
|
destroy(): void;
|
|
7
15
|
}
|
|
8
16
|
export declare class Pipeline implements IPipeline {
|
|
9
|
-
private
|
|
10
|
-
private
|
|
17
|
+
private inputCanvas;
|
|
18
|
+
private outputCanvas;
|
|
11
19
|
readonly config: PipelineConfig;
|
|
20
|
+
private readonly videoElement?;
|
|
12
21
|
private generator?;
|
|
13
22
|
private renderer?;
|
|
14
23
|
private loaded;
|
|
15
|
-
private
|
|
16
|
-
|
|
17
|
-
|
|
24
|
+
private inputCanvasCtx;
|
|
25
|
+
private lastMaskResult?;
|
|
26
|
+
private frameQueue;
|
|
27
|
+
private maskQueue;
|
|
28
|
+
constructor(inputCanvas: HTMLCanvasElement, outputCanvas: HTMLCanvasElement, config: PipelineConfig, videoElement?: HTMLVideoElement | undefined);
|
|
29
|
+
/**
|
|
30
|
+
* Gets the raw image data from the input canvas context.
|
|
31
|
+
*
|
|
32
|
+
* @returns The raw image data.
|
|
33
|
+
*/
|
|
34
|
+
private getRawImageDataFromInputCanvas;
|
|
35
|
+
/**
|
|
36
|
+
* Processes a single frame and returns the inference result.
|
|
37
|
+
*
|
|
38
|
+
* @param timestamp - The timestamp of the frame.
|
|
39
|
+
* @param [performInference=true] - Flag to perform mask inference.
|
|
40
|
+
* @returns The result of the frame processing.
|
|
41
|
+
* @throws If the pipeline (generator or renderer) is not loaded.
|
|
42
|
+
*/
|
|
43
|
+
onFrame(timestamp: number, performInference?: boolean): Promise<IFrameInferenceResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Synchronizes frames and masks to ensure they are rendered together.
|
|
46
|
+
*/
|
|
47
|
+
private renderSyncedFrameAndMask;
|
|
48
|
+
/**
|
|
49
|
+
* Resizes the image data if the model expects a fixed size input.
|
|
50
|
+
*
|
|
51
|
+
* @param {Uint8ClampedArray} rawImageData - The raw image data.
|
|
52
|
+
* @returns {Uint8ClampedArray} - The processed mask image data.
|
|
53
|
+
*/
|
|
54
|
+
private getMaskImageData;
|
|
55
|
+
/**
|
|
56
|
+
* Creates the inference result object.
|
|
57
|
+
*
|
|
58
|
+
* @param {number} timestamp - The timestamp of the frame.
|
|
59
|
+
* @param {boolean} performedInference - Indicates if the inference was performed.
|
|
60
|
+
* @returns {IFrameInferenceResult} - The result object containing inference details.
|
|
61
|
+
*/
|
|
62
|
+
private createInferenceResult;
|
|
63
|
+
/**
|
|
64
|
+
* Checks if the pipeline is loaded.
|
|
65
|
+
*
|
|
66
|
+
* @returns True if the pipeline is loaded, false otherwise.
|
|
67
|
+
*/
|
|
18
68
|
isLoaded(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Loads the pipeline components such as the generator and renderer.
|
|
71
|
+
*/
|
|
19
72
|
load(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Resets the frame and mask queues.
|
|
75
|
+
*/
|
|
76
|
+
private resetQueues;
|
|
77
|
+
reset(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Destroys the pipeline and cleans up resources.
|
|
80
|
+
*/
|
|
20
81
|
destroy(): void;
|
|
21
82
|
}
|
|
@@ -7,56 +7,162 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { LocalGenerator, NullGenerator, WorkerGenerator } from './generator';
|
|
10
|
+
import { LocalGenerator, NullGenerator, WorkerGenerator, } from './generator';
|
|
11
11
|
import { BlurRenderer, PassthroughRenderer, ReplacementRenderer } from './renderer';
|
|
12
12
|
import { resizeImage } from './util';
|
|
13
13
|
export class Pipeline {
|
|
14
|
-
constructor(
|
|
15
|
-
this.
|
|
16
|
-
this.
|
|
14
|
+
constructor(inputCanvas, outputCanvas, config, videoElement) {
|
|
15
|
+
this.inputCanvas = inputCanvas;
|
|
16
|
+
this.outputCanvas = outputCanvas;
|
|
17
17
|
this.config = config;
|
|
18
|
+
this.videoElement = videoElement;
|
|
18
19
|
this.loaded = false;
|
|
19
|
-
|
|
20
|
+
this.frameQueue = [];
|
|
21
|
+
this.maskQueue = [];
|
|
22
|
+
const inputCanvasCtx = this.inputCanvas.getContext('2d', {
|
|
20
23
|
alpha: false,
|
|
21
24
|
willReadFrequently: true,
|
|
22
25
|
});
|
|
23
|
-
if (!
|
|
26
|
+
if (!inputCanvasCtx) {
|
|
24
27
|
throw new Error('[ladon-ts] - error getting input context 2d');
|
|
25
28
|
}
|
|
26
|
-
this.
|
|
29
|
+
this.inputCanvasCtx = inputCanvasCtx;
|
|
27
30
|
}
|
|
28
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Gets the raw image data from the input canvas context.
|
|
33
|
+
*
|
|
34
|
+
* @returns The raw image data.
|
|
35
|
+
*/
|
|
36
|
+
getRawImageDataFromInputCanvas() {
|
|
37
|
+
return this.inputCanvasCtx.getImageData(0, 0, this.config.input.width, this.config.input.height).data;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Processes a single frame and returns the inference result.
|
|
41
|
+
*
|
|
42
|
+
* @param timestamp - The timestamp of the frame.
|
|
43
|
+
* @param [performInference=true] - Flag to perform mask inference.
|
|
44
|
+
* @returns The result of the frame processing.
|
|
45
|
+
* @throws If the pipeline (generator or renderer) is not loaded.
|
|
46
|
+
*/
|
|
47
|
+
onFrame(timestamp, performInference = true) {
|
|
48
|
+
var _a, _b;
|
|
29
49
|
return __awaiter(this, void 0, void 0, function* () {
|
|
30
50
|
if (!this.generator || !this.renderer) {
|
|
31
51
|
throw new Error('[ladon-ts] - pipeline is not loaded.');
|
|
32
52
|
}
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
maskImageData =
|
|
53
|
+
const maskNeeded = performInference || !this.lastMaskResult;
|
|
54
|
+
// Generate the mask if needed.
|
|
55
|
+
if (maskNeeded) {
|
|
56
|
+
const rawImageData = this.getRawImageDataFromInputCanvas();
|
|
57
|
+
const maskImageData = this.getMaskImageData(rawImageData);
|
|
58
|
+
// Add the frame to the queue. Perform inference and get the mask result and add it to the queue.
|
|
59
|
+
this.frameQueue.push({ timestamp, rawImageData });
|
|
60
|
+
this.lastMaskResult = yield this.generator.getLadonOutput(maskImageData, timestamp);
|
|
61
|
+
this.maskQueue.push(this.lastMaskResult);
|
|
62
|
+
// Sync frames and masks to render together.
|
|
63
|
+
yield this.renderSyncedFrameAndMask();
|
|
64
|
+
// Post-process the mask after rendering.
|
|
65
|
+
yield this.generator.postRender(maskImageData, timestamp);
|
|
66
|
+
}
|
|
67
|
+
else if (this.lastMaskResult) {
|
|
68
|
+
// Render the current image with the last mask when inference is skipped. Use the video element if
|
|
69
|
+
// available to avoid an uneeeded copy from GPU to CPU.
|
|
70
|
+
const videoOrImageData = (_a = this.videoElement) !== null && _a !== void 0 ? _a : this.getRawImageDataFromInputCanvas();
|
|
71
|
+
yield ((_b = this.renderer) === null || _b === void 0 ? void 0 : _b.render(videoOrImageData));
|
|
72
|
+
// Empty queues when inference is skipped to avoid jitter when switching back to inference.
|
|
73
|
+
this.resetQueues();
|
|
38
74
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
yield this.renderer.render(rawImageData, mask);
|
|
42
|
-
// Cleanup the mask data.
|
|
43
|
-
yield this.generator.postRender(maskImageData);
|
|
75
|
+
// Return the inference result.
|
|
76
|
+
return this.createInferenceResult(timestamp, performInference);
|
|
44
77
|
});
|
|
45
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Synchronizes frames and masks to ensure they are rendered together.
|
|
81
|
+
*/
|
|
82
|
+
renderSyncedFrameAndMask() {
|
|
83
|
+
var _a, _b;
|
|
84
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
+
while (this.frameQueue.length > 0 && this.maskQueue.length > 0) {
|
|
86
|
+
const frame = this.frameQueue[0];
|
|
87
|
+
const mask = this.maskQueue[0];
|
|
88
|
+
// Render the frame and mask together if they match.
|
|
89
|
+
if (frame.timestamp === mask.timestamp) {
|
|
90
|
+
yield ((_a = this.renderer) === null || _a === void 0 ? void 0 : _a.render((_b = this.videoElement) !== null && _b !== void 0 ? _b : frame.rawImageData, mask));
|
|
91
|
+
this.frameQueue.shift();
|
|
92
|
+
this.maskQueue.shift();
|
|
93
|
+
}
|
|
94
|
+
else if (frame.timestamp < mask.timestamp) {
|
|
95
|
+
// If the frame is older than the mask, discard the frame.
|
|
96
|
+
this.frameQueue.shift();
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// If the mask is older than the frame, discard the mask.
|
|
100
|
+
this.maskQueue.shift();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resizes the image data if the model expects a fixed size input.
|
|
107
|
+
*
|
|
108
|
+
* @param {Uint8ClampedArray} rawImageData - The raw image data.
|
|
109
|
+
* @returns {Uint8ClampedArray} - The processed mask image data.
|
|
110
|
+
*/
|
|
111
|
+
getMaskImageData(rawImageData) {
|
|
112
|
+
// Check if resizing is needed based on configuration.
|
|
113
|
+
if (this.config.mask.input_size.width === this.config.input.width) {
|
|
114
|
+
return rawImageData;
|
|
115
|
+
}
|
|
116
|
+
// Resize the image data.
|
|
117
|
+
return resizeImage(rawImageData, this.config.input.width, this.config.input.height, this.config.mask.input_size.width, this.config.mask.input_size.height);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Creates the inference result object.
|
|
121
|
+
*
|
|
122
|
+
* @param {number} timestamp - The timestamp of the frame.
|
|
123
|
+
* @param {boolean} performedInference - Indicates if the inference was performed.
|
|
124
|
+
* @returns {IFrameInferenceResult} - The result object containing inference details.
|
|
125
|
+
*/
|
|
126
|
+
createInferenceResult(timestamp, performedInference) {
|
|
127
|
+
if (!this.lastMaskResult) {
|
|
128
|
+
return {
|
|
129
|
+
facesAndLandmarks: { data: new Float32Array(0), dims: [] },
|
|
130
|
+
gesture: new Float32Array(0),
|
|
131
|
+
motion: 0,
|
|
132
|
+
skipped: true,
|
|
133
|
+
timestamp,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
facesAndLandmarks: this.lastMaskResult.facesAndLandmarks,
|
|
138
|
+
gesture: this.lastMaskResult.gesture,
|
|
139
|
+
motion: this.lastMaskResult.motion,
|
|
140
|
+
skipped: !performedInference,
|
|
141
|
+
timestamp,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Checks if the pipeline is loaded.
|
|
146
|
+
*
|
|
147
|
+
* @returns True if the pipeline is loaded, false otherwise.
|
|
148
|
+
*/
|
|
46
149
|
isLoaded() {
|
|
47
150
|
return this.loaded;
|
|
48
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Loads the pipeline components such as the generator and renderer.
|
|
154
|
+
*/
|
|
49
155
|
load() {
|
|
50
156
|
return __awaiter(this, void 0, void 0, function* () {
|
|
51
157
|
switch (this.config.render.type) {
|
|
52
158
|
case 'blur':
|
|
53
|
-
this.renderer = new BlurRenderer(this.
|
|
159
|
+
this.renderer = new BlurRenderer(this.outputCanvas, this.config);
|
|
54
160
|
break;
|
|
55
161
|
case 'passthrough':
|
|
56
|
-
this.renderer = new PassthroughRenderer(this.
|
|
162
|
+
this.renderer = new PassthroughRenderer(this.outputCanvas, this.config);
|
|
57
163
|
break;
|
|
58
164
|
case 'replacement':
|
|
59
|
-
this.renderer = new ReplacementRenderer(this.
|
|
165
|
+
this.renderer = new ReplacementRenderer(this.outputCanvas, this.config);
|
|
60
166
|
break;
|
|
61
167
|
default:
|
|
62
168
|
throw new Error('[ladon-ts] - renderer not implemented.');
|
|
@@ -83,10 +189,25 @@ export class Pipeline {
|
|
|
83
189
|
this.loaded = true;
|
|
84
190
|
});
|
|
85
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Resets the frame and mask queues.
|
|
194
|
+
*/
|
|
195
|
+
resetQueues() {
|
|
196
|
+
this.frameQueue = [];
|
|
197
|
+
this.maskQueue = [];
|
|
198
|
+
}
|
|
199
|
+
reset() {
|
|
200
|
+
this.resetQueues();
|
|
201
|
+
this.lastMaskResult = undefined;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Destroys the pipeline and cleans up resources.
|
|
205
|
+
*/
|
|
86
206
|
destroy() {
|
|
87
207
|
var _a, _b;
|
|
208
|
+
this.reset();
|
|
88
209
|
(_a = this.generator) === null || _a === void 0 ? void 0 : _a.destroy();
|
|
89
210
|
(_b = this.renderer) === null || _b === void 0 ? void 0 : _b.destroy();
|
|
90
211
|
}
|
|
91
212
|
}
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3BpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUNBLE9BQU8sRUFHSCxjQUFjLEVBRWQsYUFBYSxFQUNiLGVBQWUsR0FDbEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFlBQVksRUFBaUIsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbkcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQXFCckMsTUFBTSxPQUFPLFFBQVE7SUFXakIsWUFDWSxXQUE4QixFQUM5QixZQUErQixFQUN2QixNQUFzQixFQUNyQixZQUErQjtRQUh4QyxnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQW1CO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFtQjtRQVo1QyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBS2YsZUFBVSxHQUFrRSxFQUFFLENBQUM7UUFDL0UsY0FBUyxHQUF1QixFQUFFLENBQUM7UUFRdkMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3JELEtBQUssRUFBRSxLQUFLO1lBQ1osa0JBQWtCLEVBQUUsSUFBSTtTQUMzQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztTQUNsRTtRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssOEJBQThCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQ25DLENBQUMsRUFDRCxDQUFDLEVBQ0QsSUFBSSxDQUFDLE1BQU0s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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PipelineConfig } from '../config';
|
|
2
|
-
import {
|
|
2
|
+
import { LadonOutput } from '../generator';
|
|
3
3
|
import { LadonRenderer } from './ladon-renderer';
|
|
4
4
|
import { WebGLRenderer } from './webgl-renderer';
|
|
5
5
|
export declare class BlurRenderer extends WebGLRenderer implements LadonRenderer {
|
|
@@ -14,7 +14,7 @@ export declare class BlurRenderer extends WebGLRenderer implements LadonRenderer
|
|
|
14
14
|
private fragment_shader_pass_1_src;
|
|
15
15
|
fragment_shader_pass_2_src: string;
|
|
16
16
|
constructor(output_canvas: HTMLCanvasElement, config: PipelineConfig);
|
|
17
|
-
render(input: Uint8ClampedArray, mask
|
|
17
|
+
render(input: Uint8ClampedArray | HTMLVideoElement, mask?: LadonOutput): Promise<void>;
|
|
18
18
|
load(): Promise<void>;
|
|
19
19
|
destroy(): void;
|
|
20
20
|
private getBlurKernel;
|
|
@@ -7,7 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { compileShader, linkProgram } from '../util';
|
|
10
|
+
import { bilinearUpsample, compileShader, linkProgram } from '../util';
|
|
11
11
|
import { WebGLRenderer } from './webgl-renderer';
|
|
12
12
|
export class BlurRenderer extends WebGLRenderer {
|
|
13
13
|
constructor(output_canvas, config) {
|
|
@@ -20,73 +20,64 @@ precision highp float;
|
|
|
20
20
|
#define KERNEL_SIZE ${this.config.render.kernel_size}
|
|
21
21
|
#define HORIZONTAL vec2(1.0, 0.0)
|
|
22
22
|
#define VERTICAL vec2(0.0, 1.0)
|
|
23
|
-
#define EPSILON 0.00001
|
|
24
23
|
|
|
25
24
|
out vec4 outColor;
|
|
26
25
|
|
|
27
26
|
uniform sampler2D u_image;
|
|
28
|
-
uniform float u_kernel[KERNEL_SIZE];
|
|
29
27
|
uniform sampler2D u_mask;
|
|
30
28
|
uniform vec2 u_resolution;
|
|
29
|
+
uniform float u_kernel[KERNEL_SIZE];
|
|
31
30
|
|
|
32
|
-
|
|
31
|
+
// Function to retrieve the mask value
|
|
33
32
|
float get_mask(vec2 st) {
|
|
34
|
-
return
|
|
33
|
+
return texture(u_mask, st).r;
|
|
35
34
|
}
|
|
36
35
|
|
|
36
|
+
// Get the inverse of the masked area
|
|
37
37
|
float get_inv_mask(vec2 st) {
|
|
38
38
|
return 1.0 - get_mask(st);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {
|
|
43
|
-
return vec4(vec3(0.0), weight);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// 4th channel is masked weight value
|
|
47
|
-
return vec4(vec3(texture(src, uv).rgb * get_inv_mask(uv) * weight), get_mask(uv) * weight);
|
|
48
|
-
}
|
|
49
|
-
|
|
41
|
+
// Blurring function
|
|
50
42
|
vec3 blur(sampler2D src, vec2 uv, vec2 direction) {
|
|
51
|
-
vec4
|
|
52
|
-
|
|
53
|
-
vec2 step = (direction / u_resolution);
|
|
43
|
+
vec4 accum = vec4(0.0);
|
|
44
|
+
vec2 step = direction / u_resolution;
|
|
54
45
|
int offset = (KERNEL_SIZE - 1) / 2;
|
|
55
46
|
|
|
47
|
+
float weightSum = 0.0;
|
|
56
48
|
for (int i = 0; i < KERNEL_SIZE; i++) {
|
|
57
|
-
vec2
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return vec3(0.0);
|
|
49
|
+
vec2 sampleUV = uv + step * float(i - offset);
|
|
50
|
+
vec4 sampleTex = texture(src, sampleUV);
|
|
51
|
+
float weight = u_kernel[i];
|
|
52
|
+
accum += sampleTex * weight;
|
|
53
|
+
weightSum += weight;
|
|
63
54
|
}
|
|
64
55
|
|
|
65
|
-
//
|
|
66
|
-
return
|
|
56
|
+
weightSum = max(weightSum, 0.001); // Avoid division by zero
|
|
57
|
+
return accum.rgb / weightSum;
|
|
67
58
|
}
|
|
68
59
|
`;
|
|
69
60
|
this.fragment_shader_pass_1_src = this.fragment_shader_common +
|
|
70
61
|
`
|
|
71
62
|
void main() {
|
|
72
63
|
vec2 st = gl_FragCoord.xy / u_resolution;
|
|
73
|
-
|
|
74
|
-
outColor = vec4(blur(u_image, st, HORIZONTAL) * get_inv_mask(st), 1.0);
|
|
64
|
+
outColor = vec4(blur(u_image, st, HORIZONTAL), 1.0);
|
|
75
65
|
}
|
|
76
66
|
`;
|
|
77
67
|
this.fragment_shader_pass_2_src = this.fragment_shader_common +
|
|
78
68
|
`
|
|
79
69
|
uniform sampler2D u_blur;
|
|
80
70
|
|
|
81
|
-
|
|
82
71
|
void main() {
|
|
83
|
-
${this.getUVCalculation()}
|
|
72
|
+
${this.getUVCalculation()};
|
|
84
73
|
|
|
85
74
|
vec3 blurred = blur(u_blur, st, VERTICAL);
|
|
86
|
-
vec3
|
|
87
|
-
float mask =
|
|
75
|
+
vec3 original = texture(u_image, st).rgb;
|
|
76
|
+
float mask = get_inv_mask(st); // Use inverse mask to blur background, not user
|
|
88
77
|
|
|
89
|
-
|
|
78
|
+
// Correct blending based on the mask
|
|
79
|
+
vec3 color = mix(original, blurred, mask); // Ensure mask properly determines blur influence on background
|
|
80
|
+
outColor = vec4(color, 1.0);
|
|
90
81
|
}
|
|
91
82
|
`;
|
|
92
83
|
if (this.config.render.kernel_size % 2 === 0) {
|
|
@@ -148,10 +139,12 @@ void main() {
|
|
|
148
139
|
render(input, mask) {
|
|
149
140
|
return __awaiter(this, void 0, void 0, function* () {
|
|
150
141
|
this.uploadVideoStream(input);
|
|
151
|
-
if (
|
|
142
|
+
// The mask may not be included if it has not been generated (e.g., frame skipped).
|
|
143
|
+
if (mask === null || mask === void 0 ? void 0 : mask.warm) {
|
|
144
|
+
const maskData = bilinearUpsample(mask.data, this.config.mask.output_size.width, this.config.mask.output_size.height, this.config.mask.upscaled_size.width, this.config.mask.upscaled_size.height);
|
|
152
145
|
this.gl.activeTexture(this.gl.TEXTURE1);
|
|
153
146
|
this.gl.bindTexture(this.gl.TEXTURE_2D, this.mask_texture);
|
|
154
|
-
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.
|
|
147
|
+
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.R8, this.config.mask.upscaled_size.width, this.config.mask.upscaled_size.height, 0, this.gl.RED, this.gl.UNSIGNED_BYTE, maskData);
|
|
155
148
|
}
|
|
156
149
|
// program pass 1 - blur in one direction & output to framebuffer
|
|
157
150
|
this.gl.useProgram(this.program_1);
|
|
@@ -187,4 +180,4 @@ void main() {
|
|
|
187
180
|
return new Float32Array(kernel);
|
|
188
181
|
}
|
|
189
182
|
}
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmx1ci1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVuZGVyZXIvYmx1ci1yZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUd2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsTUFBTSxPQUFPLFlBQWEsU0FBUSxhQUFhO0lBZ0YzQyxZQUFtQixhQUFnQyxFQUFrQixNQUFzQjtRQUN2RixLQUFLLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRGQsa0JBQWEsR0FBYixhQUFhLENBQW1CO1FBQWtCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBdkVuRiwyQkFBc0IsR0FBRzs7OzBCQUdWLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBcUIsQ0FBQyxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F1Q3ZFLENBQUM7UUFFVSwrQkFBMEIsR0FDOUIsSUFBSSxDQUFDLHNCQUFzQjtZQUMzQjs7Ozs7Q0FLUCxDQUFDO1FBRVMsK0JBQTBCLEdBQzdCLElBQUksQ0FBQyxzQkFBc0I7WUFDM0I7Ozs7TUFJRixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Ozs7Ozs7Ozs7Q0FVNUIsQ0FBQztRQUtNLElBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFxQixDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUMzRDtRQUVELHVCQUF1QjtRQUN2QjtZQUNJLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FDL0IsSUFBSSxDQUFDLEVBQUUsRUFDUCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFDckIsSUFBSSxDQUFDLGlC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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LadonOutput } from '../generator';
|
|
2
2
|
export interface LadonRenderer {
|
|
3
|
-
render(input: Uint8ClampedArray, mask
|
|
3
|
+
render(input: Uint8ClampedArray | HTMLVideoElement, mask?: LadonOutput): Promise<void>;
|
|
4
4
|
load(): Promise<void>;
|
|
5
5
|
destroy(): void;
|
|
6
6
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PipelineConfig } from '../config';
|
|
2
|
-
import {
|
|
2
|
+
import { LadonOutput } from '../generator';
|
|
3
3
|
import { LadonRenderer } from './ladon-renderer';
|
|
4
4
|
import { WebGLRenderer } from './webgl-renderer';
|
|
5
5
|
export declare class PassthroughRenderer extends WebGLRenderer implements LadonRenderer {
|
|
@@ -8,7 +8,7 @@ export declare class PassthroughRenderer extends WebGLRenderer implements LadonR
|
|
|
8
8
|
private program;
|
|
9
9
|
private fragment_shader;
|
|
10
10
|
constructor(output_canvas: HTMLCanvasElement, config: PipelineConfig);
|
|
11
|
-
render(input: Uint8ClampedArray, _:
|
|
11
|
+
render(input: Uint8ClampedArray | HTMLVideoElement, _: LadonOutput): Promise<void>;
|
|
12
12
|
load(): Promise<void>;
|
|
13
13
|
destroy(): void;
|
|
14
14
|
}
|
|
@@ -54,4 +54,4 @@ void main() {
|
|
|
54
54
|
// empty
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3Rocm91Z2gtcmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlbmRlcmVyL3Bhc3N0aHJvdWdoLXJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBR3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsYUFBYTtJQW1CbEQsWUFBbUIsYUFBZ0MsRUFBa0IsTUFBc0I7UUFDdkYsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQURkLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUFrQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQWhCbkYsb0JBQWUsR0FBRzs7Ozs7Ozs7OztNQVV4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Ozs7Q0FJNUIsQ0FBQztRQUtNLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FDakMsSUFBSSxDQUFDLEVBQUUsRUFDUCxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FDdkIsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFWSxNQUFNLENBQ2YsS0FBMkM7SUFDM0MsZ0VBQWdFO0lBQ2hFLENBQWM7O1lBRWQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlCLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVqQyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFaEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BCLENBQUM7S0FBQTtJQUVZLElBQUk7O1lBQ2IsUUFBUTtRQUNaLENBQUM7S0FBQTtJQUVNLE9BQU87UUFDVixRQUFRO0lBQ1osQ0FBQztDQUNKIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PipelineConfig } from '../config';
|
|
2
|
-
import {
|
|
2
|
+
import { LadonOutput } from '../generator';
|
|
3
3
|
import { LadonRenderer } from './ladon-renderer';
|
|
4
4
|
import { WebGLRenderer } from './webgl-renderer';
|
|
5
5
|
export declare class ReplacementRenderer extends WebGLRenderer implements LadonRenderer {
|
|
@@ -10,7 +10,7 @@ export declare class ReplacementRenderer extends WebGLRenderer implements LadonR
|
|
|
10
10
|
protected background_texture: WebGLTexture;
|
|
11
11
|
private fragment_shader;
|
|
12
12
|
constructor(output_canvas: HTMLCanvasElement, config: PipelineConfig);
|
|
13
|
-
render(input: Uint8ClampedArray, mask
|
|
13
|
+
render(input: Uint8ClampedArray | HTMLVideoElement, mask?: LadonOutput): Promise<void>;
|
|
14
14
|
load(): Promise<void>;
|
|
15
15
|
destroy(): void;
|
|
16
16
|
}
|