You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
quaggaJS/src/quagga.js

146 lines
4.3 KiB
JavaScript

import TypeDefs from './common/typedefs'; // eslint-disable-line no-unused-vars
import WebrtcAdapter from 'webrtc-adapter'; // eslint-disable-line no-unused-vars
import createScanner from './scanner';
import ImageWrapper from './common/image_wrapper';
import ImageDebug from './common/image_debug';
import ResultCollector from './analytics/result_collector';
import Config from './config/config';
import {merge, pick, omitBy, isEmpty, omit} from 'lodash';
9 years ago
// TODO: Keep record of already created scanners for reuse?!
9 years ago
function fromImage(config, imageSrc, inputConfig={}) {
const staticImageConfig = {
inputStream: {
type: "ImageStream",
sequence: false,
size: 800,
src: imageSrc
},
9 years ago
numOfWorkers: (ENV.development && config.debug) ? 0 : 1
};
config = merge(
config,
staticImageConfig,
{numOfWorkers: typeof config.numOfWorkers === 'number' && config.numOfWorkers > 0 ? 1 : 0},
{inputStream: omitBy(pick(config.inputStream, ['size', 'src']), isEmpty)},
9 years ago
{inputStream: inputConfig});
const scanner = createScanner();
return {
addEventListener: (eventType, cb) => {
scanner.decodeSingle(config, cb);
},
removeEventListener(cb) {
9 years ago
scanner.stop();
},
toPromise() {
return new Promise((resolve, reject) => {
scanner.decodeSingle(config, (result) => {
if (result.codeResult && result.codeResult.code) {
return resolve(result);
}
return reject(result);
});
});
}
};
}
9 years ago
function fromVideo(config, source, inputConfig = {}) {
// remember last instance
// check if anything but the imagesrc has changed
//
let sourceConfig = {
9 years ago
type: "LiveStream",
constraints: {
width: 640,
height: 480,
facingMode: "environment"
}
};
9 years ago
/*if (source instanceof MediaStream) {
// stream
9 years ago
} else*/ if (source instanceof Element) {
// video element
} else if (typeof source === 'string') {
// video source
9 years ago
} else if (typeof source === 'object'
&& (typeof source.constraints !== 'undefined'
|| typeof source.area !== 'undefined')) {
console.log("inputConfig");
inputConfig = source;
} else if (!source) {
// LiveStream
}
9 years ago
config = merge({}, config, {inputStream: sourceConfig}, {inputStream: inputConfig});
console.log(config);
const scanner = createScanner();
return {
9 years ago
addEventListener(eventType, cb) {
scanner.init(config, (error) => {
if (error) {
console.log(error);
return;
}
scanner.start();
});
9 years ago
scanner.subscribe(eventType, cb);
},
9 years ago
removeEventListener(eventType, cb) {
scanner.unsubscribe(eventType, cb);
9 years ago
}
9 years ago
};
}
9 years ago
let defaultScanner = createScanner();
function setConfig(configuration = {}, key, config = {}) {
var mergedConfig = merge({}, configuration, {[key]: config});
return createApi(mergedConfig);
}
function createApi(configuration = Config) {
return {
fromImage(src, conf) {
return fromImage(configuration, src, conf);
},
9 years ago
fromVideo(src, inputConfig) {
return fromVideo(configuration, src, inputConfig);
},
decoder(conf) {
return setConfig(configuration, "decoder", conf);
},
locator(conf) {
return setConfig(configuration, "locator", conf);
},
config(conf) {
return createApi(merge({}, configuration, conf));
},
start() {
defaultScanner.start();
},
stop() {
defaultScanner.stop();
},
pause() {
defaultScanner.pause();
},
registerResultCollector(resultCollector) {
defaultScanner.registerResultCollector(resultCollector);
},
getCanvas() {
return defaultScanner.canvas;
},
ImageWrapper,
ImageDebug,
ResultCollector,
_worker: {
createScanner
}
};
}
export default createApi();