From b4e27662ba24fe197a84e6185c6b4f014e508328 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Sat, 29 Jan 2022 23:08:11 +0800 Subject: [PATCH] yuv in another worker --- web/index.html | 3 +- web/yuv.js | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ web/yuv.wasm | Bin 8573 -> 8238 bytes 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 web/yuv.js 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 f93a6eb2a012c870f33dc34b1f776175cbeafbbf..f203c685c932a7c62cccb523540555965bd1a695 100755 GIT binary patch delta 2665 zcmai0OKhCg6~6cWkGV7VAJ4>Zd;B=_6L2U_OP!DiXrs9iI1Nz*lnSXJ)d|6Y%-9LG zClMAx{{)PvsxFHD(6Y!P5<#^fts*5zU9iZa0-<^l1eGF@MI}I@yDm^w#KZm0{XMQb zRfT2GxsUVs?m6E%<8Su=v6hIVOY>3)AuIk7naJdbz@JRSkwUWhBfLUhcv1-{DnF3V zNGXF*%9d)WFb^yHn_pj3CbuH<;r#6Usl{a_%FCzE?4G)FX7Q;frgqOPHJ=o6XlCZb z$tO=N&K_&d96x>XSo6fGldmifCqX!WbZ+j{F_H6+FV4;ionLAmJ=S>S=$ToeBDenO z>{9d8;w*r;t##^t;q86-5kbPPOZV}UN-Qkz#RCNKru1 zT)ir=!u?{LrvTd$)qmzLbn2OD;MT@j_>`wo2ckBBJOH$V@j9~*uqd+4mMF#g3}Xu2 zRXa!?=rdP7^;pR%?q<Gg4cX^Y8=QN2u3a>61+}Jy@wu$*_GF|rWQ0H~J>h0aWrt3SDh<$c1RE_){ zO2^2q{j;vea@wz1DCYh9)J2^>?5|YX`m82_k=4Y8+CTj##<8yk_Ogc4s;?3XElSah z<-+}$tLKAVeU~*U#&S`U2N^}iUeM`Zf~VA4A>9)$sY^QjLwHuM*=#K|MS|QLYh7TYeCy2qHNcf_iDI(3kp!zQSc~IWxFS zCkj6pU3E_ML8z~4(3!3I`l`ln`ds1e=`Rez;QDKpkup}}ZKJUIT zWNcKo&n(y*Z~pboV2Qo_GRlJ8FsU|U`#xe9u@7f!Zsie*D9Jkv-uZ_Xiv?qE7;w(| z3q@bmR1Fx|!h^+4lb$q_r4Wxxri%foY6t}BTjs84tK0M+W=Mu;CPQTk}t z_inwaDX`B{(6G4$APc~LtT0;Zv18_{hHd&**R7MzCWFCccdsFNXv-^5wy<7RT$`}8 zTS4qA{i=uvnxSW&J}y=I9X+{Iz(jX-Q8WK~%Rd`H(@YOz?uI*5)NVTNyO+vWM%D^= z4*8HD3O#?`B^qA@B$}~k_uB`(gXulp=SSfN{aAw$d?ABQ zE9*-5`Lg?Eg$L)lZu#$Aeb}?-ho73;mDsDwV93pEsqLrC7hUHEcGmB6lTPFn{dFI(yA9r5{v!(qD|tI?DfFq@Rr~n++6_`)7XqZdX6C*#b7)^3wR delta 2993 zcmb7GYitx%6ux)n?(FQ&zFLI7%iU?A4aY(L@sx#rmB)+it-^v`MGu-h1BX zJLmNM+_ko5)-%}08DqRkbaS8k-3-6nXWf>sf0!Aw56)?5KC-`PI??BO%mS%- zu(aCx(6)!SY~420zine@n_}!>{&rtjeLcH&^>1gE*fG%C%c8Ntp`PveO+8QbGM>=% z#@@l9{()X*#Pv~Wb~Aod*&hqT@r`HH0eb;s_lX<`#aA(A=44bEL$0lk3}-yU$EnEk zAARapw4d8Ku-MxA^Xa2*LZOY_d_&F2KVhhXoGS}e+~8YOanD6i zMbVjLjw6LK`m#wGQEVL|5sGcdrp%mTSx1`Ls5G*+Od&tW3uTH@V<9!tYxND5P0MKM zGN$v@io1*iZF@w9h3Y@(#dK zvtKdW#k(Z8RP4)^<%pev3)$HO`#JI0EPa=asFM(*QV77&Qpm`V%L{~et$1@}NgZ)W zgM1_t(gc-AIO=V(cR2F6IR6reh&3pV)6LV?UZJ0^SqJsg$bo2thfJ^An?g4)+sz?& zWh}ppv{INx7p#uEV=TWyJH3mzN=uGTDM8Z=~ z7SzRK7mh^+N#_Bug)UqIL-0<#am_cOVpl-*`4VkP12vOom*i5cA4tX>Mf?jG&{s$b zBWL8aXOs&QazElRh&b~rB1nSYk&K|%EbUW}bCzXpG!g7|YIr0#s&rmW}(^%<4Yr@JqRD%FzCzk){>#LP*i%puoQx+$btY6U_w4i_QkRcUO4 z4;{>uqz=}g37$wc35}GmDrd$<$;5uj=!xXqd3245xLZc@Dq4Ww5ws|%Iu~uJTZLd3 zs{dLhw%qh&3u=o$AmI{r6S5hx+&^B!fZ$dX^8ko}41Vcq} z)Ker(2aR0nBWiiwFj|nBC~T80>CFviaq>E9F~Y1?BT=3vVdsygM_lS`sD~Nokzv{; zPjcP+;Q)9w^H!5qlr=EmXl76;F;*oTa#?whJWz4GNvp%4$!SsIGef>`;OMF0R=y}G zzMEzL_sZp~FQdG347S3^0J@YPeXteXW$BxIZ-p5{K0qA<;-%DrI;ekLH&#~|HI$f zU~$!R4PmA^H68Y$u7#m%p>uq;>da)Tv_{~mfSXd3iW|IFJv!Bj2z8+q%az?TJSgccEvcGm5lh}kB zlR}Sz8!&ly-B3*L3u=s@p|LUex~{2_DiBKPI_N!CZlxeoUp?M5ok>%7NjTHVH%+A- zv^kwhT6EB~4MS$K2rV;$LjB@NaYUww{Jyq$0C>16?MyzCYh|+PKILA)3 J9Sn@_e*o_$63qYr