diff --git a/web/index.html b/web/index.html index 7de28baf4..5451ccd3d 100644 --- a/web/index.html +++ b/web/index.html @@ -32,7 +32,8 @@ RustDesk - + + diff --git a/web/yuv.js b/web/yuv.js new file mode 100644 index 000000000..65199f3a8 --- /dev/null +++ b/web/yuv.js @@ -0,0 +1,73 @@ +var wasmExports; + +fetch('yuv.wasm').then(function (res) { return res.arrayBuffer(); }) + .then(function (file) { return WebAssembly.instantiate(file); }) + .then(function (wasm) { + wasmExports = wasm.instance.exports; + console.log('yuv ready'); + }); + +var yPtr, yPtrLen, uPtr, uPtrLen, vPtr, vPtrLen, outPtr, outPtrLen; +let testSpeed = [0, 0]; +function I420ToARGB(yb) { + if (!wasmExports) return; + testSpeed[0] += 1; + var tm0 = new Date().getTime(); + var { malloc, free, memory } = wasmExports; + var HEAPU8 = new Uint8Array(memory.buffer); + let n = yb.y.bytes.length; + if (yPtrLen != n) { + if (yPtr) free(yPtr); + yPtrLen = n; + yPtr = malloc(n); + } + HEAPU8.set(yb.y.bytes, yPtr); + n = yb.u.bytes.length; + if (uPtrLen != n) { + if (uPtr) free(uPtr); + uPtrLen = n; + uPtr = malloc(n); + } + HEAPU8.set(yb.u.bytes, uPtr); + n = yb.v.bytes.length; + if (vPtrLen != n) { + if (vPtr) free(vPtr); + vPtrLen = n; + vPtr = malloc(n); + } + HEAPU8.set(yb.v.bytes, vPtr); + var w = yb.format.displayWidth; + var h = yb.format.displayHeight; + n = w * h * 4; + if (outPtrLen != n) { + if (outPtr) free(outPtr); + outPtrLen = n; + outPtr = malloc(n); + HEAPU8.fill(255, outPtr, outPtr + n); + } + // var res = wasmExports.I420ToARGB(yPtr, yb.y.stride, uPtr, yb.u.stride, vPtr, yb.v.stride, outPtr, w * 4, w, h); + // var res = wasmExports.AVX_YUV_to_ARGB(outPtr, yPtr, yb.y.stride, uPtr, yb.u.stride, vPtr, yb.v.stride, w, h); + var res = wasmExports.yuv420_rgb24_std(w, h, yPtr, uPtr, vPtr, yb.y.stride, yb.v.stride, outPtr, w * 4, 1); + var out = HEAPU8.slice(outPtr, outPtr + n); + testSpeed[1] += new Date().getTime() - tm0; + if (testSpeed[0] > 30) { + console.log(testSpeed[1] / testSpeed[0]); + testSpeed = [0, 0]; + } + return out; +} + +var currentFrame; +self.addEventListener('message', (e) => { + currentFrame = e.data; +}); + +function run() { + if (currentFrame) { + self.postMessage(I420ToARGB(currentFrame)); + currentFrame = undefined; + } + setTimeout(run, 1); +} + +run(); \ No newline at end of file diff --git a/web/yuv.wasm b/web/yuv.wasm index f93a6eb2a..f203c685c 100755 Binary files a/web/yuv.wasm and b/web/yuv.wasm differ