mirror of
https://github.com/DustinBrett/daedalOS.git
synced 2025-12-06 12:20:20 +01:00
113 lines
3.1 KiB
JavaScript
113 lines
3.1 KiB
JavaScript
(function () {
|
|
var videoBuffers = [];
|
|
var decoder;
|
|
var dir = "/decoding";
|
|
|
|
self.Module = {};
|
|
|
|
Module.onRuntimeInitialized = function () {
|
|
self.CodecBoxDecoder = Module.CodecBoxDecoder;
|
|
self.CodecBoxDecoderState = Module.CodecBoxDecoderState;
|
|
postMessage({ type: "load" });
|
|
FS.mkdir(dir);
|
|
};
|
|
|
|
importScripts("/Program Files/codecbox.js/codecbox.js");
|
|
|
|
onmessage = function (ev) {
|
|
var msg = ev.data;
|
|
|
|
switch (msg.type) {
|
|
case "openFile":
|
|
openFile(msg);
|
|
break;
|
|
case "videoBuffer":
|
|
videoBuffers.push(msg.data);
|
|
break;
|
|
case "decode":
|
|
decode();
|
|
break;
|
|
case "pause":
|
|
break;
|
|
default:
|
|
console.warn("unkown message type: " + msg.type);
|
|
}
|
|
};
|
|
|
|
function openFile(msg) {
|
|
var file = msg.data;
|
|
var fileName = file.name || "input.bin";
|
|
|
|
FS.mount(WORKERFS, { blobs: [{ name: fileName, data: file }] }, dir);
|
|
var path = dir + "/" + fileName;
|
|
decoder = new CodecBoxDecoder(new TextEncoder("utf-8").encode(path));
|
|
|
|
var type = "openFile";
|
|
if (decoder.state.value < CodecBoxDecoderState.Metadata.value) {
|
|
onError(type, new Error("failed to open: " + path));
|
|
} else {
|
|
if (msg.sampleRate) decoder.sampleRate = msg.sampleRate;
|
|
else console.warn("openFile: sample rate not set!");
|
|
postMessage({
|
|
type: type,
|
|
fileName: fileName,
|
|
hasVideo: decoder.hasVideo && decoder.videoEnabled,
|
|
hasAudio: decoder.hasAudio && decoder.audioEnabled,
|
|
frameRate: decoder.frameRate,
|
|
duration: decoder.duration,
|
|
width: decoder.width,
|
|
height: decoder.height,
|
|
sampleRate: decoder.sampleRate,
|
|
channels: decoder.channels,
|
|
});
|
|
}
|
|
}
|
|
|
|
function decode() {
|
|
decoder.decode();
|
|
var rs = decoder.state;
|
|
var type = "decode";
|
|
if (rs === CodecBoxDecoderState.Failed) {
|
|
onError(type, new Error("failed to decode"));
|
|
} else if (rs === CodecBoxDecoderState.Ended) {
|
|
postMessage({ type: type, ended: true });
|
|
} else if (rs === CodecBoxDecoderState.Video) {
|
|
var buf = videoBuffers.pop();
|
|
if (!buf) buf = new ArrayBuffer(decoder.width * decoder.height * 4);
|
|
var dest = new Uint8Array(buf);
|
|
var src = new Uint8Array(
|
|
Module.HEAPU8.buffer,
|
|
decoder.buffer,
|
|
dest.length,
|
|
);
|
|
dest.set(src);
|
|
postMessage({ type: type, dataType: "video", data: dest.buffer }, [
|
|
dest.buffer,
|
|
]);
|
|
} else if (rs === CodecBoxDecoderState.Audio) {
|
|
var dest = new Float32Array(decoder.bufferSampleCount * decoder.channels);
|
|
var src = new Float32Array(
|
|
Module.HEAPU8.buffer,
|
|
decoder.buffer,
|
|
dest.length,
|
|
);
|
|
dest.set(src);
|
|
postMessage({ type: type, dataType: "audio", data: dest }, [dest.buffer]);
|
|
} else {
|
|
postMessage({ type: type, dataType: "inert" });
|
|
}
|
|
}
|
|
|
|
function onError(type, e) {
|
|
var msg = {
|
|
type: type,
|
|
error: formatError(e),
|
|
};
|
|
postMessage(msg);
|
|
}
|
|
|
|
function formatError(e) {
|
|
return { message: e.message, stack: e.stack };
|
|
}
|
|
})();
|