73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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;
 | |
|   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;
 | |
|   testSpeed[0] += 1;
 | |
|   if (testSpeed[0] > 30) {
 | |
|     console.log('yuv: ' + parseInt('' + 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(); |