@wemap/camera 5.4.2 → 5.4.4
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/dist/wemap-camera.es.js +453 -0
- package/dist/wemap-camera.es.js.map +1 -0
- package/package.json +2 -2
- package/src/Camera.js +3 -1
- package/src/CameraUtils.js +1 -1
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import { BarcodeFormat, MultiFormatReader, DecodeHintType, BinaryBitmap, HybridBinarizer, RGBLuminanceSource } from '@zxing/library';
|
|
2
|
+
export { BarcodeFormat } from '@zxing/library';
|
|
3
|
+
import EventEmitter from 'events';
|
|
4
|
+
|
|
5
|
+
class SharedCameras extends EventEmitter {
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Singleton pattern.
|
|
9
|
+
* @returns {SharedCameras}
|
|
10
|
+
*/
|
|
11
|
+
static get instance() {
|
|
12
|
+
if (!this._instance) {
|
|
13
|
+
this._instance = new SharedCameras();
|
|
14
|
+
}
|
|
15
|
+
return this._instance;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
_list = [];
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param {Camera} camera
|
|
22
|
+
* @param {Node}
|
|
23
|
+
*/
|
|
24
|
+
_add(camera, container) {
|
|
25
|
+
const obj = {
|
|
26
|
+
camera,
|
|
27
|
+
container
|
|
28
|
+
};
|
|
29
|
+
this._list.push(obj);
|
|
30
|
+
this.emit('added', obj);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @param {Camera} camera
|
|
35
|
+
*/
|
|
36
|
+
_remove(camera) {
|
|
37
|
+
this._list = this._list.filter(({ camera: _camera }) => _camera !== camera);
|
|
38
|
+
this.emit('removed', { camera });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
get list() {
|
|
42
|
+
return this._list;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
getCameraByContainer(container) {
|
|
46
|
+
for (const {
|
|
47
|
+
camera, container: _container
|
|
48
|
+
} of this._list) {
|
|
49
|
+
if (container === _container) {
|
|
50
|
+
return camera;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
var SharedCameras$1 = SharedCameras.instance;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @param {number} angle
|
|
61
|
+
* @param {numer} aspectRatio
|
|
62
|
+
* @returns {number}
|
|
63
|
+
*/
|
|
64
|
+
function convertFov(angle, aspectRatio) {
|
|
65
|
+
return 2 * Math.atan(Math.tan((angle / 180 * Math.PI) / 2) * aspectRatio) * 180 / Math.PI;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @param {HTMLDivElement} videoContainer
|
|
70
|
+
* @param {HTMLVideoElement} videoElement
|
|
71
|
+
* @param {number} hardwareVerticalFov
|
|
72
|
+
* @returns {object}
|
|
73
|
+
*/
|
|
74
|
+
function calcDisplayedFov(videoContainer, videoElement, hardwareVerticalFov) {
|
|
75
|
+
|
|
76
|
+
const sourceWidth = videoElement.videoWidth;
|
|
77
|
+
const sourceHeight = videoElement.videoHeight;
|
|
78
|
+
|
|
79
|
+
const containerWidth = videoContainer.offsetWidth;
|
|
80
|
+
const containerHeight = videoContainer.offsetHeight;
|
|
81
|
+
|
|
82
|
+
const sourceAspect = sourceWidth / sourceHeight;
|
|
83
|
+
const screenAspect = containerWidth / containerHeight;
|
|
84
|
+
|
|
85
|
+
let fovV = hardwareVerticalFov;
|
|
86
|
+
let fovH = convertFov(fovV, sourceAspect);
|
|
87
|
+
|
|
88
|
+
if (screenAspect < sourceAspect) {
|
|
89
|
+
fovH = convertFov(fovV, screenAspect);
|
|
90
|
+
} else {
|
|
91
|
+
fovV = convertFov(fovH, 1 / screenAspect);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
vertical: fovV,
|
|
96
|
+
horizontal: fovH
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
var CameraUtils = /*#__PURE__*/Object.freeze({
|
|
101
|
+
__proto__: null,
|
|
102
|
+
convertFov: convertFov,
|
|
103
|
+
calcDisplayedFov: calcDisplayedFov
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Helped from https://github.com/jeromeetienne/AR.js/blob/master/three.js/src/threex/threex-artoolkitsource.js
|
|
107
|
+
|
|
108
|
+
// Camera preview will fill component bounds without transformations.
|
|
109
|
+
// If the component aspect ratio is different from camera aspect ratio,
|
|
110
|
+
// camera preview is extended then cropped.
|
|
111
|
+
class Camera extends EventEmitter {
|
|
112
|
+
|
|
113
|
+
static DEFAULT_OPTIONS = {
|
|
114
|
+
width: 1024,
|
|
115
|
+
height: 768,
|
|
116
|
+
resizeOnWindowChange: false
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
static GENERIC_HARDWARE_VERTICAL_FOV = 60;
|
|
120
|
+
|
|
121
|
+
videoContainer;
|
|
122
|
+
videoElement;
|
|
123
|
+
|
|
124
|
+
fov = null;
|
|
125
|
+
|
|
126
|
+
_isStarted = false;
|
|
127
|
+
|
|
128
|
+
_hardwareVerticalFov = Camera.GENERIC_HARDWARE_VERTICAL_FOV;
|
|
129
|
+
_resizeOnWindowChange;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* @param {Node} container
|
|
133
|
+
* @param {{width: number, height: number, resizeOnWindowChange: boolean}} options
|
|
134
|
+
*/
|
|
135
|
+
constructor(container, options = {}) {
|
|
136
|
+
super();
|
|
137
|
+
|
|
138
|
+
options = Object.assign({}, Camera.DEFAULT_OPTIONS, options);
|
|
139
|
+
|
|
140
|
+
SharedCameras$1._add(this, container);
|
|
141
|
+
|
|
142
|
+
this.videoContainer = container;
|
|
143
|
+
|
|
144
|
+
this._resizeOnWindowChange = options.resizeOnWindowChange;
|
|
145
|
+
this._userMediaConstraints = {
|
|
146
|
+
audio: false,
|
|
147
|
+
video: {
|
|
148
|
+
facingMode: 'environment',
|
|
149
|
+
width: { ideal: options.width },
|
|
150
|
+
height: { ideal: options.height }
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
this.videoContainer.style.overflow = 'hidden';
|
|
155
|
+
|
|
156
|
+
this.videoElement = document.createElement('video');
|
|
157
|
+
this.videoElement.setAttribute('id', 'wemap-camera');
|
|
158
|
+
this.videoElement.setAttribute('preload', 'none');
|
|
159
|
+
this.videoElement.setAttribute('muted', '');
|
|
160
|
+
this.videoElement.setAttribute('playsinline', '');
|
|
161
|
+
this.videoContainer.appendChild(this.videoElement);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async start() {
|
|
165
|
+
|
|
166
|
+
if (this._isStarted) {
|
|
167
|
+
throw new Error('Camera is already started');
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
this._isStarted = true;
|
|
171
|
+
|
|
172
|
+
await Camera.checkAvailability();
|
|
173
|
+
|
|
174
|
+
const stream = await navigator.mediaDevices.getUserMedia(this._userMediaConstraints);
|
|
175
|
+
|
|
176
|
+
// Listeners have to be set before srcObject assigment or they can be never called
|
|
177
|
+
this.videoElement.oncanplaythrough = () => this.videoElement.play();
|
|
178
|
+
const metadataPr = new Promise(resolve => (this.videoElement.onloadedmetadata = resolve));
|
|
179
|
+
|
|
180
|
+
this.videoElement.srcObject = this.videoStream = stream;
|
|
181
|
+
await metadataPr;
|
|
182
|
+
|
|
183
|
+
this._resizeElement();
|
|
184
|
+
this._computeFov();
|
|
185
|
+
|
|
186
|
+
if (this._resizeOnWindowChange) {
|
|
187
|
+
window.addEventListener('resize', this.notifyContainerSizeChanged);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
this.emit('start', {
|
|
191
|
+
videoElement: this.videoElement,
|
|
192
|
+
stream
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
async stop() {
|
|
197
|
+
|
|
198
|
+
if (!this._isStarted) {
|
|
199
|
+
throw new Error('Camera is not started yet');
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
this.emit('stop');
|
|
203
|
+
|
|
204
|
+
if (this.videoStream && this.videoStream.stop) {
|
|
205
|
+
// compatibility with old JS API
|
|
206
|
+
this.videoStream.stop();
|
|
207
|
+
} else if (this.videoStream) {
|
|
208
|
+
// new JS API
|
|
209
|
+
this.videoStream.getVideoTracks().forEach(track => track.stop());
|
|
210
|
+
}
|
|
211
|
+
this.videoStream = null;
|
|
212
|
+
this.videoElement.srcObject = null;
|
|
213
|
+
|
|
214
|
+
if (this._resizeOnWindowChange) {
|
|
215
|
+
window.removeEventListener('resize', this.notifyContainerSizeChanged);
|
|
216
|
+
}
|
|
217
|
+
this._isStarted = false;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
release() {
|
|
221
|
+
SharedCameras$1._remove(this);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
static async checkAvailability(testUserMedia = false) {
|
|
225
|
+
|
|
226
|
+
if (!navigator.mediaDevices) {
|
|
227
|
+
throw new Error('navigator.mediaDevices not present in your browser');
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (!navigator.mediaDevices.enumerateDevices) {
|
|
231
|
+
throw new Error('navigator.mediaDevices.enumerateDevices not present in your browser');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (!navigator.mediaDevices.getUserMedia) {
|
|
235
|
+
throw new Error('navigator.mediaDevices.getUserMedia not present in your browser');
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
239
|
+
if (!devices.find(device => device.kind === 'videoinput')) {
|
|
240
|
+
throw new Error('No camera found');
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (testUserMedia) {
|
|
244
|
+
const stream = await navigator.mediaDevices.getUserMedia(this._userMediaConstraints);
|
|
245
|
+
if (stream.stop) {
|
|
246
|
+
stream.stop();
|
|
247
|
+
} else {
|
|
248
|
+
stream.getVideoTracks().forEach(track => track.stop());
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
get isStarted() {
|
|
254
|
+
return this._isStarted;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
set hardwareVerticalFov(hardwareVerticalFov) {
|
|
258
|
+
this._hardwareVerticalFov = hardwareVerticalFov;
|
|
259
|
+
this._computeFov();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
notifyContainerSizeChanged = () => {
|
|
263
|
+
this._resizeElement();
|
|
264
|
+
this._computeFov();
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
_resizeElement = () => {
|
|
268
|
+
|
|
269
|
+
if (!this.videoElement) {
|
|
270
|
+
throw new Error('No video element found');
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const sourceWidth = this.videoElement.videoWidth;
|
|
274
|
+
const sourceHeight = this.videoElement.videoHeight;
|
|
275
|
+
|
|
276
|
+
const containerWidth = this.videoContainer.offsetWidth;
|
|
277
|
+
const containerHeight = this.videoContainer.offsetHeight;
|
|
278
|
+
|
|
279
|
+
const sourceAspect = sourceWidth / sourceHeight;
|
|
280
|
+
const screenAspect = containerWidth / containerHeight;
|
|
281
|
+
|
|
282
|
+
if (screenAspect < sourceAspect) {
|
|
283
|
+
|
|
284
|
+
const newWidth = sourceAspect * containerHeight;
|
|
285
|
+
this.videoElement.style.width = newWidth + 'px';
|
|
286
|
+
this.videoElement.style.marginLeft = -(newWidth - containerWidth) / 2 + 'px';
|
|
287
|
+
|
|
288
|
+
this.videoElement.style.height = containerHeight + 'px';
|
|
289
|
+
this.videoElement.style.marginTop = '0px';
|
|
290
|
+
|
|
291
|
+
} else {
|
|
292
|
+
|
|
293
|
+
const newHeight = 1 / (sourceAspect / containerWidth);
|
|
294
|
+
this.videoElement.style.height = newHeight + 'px';
|
|
295
|
+
this.videoElement.style.marginTop = -(newHeight - containerHeight) / 2 + 'px';
|
|
296
|
+
|
|
297
|
+
this.videoElement.style.width = containerWidth + 'px';
|
|
298
|
+
this.videoElement.style.marginLeft = '0px';
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
_computeFov = () => {
|
|
304
|
+
|
|
305
|
+
this.fov = calcDisplayedFov(
|
|
306
|
+
this.videoContainer,
|
|
307
|
+
this.videoElement,
|
|
308
|
+
this._hardwareVerticalFov
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
this.emit('fov.changed', this.fov);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/* eslint-disable max-statements */
|
|
316
|
+
|
|
317
|
+
class QrCodeScanner extends EventEmitter {
|
|
318
|
+
|
|
319
|
+
static DEFAULT_FORMATS = [
|
|
320
|
+
BarcodeFormat.QR_CODE,
|
|
321
|
+
BarcodeFormat.DATA_MATRIX,
|
|
322
|
+
BarcodeFormat.CODABAR
|
|
323
|
+
];
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* @type {Camera}
|
|
327
|
+
*/
|
|
328
|
+
_camera;
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* @type {HTMLVideoElement}
|
|
332
|
+
*/
|
|
333
|
+
_videoElement;
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* @type {HTMLCanvasElement}
|
|
337
|
+
*/
|
|
338
|
+
_canvas;
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* @type {CanvasRenderingContext2D}
|
|
342
|
+
*/
|
|
343
|
+
_ctx;
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* @type {MultiFormatReader}
|
|
347
|
+
*/
|
|
348
|
+
_codeReader;
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* @type {number}
|
|
352
|
+
*/
|
|
353
|
+
_intervalTime;
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* @type {number}
|
|
357
|
+
*/
|
|
358
|
+
_intervalTick;
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* @type {boolean}
|
|
362
|
+
*/
|
|
363
|
+
_isStarted = false;
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* @param {Camera} camera
|
|
368
|
+
*/
|
|
369
|
+
constructor(camera) {
|
|
370
|
+
super();
|
|
371
|
+
|
|
372
|
+
this._camera = camera;
|
|
373
|
+
this._videoElement = camera.videoElement;
|
|
374
|
+
|
|
375
|
+
this._codeReader = new MultiFormatReader();
|
|
376
|
+
|
|
377
|
+
this._canvas = document.createElement('canvas');
|
|
378
|
+
this._ctx = this._canvas.getContext('2d');
|
|
379
|
+
|
|
380
|
+
this._camera.on('start', () => this._tryStart());
|
|
381
|
+
this._camera.on('stop', () => this._stop());
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
start(intervalTime = 500, formats = QrCodeScanner.DEFAULT_FORMATS) {
|
|
385
|
+
this._intervalTime = intervalTime;
|
|
386
|
+
|
|
387
|
+
if (this._isStarted) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
this._isStarted = true;
|
|
391
|
+
|
|
392
|
+
const hints = new Map();
|
|
393
|
+
hints.set(DecodeHintType.POSSIBLE_FORMATS, formats);
|
|
394
|
+
this._codeReader.setHints(hints);
|
|
395
|
+
|
|
396
|
+
this._tryStart();
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
stop() {
|
|
400
|
+
this._isStarted = false;
|
|
401
|
+
this._stop();
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
_tryStart() {
|
|
405
|
+
|
|
406
|
+
if (!this._isStarted || !this._camera.isStarted) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
this._width = this._videoElement.videoWidth;
|
|
411
|
+
this._height = this._videoElement.videoHeight;
|
|
412
|
+
this._canvas.width = this._width;
|
|
413
|
+
this._canvas.height = this._height;
|
|
414
|
+
this._luminances = new Uint8Array(this._width * this._height);
|
|
415
|
+
|
|
416
|
+
this._intervalTick = setInterval(() => this._onFrame(), this._intervalTime);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
_stop() {
|
|
420
|
+
clearInterval(this._intervalTick);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
_onFrame() {
|
|
424
|
+
|
|
425
|
+
if (!this._width || !this._height) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
this._ctx.drawImage(this._videoElement, 0, 0, this._width, this._height);
|
|
430
|
+
const img = this._ctx.getImageData(0, 0, this._width, this._height);
|
|
431
|
+
|
|
432
|
+
for (let i = 0; i < this._luminances.length; i++) {
|
|
433
|
+
// eslint-disable-next-line no-bitwise
|
|
434
|
+
this._luminances[i] = ((img.data[i * 4] + img.data[i * 4 + 1] * 2 + img.data[i * 4 + 2]) / 4) & 0xFF;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
const binaryBitmap = new BinaryBitmap(
|
|
438
|
+
new HybridBinarizer(
|
|
439
|
+
new RGBLuminanceSource(this._luminances, this._width, this._height)
|
|
440
|
+
)
|
|
441
|
+
);
|
|
442
|
+
|
|
443
|
+
try {
|
|
444
|
+
const result = this._codeReader.decodeWithState(binaryBitmap);
|
|
445
|
+
this.emit('scan', result.getText());
|
|
446
|
+
} catch (e) {
|
|
447
|
+
// do nothing
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
export { Camera, CameraUtils, QrCodeScanner, SharedCameras$1 as SharedCameras };
|
|
453
|
+
//# sourceMappingURL=wemap-camera.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wemap-camera.es.js","sources":["../src/SharedCameras.js","../src/CameraUtils.js","../src/Camera.js","../src/QrCodeScanner.js"],"sourcesContent":["import EventEmitter from 'events';\n\nimport Camera from './Camera.js';\n\nclass SharedCameras extends EventEmitter {\n\n /**\n * Singleton pattern.\n * @returns {SharedCameras}\n */\n static get instance() {\n if (!this._instance) {\n this._instance = new SharedCameras();\n }\n return this._instance;\n }\n\n _list = [];\n\n /**\n * @param {Camera} camera\n * @param {Node}\n */\n _add(camera, container) {\n const obj = {\n camera,\n container\n };\n this._list.push(obj);\n this.emit('added', obj);\n }\n\n /**\n * @param {Camera} camera\n */\n _remove(camera) {\n this._list = this._list.filter(({ camera: _camera }) => _camera !== camera);\n this.emit('removed', { camera });\n }\n\n get list() {\n return this._list;\n }\n\n getCameraByContainer(container) {\n for (const {\n camera, container: _container\n } of this._list) {\n if (container === _container) {\n return camera;\n }\n }\n return null;\n }\n}\n\nexport default SharedCameras.instance;\n","/**\n * @param {number} angle\n * @param {numer} aspectRatio\n * @returns {number}\n */\nexport function convertFov(angle, aspectRatio) {\n return 2 * Math.atan(Math.tan((angle / 180 * Math.PI) / 2) * aspectRatio) * 180 / Math.PI;\n}\n\n/**\n * @param {HTMLDivElement} videoContainer\n * @param {HTMLVideoElement} videoElement\n * @param {number} hardwareVerticalFov\n * @returns {object}\n */\nexport function calcDisplayedFov(videoContainer, videoElement, hardwareVerticalFov) {\n\n const sourceWidth = videoElement.videoWidth;\n const sourceHeight = videoElement.videoHeight;\n\n const containerWidth = videoContainer.offsetWidth;\n const containerHeight = videoContainer.offsetHeight;\n\n const sourceAspect = sourceWidth / sourceHeight;\n const screenAspect = containerWidth / containerHeight;\n\n let fovV = hardwareVerticalFov;\n let fovH = convertFov(fovV, sourceAspect);\n\n if (screenAspect < sourceAspect) {\n fovH = convertFov(fovV, screenAspect);\n } else {\n fovV = convertFov(fovH, 1 / screenAspect);\n }\n\n return {\n vertical: fovV,\n horizontal: fovH\n };\n}\n","import EventEmitter from 'events';\n\nimport SharedCameras from './SharedCameras.js';\nimport { calcDisplayedFov } from './CameraUtils.js';\n\n// Helped from https://github.com/jeromeetienne/AR.js/blob/master/three.js/src/threex/threex-artoolkitsource.js\n\n// Camera preview will fill component bounds without transformations.\n// If the component aspect ratio is different from camera aspect ratio,\n// camera preview is extended then cropped.\nclass Camera extends EventEmitter {\n\n static DEFAULT_OPTIONS = {\n width: 1024,\n height: 768,\n resizeOnWindowChange: false\n };\n\n static GENERIC_HARDWARE_VERTICAL_FOV = 60;\n\n videoContainer;\n videoElement;\n\n fov = null;\n\n _isStarted = false;\n\n _hardwareVerticalFov = Camera.GENERIC_HARDWARE_VERTICAL_FOV;\n _resizeOnWindowChange;\n\n /**\n * @param {Node} container\n * @param {{width: number, height: number, resizeOnWindowChange: boolean}} options\n */\n constructor(container, options = {}) {\n super();\n\n options = Object.assign({}, Camera.DEFAULT_OPTIONS, options);\n\n SharedCameras._add(this, container);\n\n this.videoContainer = container;\n\n this._resizeOnWindowChange = options.resizeOnWindowChange;\n this._userMediaConstraints = {\n audio: false,\n video: {\n facingMode: 'environment',\n width: { ideal: options.width },\n height: { ideal: options.height }\n }\n };\n\n this.videoContainer.style.overflow = 'hidden';\n\n this.videoElement = document.createElement('video');\n this.videoElement.setAttribute('id', 'wemap-camera');\n this.videoElement.setAttribute('preload', 'none');\n this.videoElement.setAttribute('muted', '');\n this.videoElement.setAttribute('playsinline', '');\n this.videoContainer.appendChild(this.videoElement);\n }\n\n async start() {\n\n if (this._isStarted) {\n throw new Error('Camera is already started');\n }\n\n this._isStarted = true;\n\n await Camera.checkAvailability();\n\n const stream = await navigator.mediaDevices.getUserMedia(this._userMediaConstraints);\n\n // Listeners have to be set before srcObject assigment or they can be never called\n this.videoElement.oncanplaythrough = () => this.videoElement.play();\n const metadataPr = new Promise(resolve => (this.videoElement.onloadedmetadata = resolve));\n\n this.videoElement.srcObject = this.videoStream = stream;\n await metadataPr;\n\n this._resizeElement();\n this._computeFov();\n\n if (this._resizeOnWindowChange) {\n window.addEventListener('resize', this.notifyContainerSizeChanged);\n }\n\n this.emit('start', {\n videoElement: this.videoElement,\n stream\n });\n }\n\n async stop() {\n\n if (!this._isStarted) {\n throw new Error('Camera is not started yet');\n }\n\n this.emit('stop');\n\n if (this.videoStream && this.videoStream.stop) {\n // compatibility with old JS API\n this.videoStream.stop();\n } else if (this.videoStream) {\n // new JS API\n this.videoStream.getVideoTracks().forEach(track => track.stop());\n }\n this.videoStream = null;\n this.videoElement.srcObject = null;\n\n if (this._resizeOnWindowChange) {\n window.removeEventListener('resize', this.notifyContainerSizeChanged);\n }\n this._isStarted = false;\n }\n\n release() {\n SharedCameras._remove(this);\n }\n\n static async checkAvailability(testUserMedia = false) {\n\n if (!navigator.mediaDevices) {\n throw new Error('navigator.mediaDevices not present in your browser');\n }\n\n if (!navigator.mediaDevices.enumerateDevices) {\n throw new Error('navigator.mediaDevices.enumerateDevices not present in your browser');\n }\n\n if (!navigator.mediaDevices.getUserMedia) {\n throw new Error('navigator.mediaDevices.getUserMedia not present in your browser');\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices();\n if (!devices.find(device => device.kind === 'videoinput')) {\n throw new Error('No camera found');\n }\n\n if (testUserMedia) {\n const stream = await navigator.mediaDevices.getUserMedia(this._userMediaConstraints);\n if (stream.stop) {\n stream.stop();\n } else {\n stream.getVideoTracks().forEach(track => track.stop());\n }\n }\n }\n\n get isStarted() {\n return this._isStarted;\n }\n\n set hardwareVerticalFov(hardwareVerticalFov) {\n this._hardwareVerticalFov = hardwareVerticalFov;\n this._computeFov();\n }\n\n notifyContainerSizeChanged = () => {\n this._resizeElement();\n this._computeFov();\n }\n\n _resizeElement = () => {\n\n if (!this.videoElement) {\n throw new Error('No video element found');\n }\n\n const sourceWidth = this.videoElement.videoWidth;\n const sourceHeight = this.videoElement.videoHeight;\n\n const containerWidth = this.videoContainer.offsetWidth;\n const containerHeight = this.videoContainer.offsetHeight;\n\n const sourceAspect = sourceWidth / sourceHeight;\n const screenAspect = containerWidth / containerHeight;\n\n if (screenAspect < sourceAspect) {\n\n const newWidth = sourceAspect * containerHeight;\n this.videoElement.style.width = newWidth + 'px';\n this.videoElement.style.marginLeft = -(newWidth - containerWidth) / 2 + 'px';\n\n this.videoElement.style.height = containerHeight + 'px';\n this.videoElement.style.marginTop = '0px';\n\n } else {\n\n const newHeight = 1 / (sourceAspect / containerWidth);\n this.videoElement.style.height = newHeight + 'px';\n this.videoElement.style.marginTop = -(newHeight - containerHeight) / 2 + 'px';\n\n this.videoElement.style.width = containerWidth + 'px';\n this.videoElement.style.marginLeft = '0px';\n }\n\n }\n\n _computeFov = () => {\n\n this.fov = calcDisplayedFov(\n this.videoContainer,\n this.videoElement,\n this._hardwareVerticalFov\n );\n\n this.emit('fov.changed', this.fov);\n }\n}\n\nexport default Camera;\n","/* eslint-disable max-statements */\nimport EventEmitter from 'events';\nimport {\n MultiFormatReader,\n BarcodeFormat,\n DecodeHintType,\n RGBLuminanceSource,\n BinaryBitmap,\n HybridBinarizer\n} from '@zxing/library';\n\nimport Camera from './Camera.js';\n\nclass QrCodeScanner extends EventEmitter {\n\n static DEFAULT_FORMATS = [\n BarcodeFormat.QR_CODE,\n BarcodeFormat.DATA_MATRIX,\n BarcodeFormat.CODABAR\n ];\n\n /**\n * @type {Camera}\n */\n _camera;\n\n /**\n * @type {HTMLVideoElement}\n */\n _videoElement;\n\n /**\n * @type {HTMLCanvasElement}\n */\n _canvas;\n\n /**\n * @type {CanvasRenderingContext2D}\n */\n _ctx;\n\n /**\n * @type {MultiFormatReader}\n */\n _codeReader;\n\n /**\n * @type {number}\n */\n _intervalTime;\n\n /**\n * @type {number}\n */\n _intervalTick;\n\n /**\n * @type {boolean}\n */\n _isStarted = false;\n\n\n /**\n * @param {Camera} camera\n */\n constructor(camera) {\n super();\n\n this._camera = camera;\n this._videoElement = camera.videoElement;\n\n this._codeReader = new MultiFormatReader();\n\n this._canvas = document.createElement('canvas');\n this._ctx = this._canvas.getContext('2d');\n\n this._camera.on('start', () => this._tryStart());\n this._camera.on('stop', () => this._stop());\n }\n\n start(intervalTime = 500, formats = QrCodeScanner.DEFAULT_FORMATS) {\n this._intervalTime = intervalTime;\n\n if (this._isStarted) {\n return;\n }\n this._isStarted = true;\n\n const hints = new Map();\n hints.set(DecodeHintType.POSSIBLE_FORMATS, formats);\n this._codeReader.setHints(hints);\n\n this._tryStart();\n }\n\n stop() {\n this._isStarted = false;\n this._stop();\n }\n\n _tryStart() {\n\n if (!this._isStarted || !this._camera.isStarted) {\n return;\n }\n\n this._width = this._videoElement.videoWidth;\n this._height = this._videoElement.videoHeight;\n this._canvas.width = this._width;\n this._canvas.height = this._height;\n this._luminances = new Uint8Array(this._width * this._height);\n\n this._intervalTick = setInterval(() => this._onFrame(), this._intervalTime);\n }\n\n _stop() {\n clearInterval(this._intervalTick);\n }\n\n _onFrame() {\n\n if (!this._width || !this._height) {\n return;\n }\n\n this._ctx.drawImage(this._videoElement, 0, 0, this._width, this._height);\n const img = this._ctx.getImageData(0, 0, this._width, this._height);\n\n for (let i = 0; i < this._luminances.length; i++) {\n // eslint-disable-next-line no-bitwise\n this._luminances[i] = ((img.data[i * 4] + img.data[i * 4 + 1] * 2 + img.data[i * 4 + 2]) / 4) & 0xFF;\n }\n\n const binaryBitmap = new BinaryBitmap(\n new HybridBinarizer(\n new RGBLuminanceSource(this._luminances, this._width, this._height)\n )\n );\n\n try {\n const result = this._codeReader.decodeWithState(binaryBitmap);\n this.emit('scan', result.getText());\n } catch (e) {\n // do nothing\n }\n }\n}\n\nexport default QrCodeScanner;\n"],"names":["SharedCameras"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"directory": "packages/camera"
|
|
12
12
|
},
|
|
13
13
|
"name": "@wemap/camera",
|
|
14
|
-
"version": "5.4.
|
|
14
|
+
"version": "5.4.4",
|
|
15
15
|
"bugs": {
|
|
16
16
|
"url": "https://github.com/wemap/wemap-modules-js/issues"
|
|
17
17
|
},
|
|
@@ -27,5 +27,5 @@
|
|
|
27
27
|
"events": "^3.3.0"
|
|
28
28
|
},
|
|
29
29
|
"type": "module",
|
|
30
|
-
"gitHead": "
|
|
30
|
+
"gitHead": "a1b04a541794b89c4a3af62a99e66976b6100ca9"
|
|
31
31
|
}
|
package/src/Camera.js
CHANGED
|
@@ -141,7 +141,9 @@ class Camera extends EventEmitter {
|
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
if (testUserMedia) {
|
|
144
|
-
const stream = await navigator.mediaDevices.getUserMedia(
|
|
144
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
145
|
+
audio: false, video: { facingMode: 'environment' }
|
|
146
|
+
});
|
|
145
147
|
if (stream.stop) {
|
|
146
148
|
stream.stop();
|
|
147
149
|
} else {
|