@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.
- package/CHANGELOG.md +91 -34
- package/README.md +2 -2
- package/lib/additional.d.ts +2 -1
- package/lib/additional.js +1 -2
- package/lib/camera-source-map.d.ts +10 -0
- package/lib/camera-source-map.js +32 -0
- package/lib/camera-source.d.ts +2 -5
- package/lib/camera-source.js +18 -32
- package/lib/cameramodel.js +18 -23
- package/lib/compatibility.js +2 -4
- package/lib/deserializer.js +1 -5
- package/lib/direct.js +12 -16
- package/lib/drawcamera.js +27 -31
- package/lib/drawface.js +5 -9
- package/lib/drawfaceproject.js +5 -9
- package/lib/drawplane.js +6 -11
- package/lib/event.js +5 -13
- package/lib/facelandmark.d.ts +1 -2
- package/lib/facelandmark.js +11 -18
- package/lib/facelandmarkdata.js +1 -4
- package/lib/facelandmarkinterface.js +1 -2
- package/lib/facemesh.js +10 -17
- package/lib/gen/zappar-client.js +11 -25
- package/lib/gen/zappar-cwrap.js +38 -33
- package/lib/gen/zappar-native.d.ts +11 -1
- package/lib/gen/zappar-native.js +20 -11
- package/lib/gen/zappar-server.js +6 -14
- package/lib/gen/zappar.d.ts +12 -0
- package/lib/gen/zappar.js +5 -11
- package/lib/gfx.d.ts +1 -0
- package/lib/gfx.js +1 -0
- package/lib/gl-state-manager.d.ts +9 -0
- package/lib/gl-state-manager.js +31 -0
- package/lib/html-element-source.d.ts +3 -20
- package/lib/html-element-source.js +39 -287
- package/lib/image-process-gl.d.ts +37 -0
- package/lib/image-process-gl.js +306 -0
- package/lib/imagebitmap-camera-source.d.ts +36 -0
- package/lib/imagebitmap-camera-source.js +273 -0
- package/lib/imagetracker.d.ts +28 -0
- package/lib/imagetracker.js +115 -0
- package/lib/index-standalone.d.ts +3 -0
- package/lib/index-standalone.js +5 -0
- package/lib/index.d.ts +2 -1
- package/lib/index.js +6 -27
- package/lib/landmarkdatagenerate.js +25 -30
- package/lib/loglevel.js +9 -16
- package/lib/messages.js +4 -8
- package/lib/mstp-camera-source.d.ts +29 -0
- package/lib/mstp-camera-source.js +226 -0
- package/lib/native.d.ts +2 -1
- package/lib/native.js +229 -130
- package/lib/options.d.ts +3 -0
- package/lib/options.js +1 -0
- package/lib/permission.js +13 -27
- package/lib/pipeline.d.ts +14 -5
- package/lib/pipeline.js +125 -61
- package/lib/profile.d.ts +2 -0
- package/lib/profile.js +59 -53
- package/lib/riff-reader.d.ts +18 -0
- package/lib/riff-reader.js +52 -0
- package/lib/sequencerecorder.d.ts +1 -0
- package/lib/sequencerecorder.js +17 -11
- package/lib/sequencesource.d.ts +7 -1
- package/lib/sequencesource.js +102 -64
- package/lib/serializer.js +1 -5
- package/lib/shader.js +2 -7
- package/lib/source.d.ts +6 -4
- package/lib/source.js +1 -5
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -4
- package/lib/worker-client.d.ts +1 -1
- package/lib/worker-client.js +9 -26
- package/lib/worker-imagebitmap.d.ts +5 -0
- package/lib/worker-imagebitmap.js +59 -0
- package/lib/worker-server.d.ts +0 -5
- package/lib/worker-server.js +133 -41
- package/lib/worker.js +6 -10
- package/lib/workerinterface.d.ts +47 -1
- package/lib/workerinterface.js +1 -2
- package/lib/zcv.js +117 -135
- package/lib/zcv.wasm +0 -0
- package/package.json +33 -32
- package/umd/169.zappar-cv.js +1 -0
- package/umd/{482727c0e7dd40d73f5aae47f238ad61.zbin → 482727c0e7dd40d73f5a.zbin} +0 -0
- package/umd/6a8309f88f836a752c68.wasm +0 -0
- package/umd/752.zappar-cv.js +1 -0
- package/umd/{b4f46e148a3b3b5aef90717d8d60e3fc.zbin → b4f46e148a3b3b5aef90.zbin} +0 -0
- package/umd/{f7b62a3a53b5c9b3222ba8dc53cb8b11.zbin → f7b62a3a53b5c9b3222b.zbin} +0 -0
- package/umd/zappar-cv.js +1 -9
- package/umd/zappar-cv.worker.js +1 -1
- package/lib/bundleworker-mainthread.d.ts +0 -2
- package/lib/bundleworker-mainthread.js +0 -36
- package/lib/bundleworker-worker.d.ts +0 -6
- package/lib/bundleworker-worker.js +0 -34
- package/lib/zcv-slam.js +0 -16
- package/lib/zcv-slam.wasm +0 -0
- package/umd/1ec038c18c27f4adf35917a8175401f0.wasm +0 -0
- package/umd/9c0b0dcf514b48c05541.bundleworker.js +0 -1
- package/umd/d115e485cffe500afc4f7c1272ea8f62.wasm +0 -0
package/lib/worker-server.js
CHANGED
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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 =
|
|
43
|
-
let server = new
|
|
44
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6
|
-
let msgs =
|
|
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 :
|
|
14
|
-
|
|
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
|
-
|
|
18
|
+
messageManager.postIncomingMessage(evt.data);
|
|
23
19
|
});
|
package/lib/workerinterface.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
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
|
+
}
|
package/lib/workerinterface.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
|
+
export {};
|