120 lines
2.7 KiB
JavaScript
120 lines
2.7 KiB
JavaScript
require('regenerator-runtime/runtime');
|
|
const defaultArgs = require('./constants/defaultArgs');
|
|
|
|
let action = 'unknown';
|
|
let Module = null;
|
|
let adapter = null;
|
|
let ffmpeg = null;
|
|
|
|
const str2ptr = (s) => {
|
|
const ptr = Module._malloc((s.length + 1) * Uint8Array.BYTES_PER_ELEMENT);
|
|
for (let i = 0; i < s.length; i += 1) {
|
|
Module.setValue(ptr + i, s.charCodeAt(i), 'i8');
|
|
}
|
|
Module.setValue(ptr + s.length, 0, 'i8');
|
|
return ptr;
|
|
};
|
|
|
|
const strList2ptr = (strList) => {
|
|
const listPtr = Module._malloc(strList.length * Uint32Array.BYTES_PER_ELEMENT);
|
|
|
|
strList.forEach((s, idx) => {
|
|
const strPtr = str2ptr(s);
|
|
Module.setValue(listPtr + (4 * idx), strPtr, 'i32');
|
|
});
|
|
|
|
return listPtr;
|
|
};
|
|
|
|
const load = ({ workerId, payload: { options: { corePath } } }, res) => {
|
|
if (Module == null) {
|
|
const Core = adapter.getCore(corePath);
|
|
Core()
|
|
.then((_Module) => {
|
|
Module = _Module;
|
|
Module.setLogger((message, type) => {
|
|
res.progress({
|
|
workerId, action, type, message,
|
|
});
|
|
});
|
|
ffmpeg = Module.cwrap('ffmpeg', 'number', ['number', 'number']);
|
|
res.resolve({ message: 'Loaded ffmpeg-core' });
|
|
});
|
|
} else {
|
|
res.resolve({ message: 'Loaded ffmpeg-core' });
|
|
}
|
|
};
|
|
|
|
const write = ({
|
|
payload: {
|
|
path,
|
|
data,
|
|
},
|
|
}, res) => {
|
|
const d = Uint8Array.from({ ...data, length: Object.keys(data).length });
|
|
Module.FS.writeFile(path, d);
|
|
res.resolve({ message: `Write ${path} (${d.length} bytes)` });
|
|
};
|
|
|
|
const transcode = ({
|
|
payload: {
|
|
inputPath,
|
|
outputPath,
|
|
options = '',
|
|
},
|
|
}, res) => {
|
|
const args = [...defaultArgs, ...`${options} -i ${inputPath} ${outputPath}`.trim().split(' ')];
|
|
ffmpeg(args.length, strList2ptr(args));
|
|
res.resolve({ message: `Complete transcoding ${inputPath} to ${outputPath}` });
|
|
};
|
|
|
|
const read = ({
|
|
payload: {
|
|
path,
|
|
},
|
|
}, res) => {
|
|
res.resolve(Module.FS.readFile(path));
|
|
};
|
|
|
|
const run = ({
|
|
payload: {
|
|
args: _args,
|
|
},
|
|
}, res) => {
|
|
const args = [...defaultArgs, ..._args.trim().split(' ')];
|
|
ffmpeg(args.length, strList2ptr(args));
|
|
res.resolve({ message: `Complete ./ffmpeg ${_args}` });
|
|
};
|
|
|
|
exports.dispatchHandlers = (packet, send) => {
|
|
const res = (status, data) => {
|
|
send({
|
|
...packet,
|
|
status,
|
|
data,
|
|
});
|
|
};
|
|
res.resolve = res.bind(this, 'resolve');
|
|
res.reject = res.bind(this, 'reject');
|
|
res.progress = res.bind(this, 'progress');
|
|
|
|
action = packet.action;
|
|
try {
|
|
({
|
|
load,
|
|
write,
|
|
transcode,
|
|
read,
|
|
run,
|
|
})[packet.action](packet, res);
|
|
} catch (err) {
|
|
/** Prepare exception to travel through postMessage */
|
|
res.reject(err.toString());
|
|
}
|
|
action = 'unknown';
|
|
};
|
|
|
|
exports.setAdapter = (_adapter) => {
|
|
adapter = _adapter;
|
|
};
|