| 
									
										
										
										
											2022-01-29 23:08:11 +08:00
										 |  |  | 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; | 
					
						
							| 
									
										
										
										
											2022-02-05 04:29:10 +08:00
										 |  |  |   testSpeed[0] += 1; | 
					
						
							| 
									
										
										
										
											2022-01-29 23:08:11 +08:00
										 |  |  |   if (testSpeed[0] > 30) { | 
					
						
							| 
									
										
										
										
											2022-02-05 04:29:10 +08:00
										 |  |  |     console.log('yuv: ' + parseInt('' + testSpeed[1] / testSpeed[0])); | 
					
						
							| 
									
										
										
										
											2022-01-29 23:08:11 +08:00
										 |  |  |     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(); |