@zappar/zappar-cv 0.4.0-beta.4 → 2.0.0-beta.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.
Files changed (100) hide show
  1. package/CHANGELOG.md +91 -34
  2. package/README.md +2 -2
  3. package/lib/additional.d.ts +2 -1
  4. package/lib/additional.js +1 -2
  5. package/lib/camera-source-map.d.ts +10 -0
  6. package/lib/camera-source-map.js +32 -0
  7. package/lib/camera-source.d.ts +2 -5
  8. package/lib/camera-source.js +18 -32
  9. package/lib/cameramodel.js +18 -23
  10. package/lib/compatibility.js +2 -4
  11. package/lib/deserializer.js +1 -5
  12. package/lib/direct.js +12 -16
  13. package/lib/drawcamera.js +27 -31
  14. package/lib/drawface.js +5 -9
  15. package/lib/drawfaceproject.js +5 -9
  16. package/lib/drawplane.js +6 -11
  17. package/lib/event.js +5 -13
  18. package/lib/facelandmark.d.ts +1 -2
  19. package/lib/facelandmark.js +11 -18
  20. package/lib/facelandmarkdata.js +1 -4
  21. package/lib/facelandmarkinterface.js +1 -2
  22. package/lib/facemesh.js +10 -17
  23. package/lib/gen/zappar-client.js +11 -25
  24. package/lib/gen/zappar-cwrap.js +38 -33
  25. package/lib/gen/zappar-native.d.ts +11 -1
  26. package/lib/gen/zappar-native.js +20 -11
  27. package/lib/gen/zappar-server.js +6 -14
  28. package/lib/gen/zappar.d.ts +12 -0
  29. package/lib/gen/zappar.js +5 -11
  30. package/lib/gfx.d.ts +1 -0
  31. package/lib/gfx.js +1 -0
  32. package/lib/gl-state-manager.d.ts +9 -0
  33. package/lib/gl-state-manager.js +31 -0
  34. package/lib/html-element-source.d.ts +3 -20
  35. package/lib/html-element-source.js +39 -287
  36. package/lib/image-process-gl.d.ts +37 -0
  37. package/lib/image-process-gl.js +306 -0
  38. package/lib/imagebitmap-camera-source.d.ts +36 -0
  39. package/lib/imagebitmap-camera-source.js +273 -0
  40. package/lib/imagetracker.d.ts +28 -0
  41. package/lib/imagetracker.js +115 -0
  42. package/lib/index-standalone.d.ts +3 -0
  43. package/lib/index-standalone.js +5 -0
  44. package/lib/index.d.ts +2 -1
  45. package/lib/index.js +6 -27
  46. package/lib/landmarkdatagenerate.js +25 -30
  47. package/lib/loglevel.js +9 -16
  48. package/lib/messages.js +4 -8
  49. package/lib/mstp-camera-source.d.ts +29 -0
  50. package/lib/mstp-camera-source.js +226 -0
  51. package/lib/native.d.ts +2 -1
  52. package/lib/native.js +229 -130
  53. package/lib/options.d.ts +3 -0
  54. package/lib/options.js +1 -0
  55. package/lib/permission.js +13 -27
  56. package/lib/pipeline.d.ts +14 -5
  57. package/lib/pipeline.js +125 -61
  58. package/lib/profile.d.ts +2 -0
  59. package/lib/profile.js +59 -53
  60. package/lib/riff-reader.d.ts +18 -0
  61. package/lib/riff-reader.js +52 -0
  62. package/lib/sequencerecorder.d.ts +1 -0
  63. package/lib/sequencerecorder.js +17 -11
  64. package/lib/sequencesource.d.ts +7 -1
  65. package/lib/sequencesource.js +102 -64
  66. package/lib/serializer.js +1 -5
  67. package/lib/shader.js +2 -7
  68. package/lib/source.d.ts +6 -4
  69. package/lib/source.js +1 -5
  70. package/lib/version.d.ts +1 -1
  71. package/lib/version.js +1 -4
  72. package/lib/worker-client.d.ts +1 -1
  73. package/lib/worker-client.js +9 -26
  74. package/lib/worker-imagebitmap.d.ts +5 -0
  75. package/lib/worker-imagebitmap.js +59 -0
  76. package/lib/worker-server.d.ts +0 -5
  77. package/lib/worker-server.js +133 -41
  78. package/lib/worker.js +6 -10
  79. package/lib/workerinterface.d.ts +47 -1
  80. package/lib/workerinterface.js +1 -2
  81. package/lib/zcv.js +117 -135
  82. package/lib/zcv.wasm +0 -0
  83. package/package.json +33 -32
  84. package/umd/169.zappar-cv.js +1 -0
  85. package/umd/{482727c0e7dd40d73f5aae47f238ad61.zbin → 482727c0e7dd40d73f5a.zbin} +0 -0
  86. package/umd/6a8309f88f836a752c68.wasm +0 -0
  87. package/umd/752.zappar-cv.js +1 -0
  88. package/umd/{b4f46e148a3b3b5aef90717d8d60e3fc.zbin → b4f46e148a3b3b5aef90.zbin} +0 -0
  89. package/umd/{f7b62a3a53b5c9b3222ba8dc53cb8b11.zbin → f7b62a3a53b5c9b3222b.zbin} +0 -0
  90. package/umd/zappar-cv.js +1 -9
  91. package/umd/zappar-cv.worker.js +1 -1
  92. package/lib/bundleworker-mainthread.d.ts +0 -2
  93. package/lib/bundleworker-mainthread.js +0 -36
  94. package/lib/bundleworker-worker.d.ts +0 -6
  95. package/lib/bundleworker-worker.js +0 -34
  96. package/lib/zcv-slam.js +0 -16
  97. package/lib/zcv-slam.wasm +0 -0
  98. package/umd/1ec038c18c27f4adf35917a8175401f0.wasm +0 -0
  99. package/umd/9c0b0dcf514b48c05541.bundleworker.js +0 -1
  100. package/umd/d115e485cffe500afc4f7c1272ea8f62.wasm +0 -0
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
2
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
3
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -8,28 +7,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
8
  });
10
9
  };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.launchWorkerServer = exports.messageManager = void 0;
13
- const ZNM = require("./zcv");
14
- const zappar_cwrap_1 = require("./gen/zappar-cwrap");
15
- const zappar_server_1 = require("./gen/zappar-server");
16
- const messages_1 = require("./messages");
17
- exports.messageManager = new messages_1.MsgManager();
18
- let bundleWorkerPort;
19
- self.addEventListener("message", msg => {
20
- if (msg && msg.data && msg.data.t === "port") {
21
- bundleWorkerPort = msg.data.port;
22
- }
23
- });
24
- self.bundle_adjust_message = function (buf) {
25
- var buf_copy = new ArrayBuffer(buf.byteLength);
26
- new Uint8Array(buf_copy).set(new Uint8Array(buf));
27
- bundleWorkerPort === null || bundleWorkerPort === void 0 ? void 0 : bundleWorkerPort.postMessage({
28
- t: "bundle_adjust_message",
29
- buf: buf_copy
30
- }, [buf_copy]);
31
- };
32
- function launchWorkerServer(wasmUrl) {
10
+ import * as ZNM from "./zcv";
11
+ import { getRuntimeObject } from "./gen/zappar-cwrap";
12
+ import { zappar_server } from "./gen/zappar-server";
13
+ import { MsgManager } from "./messages";
14
+ import { mat4 } from "gl-matrix";
15
+ import { frame_pixel_format_t } from "./gen/zappar-native";
16
+ import { handleImageBitmap } from "./worker-imagebitmap";
17
+ import { profile } from "./profile";
18
+ export let messageManager = new MsgManager();
19
+ let latestCameraToScreenRotation = 0;
20
+ export function launchWorkerServer(wasmUrl) {
33
21
  return __awaiter(this, void 0, void 0, function* () {
34
22
  let mod = ZNM.default({
35
23
  locateFile: (path, prefix) => {
@@ -39,35 +27,26 @@ function launchWorkerServer(wasmUrl) {
39
27
  return prefix + path;
40
28
  },
41
29
  onRuntimeInitialized: () => {
42
- let r = zappar_cwrap_1.getRuntimeObject(mod);
43
- let server = new zappar_server_1.zappar_server(r, (pipelineId, ab) => {
44
- exports.messageManager.postOutgoingMessage({
30
+ let r = getRuntimeObject(mod);
31
+ let server = new zappar_server(r, (pipelineId, ab) => {
32
+ messageManager.postOutgoingMessage({
45
33
  p: pipelineId,
46
34
  t: "zappar",
47
35
  d: ab
48
36
  }, [ab]);
49
37
  });
50
- exports.messageManager.postOutgoingMessage("loaded", []);
51
- bundleWorkerPort.onmessage = function (msg) {
52
- // Received message from other worker
53
- var a_buf = msg.data.buf;
54
- var buf = mod._malloc(a_buf.byteLength);
55
- mod.HEAPU8.set(new Uint8Array(a_buf), buf);
56
- /// call the exported native function to update the world map
57
- mod._bundle_adjust_message_callback(buf, msg.data.buf.byteLength, 0);
58
- mod._free(buf);
59
- };
60
- exports.messageManager.onIncomingMessage.bind((msg) => {
38
+ messageManager.postOutgoingMessage("loaded", []);
39
+ messageManager.onIncomingMessage.bind((msg) => {
61
40
  var _a;
62
41
  switch (msg.t) {
63
42
  case "zappar":
64
43
  server.processBuffer(msg.d);
65
- exports.messageManager.postOutgoingMessage({ t: "buf", d: msg.d }, [msg.d]);
44
+ messageManager.postOutgoingMessage({ t: "buf", d: msg.d }, [msg.d]);
66
45
  break;
67
46
  case "buf":
68
47
  (_a = server.serializersByPipelineId.get(msg.p)) === null || _a === void 0 ? void 0 : _a.bufferReturn(msg.d);
69
48
  break;
70
- case "cameraFrameC2S":
49
+ case "cameraFrameC2S": {
71
50
  let msgt = msg;
72
51
  let pipeline = server._pipeline_by_instance.get(msgt.p);
73
52
  let att;
@@ -84,13 +63,126 @@ function launchWorkerServer(wasmUrl) {
84
63
  t: "cameraFrameRecycleS2C",
85
64
  att
86
65
  };
87
- exports.messageManager.postOutgoingMessage(ret, [msgt.d]);
66
+ messageManager.postOutgoingMessage(ret, [msgt.d]);
88
67
  break;
68
+ }
69
+ case "streamC2S": {
70
+ let msgt = msg;
71
+ consumeStream(mod, r, msgt.s, msgt.p, msgt.userFacing, server, msgt.source);
72
+ break;
73
+ }
74
+ case "cameraToScreenC2S": {
75
+ let msgt = msg;
76
+ latestCameraToScreenRotation = msgt.r;
77
+ break;
78
+ }
79
+ case "imageBitmapC2S": {
80
+ let msgt = msg;
81
+ handleImageBitmap(msgt, r, server, messageManager);
82
+ break;
83
+ }
89
84
  }
90
85
  });
91
86
  }
92
87
  });
93
88
  });
94
89
  }
95
- exports.launchWorkerServer = launchWorkerServer;
96
90
  ;
91
+ let streamDataBufferPointer = 0;
92
+ let streamDataBufferLength = 0;
93
+ let tokenId = 1;
94
+ const cameraToDeviceTransform = mat4.create();
95
+ const cameraModel = new Float32Array([300, 300, 160, 120, 0, 0]);
96
+ function consumeStream(mod, r, stream, p, userFacing, server, source) {
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ const reader = yield stream.getReader();
99
+ while (true) {
100
+ let result = yield reader.read();
101
+ if (result.done) {
102
+ console.log("Stream done");
103
+ return;
104
+ }
105
+ let frame = result.value;
106
+ let size = frame.allocationSize();
107
+ if (size > streamDataBufferLength) {
108
+ if (streamDataBufferPointer > 0)
109
+ mod._free(streamDataBufferPointer);
110
+ streamDataBufferPointer = mod._malloc(size);
111
+ streamDataBufferLength = size;
112
+ }
113
+ yield frame.copyTo(mod.HEAPU8.subarray(streamDataBufferPointer, streamDataBufferPointer + streamDataBufferLength));
114
+ let token = tokenId;
115
+ tokenId++;
116
+ const width = frame.visibleRect.width;
117
+ const height = frame.visibleRect.height;
118
+ let uvTransform;
119
+ let dataWidth = width;
120
+ let dataHeight = height;
121
+ switch (latestCameraToScreenRotation) {
122
+ case 270:
123
+ uvTransform = new Float32Array([0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1]);
124
+ dataWidth = height;
125
+ dataHeight = width;
126
+ break;
127
+ case 180:
128
+ uvTransform = new Float32Array([-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1]);
129
+ break;
130
+ case 90:
131
+ uvTransform = new Float32Array([0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1]);
132
+ dataWidth = height;
133
+ dataHeight = width;
134
+ break;
135
+ default:
136
+ uvTransform = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
137
+ break;
138
+ }
139
+ let clone = frame.clone();
140
+ if (userFacing)
141
+ mat4.fromScaling(cameraToDeviceTransform, [-1, 1, -1]);
142
+ else
143
+ mat4.identity(cameraToDeviceTransform);
144
+ let focalLength = 300.0 * profile.dataWidth / 320.0;
145
+ cameraModel[0] = focalLength;
146
+ cameraModel[1] = focalLength;
147
+ cameraModel[2] = profile.dataWidth * 0.5;
148
+ cameraModel[3] = profile.dataHeight * 0.5;
149
+ const ret = {
150
+ token: token,
151
+ d: clone,
152
+ p: p,
153
+ t: "videoFrameS2C",
154
+ userFacing,
155
+ uvTransform,
156
+ w: dataWidth,
157
+ h: dataHeight,
158
+ cameraToDevice: cameraToDeviceTransform,
159
+ cameraModel,
160
+ source
161
+ };
162
+ messageManager.postOutgoingMessage(ret, [ret.d, ret.uvTransform.buffer]);
163
+ const pipeline = server._pipeline_by_instance.get(p);
164
+ if (pipeline) {
165
+ r.pipeline_camera_frame_submit_raw_pointer(pipeline, streamDataBufferPointer, size, framePixelFormatFromFormat(frame.format), width, height, token, cameraToDeviceTransform, latestCameraToScreenRotation, cameraModel, userFacing);
166
+ r.pipeline_frame_update(pipeline);
167
+ server.exploreState();
168
+ }
169
+ frame.close();
170
+ }
171
+ });
172
+ }
173
+ function framePixelFormatFromFormat(f) {
174
+ switch (f) {
175
+ case "I420": return frame_pixel_format_t.FRAME_PIXEL_FORMAT_I420;
176
+ case "I420A": return frame_pixel_format_t.FRAME_PIXEL_FORMAT_I420A;
177
+ case "I422": return frame_pixel_format_t.FRAME_PIXEL_FORMAT_I422;
178
+ case "I444": return frame_pixel_format_t.FRAME_PIXEL_FORMAT_I444;
179
+ case "NV12": return frame_pixel_format_t.FRAME_PIXEL_FORMAT_NV12;
180
+ case "RGBA":
181
+ case "RGBX":
182
+ return frame_pixel_format_t.FRAME_PIXEL_FORMAT_RGBA;
183
+ case "BGRA":
184
+ case "BGRX":
185
+ return frame_pixel_format_t.FRAME_PIXEL_FORMAT_BGRA;
186
+ }
187
+ return frame_pixel_format_t.FRAME_PIXEL_FORMAT_Y;
188
+ }
package/lib/worker.js CHANGED
@@ -1,23 +1,19 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const worker_server_1 = require("./worker-server");
1
+ import { launchWorkerServer, messageManager } from "./worker-server";
4
2
  const ctx = self;
5
- worker_server_1.messageManager.onOutgoingMessage.bind(() => {
6
- let msgs = worker_server_1.messageManager.getOutgoingMessages();
3
+ messageManager.onOutgoingMessage.bind(() => {
4
+ let msgs = messageManager.getOutgoingMessages();
7
5
  for (let msg of msgs) {
8
6
  ctx.postMessage(msg.msg, msg.transferables);
9
7
  }
10
8
  });
11
9
  let launchHandler = (evt) => {
12
10
  if (evt && evt.data && evt.data.t === "wasm") {
13
- let url = location.href.startsWith("blob") ? evt.data.url : require("./zcv.wasm");
14
- if (url.default)
15
- url = url.default;
16
- worker_server_1.launchWorkerServer(url);
11
+ let url = location.href.startsWith("blob") ? evt.data.url : new URL("./zcv.wasm", import.meta.url).toString();
12
+ launchWorkerServer(url);
17
13
  ctx.removeEventListener("message", launchHandler);
18
14
  }
19
15
  };
20
16
  ctx.addEventListener("message", launchHandler);
21
17
  ctx.addEventListener("message", evt => {
22
- worker_server_1.messageManager.postIncomingMessage(evt.data);
18
+ messageManager.postIncomingMessage(evt.data);
23
19
  });
@@ -1,4 +1,5 @@
1
- import { zappar_pipeline_t } from "./gen/zappar-native";
1
+ /// <reference types="dom-webcodecs" />
2
+ import { zappar_camera_source_t, zappar_pipeline_t } from "./gen/zappar-native";
2
3
  export interface CameraFrameC2S {
3
4
  t: "cameraFrameC2S";
4
5
  d: ArrayBuffer;
@@ -17,3 +18,48 @@ export interface CameraFrameReturnS2C {
17
18
  p: zappar_pipeline_t;
18
19
  att?: Float32Array;
19
20
  }
21
+ export interface VideoFrameS2C {
22
+ t: "videoFrameS2C";
23
+ token: number;
24
+ d: VideoFrame;
25
+ p: zappar_pipeline_t;
26
+ source: zappar_camera_source_t;
27
+ userFacing: boolean;
28
+ uvTransform: Float32Array;
29
+ w: number;
30
+ h: number;
31
+ cameraModel: Float32Array;
32
+ cameraToDevice: Float32Array;
33
+ }
34
+ export interface StreamC2S {
35
+ t: "streamC2S";
36
+ p: zappar_pipeline_t;
37
+ s: ReadableStream<VideoFrame>;
38
+ userFacing: boolean;
39
+ source: zappar_camera_source_t;
40
+ }
41
+ export interface CameraToScreenRotationC2S {
42
+ t: "cameraToScreenC2S";
43
+ p: zappar_pipeline_t;
44
+ r: number;
45
+ }
46
+ export interface ImageBitmapC2S {
47
+ t: "imageBitmapC2S";
48
+ p: zappar_pipeline_t;
49
+ i: ImageBitmap;
50
+ r: number;
51
+ userFacing: boolean;
52
+ tokenId: number;
53
+ cameraModel: Float32Array;
54
+ cameraToDevice: Float32Array;
55
+ }
56
+ export interface ImageBitmapS2C {
57
+ t: "imageBitmapS2C";
58
+ p: zappar_pipeline_t;
59
+ dataWidth: number;
60
+ dataHeight: number;
61
+ uvTransform: Float32Array;
62
+ userFacing: boolean;
63
+ frame: ImageBitmap;
64
+ tokenId: number;
65
+ }
@@ -1,2 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};