@webex/ladon-ts 4.0.0 → 4.2.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.
- package/CHANGELOG.md +41 -9
- package/LICENSE +5 -5
- package/README.md +36 -36
- package/build/module/index.d.ts +6 -6
- package/build/module/index.js +6 -6
- package/build/module/lib/config.d.ts +67 -61
- package/build/module/lib/config.js +123 -109
- package/build/module/lib/generator.d.ts +62 -52
- package/build/module/lib/generator.js +233 -202
- package/build/module/lib/pipeline.d.ts +21 -21
- package/build/module/lib/pipeline.js +92 -83
- package/build/module/lib/renderer/blur-renderer.d.ts +21 -0
- package/build/module/lib/renderer/blur-renderer.js +190 -0
- package/build/module/lib/renderer/ladon-renderer.d.ts +6 -0
- package/build/module/lib/renderer/ladon-renderer.js +2 -0
- package/build/module/lib/renderer/passthrough-renderer.d.ts +14 -0
- package/build/module/lib/renderer/passthrough-renderer.js +57 -0
- package/build/module/lib/renderer/replacement-renderer.d.ts +16 -0
- package/build/module/lib/renderer/replacement-renderer.js +103 -0
- package/build/module/lib/renderer/webgl-renderer.d.ts +17 -0
- package/build/module/lib/renderer/webgl-renderer.js +113 -0
- package/build/module/lib/renderer.d.ts +5 -63
- package/build/module/lib/renderer.js +6 -463
- package/build/module/lib/util.d.ts +31 -1
- package/build/module/lib/util.js +101 -10
- package/build/module/lib/version.d.ts +1 -1
- package/build/module/lib/version.js +1 -1
- package/build/module/lib/worker/segmentation.d.ts +1 -0
- package/build/module/lib/worker/segmentation.js +42 -0
- package/package.json +76 -81
|
@@ -1,52 +1,62 @@
|
|
|
1
|
-
import { PipelineConfig } from './config';
|
|
2
|
-
declare global {
|
|
3
|
-
interface ImportMeta {
|
|
4
|
-
url: string;
|
|
5
|
-
}
|
|
6
|
-
}
|
|
7
|
-
export interface MaskResult {
|
|
8
|
-
data: Float32Array;
|
|
9
|
-
warm: boolean;
|
|
10
|
-
}
|
|
11
|
-
export interface MaskGenerator {
|
|
12
|
-
getMask(input: Uint8ClampedArray): Promise<MaskResult>;
|
|
13
|
-
load(): Promise<void>;
|
|
14
|
-
isLoaded(): boolean;
|
|
15
|
-
postRender(input: Uint8ClampedArray): Promise<void>;
|
|
16
|
-
destroy(): void;
|
|
17
|
-
}
|
|
18
|
-
export declare class LocalGenerator implements MaskGenerator {
|
|
19
|
-
readonly config: PipelineConfig;
|
|
20
|
-
private last_mask;
|
|
21
|
-
private mask_model?;
|
|
22
|
-
private last_mask_generation;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
getMask(
|
|
36
|
-
load(): Promise<void>;
|
|
37
|
-
isLoaded(): boolean;
|
|
38
|
-
postRender(_: Uint8ClampedArray): Promise<void>;
|
|
39
|
-
destroy(): void;
|
|
40
|
-
}
|
|
41
|
-
export declare class
|
|
42
|
-
readonly config: PipelineConfig;
|
|
43
|
-
private last_mask;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
1
|
+
import { PipelineConfig } from './config';
|
|
2
|
+
declare global {
|
|
3
|
+
interface ImportMeta {
|
|
4
|
+
url: string;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export interface MaskResult {
|
|
8
|
+
data: Float32Array;
|
|
9
|
+
warm: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface MaskGenerator {
|
|
12
|
+
getMask(input: Uint8ClampedArray): Promise<MaskResult>;
|
|
13
|
+
load(): Promise<void>;
|
|
14
|
+
isLoaded(): boolean;
|
|
15
|
+
postRender(input: Uint8ClampedArray): Promise<void>;
|
|
16
|
+
destroy(): void;
|
|
17
|
+
}
|
|
18
|
+
export declare class LocalGenerator implements MaskGenerator {
|
|
19
|
+
readonly config: PipelineConfig;
|
|
20
|
+
private last_mask;
|
|
21
|
+
private mask_model?;
|
|
22
|
+
private last_mask_generation;
|
|
23
|
+
private output?;
|
|
24
|
+
constructor(config: PipelineConfig);
|
|
25
|
+
/**
|
|
26
|
+
* This method preprocesses an input Uint8ClampedArray to a Float32Array
|
|
27
|
+
* while maintaining memory efficiency by reusing a class-scoped output buffer.
|
|
28
|
+
* If the model rank is 4 (e.g., newer tiny model), it sets an alpha channel value.
|
|
29
|
+
*
|
|
30
|
+
* @param {Uint8ClampedArray} input - The input data to be preprocessed
|
|
31
|
+
* @param {Float32Array} alpha - The alpha channel data
|
|
32
|
+
* @returns {Float32Array} - The processed data
|
|
33
|
+
*/
|
|
34
|
+
private preprocess;
|
|
35
|
+
getMask(input: Uint8ClampedArray): Promise<MaskResult>;
|
|
36
|
+
load(): Promise<void>;
|
|
37
|
+
isLoaded(): boolean;
|
|
38
|
+
postRender(_: Uint8ClampedArray): Promise<void>;
|
|
39
|
+
destroy(): void;
|
|
40
|
+
}
|
|
41
|
+
export declare class NullGenerator implements MaskGenerator {
|
|
42
|
+
readonly config: PipelineConfig;
|
|
43
|
+
private last_mask;
|
|
44
|
+
constructor(config: PipelineConfig);
|
|
45
|
+
getMask(_: Uint8ClampedArray): Promise<MaskResult>;
|
|
46
|
+
load(): Promise<void>;
|
|
47
|
+
isLoaded(): boolean;
|
|
48
|
+
postRender(_: Uint8ClampedArray): Promise<void>;
|
|
49
|
+
destroy(): void;
|
|
50
|
+
}
|
|
51
|
+
export declare class WorkerGenerator implements MaskGenerator {
|
|
52
|
+
readonly config: PipelineConfig;
|
|
53
|
+
private last_mask;
|
|
54
|
+
private worker?;
|
|
55
|
+
private new_mask;
|
|
56
|
+
constructor(config: PipelineConfig);
|
|
57
|
+
getMask(_: Uint8ClampedArray): Promise<MaskResult>;
|
|
58
|
+
load(): Promise<void>;
|
|
59
|
+
isLoaded(): boolean;
|
|
60
|
+
postRender(input: Uint8ClampedArray): Promise<void>;
|
|
61
|
+
destroy(): void;
|
|
62
|
+
}
|
|
@@ -1,202 +1,233 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import * as ort from 'onnxruntime-web';
|
|
11
|
-
import { toAbsoluteURI } from './util';
|
|
12
|
-
export class LocalGenerator {
|
|
13
|
-
constructor(config) {
|
|
14
|
-
this.config = config;
|
|
15
|
-
this.last_mask_generation = 0;
|
|
16
|
-
this.last_mask = new ort.Tensor('float32', new Float32Array(this.config.input.height * this.config.input.width), [1, 1, this.config.input.height, this.config.input.width]);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import * as ort from 'onnxruntime-web';
|
|
11
|
+
import { getModelUrl, toAbsoluteURI } from './util';
|
|
12
|
+
export class LocalGenerator {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.last_mask_generation = 0;
|
|
16
|
+
this.last_mask = new ort.Tensor('float32', new Float32Array(this.config.input.height * this.config.input.width), [1, 1, this.config.input.height, this.config.input.width]);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* This method preprocesses an input Uint8ClampedArray to a Float32Array
|
|
20
|
+
* while maintaining memory efficiency by reusing a class-scoped output buffer.
|
|
21
|
+
* If the model rank is 4 (e.g., newer tiny model), it sets an alpha channel value.
|
|
22
|
+
*
|
|
23
|
+
* @param {Uint8ClampedArray} input - The input data to be preprocessed
|
|
24
|
+
* @param {Float32Array} alpha - The alpha channel data
|
|
25
|
+
* @returns {Float32Array} - The processed data
|
|
26
|
+
*/
|
|
27
|
+
preprocess(input, alpha) {
|
|
28
|
+
const { model_rank, input_size, output_size } = this.config.mask;
|
|
29
|
+
const { height, width } = input_size;
|
|
30
|
+
const numImagePixels = height * width;
|
|
31
|
+
if (!this.output) {
|
|
32
|
+
this.output = new Float32Array(numImagePixels * model_rank);
|
|
33
|
+
}
|
|
34
|
+
// In-place modification of class-scoped output buffer
|
|
35
|
+
const channelFlipOffset = model_rank === 4 ? 2 : 0;
|
|
36
|
+
const numInputPixels = input.length / 4;
|
|
37
|
+
// Loop over all color channels in the image
|
|
38
|
+
for (let channel = 0; channel < 3; channel++) {
|
|
39
|
+
// For each pixel in the input image...
|
|
40
|
+
for (let pixel = 0; pixel < numInputPixels; pixel++) {
|
|
41
|
+
// ...copy the color channel value from input to output, potentially
|
|
42
|
+
// potentially flipping the color channel order for the tiny.
|
|
43
|
+
this.output[pixel + channel * numImagePixels] =
|
|
44
|
+
input[pixel * 4 + Math.abs(channelFlipOffset - channel)];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// If the model_rank is 4, an additional alpha channel needs to be set
|
|
48
|
+
if (model_rank === 4) {
|
|
49
|
+
// Scaling factors for width and height based on the ratio of output to input sizes
|
|
50
|
+
const widthScale = output_size.width / width;
|
|
51
|
+
const heightScale = output_size.height / height;
|
|
52
|
+
// Iterate over each pixel in the width of the input image
|
|
53
|
+
for (let x = 0; x < width; x++) {
|
|
54
|
+
const nearestNeighborX = Math.floor(x * widthScale);
|
|
55
|
+
// Iterate over each pixel in the height of the input image
|
|
56
|
+
for (let y = 0; y < height; y++) {
|
|
57
|
+
const nearestNeighborY = Math.floor(y * heightScale);
|
|
58
|
+
const maskIdx = nearestNeighborX + nearestNeighborY * output_size.width;
|
|
59
|
+
const outputIdx = x + y * width + 3 * numImagePixels;
|
|
60
|
+
// Normalize the alpha value to range between 0 and 1, and scale it to the range of 0-255
|
|
61
|
+
const normalizedValue = Math.min(Math.max(alpha[maskIdx], 0), 1) * 255;
|
|
62
|
+
// Assign the normalized value to the output at the computed index
|
|
63
|
+
this.output[outputIdx] = normalizedValue;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return this.output;
|
|
68
|
+
}
|
|
69
|
+
getMask(input) {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
if (!this.mask_model) {
|
|
72
|
+
throw new Error('[ladon-ts] - mask model not loaded.');
|
|
73
|
+
}
|
|
74
|
+
const mask_generation_timeout = Date.now() - this.last_mask_generation > this.config.mask.generation_interval_ms;
|
|
75
|
+
if (!mask_generation_timeout) {
|
|
76
|
+
return {
|
|
77
|
+
data: this.last_mask.data,
|
|
78
|
+
warm: false,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
this.last_mask_generation = Date.now();
|
|
82
|
+
const image_tns = new ort.Tensor('float32', this.preprocess(input, this.last_mask.data), [
|
|
83
|
+
1,
|
|
84
|
+
this.config.mask.model_rank,
|
|
85
|
+
this.config.mask.input_size.height,
|
|
86
|
+
this.config.mask.input_size.width,
|
|
87
|
+
]);
|
|
88
|
+
if (this.config.mask.model_rank === 4) {
|
|
89
|
+
// This feed uses the new model input params for the tiny model.
|
|
90
|
+
const results = yield this.mask_model.run({
|
|
91
|
+
input: image_tns,
|
|
92
|
+
});
|
|
93
|
+
this.last_mask = results.segmentation;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const results = yield this.mask_model.run({
|
|
97
|
+
input_image: image_tns,
|
|
98
|
+
prev_mask: this.last_mask,
|
|
99
|
+
});
|
|
100
|
+
this.last_mask = results.output_mask;
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
data: this.last_mask.data,
|
|
104
|
+
warm: true,
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
load() {
|
|
109
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
110
|
+
if (this.config.wasm_uri) {
|
|
111
|
+
ort.env.wasm.wasmPaths = toAbsoluteURI(this.config.wasm_uri, this.config.base_url);
|
|
112
|
+
}
|
|
113
|
+
ort.env.wasm.numThreads = 1;
|
|
114
|
+
const modelUrl = yield getModelUrl(this.config);
|
|
115
|
+
this.mask_model = yield ort.InferenceSession.create(modelUrl, {
|
|
116
|
+
executionProviders: ['wasm'],
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
isLoaded() {
|
|
121
|
+
return !!this.mask_model;
|
|
122
|
+
}
|
|
123
|
+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
|
124
|
+
postRender(_) {
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
+
// empty for local generator
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
destroy() {
|
|
130
|
+
// empty for local generator
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export class NullGenerator {
|
|
134
|
+
constructor(config) {
|
|
135
|
+
this.config = config;
|
|
136
|
+
this.last_mask = new Float32Array(this.config.input.height * this.config.input.width);
|
|
137
|
+
}
|
|
138
|
+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
|
139
|
+
getMask(_) {
|
|
140
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
141
|
+
return {
|
|
142
|
+
data: this.last_mask,
|
|
143
|
+
warm: false,
|
|
144
|
+
};
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
load() {
|
|
148
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
149
|
+
// empty for null generator
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
isLoaded() {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
|
156
|
+
postRender(_) {
|
|
157
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
158
|
+
// empty for null generator
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
destroy() {
|
|
162
|
+
// empty for null generator
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export class WorkerGenerator {
|
|
166
|
+
constructor(config) {
|
|
167
|
+
this.config = config;
|
|
168
|
+
this.new_mask = true;
|
|
169
|
+
this.last_mask = new Float32Array(this.config.input.height * this.config.input.width);
|
|
170
|
+
}
|
|
171
|
+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
|
172
|
+
getMask(_) {
|
|
173
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
174
|
+
const toReturn = {
|
|
175
|
+
data: this.last_mask,
|
|
176
|
+
warm: this.new_mask,
|
|
177
|
+
};
|
|
178
|
+
this.new_mask = false;
|
|
179
|
+
return toReturn;
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
load() {
|
|
183
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
184
|
+
const workerUrl = String(new URL('./worker/segmentation.js', import.meta.url));
|
|
185
|
+
this.worker = new Worker(workerUrl, { type: 'module' });
|
|
186
|
+
const modelUrl = yield getModelUrl(this.config);
|
|
187
|
+
const worker_config = {
|
|
188
|
+
base_url: this.config.base_url,
|
|
189
|
+
input: this.config.input,
|
|
190
|
+
mask: Object.assign(Object.assign({}, this.config.mask), { model_url_resolver: modelUrl }),
|
|
191
|
+
wasm_uri: this.config.wasm_uri,
|
|
192
|
+
render: { type: 'passthrough' },
|
|
193
|
+
};
|
|
194
|
+
this.worker.postMessage(worker_config);
|
|
195
|
+
let resolution_cb;
|
|
196
|
+
const result = new Promise((resolve) => {
|
|
197
|
+
resolution_cb = resolve;
|
|
198
|
+
});
|
|
199
|
+
this.worker.onmessage = (event) => {
|
|
200
|
+
if (event.data.mask) {
|
|
201
|
+
this.last_mask = event.data.mask;
|
|
202
|
+
this.new_mask = true;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
URL.revokeObjectURL(workerUrl);
|
|
206
|
+
if (resolution_cb) {
|
|
207
|
+
resolution_cb();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
return result;
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
isLoaded() {
|
|
215
|
+
return !!this.worker;
|
|
216
|
+
}
|
|
217
|
+
postRender(input) {
|
|
218
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
219
|
+
// claim ownership of the input tensor's buffer and forward to worker
|
|
220
|
+
if (!this.worker) {
|
|
221
|
+
throw new Error('[ladon-ts] - worker is not defined.');
|
|
222
|
+
}
|
|
223
|
+
this.worker.postMessage({
|
|
224
|
+
image: input,
|
|
225
|
+
}, [input.buffer]);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
destroy() {
|
|
229
|
+
var _a;
|
|
230
|
+
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.terminate();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQztBQUd2QyxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQXFCcEQsTUFBTSxPQUFPLGNBQWM7SUFNdkIsWUFBNEIsTUFBc0I7UUFBdEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFIMUMseUJBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBSTdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUMzQixTQUFTLEVBQ1QsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUNwRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUM1RCxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssVUFBVSxDQUFDLEtBQXdCLEVBQUUsS0FBbUI7UUFDNUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDakUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFDckMsTUFBTSxjQUFjLEdBQUcsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUV0QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsY0FB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
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { PipelineConfig } from './config';
|
|
2
|
-
export interface IPipeline {
|
|
3
|
-
onFrame(): Promise<void>;
|
|
4
|
-
isLoaded(): boolean;
|
|
5
|
-
load(): Promise<void>;
|
|
6
|
-
destroy(): void;
|
|
7
|
-
}
|
|
8
|
-
export declare class Pipeline implements IPipeline {
|
|
9
|
-
private input_canvas;
|
|
10
|
-
private output_canvas;
|
|
11
|
-
readonly config: PipelineConfig;
|
|
12
|
-
private generator?;
|
|
13
|
-
private renderer?;
|
|
14
|
-
private loaded;
|
|
15
|
-
private input_ctx;
|
|
16
|
-
constructor(input_canvas: HTMLCanvasElement, output_canvas: HTMLCanvasElement, config: PipelineConfig);
|
|
17
|
-
onFrame(): Promise<void>;
|
|
18
|
-
isLoaded(): boolean;
|
|
19
|
-
load(): Promise<void>;
|
|
20
|
-
destroy(): void;
|
|
21
|
-
}
|
|
1
|
+
import { PipelineConfig } from './config';
|
|
2
|
+
export interface IPipeline {
|
|
3
|
+
onFrame(): Promise<void>;
|
|
4
|
+
isLoaded(): boolean;
|
|
5
|
+
load(): Promise<void>;
|
|
6
|
+
destroy(): void;
|
|
7
|
+
}
|
|
8
|
+
export declare class Pipeline implements IPipeline {
|
|
9
|
+
private input_canvas;
|
|
10
|
+
private output_canvas;
|
|
11
|
+
readonly config: PipelineConfig;
|
|
12
|
+
private generator?;
|
|
13
|
+
private renderer?;
|
|
14
|
+
private loaded;
|
|
15
|
+
private input_ctx;
|
|
16
|
+
constructor(input_canvas: HTMLCanvasElement, output_canvas: HTMLCanvasElement, config: PipelineConfig);
|
|
17
|
+
onFrame(): Promise<void>;
|
|
18
|
+
isLoaded(): boolean;
|
|
19
|
+
load(): Promise<void>;
|
|
20
|
+
destroy(): void;
|
|
21
|
+
}
|