From 604dcd6748084f9aa4f075f1f7dca45531cf3f94 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Fri, 28 Jan 2022 04:30:38 +0800 Subject: [PATCH] improve yuv --- src/connection.ts | 2 +- src/globals.js | 8 ++++---- yuv-to-rgb.c | 22 +++++++++------------- yuv.wasm | Bin 8238 -> 8573 bytes 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/connection.ts b/src/connection.ts index feb27255c..0703668af 100644 --- a/src/connection.ts +++ b/src/connection.ts @@ -239,7 +239,7 @@ export default class Connection { draw(frame: any) { this._draw?.(frame); - // globals.I420ToABGR(frame); + // globals.I420ToARGB(frame); } close() { diff --git a/src/globals.js b/src/globals.js index 86e6100b8..ca7281dae 100644 --- a/src/globals.js +++ b/src/globals.js @@ -41,7 +41,7 @@ export function pushEvent(name, payload) { } export function draw(frame) { - currentFrame = I420ToABGR(frame); + currentFrame = I420ToARGB(frame); } export function setConn(conn) { @@ -282,7 +282,7 @@ window.init = async () => { let yPtr, yPtrLen, uPtr, uPtrLen, vPtr, vPtrLen, outPtr, outPtrLen; // let testSpeed = [0, 0]; -export function I420ToABGR(yb) { +export function I420ToARGB(yb) { if (!wasmExports) return; // testSpeed[0] += 1; const tm0 = new Date().getTime(); @@ -318,8 +318,8 @@ export function I420ToABGR(yb) { outPtr = malloc(n); } // const res = wasmExports.I420ToARGB(yPtr, yb.y.stride, uPtr, yb.u.stride, vPtr, yb.v.stride, outPtr, w * 4, w, h); - // const res = wasmExports.AVX_YUV_to_RGB(outPtr, yPtr, uPtr, vPtr, w, h); - const res = wasmExports.yuv420_rgb24_std(w, h, yPtr, uPtr, vPtr, yb.y.stride, yb.v.stride, outPtr, w * 4, 0); + const res = wasmExports.AVX_YUV_to_RGBA(outPtr, yPtr, uPtr, vPtr, w, h); + // const res = wasmExports.yuv420_rgb24_std(w, h, yPtr, uPtr, vPtr, yb.y.stride, yb.v.stride, outPtr, w * 4, 0); const out = HEAPU8.slice(outPtr, outPtr + n); /* testSpeed[1] += new Date().getTime() - tm0; diff --git a/yuv-to-rgb.c b/yuv-to-rgb.c index 5fb37a030..14eb60c78 100644 --- a/yuv-to-rgb.c +++ b/yuv-to-rgb.c @@ -24,7 +24,6 @@ #include #define ZOF_TAB 65536 -#define ZOF_RGB 3 static int T1[ZOF_TAB], T2[ZOF_TAB], T3[ZOF_TAB], T4[ZOF_TAB]; static int initialized; @@ -46,19 +45,16 @@ static int foo; static int frame; void -AVX_YUV_to_RGB(unsigned char *dst, unsigned short *src, int width, int height) { +AVX_YUV_to_RGBA(unsigned char *dst, unsigned char *y, unsigned char* u, unsigned char* v, int width, int height) { int r, g, b; - unsigned short *y, *u, *v, *uline, *vline; + unsigned char *uline, *vline; int w, h; if (initialized == 0) { initialized = !0; build_tables(); } - // Setup pointers to the Y, U, V planes - y = src; - u = src + (width * height); - v = u + (width * height) / 4; // Each chroma does 4 pixels in 4:2:0 + int half_width = width / 2; // Loop the image, taking into account sub-sample for the chroma channels for (h = 0; h < height; h++) { uline = u; @@ -67,18 +63,18 @@ AVX_YUV_to_RGB(unsigned char *dst, unsigned short *src, int width, int height) { r = *y + T1[*vline]; g = *y + T2[*vline] + T3[*uline]; b = *y + T4[*uline]; - dst[0] = clamp(r); // 16-bit to 8-bit, chuck precision - dst[1] = clamp(g); - dst[2] = clamp(b); - dst += ZOF_RGB; + *dst++ = clamp(r); // 16-bit to 8-bit, chuck precision + *dst++ = clamp(g); + *dst++ = clamp(b); + *dst++ = 255; if (w & 0x01) { uline++; vline++; } } if (h & 0x01) { - u += width / 2; - v += width / 2; + u += half_width; + v += half_width; } } } diff --git a/yuv.wasm b/yuv.wasm index 37925d29b447a61ea8996750576711cbdc06437e..f93a6eb2a012c870f33dc34b1f776175cbeafbbf 100755 GIT binary patch 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 delta 2665 zcmai0O>A7%6~6brpSd&ljc4M2d;D|e5pV#frA|l$lxS`Q4k3zY0U?!2I3YNY89TxD zB&t=RHvuCm)J4$?KZ`6PHK-N@6e&Ss!6J)_s;U=3P$?2wAORBHu|QQ(Dds!(d0bjHDc1|rcpAd3jYU7MAzo{tC|K%#ttr5|UOn;$FXo3)!f4Q{IL% zP<&q3t9>|2mayo@;yK6x$Y&u3Ax}eAAX|__UX8lp!lTH_Q^XGH)lL%R*Q;HmD4=Mj zUKLp3em>4qfNhC#q}_#dt31x~)VE!TYMJ_3Y@vbe3FI&h@^*wOEJkUF1zAz;LEO%9 zY&r;U#3_{dowQ&{!<*Bp@Q5!%W0NTNLomnVY6xn7&lwy5~F?sH) z9V8F*nX7=htmG7Tvgo9eRh(DBLU1KHqmqTB9vsF!)V;qbj6of+i>P;h>UnV#2>Y5g z`=m(p@4oe$7HL@86@&>-5+DQl+iWY7!V(O{}T?+kbo%`)Xh>YB;U>DxuJ#6wO%9 z-J7|3CfLz)QIldU=QVkdQDp2no&F2J9}^5s?i z5Ca*@Z)Kea@{R51IZ~_+!h06f!y^>s8nLwH2XKlYl7k_rm$nK$sbAo!PsjCoU{I1 z(N{H90|vJ6U~%1~$IW;t#N(35VnC`I0zvwwxjowGHvQ5J$S^HLgx|MDW9l1|J`&x8 z%`*{Syc&&-UE?tDYyEkEG^FgetE;QI14T)yoCUC=9H#$@Mt8563@e2wHb3bqTaw^} zT{VtmhLNsg4Kl0;iZ>+}9C*wt0uc{Zm2>tvP5~3$)p^bQ>n=asho+ev#M}+Hsi@s_+;`8HFAc2}@E!nw zC1;SID~l2h!#(rpme+^5;}m-StV=XL1SFcVX!qL(-TmpEoo9#P2K`ur5qu$oPAlt5 z`1!i?1%(IaI&S!Wu0HJA^^4EU%}VT6WiaG=w$%1B=8LZL12@<23zJTEKlPKSE;~eM z)-^HE0<{mOa_9-4sabESM&sr1UgmCb`O^B^c} z7wYxF9XD(mjOYkAmU*a@>stj0^OtmWaBsI`;eK=~xWL~C51dMWQ=v5?De^WE>6J=G zB&5U<3E#Ny6R9!O