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