@zappar/zappar-cv 3.0.0-beta.7 → 3.0.1-alpha.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/README.md +2 -2
- package/lib/additional.d.ts +0 -3
- package/lib/camera-source.js +8 -4
- package/lib/ceres-worker.d.ts +1 -0
- package/lib/ceres-worker.js +67 -0
- package/lib/direct.js +3 -1
- package/lib/gen/zappar-client.d.ts +2 -2
- package/lib/gen/zappar-client.js +5 -0
- package/lib/gen/zappar-cwrap.js +4 -31
- package/lib/gen/zappar-native.d.ts +1 -5
- package/lib/gen/zappar.d.ts +0 -1
- package/lib/html-element-source.js +0 -1
- package/lib/imagetracker.d.ts +2 -3
- package/lib/index.d.ts +0 -1
- package/lib/mstp-camera-source.d.ts +9 -0
- package/lib/mstp-camera-source.js +79 -6
- package/lib/native.js +8 -18
- package/lib/pipeline.d.ts +3 -11
- package/lib/pipeline.js +3 -72
- package/lib/source.d.ts +0 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/worker-client.d.ts +1 -0
- package/lib/worker-client.js +19 -1
- package/lib/worker-messages.d.ts +10 -0
- package/lib/worker-messages.js +10 -0
- package/lib/worker-server.d.ts +1 -1
- package/lib/worker-server.js +52 -56
- package/lib/worker.js +1 -1
- package/lib/workerinterface.d.ts +0 -16
- package/lib/zappar-cv.js +177 -134
- package/lib/zappar-cv.wasm +0 -0
- package/package.json +4 -3
- package/umd/169.zappar-cv.js +1 -1
- package/umd/25.zappar-cv.js +1 -0
- package/umd/429.zappar-cv.js +1 -0
- package/umd/501114eb92cddf5f56fe.wasm +0 -0
- package/umd/867.zappar-cv.js +1 -0
- package/umd/zappar-cv.js +1 -1
- package/umd/zappar-cv.worker.js +1 -1
- package/lib/camera-frame-data.d.ts +0 -5
- package/lib/camera-frame-data.js +0 -1
- package/lib/gen/zappar-bridge.d.ts +0 -120
- package/lib/gen/zappar-bridge.js +0 -7
- package/umd/51b1854609f16d933fe2.wasm +0 -0
- package/umd/56.zappar-cv.js +0 -1
package/lib/pipeline.js
CHANGED
|
@@ -24,10 +24,6 @@ export class Pipeline {
|
|
|
24
24
|
this.cameraPixelArrays = [];
|
|
25
25
|
this._sequenceRecordDeviceAttitudeMatrices = true;
|
|
26
26
|
this._sequenceRecorderFirstCameraToken = 0;
|
|
27
|
-
this._cameraFrameDataPromises = new Map();
|
|
28
|
-
this._cameraFrameDataResolves = new Map();
|
|
29
|
-
this._cameraFrameDataRejects = new Map();
|
|
30
|
-
this._cameraFrameDataEnabled = false;
|
|
31
27
|
this.onGLContextReset = new Event();
|
|
32
28
|
}
|
|
33
29
|
static create(client, mgr) {
|
|
@@ -60,34 +56,14 @@ export class Pipeline {
|
|
|
60
56
|
if (t[1].texture)
|
|
61
57
|
this.videoTextures.push(t[1].texture);
|
|
62
58
|
(_b = (_a = t[1].frame) === null || _a === void 0 ? void 0 : _a.close) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
63
|
-
if (t[1].data) {
|
|
64
|
-
this.cameraPixelArrays.push(t[1].data);
|
|
65
|
-
t[1].data = undefined;
|
|
66
|
-
}
|
|
67
59
|
this.cameraTokens.delete(t[0]);
|
|
68
60
|
}
|
|
69
61
|
}
|
|
70
62
|
}
|
|
71
|
-
cameraFrameDataRawResult(msg) {
|
|
72
|
-
var _a, _b;
|
|
73
|
-
let info = this.cameraTokens.get(msg.token);
|
|
74
|
-
if (!info)
|
|
75
|
-
return;
|
|
76
|
-
if (msg.data === null) {
|
|
77
|
-
(_a = this._cameraFrameDataRejects.get(info)) === null || _a === void 0 ? void 0 : _a(new Error('Raw camera data not available'));
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
info.data = msg.data.data;
|
|
81
|
-
(_b = this._cameraFrameDataResolves.get(info)) === null || _b === void 0 ? void 0 : _b(msg.data);
|
|
82
|
-
}
|
|
83
|
-
this._cameraFrameDataRejects.delete(info);
|
|
84
|
-
this._cameraFrameDataResolves.delete(info);
|
|
85
|
-
this._cameraFrameDataPromises.delete(info);
|
|
86
|
-
}
|
|
87
63
|
cameraTokenReturn(msg) {
|
|
88
|
-
let info = this.cameraTokens.get(msg.token);
|
|
89
64
|
if (this._sequenceRecorder && this._sequenceRecordDeviceAttitudeMatrices
|
|
90
65
|
&& msg.token >= this._sequenceRecorderFirstCameraToken) {
|
|
66
|
+
let info = this.cameraTokens.get(msg.token);
|
|
91
67
|
if (info) {
|
|
92
68
|
if (msg.att)
|
|
93
69
|
this._sequenceRecorder.appendAttitudeMatrix(msg.att);
|
|
@@ -95,20 +71,7 @@ export class Pipeline {
|
|
|
95
71
|
this._sequenceRecorder.appendCameraFrame(info);
|
|
96
72
|
}
|
|
97
73
|
}
|
|
98
|
-
|
|
99
|
-
info.data = msg.d;
|
|
100
|
-
const rawRequestResolve = this._cameraFrameDataResolves.get(info);
|
|
101
|
-
if (rawRequestResolve) {
|
|
102
|
-
rawRequestResolve({
|
|
103
|
-
data: info.data,
|
|
104
|
-
width: info.dataWidth,
|
|
105
|
-
height: info.dataHeight,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
this._cameraFrameDataRejects.delete(info);
|
|
109
|
-
this._cameraFrameDataResolves.delete(info);
|
|
110
|
-
this._cameraFrameDataPromises.delete(info);
|
|
111
|
-
}
|
|
74
|
+
this.cameraPixelArrays.push(msg.d);
|
|
112
75
|
this.tokensInFlight--;
|
|
113
76
|
}
|
|
114
77
|
sequenceRecordStart(expectedFrames) {
|
|
@@ -134,37 +97,6 @@ export class Pipeline {
|
|
|
134
97
|
getVideoTexture() {
|
|
135
98
|
return this.videoTextures.pop();
|
|
136
99
|
}
|
|
137
|
-
getCameraFrameDataRaw() {
|
|
138
|
-
if (!this._cameraFrameDataEnabled)
|
|
139
|
-
throw new Error('Raw camera frame data is not enabled.');
|
|
140
|
-
const info = this.getCurrentCameraInfo();
|
|
141
|
-
if (!info)
|
|
142
|
-
return Promise.resolve(undefined);
|
|
143
|
-
if (info.data)
|
|
144
|
-
return Promise.resolve({ data: info.data.slice(0), width: info.dataWidth, height: info.dataHeight });
|
|
145
|
-
let existing = this._cameraFrameDataPromises.get(info);
|
|
146
|
-
if (!existing) {
|
|
147
|
-
existing = new Promise((resolve, reject) => {
|
|
148
|
-
if (typeof info.remoteToken !== 'undefined') {
|
|
149
|
-
const msg = {
|
|
150
|
-
t: "rawrequest",
|
|
151
|
-
token: info.remoteToken,
|
|
152
|
-
p: this._impl,
|
|
153
|
-
};
|
|
154
|
-
this._mgr.postOutgoingMessage(msg, []);
|
|
155
|
-
}
|
|
156
|
-
this._cameraFrameDataResolves.set(info, resolve);
|
|
157
|
-
this._cameraFrameDataRejects.set(info, reject);
|
|
158
|
-
});
|
|
159
|
-
this._cameraFrameDataPromises.set(info, existing);
|
|
160
|
-
}
|
|
161
|
-
return existing;
|
|
162
|
-
}
|
|
163
|
-
setCameraFrameDataRawEnabled(e) {
|
|
164
|
-
this._cameraFrameDataEnabled = e;
|
|
165
|
-
const msg = { t: 'rawenabled', v: e };
|
|
166
|
-
this._mgr.postOutgoingMessage(msg, []);
|
|
167
|
-
}
|
|
168
100
|
destroy() {
|
|
169
101
|
this._client.pipeline_destroy(this._impl);
|
|
170
102
|
byId.delete(this._impl);
|
|
@@ -294,8 +226,7 @@ export class Pipeline {
|
|
|
294
226
|
uvTransform: msg.uvTransform,
|
|
295
227
|
cameraModel: msg.cameraModel,
|
|
296
228
|
cameraToDevice: msg.cameraToDevice,
|
|
297
|
-
cameraSource
|
|
298
|
-
remoteToken: msg.token,
|
|
229
|
+
cameraSource
|
|
299
230
|
});
|
|
300
231
|
this.cleanOldFrames();
|
|
301
232
|
}
|
package/lib/source.d.ts
CHANGED
package/lib/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "3.0.
|
|
1
|
+
export declare const VERSION = "3.0.1-alpha.1";
|
package/lib/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = "3.0.
|
|
1
|
+
export const VERSION = "3.0.1-alpha.1";
|
package/lib/worker-client.d.ts
CHANGED
package/lib/worker-client.js
CHANGED
|
@@ -9,13 +9,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import { MsgManager } from "./messages";
|
|
11
11
|
export let messageManager = new MsgManager();
|
|
12
|
+
const wasmModule = (() => __awaiter(void 0, void 0, void 0, function* () {
|
|
13
|
+
const response = yield fetch(new URL("./zappar-cv.wasm", import.meta.url).toString());
|
|
14
|
+
const module = yield WebAssembly.compileStreaming(response);
|
|
15
|
+
return module;
|
|
16
|
+
}))();
|
|
12
17
|
export function launchWorker(worker) {
|
|
13
18
|
return __awaiter(this, void 0, void 0, function* () {
|
|
14
19
|
if (!worker)
|
|
15
20
|
worker = new Worker(new URL("./worker", import.meta.url), { type: 'module' });
|
|
16
21
|
worker.postMessage({
|
|
17
22
|
t: "wasm",
|
|
18
|
-
url: new URL("./zappar-cv.wasm", import.meta.url).toString()
|
|
23
|
+
url: new URL("./zappar-cv.wasm", import.meta.url).toString(),
|
|
24
|
+
module: yield wasmModule
|
|
19
25
|
});
|
|
20
26
|
yield waitForLoad(worker);
|
|
21
27
|
function sendOutgoing() {
|
|
@@ -31,6 +37,18 @@ export function launchWorker(worker) {
|
|
|
31
37
|
});
|
|
32
38
|
});
|
|
33
39
|
}
|
|
40
|
+
export function launchCeresWorker(port, worker) {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
if (!worker)
|
|
43
|
+
worker = new Worker(new URL("./ceres-worker", import.meta.url), { type: 'module' });
|
|
44
|
+
worker.postMessage({
|
|
45
|
+
t: "wasm",
|
|
46
|
+
url: new URL("./zappar-cv.wasm", import.meta.url).toString(),
|
|
47
|
+
module: yield wasmModule,
|
|
48
|
+
port
|
|
49
|
+
}, [port]);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
34
52
|
function waitForLoad(w) {
|
|
35
53
|
return new Promise(resolve => {
|
|
36
54
|
let listener = (msg) => {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type * as ZNM from "./zappar-cv";
|
|
2
|
+
export interface WorkerMessageAPI {
|
|
3
|
+
worker_message_send_count: () => number;
|
|
4
|
+
worker_message_send_clear: () => void;
|
|
5
|
+
worker_message_send_data_size: (index: number) => number;
|
|
6
|
+
worker_message_send_data: (index: number) => number;
|
|
7
|
+
worker_message_send_reference: (index: number) => number;
|
|
8
|
+
worker_message_receive: (ref: number, size: number, data: number) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function getWorkerMessageAPI(mod: ZNM.Module): WorkerMessageAPI;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function getWorkerMessageAPI(mod) {
|
|
2
|
+
return {
|
|
3
|
+
worker_message_send_count: mod.cwrap("worker_message_send_count", "number", []),
|
|
4
|
+
worker_message_send_clear: mod.cwrap("worker_message_send_clear", null, []),
|
|
5
|
+
worker_message_send_data_size: mod.cwrap("worker_message_send_data_size", "number", ["number"]),
|
|
6
|
+
worker_message_send_data: mod.cwrap("worker_message_send_data", "number", ["number"]),
|
|
7
|
+
worker_message_send_reference: mod.cwrap("worker_message_send_reference", "number", ["number"]),
|
|
8
|
+
worker_message_receive: mod.cwrap("worker_message_receive", null, ["number", "number", "number"]),
|
|
9
|
+
};
|
|
10
|
+
}
|
package/lib/worker-server.d.ts
CHANGED
package/lib/worker-server.js
CHANGED
|
@@ -15,11 +15,11 @@ import { mat4 } from "gl-matrix";
|
|
|
15
15
|
import { frame_pixel_format_t } from "./gen/zappar-native";
|
|
16
16
|
import { handleImageBitmap } from "./worker-imagebitmap";
|
|
17
17
|
import { profile } from "./profile";
|
|
18
|
+
import { getWorkerMessageAPI } from "./worker-messages";
|
|
18
19
|
export let messageManager = new MsgManager();
|
|
20
|
+
let workerMessageChannel;
|
|
19
21
|
let latestCameraToScreenRotation = 0;
|
|
20
|
-
|
|
21
|
-
const rawCameraFrameBuffersByPipeline = new Map();
|
|
22
|
-
export function launchWorkerServer(wasmUrl) {
|
|
22
|
+
export function launchWorkerServer(wasmUrl, module) {
|
|
23
23
|
return __awaiter(this, void 0, void 0, function* () {
|
|
24
24
|
let mod = ZNM.default({
|
|
25
25
|
locateFile: (path, prefix) => {
|
|
@@ -28,8 +28,14 @@ export function launchWorkerServer(wasmUrl) {
|
|
|
28
28
|
}
|
|
29
29
|
return prefix + path;
|
|
30
30
|
},
|
|
31
|
+
instantiateWasm: (imports, successCallback) => {
|
|
32
|
+
const instance = new WebAssembly.Instance(module, imports);
|
|
33
|
+
successCallback(instance);
|
|
34
|
+
return instance.exports;
|
|
35
|
+
},
|
|
31
36
|
onRuntimeInitialized: () => {
|
|
32
37
|
let r = getRuntimeObject(mod);
|
|
38
|
+
const workerMessageAPI = getWorkerMessageAPI(mod);
|
|
33
39
|
let server = new zappar_server(r, (pipelineId, ab) => {
|
|
34
40
|
messageManager.postOutgoingMessage({
|
|
35
41
|
p: pipelineId,
|
|
@@ -39,7 +45,7 @@ export function launchWorkerServer(wasmUrl) {
|
|
|
39
45
|
});
|
|
40
46
|
messageManager.postOutgoingMessage("loaded", []);
|
|
41
47
|
messageManager.onIncomingMessage.bind((msg) => {
|
|
42
|
-
var _a
|
|
48
|
+
var _a;
|
|
43
49
|
switch (msg.t) {
|
|
44
50
|
case "zappar":
|
|
45
51
|
server.processBuffer(msg.d);
|
|
@@ -57,6 +63,7 @@ export function launchWorkerServer(wasmUrl) {
|
|
|
57
63
|
r.pipeline_frame_update(pipeline);
|
|
58
64
|
att = r.pipeline_camera_frame_device_attitude(pipeline);
|
|
59
65
|
server.exploreState();
|
|
66
|
+
handleMessages(mod, workerMessageAPI);
|
|
60
67
|
}
|
|
61
68
|
let ret = {
|
|
62
69
|
token: msgt.token,
|
|
@@ -68,26 +75,9 @@ export function launchWorkerServer(wasmUrl) {
|
|
|
68
75
|
messageManager.postOutgoingMessage(ret, [msgt.d]);
|
|
69
76
|
break;
|
|
70
77
|
}
|
|
71
|
-
case "rawenabled": {
|
|
72
|
-
const msgt = msg;
|
|
73
|
-
rawDataAccessEnabled = msgt.v;
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
76
|
-
case "rawrequest": {
|
|
77
|
-
const msgt = msg;
|
|
78
|
-
const buffers = rawCameraFrameBuffersByPipeline.get(msgt.p);
|
|
79
|
-
const ret = {
|
|
80
|
-
t: "raw",
|
|
81
|
-
token: msgt.token,
|
|
82
|
-
p: msgt.p,
|
|
83
|
-
data: buffers ? (_c = (_b = buffers.ready.find(entry => entry.token === msgt.token)) === null || _b === void 0 ? void 0 : _b.data) !== null && _c !== void 0 ? _c : null : null,
|
|
84
|
-
};
|
|
85
|
-
messageManager.postOutgoingMessage(ret, []);
|
|
86
|
-
break;
|
|
87
|
-
}
|
|
88
78
|
case "streamC2S": {
|
|
89
79
|
let msgt = msg;
|
|
90
|
-
consumeStream(mod, r, msgt.s, msgt.p, msgt.userFacing, server, msgt.source).then(() => {
|
|
80
|
+
consumeStream(mod, r, msgt.s, msgt.p, msgt.userFacing, server, msgt.source, workerMessageAPI).then(() => {
|
|
91
81
|
let m = { t: "streamEndedS2C", p: msgt.p, source: msgt.source };
|
|
92
82
|
// console.log('Stream ended, requesting new stream');
|
|
93
83
|
messageManager.postOutgoingMessage(m, []);
|
|
@@ -151,7 +141,7 @@ export function launchWorkerServer(wasmUrl) {
|
|
|
151
141
|
});
|
|
152
142
|
}
|
|
153
143
|
;
|
|
154
|
-
function consumeStream(mod, r, stream, p, userFacing, server, source) {
|
|
144
|
+
function consumeStream(mod, r, stream, p, userFacing, server, source, workerMessageAPI) {
|
|
155
145
|
return __awaiter(this, void 0, void 0, function* () {
|
|
156
146
|
while (true) {
|
|
157
147
|
let reader;
|
|
@@ -164,7 +154,7 @@ function consumeStream(mod, r, stream, p, userFacing, server, source) {
|
|
|
164
154
|
continue;
|
|
165
155
|
}
|
|
166
156
|
try {
|
|
167
|
-
yield consumeReader(mod, r, reader, p, userFacing, server, source);
|
|
157
|
+
yield consumeReader(mod, r, reader, p, userFacing, server, source, workerMessageAPI);
|
|
168
158
|
return;
|
|
169
159
|
}
|
|
170
160
|
catch (err) {
|
|
@@ -192,8 +182,8 @@ function getFrameOrTimeout(reader) {
|
|
|
192
182
|
}
|
|
193
183
|
const cameraToDeviceTransform = mat4.create();
|
|
194
184
|
const cameraModel = new Float32Array([300, 300, 160, 120, 0, 0]);
|
|
195
|
-
function consumeReader(mod, r, reader, p, userFacing, server, source) {
|
|
196
|
-
var _a;
|
|
185
|
+
function consumeReader(mod, r, reader, p, userFacing, server, source, workerMessageAPI) {
|
|
186
|
+
var _a, _b;
|
|
197
187
|
return __awaiter(this, void 0, void 0, function* () {
|
|
198
188
|
while (true) {
|
|
199
189
|
let result = yield getFrameOrTimeout(reader);
|
|
@@ -253,8 +243,8 @@ function consumeReader(mod, r, reader, p, userFacing, server, source) {
|
|
|
253
243
|
t: "videoFrameS2C",
|
|
254
244
|
userFacing,
|
|
255
245
|
uvTransform,
|
|
256
|
-
w:
|
|
257
|
-
h:
|
|
246
|
+
w: dataWidth,
|
|
247
|
+
h: dataHeight,
|
|
258
248
|
cameraToDevice: cameraToDeviceTransform,
|
|
259
249
|
cameraModel,
|
|
260
250
|
source
|
|
@@ -263,41 +253,16 @@ function consumeReader(mod, r, reader, p, userFacing, server, source) {
|
|
|
263
253
|
const pipeline = server._pipeline_by_instance.get(p);
|
|
264
254
|
if (pipeline) {
|
|
265
255
|
try {
|
|
266
|
-
r.pipeline_camera_frame_submit_raw_pointer(pipeline, streamDataBufferPointer, size, framePixelFormatFromFormat(frame.format), width, height, token, cameraToDeviceTransform, latestCameraToScreenRotation, cameraModel, userFacing);
|
|
256
|
+
r.pipeline_camera_frame_submit_raw_pointer(pipeline, streamDataBufferPointer, size, framePixelFormatFromFormat(frame.format), width, height, token, cameraToDeviceTransform, latestCameraToScreenRotation, cameraModel, userFacing, (_b = frame.timestamp) !== null && _b !== void 0 ? _b : -1);
|
|
257
|
+
handleMessages(mod, workerMessageAPI);
|
|
267
258
|
}
|
|
268
259
|
catch (err) {
|
|
269
|
-
|
|
260
|
+
console.log('Exception during camera processing', err);
|
|
270
261
|
// const func = mod.cwrap('what_to_stderr', 'number', ['number']);
|
|
271
262
|
// func(err);
|
|
272
263
|
// (mod as any).ccall('what_to_stderr', 'number', ['number'], [err]);
|
|
273
264
|
}
|
|
274
265
|
r.pipeline_frame_update(pipeline);
|
|
275
|
-
if (rawDataAccessEnabled) {
|
|
276
|
-
let buffers = rawCameraFrameBuffersByPipeline.get(p);
|
|
277
|
-
if (!buffers) {
|
|
278
|
-
buffers = { available: [], ready: [] };
|
|
279
|
-
rawCameraFrameBuffersByPipeline.set(p, buffers);
|
|
280
|
-
}
|
|
281
|
-
if (buffers.ready.length > 4) {
|
|
282
|
-
const removed = buffers.ready.splice(0, 1);
|
|
283
|
-
for (const entry of removed)
|
|
284
|
-
buffers.available.push(new Uint8Array(entry.data.data));
|
|
285
|
-
}
|
|
286
|
-
const size = r.pipeline_camera_frame_data_raw_size(pipeline);
|
|
287
|
-
let buffer;
|
|
288
|
-
while (!buffer || buffer.byteLength < size) {
|
|
289
|
-
if (buffers.available.length < 1)
|
|
290
|
-
buffers.available.push(new Uint8Array(size));
|
|
291
|
-
buffer = buffers.available.pop();
|
|
292
|
-
}
|
|
293
|
-
const dataPointer = r.pipeline_camera_frame_data_raw(pipeline);
|
|
294
|
-
buffer.set(mod.HEAPU8.subarray(dataPointer, dataPointer + size));
|
|
295
|
-
buffers.ready.push({ token, data: {
|
|
296
|
-
data: buffer,
|
|
297
|
-
width: r.pipeline_camera_frame_data_raw_width(p),
|
|
298
|
-
height: r.pipeline_camera_frame_data_raw_height(p),
|
|
299
|
-
} });
|
|
300
|
-
}
|
|
301
266
|
server.exploreState();
|
|
302
267
|
}
|
|
303
268
|
frame.close();
|
|
@@ -326,3 +291,34 @@ function framePixelFormatFromFormat(f) {
|
|
|
326
291
|
}
|
|
327
292
|
return frame_pixel_format_t.FRAME_PIXEL_FORMAT_Y;
|
|
328
293
|
}
|
|
294
|
+
function handleMessages(mod, m) {
|
|
295
|
+
const toSend = m.worker_message_send_count();
|
|
296
|
+
if (toSend === 0)
|
|
297
|
+
return;
|
|
298
|
+
if (!workerMessageChannel) {
|
|
299
|
+
workerMessageChannel = new MessageChannel();
|
|
300
|
+
workerMessageChannel.port1.start();
|
|
301
|
+
workerMessageChannel.port1.addEventListener('message', evt => {
|
|
302
|
+
if (evt.data.t !== 'msgrec')
|
|
303
|
+
return;
|
|
304
|
+
const data = evt.data.data;
|
|
305
|
+
const ptr = mod._malloc(data.byteLength);
|
|
306
|
+
mod.HEAPU8.set(data, ptr);
|
|
307
|
+
m.worker_message_receive(evt.data.reference, data.byteLength, ptr);
|
|
308
|
+
mod._free(ptr);
|
|
309
|
+
});
|
|
310
|
+
messageManager.postOutgoingMessage({ t: 'setupCeresWorker', port: workerMessageChannel.port2 }, [workerMessageChannel.port2]);
|
|
311
|
+
}
|
|
312
|
+
for (let i = 0; i < toSend; i++) {
|
|
313
|
+
const reference = m.worker_message_send_reference(i);
|
|
314
|
+
const dataSize = m.worker_message_send_data_size(i);
|
|
315
|
+
const dataPtr = m.worker_message_send_data(i);
|
|
316
|
+
const data = mod.HEAPU8.slice(dataPtr, dataPtr + dataSize);
|
|
317
|
+
workerMessageChannel.port1.postMessage({
|
|
318
|
+
t: 'msgsend',
|
|
319
|
+
data,
|
|
320
|
+
reference
|
|
321
|
+
}, [data.buffer]);
|
|
322
|
+
}
|
|
323
|
+
m.worker_message_send_clear();
|
|
324
|
+
}
|
package/lib/worker.js
CHANGED
|
@@ -9,7 +9,7 @@ messageManager.onOutgoingMessage.bind(() => {
|
|
|
9
9
|
let launchHandler = (evt) => {
|
|
10
10
|
if (evt && evt.data && evt.data.t === "wasm") {
|
|
11
11
|
let url = location.href.startsWith("blob") ? evt.data.url : new URL("./zappar-cv.wasm", import.meta.url).toString();
|
|
12
|
-
launchWorkerServer(url);
|
|
12
|
+
launchWorkerServer(url, evt.data.module);
|
|
13
13
|
ctx.removeEventListener("message", launchHandler);
|
|
14
14
|
}
|
|
15
15
|
};
|
package/lib/workerinterface.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
/// <reference types="dom-webcodecs" />
|
|
2
|
-
import { CameraFrameData } from "./camera-frame-data";
|
|
3
2
|
import { zappar_camera_source_t, zappar_pipeline_t } from "./gen/zappar-native";
|
|
4
3
|
export interface CameraFrameC2S {
|
|
5
4
|
t: "cameraFrameC2S";
|
|
@@ -84,18 +83,3 @@ export interface AttitudeMatrixC2S {
|
|
|
84
83
|
p: zappar_pipeline_t;
|
|
85
84
|
m: Float32Array;
|
|
86
85
|
}
|
|
87
|
-
export interface CameraDataRawEnabledC2S {
|
|
88
|
-
t: "rawenabled";
|
|
89
|
-
v: boolean;
|
|
90
|
-
}
|
|
91
|
-
export interface CameraDataRawRequestC2S {
|
|
92
|
-
t: "rawrequest";
|
|
93
|
-
p: zappar_pipeline_t;
|
|
94
|
-
token: number;
|
|
95
|
-
}
|
|
96
|
-
export interface CameraDataRawS2C {
|
|
97
|
-
t: "raw";
|
|
98
|
-
token: number;
|
|
99
|
-
p: zappar_pipeline_t;
|
|
100
|
-
data: CameraFrameData | null;
|
|
101
|
-
}
|