yuv in another worker
This commit is contained in:
parent
eebb7e1f4c
commit
b4e27662ba
@ -32,7 +32,8 @@
|
||||
<title>RustDesk</title>
|
||||
<link rel="manifest" href="manifest.json">
|
||||
<script src="ogvjs/ogv.js"></script>
|
||||
<script type="module" crossorigin src="/assets/index.9eb7e514.js"></script>
|
||||
<script src="yuv.js"></script>
|
||||
<script type="module" crossorigin src="/assets/index.b120c626.js"></script>
|
||||
<link rel="modulepreload" href="/assets/vendor.981241b3.js">
|
||||
</head>
|
||||
<body>
|
||||
|
73
web/yuv.js
Normal file
73
web/yuv.js
Normal file
@ -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();
|
BIN
web/yuv.wasm
BIN
web/yuv.wasm
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user