@zappar/zappar-cv 3.0.1-alpha.1 → 3.0.1-alpha.13
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 +8 -1
- package/lib/camera-frame-data.d.ts +5 -0
- package/lib/camera-frame-data.js +1 -0
- package/lib/data-download.d.ts +8 -0
- package/lib/data-download.js +8 -0
- package/lib/deserializer.d.ts +1 -0
- package/lib/deserializer.js +7 -0
- package/lib/direct.js +1 -1
- package/lib/drawgrid.d.ts +2 -0
- package/lib/drawgrid.js +136 -0
- package/lib/drawpoints.d.ts +11 -0
- package/lib/drawpoints.js +180 -0
- package/lib/gen/zappar-bridge.d.ts +141 -0
- package/lib/gen/zappar-bridge.js +8 -0
- package/lib/gen/zappar-client.d.ts +3 -2
- package/lib/gen/zappar-client.js +214 -18
- package/lib/gen/zappar-cwrap.js +179 -3
- package/lib/gen/zappar-native.d.ts +29 -1
- package/lib/gen/zappar-native.js +6 -0
- package/lib/gen/zappar-server.d.ts +3 -0
- package/lib/gen/zappar-server.js +108 -10
- package/lib/gen/zappar.d.ts +26 -0
- package/lib/gen/zappar.js +1 -0
- package/lib/html-element-source.d.ts +3 -1
- package/lib/html-element-source.js +13 -6
- package/lib/image-process-gl.d.ts +3 -2
- package/lib/image-process-gl.js +9 -7
- package/lib/imagebitmap-camera-source.d.ts +3 -1
- package/lib/imagebitmap-camera-source.js +10 -4
- package/lib/imagetracker.d.ts +3 -2
- package/lib/index.d.ts +2 -1
- package/lib/index.js +1 -1
- package/lib/mstp-camera-source.d.ts +2 -1
- package/lib/mstp-camera-source.js +5 -0
- package/lib/native.js +67 -3
- package/lib/pipeline.d.ts +14 -4
- package/lib/pipeline.js +84 -5
- package/lib/profile.d.ts +2 -2
- package/lib/profile.js +3 -3
- package/lib/serializer.d.ts +1 -0
- package/lib/serializer.js +1 -0
- package/lib/source.d.ts +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/worker-client.js +5 -1
- package/lib/worker-imagebitmap.js +5 -4
- package/lib/worker-server.d.ts +1 -1
- package/lib/worker-server.js +84 -12
- package/lib/worker.js +2 -1
- package/lib/workerinterface.d.ts +24 -1
- package/lib/zappar-cv.js +1 -174
- package/lib/zappar-cv.wasm +0 -0
- package/package.json +1 -1
- package/umd/751.zappar-cv.js +1 -0
- package/umd/{501114eb92cddf5f56fe.wasm → 7a7455e00ac55a4f34d3.wasm} +0 -0
- package/umd/867.zappar-cv.js +1 -1
- package/umd/zappar-cv.js +1 -1
- package/umd/zappar-cv.worker.js +1 -1
- package/umd/429.zappar-cv.js +0 -1
package/lib/worker-server.js
CHANGED
|
@@ -12,14 +12,17 @@ import { getRuntimeObject } from "./gen/zappar-cwrap";
|
|
|
12
12
|
import { zappar_server } from "./gen/zappar-server";
|
|
13
13
|
import { MsgManager } from "./messages";
|
|
14
14
|
import { mat4 } from "gl-matrix";
|
|
15
|
-
import { frame_pixel_format_t } from "./gen/zappar-native";
|
|
15
|
+
import { camera_profile_t, frame_pixel_format_t } from "./gen/zappar-native";
|
|
16
16
|
import { handleImageBitmap } from "./worker-imagebitmap";
|
|
17
|
-
import { profile } from "./profile";
|
|
18
17
|
import { getWorkerMessageAPI } from "./worker-messages";
|
|
18
|
+
import { getDataDownloadAPI } from "./data-download";
|
|
19
19
|
export let messageManager = new MsgManager();
|
|
20
20
|
let workerMessageChannel;
|
|
21
21
|
let latestCameraToScreenRotation = 0;
|
|
22
|
-
|
|
22
|
+
let rawDataAccessEnabled = false;
|
|
23
|
+
const rawCameraFrameBuffersByPipeline = new Map();
|
|
24
|
+
const cameraProfileBySource = new Map();
|
|
25
|
+
export function launchWorkerServer(wasmUrl, module, shouldRecordData) {
|
|
23
26
|
return __awaiter(this, void 0, void 0, function* () {
|
|
24
27
|
let mod = ZNM.default({
|
|
25
28
|
locateFile: (path, prefix) => {
|
|
@@ -36,6 +39,8 @@ export function launchWorkerServer(wasmUrl, module) {
|
|
|
36
39
|
onRuntimeInitialized: () => {
|
|
37
40
|
let r = getRuntimeObject(mod);
|
|
38
41
|
const workerMessageAPI = getWorkerMessageAPI(mod);
|
|
42
|
+
const dataDownloadAPI = (shouldRecordData > 0) ? getDataDownloadAPI(mod) : undefined;
|
|
43
|
+
dataDownloadAPI === null || dataDownloadAPI === void 0 ? void 0 : dataDownloadAPI.data_should_record_set(shouldRecordData); // Only happens if dataDownloadAPI is defined
|
|
39
44
|
let server = new zappar_server(r, (pipelineId, ab) => {
|
|
40
45
|
messageManager.postOutgoingMessage({
|
|
41
46
|
p: pipelineId,
|
|
@@ -45,7 +50,7 @@ export function launchWorkerServer(wasmUrl, module) {
|
|
|
45
50
|
});
|
|
46
51
|
messageManager.postOutgoingMessage("loaded", []);
|
|
47
52
|
messageManager.onIncomingMessage.bind((msg) => {
|
|
48
|
-
var _a;
|
|
53
|
+
var _a, _b, _c;
|
|
49
54
|
switch (msg.t) {
|
|
50
55
|
case "zappar":
|
|
51
56
|
server.processBuffer(msg.d);
|
|
@@ -64,6 +69,8 @@ export function launchWorkerServer(wasmUrl, module) {
|
|
|
64
69
|
att = r.pipeline_camera_frame_device_attitude(pipeline);
|
|
65
70
|
server.exploreState();
|
|
66
71
|
handleMessages(mod, workerMessageAPI);
|
|
72
|
+
if (dataDownloadAPI)
|
|
73
|
+
handleDataDownload(mod, dataDownloadAPI);
|
|
67
74
|
}
|
|
68
75
|
let ret = {
|
|
69
76
|
token: msgt.token,
|
|
@@ -75,9 +82,31 @@ export function launchWorkerServer(wasmUrl, module) {
|
|
|
75
82
|
messageManager.postOutgoingMessage(ret, [msgt.d]);
|
|
76
83
|
break;
|
|
77
84
|
}
|
|
85
|
+
case "rawenabled": {
|
|
86
|
+
const msgt = msg;
|
|
87
|
+
rawDataAccessEnabled = msgt.v;
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
case "rawrequest": {
|
|
91
|
+
const msgt = msg;
|
|
92
|
+
const buffers = rawCameraFrameBuffersByPipeline.get(msgt.p);
|
|
93
|
+
const ret = {
|
|
94
|
+
t: "raw",
|
|
95
|
+
token: msgt.token,
|
|
96
|
+
p: msgt.p,
|
|
97
|
+
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,
|
|
98
|
+
};
|
|
99
|
+
messageManager.postOutgoingMessage(ret, []);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case "cameraProfileC2S": {
|
|
103
|
+
let msgt = msg;
|
|
104
|
+
cameraProfileBySource.set(msgt.source, msgt.p);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
78
107
|
case "streamC2S": {
|
|
79
108
|
let msgt = msg;
|
|
80
|
-
consumeStream(mod, r, msgt.s, msgt.p, msgt.userFacing, server, msgt.source, workerMessageAPI).then(() => {
|
|
109
|
+
consumeStream(mod, r, msgt.s, msgt.p, msgt.userFacing, server, msgt.source, workerMessageAPI, dataDownloadAPI).then(() => {
|
|
81
110
|
let m = { t: "streamEndedS2C", p: msgt.p, source: msgt.source };
|
|
82
111
|
// console.log('Stream ended, requesting new stream');
|
|
83
112
|
messageManager.postOutgoingMessage(m, []);
|
|
@@ -141,7 +170,7 @@ export function launchWorkerServer(wasmUrl, module) {
|
|
|
141
170
|
});
|
|
142
171
|
}
|
|
143
172
|
;
|
|
144
|
-
function consumeStream(mod, r, stream, p, userFacing, server, source, workerMessageAPI) {
|
|
173
|
+
function consumeStream(mod, r, stream, p, userFacing, server, source, workerMessageAPI, dataDownloadAPI) {
|
|
145
174
|
return __awaiter(this, void 0, void 0, function* () {
|
|
146
175
|
while (true) {
|
|
147
176
|
let reader;
|
|
@@ -154,7 +183,7 @@ function consumeStream(mod, r, stream, p, userFacing, server, source, workerMess
|
|
|
154
183
|
continue;
|
|
155
184
|
}
|
|
156
185
|
try {
|
|
157
|
-
yield consumeReader(mod, r, reader, p, userFacing, server, source, workerMessageAPI);
|
|
186
|
+
yield consumeReader(mod, r, reader, p, userFacing, server, source, workerMessageAPI, dataDownloadAPI);
|
|
158
187
|
return;
|
|
159
188
|
}
|
|
160
189
|
catch (err) {
|
|
@@ -182,7 +211,7 @@ function getFrameOrTimeout(reader) {
|
|
|
182
211
|
}
|
|
183
212
|
const cameraToDeviceTransform = mat4.create();
|
|
184
213
|
const cameraModel = new Float32Array([300, 300, 160, 120, 0, 0]);
|
|
185
|
-
function consumeReader(mod, r, reader, p, userFacing, server, source, workerMessageAPI) {
|
|
214
|
+
function consumeReader(mod, r, reader, p, userFacing, server, source, workerMessageAPI, dataDownloadAPI) {
|
|
186
215
|
var _a, _b;
|
|
187
216
|
return __awaiter(this, void 0, void 0, function* () {
|
|
188
217
|
while (true) {
|
|
@@ -226,16 +255,22 @@ function consumeReader(mod, r, reader, p, userFacing, server, source, workerMess
|
|
|
226
255
|
uvTransform = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
|
|
227
256
|
break;
|
|
228
257
|
}
|
|
258
|
+
let downSample = false;
|
|
259
|
+
if (cameraProfileBySource.get(source) !== camera_profile_t.HIGH) {
|
|
260
|
+
dataWidth /= 2;
|
|
261
|
+
dataHeight /= 2;
|
|
262
|
+
downSample = true;
|
|
263
|
+
}
|
|
229
264
|
let clone = frame.clone();
|
|
230
265
|
if (userFacing)
|
|
231
266
|
mat4.fromScaling(cameraToDeviceTransform, [-1, 1, -1]);
|
|
232
267
|
else
|
|
233
268
|
mat4.identity(cameraToDeviceTransform);
|
|
234
|
-
let focalLength = 300.0 *
|
|
269
|
+
let focalLength = 300.0 * dataWidth / 320.0;
|
|
235
270
|
cameraModel[0] = focalLength;
|
|
236
271
|
cameraModel[1] = focalLength;
|
|
237
|
-
cameraModel[2] =
|
|
238
|
-
cameraModel[3] =
|
|
272
|
+
cameraModel[2] = dataWidth * 0.5;
|
|
273
|
+
cameraModel[3] = dataHeight * 0.5;
|
|
239
274
|
const ret = {
|
|
240
275
|
token: token,
|
|
241
276
|
d: clone,
|
|
@@ -253,8 +288,10 @@ function consumeReader(mod, r, reader, p, userFacing, server, source, workerMess
|
|
|
253
288
|
const pipeline = server._pipeline_by_instance.get(p);
|
|
254
289
|
if (pipeline) {
|
|
255
290
|
try {
|
|
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);
|
|
291
|
+
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, downSample);
|
|
257
292
|
handleMessages(mod, workerMessageAPI);
|
|
293
|
+
if (dataDownloadAPI)
|
|
294
|
+
handleDataDownload(mod, dataDownloadAPI);
|
|
258
295
|
}
|
|
259
296
|
catch (err) {
|
|
260
297
|
console.log('Exception during camera processing', err);
|
|
@@ -263,6 +300,32 @@ function consumeReader(mod, r, reader, p, userFacing, server, source, workerMess
|
|
|
263
300
|
// (mod as any).ccall('what_to_stderr', 'number', ['number'], [err]);
|
|
264
301
|
}
|
|
265
302
|
r.pipeline_frame_update(pipeline);
|
|
303
|
+
if (rawDataAccessEnabled) {
|
|
304
|
+
let buffers = rawCameraFrameBuffersByPipeline.get(p);
|
|
305
|
+
if (!buffers) {
|
|
306
|
+
buffers = { available: [], ready: [] };
|
|
307
|
+
rawCameraFrameBuffersByPipeline.set(p, buffers);
|
|
308
|
+
}
|
|
309
|
+
if (buffers.ready.length > 4) {
|
|
310
|
+
const removed = buffers.ready.splice(0, 1);
|
|
311
|
+
for (const entry of removed)
|
|
312
|
+
buffers.available.push(new Uint8Array(entry.data.data));
|
|
313
|
+
}
|
|
314
|
+
const size = r.pipeline_camera_frame_data_raw_size(pipeline);
|
|
315
|
+
let buffer;
|
|
316
|
+
while (!buffer || buffer.byteLength < size) {
|
|
317
|
+
if (buffers.available.length < 1)
|
|
318
|
+
buffers.available.push(new Uint8Array(size));
|
|
319
|
+
buffer = buffers.available.pop();
|
|
320
|
+
}
|
|
321
|
+
const dataPointer = r.pipeline_camera_frame_data_raw(pipeline);
|
|
322
|
+
buffer.set(mod.HEAPU8.subarray(dataPointer, dataPointer + size));
|
|
323
|
+
buffers.ready.push({ token, data: {
|
|
324
|
+
data: buffer,
|
|
325
|
+
width: r.pipeline_camera_frame_data_raw_width(p),
|
|
326
|
+
height: r.pipeline_camera_frame_data_raw_height(p),
|
|
327
|
+
} });
|
|
328
|
+
}
|
|
266
329
|
server.exploreState();
|
|
267
330
|
}
|
|
268
331
|
frame.close();
|
|
@@ -322,3 +385,12 @@ function handleMessages(mod, m) {
|
|
|
322
385
|
}
|
|
323
386
|
m.worker_message_send_clear();
|
|
324
387
|
}
|
|
388
|
+
function handleDataDownload(mod, d) {
|
|
389
|
+
const size = d.data_download_size();
|
|
390
|
+
if (size === 0)
|
|
391
|
+
return;
|
|
392
|
+
const dataPtr = d.data_download();
|
|
393
|
+
const data = mod.HEAPU8.slice(dataPtr, dataPtr + size);
|
|
394
|
+
messageManager.postOutgoingMessage({ t: '_z_datadownload', data }, [data.buffer]);
|
|
395
|
+
d.data_download_clear();
|
|
396
|
+
}
|
package/lib/worker.js
CHANGED
|
@@ -7,9 +7,10 @@ messageManager.onOutgoingMessage.bind(() => {
|
|
|
7
7
|
}
|
|
8
8
|
});
|
|
9
9
|
let launchHandler = (evt) => {
|
|
10
|
+
var _a;
|
|
10
11
|
if (evt && evt.data && evt.data.t === "wasm") {
|
|
11
12
|
let url = location.href.startsWith("blob") ? evt.data.url : new URL("./zappar-cv.wasm", import.meta.url).toString();
|
|
12
|
-
launchWorkerServer(url, evt.data.module);
|
|
13
|
+
launchWorkerServer(url, evt.data.module, (_a = evt.data.shouldRecordData) !== null && _a !== void 0 ? _a : 0);
|
|
13
14
|
ctx.removeEventListener("message", launchHandler);
|
|
14
15
|
}
|
|
15
16
|
};
|
package/lib/workerinterface.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="dom-webcodecs" />
|
|
2
|
-
import {
|
|
2
|
+
import { CameraFrameData } from "./camera-frame-data";
|
|
3
|
+
import { camera_profile_t, zappar_camera_source_t, zappar_pipeline_t } from "./gen/zappar-native";
|
|
3
4
|
export interface CameraFrameC2S {
|
|
4
5
|
t: "cameraFrameC2S";
|
|
5
6
|
d: ArrayBuffer;
|
|
@@ -38,6 +39,12 @@ export interface StreamC2S {
|
|
|
38
39
|
userFacing: boolean;
|
|
39
40
|
source: zappar_camera_source_t;
|
|
40
41
|
}
|
|
42
|
+
export interface CameraProfileC2S {
|
|
43
|
+
t: "cameraProfileC2S";
|
|
44
|
+
p: zappar_pipeline_t;
|
|
45
|
+
source: zappar_camera_source_t;
|
|
46
|
+
profile: camera_profile_t;
|
|
47
|
+
}
|
|
41
48
|
export interface CameraToScreenRotationC2S {
|
|
42
49
|
t: "cameraToScreenC2S";
|
|
43
50
|
p: zappar_pipeline_t;
|
|
@@ -52,6 +59,7 @@ export interface ImageBitmapC2S {
|
|
|
52
59
|
tokenId: number;
|
|
53
60
|
cameraModel: Float32Array;
|
|
54
61
|
cameraToDevice: Float32Array;
|
|
62
|
+
cp: camera_profile_t;
|
|
55
63
|
}
|
|
56
64
|
export interface ImageBitmapS2C {
|
|
57
65
|
t: "imageBitmapS2C";
|
|
@@ -83,3 +91,18 @@ export interface AttitudeMatrixC2S {
|
|
|
83
91
|
p: zappar_pipeline_t;
|
|
84
92
|
m: Float32Array;
|
|
85
93
|
}
|
|
94
|
+
export interface CameraDataRawEnabledC2S {
|
|
95
|
+
t: "rawenabled";
|
|
96
|
+
v: boolean;
|
|
97
|
+
}
|
|
98
|
+
export interface CameraDataRawRequestC2S {
|
|
99
|
+
t: "rawrequest";
|
|
100
|
+
p: zappar_pipeline_t;
|
|
101
|
+
token: number;
|
|
102
|
+
}
|
|
103
|
+
export interface CameraDataRawS2C {
|
|
104
|
+
t: "raw";
|
|
105
|
+
token: number;
|
|
106
|
+
p: zappar_pipeline_t;
|
|
107
|
+
data: CameraFrameData | null;
|
|
108
|
+
}
|