@zappar/zappar-cv 3.0.1-alpha.1 → 3.0.1-alpha.10

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.
Files changed (60) hide show
  1. package/README.md +2 -2
  2. package/lib/additional.d.ts +8 -1
  3. package/lib/camera-frame-data.d.ts +5 -0
  4. package/lib/camera-frame-data.js +1 -0
  5. package/lib/data-download.d.ts +8 -0
  6. package/lib/data-download.js +8 -0
  7. package/lib/deserializer.d.ts +1 -0
  8. package/lib/deserializer.js +7 -0
  9. package/lib/direct.js +1 -1
  10. package/lib/drawgrid.d.ts +2 -0
  11. package/lib/drawgrid.js +136 -0
  12. package/lib/drawpoints.d.ts +11 -0
  13. package/lib/drawpoints.js +180 -0
  14. package/lib/gen/zappar-bridge.d.ts +140 -0
  15. package/lib/gen/zappar-bridge.js +8 -0
  16. package/lib/gen/zappar-client.d.ts +3 -2
  17. package/lib/gen/zappar-client.js +208 -18
  18. package/lib/gen/zappar-cwrap.js +171 -3
  19. package/lib/gen/zappar-native.d.ts +28 -1
  20. package/lib/gen/zappar-native.js +6 -0
  21. package/lib/gen/zappar-server.d.ts +3 -0
  22. package/lib/gen/zappar-server.js +108 -10
  23. package/lib/gen/zappar.d.ts +25 -0
  24. package/lib/gen/zappar.js +1 -0
  25. package/lib/html-element-source.d.ts +3 -1
  26. package/lib/html-element-source.js +13 -6
  27. package/lib/image-process-gl.d.ts +3 -2
  28. package/lib/image-process-gl.js +9 -7
  29. package/lib/imagebitmap-camera-source.d.ts +3 -1
  30. package/lib/imagebitmap-camera-source.js +10 -4
  31. package/lib/imagetracker.d.ts +3 -2
  32. package/lib/index.d.ts +2 -1
  33. package/lib/index.js +1 -1
  34. package/lib/mstp-camera-source.d.ts +2 -1
  35. package/lib/mstp-camera-source.js +5 -0
  36. package/lib/native.js +67 -3
  37. package/lib/pipeline.d.ts +14 -4
  38. package/lib/pipeline.js +84 -5
  39. package/lib/profile.d.ts +2 -2
  40. package/lib/profile.js +3 -3
  41. package/lib/serializer.d.ts +1 -0
  42. package/lib/serializer.js +1 -0
  43. package/lib/source.d.ts +1 -0
  44. package/lib/version.d.ts +1 -1
  45. package/lib/version.js +1 -1
  46. package/lib/worker-client.js +5 -1
  47. package/lib/worker-imagebitmap.js +5 -4
  48. package/lib/worker-server.d.ts +1 -1
  49. package/lib/worker-server.js +84 -12
  50. package/lib/worker.js +2 -1
  51. package/lib/workerinterface.d.ts +24 -1
  52. package/lib/zappar-cv.js +203 -165
  53. package/lib/zappar-cv.wasm +0 -0
  54. package/package.json +1 -1
  55. package/umd/751.zappar-cv.js +1 -0
  56. package/umd/867.zappar-cv.js +1 -1
  57. package/umd/{501114eb92cddf5f56fe.wasm → ca409d4e8cebe454b816.wasm} +0 -0
  58. package/umd/zappar-cv.js +1 -1
  59. package/umd/zappar-cv.worker.js +1 -1
  60. package/umd/429.zappar-cv.js +0 -1
@@ -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
- export function launchWorkerServer(wasmUrl, module) {
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 * profile.dataWidth / 320.0;
269
+ let focalLength = 300.0 * dataWidth / 320.0;
235
270
  cameraModel[0] = focalLength;
236
271
  cameraModel[1] = focalLength;
237
- cameraModel[2] = profile.dataWidth * 0.5;
238
- cameraModel[3] = profile.dataHeight * 0.5;
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
  };
@@ -1,5 +1,6 @@
1
1
  /// <reference types="dom-webcodecs" />
2
- import { zappar_camera_source_t, zappar_pipeline_t } from "./gen/zappar-native";
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
+ }