@zappar/zappar-cv 0.3.13 → 0.4.0-beta.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.
- package/CHANGELOG.md +6 -0
- package/README.md +2 -2
- package/lib/additional.d.ts +2 -1
- package/lib/camera-source-map.d.ts +10 -0
- package/lib/camera-source-map.js +40 -0
- package/lib/camera-source.d.ts +3 -5
- package/lib/camera-source.js +8 -15
- package/lib/deserializer.d.ts +1 -0
- package/lib/deserializer.js +7 -0
- package/lib/drawcamera.js +2 -1
- package/lib/gen/zappar-client.d.ts +1 -0
- package/lib/gen/zappar-client.js +78 -41
- package/lib/gen/zappar-cwrap.js +71 -20
- package/lib/gen/zappar-native.d.ts +20 -3
- package/lib/gen/zappar-native.js +13 -1
- package/lib/gen/zappar-server.d.ts +3 -0
- package/lib/gen/zappar-server.js +70 -34
- package/lib/gen/zappar.d.ts +29 -1
- package/lib/gen/zappar.js +5 -3
- package/lib/gfx.d.ts +1 -0
- package/lib/gfx.js +4 -0
- package/lib/gl-state-manager.d.ts +9 -0
- package/lib/gl-state-manager.js +35 -0
- package/lib/html-element-source.d.ts +7 -22
- package/lib/html-element-source.js +30 -289
- package/lib/image-process-gl.d.ts +37 -0
- package/lib/image-process-gl.js +298 -0
- package/lib/imagebitmap-camera-source.d.ts +36 -0
- package/lib/imagebitmap-camera-source.js +277 -0
- package/lib/imagetracker.d.ts +28 -0
- package/lib/imagetracker.js +119 -0
- package/lib/index.d.ts +1 -1
- package/lib/mstp-camera-source.d.ts +29 -0
- package/lib/mstp-camera-source.js +230 -0
- package/lib/native.js +129 -6
- package/lib/pipeline.d.ts +22 -2
- package/lib/pipeline.js +140 -19
- package/lib/profile.d.ts +2 -0
- package/lib/profile.js +21 -6
- package/lib/riff-reader.d.ts +18 -0
- package/lib/riff-reader.js +56 -0
- package/lib/sequencerecorder.d.ts +83 -0
- package/lib/sequencerecorder.js +283 -0
- package/lib/sequencesource.d.ts +23 -0
- package/lib/sequencesource.js +170 -0
- package/lib/serializer.d.ts +1 -0
- package/lib/serializer.js +1 -0
- package/lib/source.d.ts +10 -3
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/worker-imagebitmap.d.ts +5 -0
- package/lib/worker-imagebitmap.js +63 -0
- package/lib/worker-server.js +124 -8
- package/lib/workerinterface.d.ts +50 -1
- package/lib/zcv.js +121 -197
- package/lib/zcv.wasm +0 -0
- package/package.json +34 -31
- package/umd/e9486c1cdadb21608a4f7e2fa3be9517.wasm +0 -0
- package/umd/zappar-cv.js +1 -9
- package/umd/zappar-cv.worker.js +1 -1
- package/umd/0bdbfe863a384bcd2935e7437d8f1153.wasm +0 -0
package/lib/worker-server.js
CHANGED
|
@@ -15,7 +15,11 @@ const zappar_cwrap_1 = require("./gen/zappar-cwrap");
|
|
|
15
15
|
const zappar_server_1 = require("./gen/zappar-server");
|
|
16
16
|
const messages_1 = require("./messages");
|
|
17
17
|
const gl_matrix_1 = require("gl-matrix");
|
|
18
|
+
const zappar_native_1 = require("./gen/zappar-native");
|
|
19
|
+
const worker_imagebitmap_1 = require("./worker-imagebitmap");
|
|
20
|
+
const profile_1 = require("./profile");
|
|
18
21
|
exports.messageManager = new messages_1.MsgManager();
|
|
22
|
+
let latestCameraToScreenRotation = 0;
|
|
19
23
|
function launchWorkerServer(wasmUrl) {
|
|
20
24
|
return __awaiter(this, void 0, void 0, function* () {
|
|
21
25
|
let mod = ZNM.default({
|
|
@@ -45,27 +49,41 @@ function launchWorkerServer(wasmUrl) {
|
|
|
45
49
|
case "buf":
|
|
46
50
|
(_a = server.serializersByPipelineId.get(msg.p)) === null || _a === void 0 ? void 0 : _a.bufferReturn(msg.d);
|
|
47
51
|
break;
|
|
48
|
-
case "cameraFrameC2S":
|
|
52
|
+
case "cameraFrameC2S": {
|
|
49
53
|
let msgt = msg;
|
|
50
|
-
// PROCESS DATA
|
|
51
|
-
let cameraToDeviceTransform = gl_matrix_1.mat4.create();
|
|
52
|
-
if (msgt.userFacing) {
|
|
53
|
-
gl_matrix_1.mat4.fromScaling(cameraToDeviceTransform, [-1, 1, -1]);
|
|
54
|
-
}
|
|
55
54
|
let pipeline = server._pipeline_by_instance.get(msgt.p);
|
|
55
|
+
let att;
|
|
56
56
|
if (pipeline) {
|
|
57
|
-
r.pipeline_camera_frame_submit(pipeline, msgt.d, msgt.width, msgt.height, msgt.token,
|
|
57
|
+
r.pipeline_camera_frame_submit(pipeline, msgt.d, msgt.width, msgt.height, msgt.token, msgt.c2d, msgt.cm, msgt.userFacing);
|
|
58
58
|
r.pipeline_frame_update(pipeline);
|
|
59
|
+
att = r.pipeline_camera_frame_device_attitude(pipeline);
|
|
59
60
|
server.exploreState();
|
|
60
61
|
}
|
|
61
62
|
let ret = {
|
|
62
63
|
token: msgt.token,
|
|
63
64
|
d: msgt.d,
|
|
64
65
|
p: msgt.p,
|
|
65
|
-
t: "cameraFrameRecycleS2C"
|
|
66
|
+
t: "cameraFrameRecycleS2C",
|
|
67
|
+
att
|
|
66
68
|
};
|
|
67
69
|
exports.messageManager.postOutgoingMessage(ret, [msgt.d]);
|
|
68
70
|
break;
|
|
71
|
+
}
|
|
72
|
+
case "streamC2S": {
|
|
73
|
+
let msgt = msg;
|
|
74
|
+
consumeStream(mod, r, msgt.s, msgt.p, msgt.userFacing, server, msgt.source);
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
case "cameraToScreenC2S": {
|
|
78
|
+
let msgt = msg;
|
|
79
|
+
latestCameraToScreenRotation = msgt.r;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
case "imageBitmapC2S": {
|
|
83
|
+
let msgt = msg;
|
|
84
|
+
worker_imagebitmap_1.handleImageBitmap(msgt, r, server, exports.messageManager);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
69
87
|
}
|
|
70
88
|
});
|
|
71
89
|
}
|
|
@@ -74,3 +92,101 @@ function launchWorkerServer(wasmUrl) {
|
|
|
74
92
|
}
|
|
75
93
|
exports.launchWorkerServer = launchWorkerServer;
|
|
76
94
|
;
|
|
95
|
+
let streamDataBufferPointer = 0;
|
|
96
|
+
let streamDataBufferLength = 0;
|
|
97
|
+
let tokenId = 1;
|
|
98
|
+
const cameraToDeviceTransform = gl_matrix_1.mat4.create();
|
|
99
|
+
const cameraModel = new Float32Array([300, 300, 160, 120, 0, 0]);
|
|
100
|
+
function consumeStream(mod, r, stream, p, userFacing, server, source) {
|
|
101
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
const reader = yield stream.getReader();
|
|
103
|
+
while (true) {
|
|
104
|
+
let result = yield reader.read();
|
|
105
|
+
if (result.done) {
|
|
106
|
+
console.log("Stream done");
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
let frame = result.value;
|
|
110
|
+
let size = frame.allocationSize();
|
|
111
|
+
if (size > streamDataBufferLength) {
|
|
112
|
+
if (streamDataBufferPointer > 0)
|
|
113
|
+
mod._free(streamDataBufferPointer);
|
|
114
|
+
streamDataBufferPointer = mod._malloc(size);
|
|
115
|
+
streamDataBufferLength = size;
|
|
116
|
+
}
|
|
117
|
+
yield frame.copyTo(mod.HEAPU8.subarray(streamDataBufferPointer, streamDataBufferPointer + streamDataBufferLength));
|
|
118
|
+
let token = tokenId;
|
|
119
|
+
tokenId++;
|
|
120
|
+
const width = frame.visibleRect.width;
|
|
121
|
+
const height = frame.visibleRect.height;
|
|
122
|
+
let uvTransform;
|
|
123
|
+
let dataWidth = width;
|
|
124
|
+
let dataHeight = height;
|
|
125
|
+
switch (latestCameraToScreenRotation) {
|
|
126
|
+
case 270:
|
|
127
|
+
uvTransform = new Float32Array([0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1]);
|
|
128
|
+
dataWidth = height;
|
|
129
|
+
dataHeight = width;
|
|
130
|
+
break;
|
|
131
|
+
case 180:
|
|
132
|
+
uvTransform = new Float32Array([-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1]);
|
|
133
|
+
break;
|
|
134
|
+
case 90:
|
|
135
|
+
uvTransform = new Float32Array([0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1]);
|
|
136
|
+
dataWidth = height;
|
|
137
|
+
dataHeight = width;
|
|
138
|
+
break;
|
|
139
|
+
default:
|
|
140
|
+
uvTransform = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
let clone = frame.clone();
|
|
144
|
+
if (userFacing)
|
|
145
|
+
gl_matrix_1.mat4.fromScaling(cameraToDeviceTransform, [-1, 1, -1]);
|
|
146
|
+
else
|
|
147
|
+
gl_matrix_1.mat4.identity(cameraToDeviceTransform);
|
|
148
|
+
let focalLength = 300.0 * profile_1.profile.dataWidth / 320.0;
|
|
149
|
+
cameraModel[0] = focalLength;
|
|
150
|
+
cameraModel[1] = focalLength;
|
|
151
|
+
cameraModel[2] = profile_1.profile.dataWidth * 0.5;
|
|
152
|
+
cameraModel[3] = profile_1.profile.dataHeight * 0.5;
|
|
153
|
+
const ret = {
|
|
154
|
+
token: token,
|
|
155
|
+
d: clone,
|
|
156
|
+
p: p,
|
|
157
|
+
t: "videoFrameS2C",
|
|
158
|
+
userFacing,
|
|
159
|
+
uvTransform,
|
|
160
|
+
w: dataWidth,
|
|
161
|
+
h: dataHeight,
|
|
162
|
+
cameraToDevice: cameraToDeviceTransform,
|
|
163
|
+
cameraModel,
|
|
164
|
+
source
|
|
165
|
+
};
|
|
166
|
+
exports.messageManager.postOutgoingMessage(ret, [ret.d, ret.uvTransform.buffer]);
|
|
167
|
+
const pipeline = server._pipeline_by_instance.get(p);
|
|
168
|
+
if (pipeline) {
|
|
169
|
+
r.pipeline_camera_frame_submit_raw_pointer(pipeline, streamDataBufferPointer, size, framePixelFormatFromFormat(frame.format), width, height, token, cameraToDeviceTransform, latestCameraToScreenRotation, cameraModel, userFacing);
|
|
170
|
+
r.pipeline_frame_update(pipeline);
|
|
171
|
+
server.exploreState();
|
|
172
|
+
}
|
|
173
|
+
frame.close();
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
function framePixelFormatFromFormat(f) {
|
|
178
|
+
switch (f) {
|
|
179
|
+
case "I420": return zappar_native_1.frame_pixel_format_t.FRAME_PIXEL_FORMAT_I420;
|
|
180
|
+
case "I420A": return zappar_native_1.frame_pixel_format_t.FRAME_PIXEL_FORMAT_I420A;
|
|
181
|
+
case "I422": return zappar_native_1.frame_pixel_format_t.FRAME_PIXEL_FORMAT_I422;
|
|
182
|
+
case "I444": return zappar_native_1.frame_pixel_format_t.FRAME_PIXEL_FORMAT_I444;
|
|
183
|
+
case "NV12": return zappar_native_1.frame_pixel_format_t.FRAME_PIXEL_FORMAT_NV12;
|
|
184
|
+
case "RGBA":
|
|
185
|
+
case "RGBX":
|
|
186
|
+
return zappar_native_1.frame_pixel_format_t.FRAME_PIXEL_FORMAT_RGBA;
|
|
187
|
+
case "BGRA":
|
|
188
|
+
case "BGRX":
|
|
189
|
+
return zappar_native_1.frame_pixel_format_t.FRAME_PIXEL_FORMAT_BGRA;
|
|
190
|
+
}
|
|
191
|
+
return zappar_native_1.frame_pixel_format_t.FRAME_PIXEL_FORMAT_Y;
|
|
192
|
+
}
|
package/lib/workerinterface.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
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;
|
|
5
6
|
p: zappar_pipeline_t;
|
|
6
7
|
userFacing: boolean;
|
|
8
|
+
c2d: Float32Array;
|
|
9
|
+
cm: Float32Array;
|
|
7
10
|
token: number;
|
|
8
11
|
width: number;
|
|
9
12
|
height: number;
|
|
@@ -13,4 +16,50 @@ export interface CameraFrameReturnS2C {
|
|
|
13
16
|
token: number;
|
|
14
17
|
d: ArrayBuffer;
|
|
15
18
|
p: zappar_pipeline_t;
|
|
19
|
+
att?: Float32Array;
|
|
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;
|
|
16
65
|
}
|