diff --git a/app/ui.js b/app/ui.js index d253ce24..175f9b45 100644 --- a/app/ui.js +++ b/app/ui.js @@ -1609,6 +1609,7 @@ const UI = { break; case 'setvideoquality': UI.forceSetting('video_quality', parseInt(event.data.value), false); + UI.forceSetting('enable_qoi', false, false); // QOI controlled via video quality mode when in iframe UI.updateQuality(); break; case 'enable_game_mode': @@ -2043,7 +2044,7 @@ const UI = { } //force QOI off if mode is below extreme - if (present_mode !== 4 && UI.getSetting('enable_qoi')) { + if (present_mode < 4 && UI.getSetting('enable_qoi')) { UI.showStatus("Lossless QOI disabled when not in extreme quality mode."); UI.forceSetting('enable_qoi', false, false); } diff --git a/core/decoders/qoi/decoder.js b/core/decoders/qoi/decoder.js index eab72f13..45a509b0 100644 --- a/core/decoders/qoi/decoder.js +++ b/core/decoders/qoi/decoder.js @@ -249,7 +249,7 @@ async function load(module, imports) { async function init(input) { if (typeof input === 'undefined') { - input = '/core/decoders/qoi/qoi_viewer_bg.wasm'; + input = path + 'core/decoders/qoi/qoi_viewer_bg.wasm'; } const imports = {}; imports.wbg = {}; @@ -296,47 +296,50 @@ async function init(input) { } var arr; +var path; async function run() { - self.addEventListener('message', function(evt) { - try { - let length = evt.data.length; - let data = new Uint8Array(evt.data.sab.slice(0, length)); - let resultData = decode_qoi(data); - if (!arr) { - arr = new Uint8Array(evt.data.sabR); + self.addEventListener('message', async function(evt) { + if (evt.data.path) { + path = evt.data.path; + await init(); + //Send message that worker is ready + self.postMessage({ + result: 1 + }) + } else { + try { + let length = evt.data.length; + let data = new Uint8Array(evt.data.sab.slice(0, length)); + let resultData = decode_qoi(data); + if (!arr) { + arr = new Uint8Array(evt.data.sabR); + } + let lengthR = resultData.data.length; + arr.set(resultData.data); + let img = { + colorSpace: resultData.colorSpace, + width: resultData.width, + height: resultData.height + }; + self.postMessage({ + result: 0, + img: img, + length: lengthR, + width: evt.data.width, + height: evt.data.height, + x: evt.data.x, + y: evt.data.y, + frame_id: evt.data.frame_id + }); + } catch (err) { + self.postMessage({ + result: 2, + error: err + }); } - let lengthR = resultData.data.length; - arr.set(resultData.data); - let img = { - colorSpace: resultData.colorSpace, - width: resultData.width, - height: resultData.height - }; - self.postMessage({ - result: 0, - img: img, - length: lengthR, - width: evt.data.width, - height: evt.data.height, - x: evt.data.x, - y: evt.data.y, - frame_id: evt.data.frame_id - }); - } catch (err) { - self.postMessage({ - result: 2, - error: err - }); } }, false); - - await init(); - - //Send message that worker is ready - self.postMessage({ - result: 1 - }) } run(); diff --git a/core/decoders/tight.js b/core/decoders/tight.js index dd111ece..fea7bca5 100644 --- a/core/decoders/tight.js +++ b/core/decoders/tight.js @@ -398,6 +398,8 @@ export default class TightDecoder { } _enableQOIWorkers() { + let fullPath = window.location.pathname; + let path = fullPath.substring(0, fullPath.lastIndexOf('/')+1); let sabTest = typeof SharedArrayBuffer; if (sabTest !== 'undefined') { this._enableQOI = true; @@ -416,7 +418,7 @@ export default class TightDecoder { this._qoiRects = []; this._rectQlooping = false; for (let i = 0; i < this._threads; i++) { - this._workers.push(new Worker("/core/decoders/qoi/decoder.js")); + this._workers.push(new Worker("core/decoders/qoi/decoder.js")); this._sabs.push(new SharedArrayBuffer(300000)); this._sabsR.push(new SharedArrayBuffer(400000)); this._arrs.push(new Uint8Array(this._sabs[i])); @@ -450,6 +452,9 @@ export default class TightDecoder { } }; } + for (let i = 0; i < this._threads; i++) { + this._workers[i].postMessage({path:path}); + } } else { this._enableQOI = false; Log.Warn("Enabling QOI Failed, client not compatible.");