From 14807e2633b60cb1c6b1fbd6f48ad89d58c8fddc Mon Sep 17 00:00:00 2001 From: Harvey Zhao Date: Wed, 11 Feb 2026 23:00:36 +0800 Subject: [PATCH] feat: update artplayerPluginWebsr to support async upscale initialization - Changed the return function to be async for handling asynchronous operations. - Updated the call to startRealtimeUpscale to await its completion, allowing for proper handling of the upscale process with the specified network size option. --- docs/uncompiled/artplayer-plugin-websr/index.js | 4 ++-- docs/uncompiled/artplayer-plugin-websr/index.js.map | 2 +- packages/artplayer-plugin-websr/src/index.js | 8 ++++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/uncompiled/artplayer-plugin-websr/index.js b/docs/uncompiled/artplayer-plugin-websr/index.js index ea6b4c19b..dca04266f 100644 --- a/docs/uncompiled/artplayer-plugin-websr/index.js +++ b/docs/uncompiled/artplayer-plugin-websr/index.js @@ -217,7 +217,7 @@ function artplayerPluginWebsr(option = { networkSize: "medium", compare: false }) { - return (art)=>{ + return async (art)=>{ const { $video, $player } = art.template; const $canvas = document.createElement("canvas"); $player.appendChild($canvas); @@ -229,7 +229,7 @@ function artplayerPluginWebsr(option = { $canvas.style.transform = "translate(-50%, -50%)"; const upscaler = new (0, _upscalerDefault.default)(option); upscaler.init(); - upscaler.startRealtimeUpscale($video, $canvas); + await upscaler.startRealtimeUpscale($video, $canvas, option.networkSize); // 对比模式 let comparePosition = 50; let isDragging = false; diff --git a/docs/uncompiled/artplayer-plugin-websr/index.js.map b/docs/uncompiled/artplayer-plugin-websr/index.js.map index 49483a3ff..ffffde410 100644 --- a/docs/uncompiled/artplayer-plugin-websr/index.js.map +++ b/docs/uncompiled/artplayer-plugin-websr/index.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["packages/artplayer-plugin-websr/src/index.js","packages/artplayer-plugin-websr/src/Upscaler.js","node_modules/@parcel/transformer-js/src/esmodule-helpers.js"],"sourcesContent":["import Upscaler from \"./Upscaler\";\n\nexport default function artplayerPluginWebsr(\n option = {\n networkSize: \"medium\",\n compare: false,\n },\n) {\n return (art) => {\n const { $video, $player } = art.template;\n\n const $canvas = document.createElement(\"canvas\");\n $player.appendChild($canvas);\n\n $canvas.style.position = \"absolute\";\n $canvas.style.zIndex = \"11\";\n $canvas.style.pointerEvents = \"none\";\n $canvas.style.top = \"50%\";\n $canvas.style.left = \"50%\";\n $canvas.style.transform = \"translate(-50%, -50%)\";\n\n const upscaler = new Upscaler(option);\n upscaler.init();\n upscaler.startRealtimeUpscale($video, $canvas);\n\n // 对比模式\n let comparePosition = 50;\n let isDragging = false;\n\n // 创建对比手柄\n const $handler = document.createElement(\"div\");\n $handler.style.position = \"absolute\";\n $handler.style.width = \"3px\";\n $handler.style.backgroundColor = \"rgba(255, 255, 255, 0.5)\";\n $handler.style.cursor = \"ew-resize\";\n $handler.style.zIndex = \"12\";\n $handler.style.pointerEvents = \"auto\";\n $handler.style.display = option.compare ? \"block\" : \"none\";\n $handler.style.boxShadow = \"0 0 4px rgba(0, 0, 0, 0.1)\";\n\n if (option.compare) {\n $player.appendChild($handler);\n $handler.addEventListener(\"mousedown\", handleMouseDown);\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n updateCompareMask();\n }\n\n function calcCanvasSize() {\n const videoElement = art.video;\n const containerWidth = $player.offsetWidth || 640;\n const containerHeight = $player.offsetHeight || 360;\n const videoWidth = videoElement.videoWidth || 640;\n const videoHeight = videoElement.videoHeight || 360;\n const aspectRatio = videoWidth / videoHeight;\n let displayWidth = containerWidth;\n let displayHeight = containerHeight;\n if (containerWidth / containerHeight > aspectRatio) {\n displayWidth = containerHeight * aspectRatio;\n } else {\n displayHeight = containerWidth / aspectRatio;\n }\n return { displayWidth, displayHeight };\n }\n\n function updateCompareMask() {\n if (option.compare) {\n const { displayWidth, displayHeight } = calcCanvasSize();\n const gradient = `linear-gradient(to right, transparent 0%, transparent ${comparePosition}%, black ${comparePosition}%, black 100%)`;\n $canvas.style.maskImage = gradient;\n\n const containerWidth = $player.offsetWidth || 640;\n const containerHeight = $player.offsetHeight || 360;\n const canvasLeft = (containerWidth - displayWidth) / 2;\n const canvasTop = (containerHeight - displayHeight) / 2;\n const handlerX =\n canvasLeft + (displayWidth * comparePosition) / 100;\n\n $handler.style.top = canvasTop + \"px\";\n $handler.style.left = handlerX + \"px\";\n $handler.style.height = displayHeight + \"px\";\n $handler.style.transform = \"translateX(-50%)\";\n } else {\n $canvas.style.maskImage = \"none\";\n }\n }\n\n function handleMouseDown(e) {\n if (option.compare) {\n isDragging = true;\n }\n }\n\n function handleMouseMove(e) {\n if (option.compare && isDragging) {\n const rect = $player.getBoundingClientRect();\n const { displayWidth } = calcCanvasSize();\n const containerWidth = $player.offsetWidth || 640;\n const canvasLeft = (containerWidth - displayWidth) / 2;\n const x = e.clientX - rect.left;\n const relativeX = x - canvasLeft;\n comparePosition = (relativeX / displayWidth) * 100;\n comparePosition = Math.max(0, Math.min(100, comparePosition));\n updateCompareMask();\n }\n }\n\n function handleMouseUp(e) {\n isDragging = false;\n }\n\n art.on(\"destroy\", () => {\n upscaler.dispose();\n $handler.removeEventListener(\"mousedown\", handleMouseDown);\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n });\n\n art.on(\"resize\", () => {\n const { displayWidth, displayHeight } = calcCanvasSize();\n $canvas.style.width = displayWidth + \"px\";\n $canvas.style.height = displayHeight + \"px\";\n updateCompareMask();\n });\n\n return {\n name: \"artplayerPluginWebsr\",\n };\n };\n}\n\nif (typeof window !== \"undefined\") {\n window.artplayerPluginWebsr = artplayerPluginWebsr;\n}\n","export default class Upscaler {\r\n static DEFAULT_TIMEOUTS = { IMAGE: 300000, VIDEO: 3600000, METADATA: 10000 };\r\n static DEFAULT_DELAYS = { INIT: 500, NETWORK: 300 };\r\n\r\n static isSupported() {\r\n try {\r\n const hasWorker = typeof Worker !== \"undefined\";\r\n const hasOffscreen =\r\n typeof OffscreenCanvas !== \"undefined\" ||\r\n (typeof document !== \"undefined\" &&\r\n !!document.createElement(\"canvas\").transferControlToOffscreen);\r\n const hasBlob = typeof Blob !== \"undefined\";\r\n return hasWorker && hasOffscreen && hasBlob;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n static isVideoSupported() {\r\n try {\r\n return (\r\n typeof VideoEncoder !== \"undefined\" &&\r\n typeof VideoDecoder !== \"undefined\"\r\n );\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n constructor(options = {}) {\r\n const weightsBaseUrl = options.weightsBaseUrl || \"/weights\";\r\n\r\n this.networks = options.networks || {\r\n small: {\r\n name: \"anime4k/cnn-2x-l\",\r\n weightsUrl: `${weightsBaseUrl}/cnn-8.json`,\r\n },\r\n medium: {\r\n name: \"anime4k/cnn-2x-16\",\r\n weightsUrl: `${weightsBaseUrl}/cnn-16.json`,\r\n },\r\n large: {\r\n name: \"anime4k/cnn-2x-28\",\r\n weightsUrl: `${weightsBaseUrl}/cnn-28.json`,\r\n },\r\n };\r\n\r\n this.networkSize = options.networkSize || \"medium\";\r\n this.weightsBaseUrl = weightsBaseUrl;\r\n this.workerUrl = options.workerUrl || \"/worker/main.js\";\r\n\r\n this.timeouts = {\r\n ...Upscaler.DEFAULT_TIMEOUTS,\r\n ...(options.timeouts || {}),\r\n };\r\n this.delays = { ...Upscaler.DEFAULT_DELAYS, ...(options.delays || {}) };\r\n\r\n this.imageScale =\r\n typeof options.imageScale === \"number\" && options.imageScale > 0\r\n ? options.imageScale\r\n : 2;\r\n this.videoScale =\r\n typeof options.videoScale === \"number\" && options.videoScale > 0\r\n ? options.videoScale\r\n : 2;\r\n\r\n this.weightsCache = new Map();\r\n this.workerInstance = null;\r\n this.messageHandlers = {};\r\n this.progressCallback = null;\r\n this.processingType = null;\r\n\r\n this.realtimeLoopId = null;\r\n this.realtimeState = null;\r\n }\r\n\r\n init({ prewarm = true } = {}) {\r\n if (!Upscaler.isSupported()) {\r\n throw new Error(\"Upscaler is not supported in this environment\");\r\n }\r\n if (prewarm) {\r\n this.getWorker().postMessage({ cmd: \"isSupported\" });\r\n }\r\n return this;\r\n }\r\n\r\n getWorker() {\r\n if (!this.workerInstance) {\r\n this.workerInstance = new Worker(this.workerUrl);\r\n this.workerInstance.onmessage = (event) =>\r\n this.handleWorkerMessage(event);\r\n }\r\n return this.workerInstance;\r\n }\r\n\r\n static extractProgressValue(data) {\r\n const value = data.data ?? data.progress ?? data.value ?? data.percentage;\r\n return typeof value === \"number\"\r\n ? Math.min(100, Math.max(0, Math.round(value)))\r\n : null;\r\n }\r\n\r\n handleBlobResponse(data) {\r\n const blobType =\r\n this.processingType === \"video\" ? \"videoBlob\" : \"imageBlob\";\r\n const handler = this.messageHandlers[blobType];\r\n if (data.data instanceof Blob && handler) {\r\n handler({ [blobType]: data.data });\r\n }\r\n }\r\n\r\n requestBlob() {\r\n const cmd =\r\n this.processingType === \"video\" ? \"getVideoBlob\" : \"getImageBlob\";\r\n this.getWorker().postMessage({ cmd });\r\n }\r\n\r\n handleWorkerMessage(event) {\r\n const { data } = event;\r\n if (!data.cmd) return;\r\n\r\n const { cmd } = data;\r\n\r\n if (cmd === \"progress\") {\r\n const progress = Upscaler.extractProgressValue(data);\r\n if (progress !== null && this.progressCallback) {\r\n this.progressCallback(progress);\r\n }\r\n if (this.messageHandlers.progress) this.messageHandlers.progress(data);\r\n } else if (cmd === \"finished\") {\r\n if (data.data instanceof Blob) {\r\n this.handleBlobResponse(data);\r\n } else {\r\n this.requestBlob();\r\n }\r\n } else if (this.messageHandlers[cmd]) {\r\n this.messageHandlers[cmd](data);\r\n }\r\n }\r\n\r\n async loadWeights(networkSize) {\r\n this.validateNetworkSize(networkSize);\r\n if (this.weightsCache.has(networkSize)) {\r\n return this.weightsCache.get(networkSize);\r\n }\r\n const network = this.networks[networkSize];\r\n const response = await fetch(network.weightsUrl);\r\n if (!response.ok)\r\n throw new Error(`Failed to fetch weights: ${response.statusText}`);\r\n const weights = await response.json();\r\n this.weightsCache.set(networkSize, weights);\r\n return weights;\r\n }\r\n\r\n static loadImageMetadata(arrayBuffer, mimeType) {\r\n return new Promise((resolve, reject) => {\r\n const blob = new Blob([arrayBuffer], { type: mimeType });\r\n const url = URL.createObjectURL(blob);\r\n const img = new Image();\r\n\r\n img.onload = () => {\r\n URL.revokeObjectURL(url);\r\n resolve({ width: img.width, height: img.height });\r\n };\r\n\r\n img.onerror = () => {\r\n URL.revokeObjectURL(url);\r\n reject(new Error(\"Failed to load image\"));\r\n };\r\n\r\n img.src = url;\r\n });\r\n }\r\n\r\n static loadVideoMetadata(file, timeoutMs) {\r\n return new Promise((resolve, reject) => {\r\n const url = URL.createObjectURL(file);\r\n const video = document.createElement(\"video\");\r\n video.src = url;\r\n\r\n const timeout = setTimeout(() => reject(new Error(\"Timeout\")), timeoutMs);\r\n\r\n video.onloadedmetadata = () => {\r\n clearTimeout(timeout);\r\n URL.revokeObjectURL(url);\r\n resolve({\r\n width: video.videoWidth,\r\n height: video.videoHeight,\r\n duration: video.duration,\r\n });\r\n };\r\n\r\n video.onerror = () => {\r\n clearTimeout(timeout);\r\n URL.revokeObjectURL(url);\r\n reject(new Error(\"Failed to load video\"));\r\n };\r\n });\r\n }\r\n\r\n createOffscreenCanvas(width, height, scale = 2) {\r\n const factor = typeof scale === \"number\" && scale > 0 ? scale : 1;\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = width * factor;\r\n canvas.height = height * factor;\r\n if (typeof canvas.transferControlToOffscreen !== \"function\") {\r\n throw new Error(\"OffscreenCanvas is not supported in this environment\");\r\n }\r\n return canvas.transferControlToOffscreen();\r\n }\r\n\r\n createBlobPromise(blobType, timeout) {\r\n return new Promise((resolve, reject) => {\r\n const timeoutId = setTimeout(() => {\r\n if (this.messageHandlers[blobType]) {\r\n delete this.messageHandlers[blobType];\r\n reject(new Error(`${blobType} processing timeout`));\r\n }\r\n }, timeout);\r\n\r\n this.messageHandlers[blobType] = (msg) => {\r\n delete this.messageHandlers[blobType];\r\n clearTimeout(timeoutId);\r\n const blob = msg[blobType] || msg.data;\r\n if (blob instanceof Blob) {\r\n resolve(blob);\r\n } else {\r\n reject(new Error(`Invalid ${blobType} format`));\r\n }\r\n };\r\n });\r\n }\r\n\r\n validateNetworkSize(size) {\r\n if (!this.networks[size]) {\r\n throw new Error(\r\n \"Invalid networkSize: use one of \" +\r\n Object.keys(this.networks).join(\", \"),\r\n );\r\n }\r\n }\r\n\r\n async upscaleImage(imageFile, networkSize, scaleOverride) {\r\n if (!imageFile) throw new Error(\"Image file is required\");\r\n const size = networkSize || this.networkSize;\r\n this.validateNetworkSize(size);\r\n\r\n this.processingType = \"image\";\r\n const arrayBuffer = await imageFile.arrayBuffer();\r\n const mimeType = imageFile.type || \"image/jpeg\";\r\n const { width, height } = await Upscaler.loadImageMetadata(\r\n arrayBuffer,\r\n mimeType,\r\n );\r\n\r\n\r\n const weights = await this.loadWeights(size);\r\n const network = this.networks[size];\r\n const scale =\r\n typeof scaleOverride === \"number\" && scaleOverride > 0\r\n ? scaleOverride\r\n : this.imageScale;\r\n const [canvasUp, canvasOrig] = [\r\n this.createOffscreenCanvas(width, height, scale),\r\n this.createOffscreenCanvas(width, height, 1),\r\n ];\r\n\r\n const blobPromise = this.createBlobPromise(\r\n \"imageBlob\",\r\n this.timeouts.IMAGE,\r\n );\r\n\r\n this.getWorker().postMessage(\r\n {\r\n cmd: \"init\",\r\n data: {\r\n imageArrayBuffer: arrayBuffer,\r\n imageMimeType: mimeType,\r\n upscaled: canvasUp,\r\n original: canvasOrig,\r\n resolution: { width, height },\r\n network_name: network.name,\r\n weights,\r\n },\r\n },\r\n [canvasUp, canvasOrig],\r\n );\r\n\r\n setTimeout(() => {\r\n this.getWorker().postMessage({\r\n cmd: \"network\",\r\n data: {\r\n name: network.name,\r\n imageArrayBuffer: arrayBuffer,\r\n imageMimeType: mimeType,\r\n weights,\r\n },\r\n });\r\n\r\n setTimeout(() => {\r\n this.getWorker().postMessage({\r\n cmd: \"getImageBlob\",\r\n data: { imageArrayBuffer: arrayBuffer, imageMimeType: mimeType },\r\n });\r\n }, this.delays.NETWORK);\r\n }, this.delays.INIT);\r\n\r\n return blobPromise;\r\n }\r\n\r\n async upscaleVideo(videoFile, networkSize, scaleOverride) {\r\n if (!videoFile) throw new Error(\"Video file is required\");\r\n const size = networkSize || this.networkSize;\r\n this.validateNetworkSize(size);\r\n\r\n if (!Upscaler.isVideoSupported()) {\r\n throw new Error(\"WebCodecs API not supported. Requires Chrome 94+\");\r\n }\r\n\r\n this.processingType = \"video\";\r\n const { width, height, duration } = await Upscaler.loadVideoMetadata(\r\n videoFile,\r\n this.timeouts.METADATA,\r\n );\r\n\r\n\r\n const weights = await this.loadWeights(size);\r\n const network = this.networks[size];\r\n const scale =\r\n typeof scaleOverride === \"number\" && scaleOverride > 0\r\n ? scaleOverride\r\n : this.videoScale;\r\n const [canvasOut, canvasIn] = [\r\n this.createOffscreenCanvas(width, height, scale),\r\n this.createOffscreenCanvas(width, height, 1),\r\n ];\r\n\r\n const blobPromise = this.createBlobPromise(\r\n \"videoBlob\",\r\n this.timeouts.VIDEO,\r\n );\r\n\r\n this.getWorker().postMessage(\r\n {\r\n cmd: \"process\",\r\n file: videoFile,\r\n fileSize: videoFile.size,\r\n duration,\r\n adjustedResolution: {\r\n adjustedInputWidth: width,\r\n adjustedInputHeight: height,\r\n adjustedOutputWidth: width * scale,\r\n adjustedOutputHeight: height * scale,\r\n },\r\n upscaled: canvasOut,\r\n original: canvasIn,\r\n weights,\r\n network_name: network.name,\r\n skipDemuxProgress: true,\r\n },\r\n [canvasOut, canvasIn],\r\n );\r\n\r\n return blobPromise;\r\n }\r\n\r\n async startRealtimeUpscale(\r\n videoElement,\r\n canvasElement,\r\n networkSize,\r\n scaleOverride,\r\n ) {\r\n if (!videoElement || !canvasElement) {\r\n throw new Error(\"videoElement and canvasElement are required\");\r\n }\r\n\r\n const size = networkSize || this.networkSize;\r\n this.validateNetworkSize(size);\r\n\r\n const network = this.networks[size];\r\n const weights = await this.loadWeights(size);\r\n\r\n const scale =\r\n typeof scaleOverride === \"number\" && scaleOverride > 0\r\n ? scaleOverride\r\n : this.videoScale;\r\n\r\n const ensureMetadata = () => {\r\n return new Promise((resolve, reject) => {\r\n if (videoElement.readyState >= 1) {\r\n resolve();\r\n return;\r\n }\r\n const onLoaded = () => {\r\n cleanup();\r\n resolve();\r\n };\r\n const onError = () => {\r\n cleanup();\r\n reject(new Error(\"Failed to load video metadata\"));\r\n };\r\n const cleanup = () => {\r\n videoElement.removeEventListener(\"loadedmetadata\", onLoaded);\r\n videoElement.removeEventListener(\"error\", onError);\r\n };\r\n videoElement.addEventListener(\"loadedmetadata\", onLoaded);\r\n videoElement.addEventListener(\"error\", onError);\r\n });\r\n };\r\n\r\n await ensureMetadata();\r\n\r\n const width = videoElement.videoWidth;\r\n const height = videoElement.videoHeight;\r\n if (!width || !height) {\r\n throw new Error(\"Invalid video dimensions\");\r\n }\r\n\r\n\r\n canvasElement.width = width * scale;\r\n canvasElement.height = height * scale;\r\n\r\n if (typeof canvasElement.transferControlToOffscreen !== \"function\") {\r\n throw new Error(\"OffscreenCanvas is not supported in this environment\");\r\n }\r\n\r\n const offscreen = canvasElement.transferControlToOffscreen();\r\n\r\n\r\n if (this.realtimeLoopId) {\r\n cancelAnimationFrame(this.realtimeLoopId);\r\n this.realtimeLoopId = null;\r\n }\r\n\r\n this.getWorker().postMessage(\r\n {\r\n cmd: \"realtimeInit\",\r\n data: {\r\n upscaled: offscreen,\r\n resolution: {\r\n width,\r\n height,\r\n scale,\r\n outputWidth: width * scale,\r\n outputHeight: height * scale,\r\n },\r\n network_name: network.name,\r\n weights,\r\n },\r\n },\r\n [offscreen],\r\n );\r\n\r\n\r\n this.realtimeState = {\r\n running: true,\r\n video: videoElement,\r\n canvas: canvasElement,\r\n scale,\r\n busy: false,\r\n frameIndex: 0,\r\n };\r\n\r\n const loop = async () => {\r\n if (!this.realtimeState || !this.realtimeState.running) return;\r\n const state = this.realtimeState;\r\n const v = state.video;\r\n\r\n if (!v.paused && !v.ended && !state.busy) {\r\n state.busy = true;\r\n try {\r\n const frame = await createImageBitmap(v);\r\n state.frameIndex += 1;\r\n \r\n this.getWorker().postMessage(\r\n {\r\n cmd: \"realtimeFrame\",\r\n frame,\r\n },\r\n [frame],\r\n );\r\n } catch (e) {\r\n console.warn(\"realtimeFrame error\", e);\r\n } finally {\r\n if (this.realtimeState) {\r\n this.realtimeState.busy = false;\r\n }\r\n }\r\n }\r\n\r\n this.realtimeLoopId = requestAnimationFrame(loop);\r\n };\r\n\r\n this.realtimeLoopId = requestAnimationFrame(loop);\r\n }\r\n\r\n stopRealtimeUpscale() {\r\n if (this.realtimeLoopId) {\r\n cancelAnimationFrame(this.realtimeLoopId);\r\n this.realtimeLoopId = null;\r\n }\r\n if (this.realtimeState) {\r\n this.realtimeState.running = false;\r\n this.realtimeState = null;\r\n }\r\n }\r\n\r\n async downloadUpscaled(file, networkSize, filename = null) {\r\n const isVideo = file.type.startsWith(\"video\");\r\n const size = networkSize || this.networkSize;\r\n const blob = isVideo\r\n ? await this.upscaleVideo(file, size)\r\n : await this.upscaleImage(file, size);\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download =\r\n filename || `upscaled_${Date.now()}.${isVideo ? \"mp4\" : \"png\"}`;\r\n link.click();\r\n URL.revokeObjectURL(url);\r\n return blob;\r\n }\r\n\r\n getSupportedNetworks() {\r\n return Object.keys(this.networks);\r\n }\r\n\r\n static async getGPUCapability() {\r\n try {\r\n if (navigator.gpu) {\r\n const adapter = await navigator.gpu.requestAdapter();\r\n if (adapter) {\r\n const buffer = adapter.limits.maxStorageBufferBindingSize / 512;\r\n const texture = 8192 * 8192;\r\n return Math.min(buffer, texture);\r\n }\r\n }\r\n const canvas = document.createElement(\"canvas\");\r\n const gl = canvas.getContext(\"webgl2\");\r\n if (gl) return gl.getParameter(gl.MAX_TEXTURE_SIZE) ** 2;\r\n return 8388608;\r\n } catch {\r\n return 8388608;\r\n }\r\n }\r\n\r\n static getBackendType() {\r\n try {\r\n if (navigator.gpu) return \"webgpu\";\r\n if (document.createElement(\"canvas\").getContext(\"webgl2\")) return \"webgl\";\r\n return \"unknown\";\r\n } catch {\r\n return \"unknown\";\r\n }\r\n }\r\n\r\n getAppState() {\r\n return {\r\n backend: Upscaler.getBackendType(),\r\n isProcessing: false,\r\n progress: 0,\r\n width: 0,\r\n height: 0,\r\n };\r\n }\r\n\r\n onProgress(callback) {\r\n if (typeof callback === \"function\") {\r\n this.progressCallback = callback;\r\n }\r\n }\r\n\r\n dispose() {\r\n this.stopRealtimeUpscale();\r\n if (this.workerInstance) {\r\n this.workerInstance.terminate();\r\n this.workerInstance = null;\r\n }\r\n this.messageHandlers = {};\r\n this.progressCallback = null;\r\n this.processingType = null;\r\n this.weightsCache.clear();\r\n }\r\n}","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"} \ No newline at end of file +{"mappings":"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","sources":["packages/artplayer-plugin-websr/src/index.js","packages/artplayer-plugin-websr/src/Upscaler.js","node_modules/@parcel/transformer-js/src/esmodule-helpers.js"],"sourcesContent":["import Upscaler from \"./Upscaler\";\n\nexport default function artplayerPluginWebsr(\n option = {\n networkSize: \"medium\",\n compare: false,\n },\n) {\n return async (art) => {\n const { $video, $player } = art.template;\n\n const $canvas = document.createElement(\"canvas\");\n $player.appendChild($canvas);\n\n $canvas.style.position = \"absolute\";\n $canvas.style.zIndex = \"11\";\n $canvas.style.pointerEvents = \"none\";\n $canvas.style.top = \"50%\";\n $canvas.style.left = \"50%\";\n $canvas.style.transform = \"translate(-50%, -50%)\";\n\n const upscaler = new Upscaler(option);\n upscaler.init();\n await upscaler.startRealtimeUpscale(\n $video,\n $canvas,\n option.networkSize,\n );\n\n // 对比模式\n let comparePosition = 50;\n let isDragging = false;\n\n // 创建对比手柄\n const $handler = document.createElement(\"div\");\n $handler.style.position = \"absolute\";\n $handler.style.width = \"3px\";\n $handler.style.backgroundColor = \"rgba(255, 255, 255, 0.5)\";\n $handler.style.cursor = \"ew-resize\";\n $handler.style.zIndex = \"12\";\n $handler.style.pointerEvents = \"auto\";\n $handler.style.display = option.compare ? \"block\" : \"none\";\n $handler.style.boxShadow = \"0 0 4px rgba(0, 0, 0, 0.1)\";\n\n if (option.compare) {\n $player.appendChild($handler);\n $handler.addEventListener(\"mousedown\", handleMouseDown);\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n updateCompareMask();\n }\n\n function calcCanvasSize() {\n const videoElement = art.video;\n const containerWidth = $player.offsetWidth || 640;\n const containerHeight = $player.offsetHeight || 360;\n const videoWidth = videoElement.videoWidth || 640;\n const videoHeight = videoElement.videoHeight || 360;\n const aspectRatio = videoWidth / videoHeight;\n let displayWidth = containerWidth;\n let displayHeight = containerHeight;\n if (containerWidth / containerHeight > aspectRatio) {\n displayWidth = containerHeight * aspectRatio;\n } else {\n displayHeight = containerWidth / aspectRatio;\n }\n return { displayWidth, displayHeight };\n }\n\n function updateCompareMask() {\n if (option.compare) {\n const { displayWidth, displayHeight } = calcCanvasSize();\n const gradient = `linear-gradient(to right, transparent 0%, transparent ${comparePosition}%, black ${comparePosition}%, black 100%)`;\n $canvas.style.maskImage = gradient;\n\n const containerWidth = $player.offsetWidth || 640;\n const containerHeight = $player.offsetHeight || 360;\n const canvasLeft = (containerWidth - displayWidth) / 2;\n const canvasTop = (containerHeight - displayHeight) / 2;\n const handlerX =\n canvasLeft + (displayWidth * comparePosition) / 100;\n\n $handler.style.top = canvasTop + \"px\";\n $handler.style.left = handlerX + \"px\";\n $handler.style.height = displayHeight + \"px\";\n $handler.style.transform = \"translateX(-50%)\";\n } else {\n $canvas.style.maskImage = \"none\";\n }\n }\n\n function handleMouseDown(e) {\n if (option.compare) {\n isDragging = true;\n }\n }\n\n function handleMouseMove(e) {\n if (option.compare && isDragging) {\n const rect = $player.getBoundingClientRect();\n const { displayWidth } = calcCanvasSize();\n const containerWidth = $player.offsetWidth || 640;\n const canvasLeft = (containerWidth - displayWidth) / 2;\n const x = e.clientX - rect.left;\n const relativeX = x - canvasLeft;\n comparePosition = (relativeX / displayWidth) * 100;\n comparePosition = Math.max(0, Math.min(100, comparePosition));\n updateCompareMask();\n }\n }\n\n function handleMouseUp(e) {\n isDragging = false;\n }\n\n art.on(\"destroy\", () => {\n upscaler.dispose();\n $handler.removeEventListener(\"mousedown\", handleMouseDown);\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n });\n\n art.on(\"resize\", () => {\n const { displayWidth, displayHeight } = calcCanvasSize();\n $canvas.style.width = displayWidth + \"px\";\n $canvas.style.height = displayHeight + \"px\";\n updateCompareMask();\n });\n\n return {\n name: \"artplayerPluginWebsr\",\n };\n };\n}\n\nif (typeof window !== \"undefined\") {\n window.artplayerPluginWebsr = artplayerPluginWebsr;\n}\n","export default class Upscaler {\r\n static DEFAULT_TIMEOUTS = { IMAGE: 300000, VIDEO: 3600000, METADATA: 10000 };\r\n static DEFAULT_DELAYS = { INIT: 500, NETWORK: 300 };\r\n\r\n static isSupported() {\r\n try {\r\n const hasWorker = typeof Worker !== \"undefined\";\r\n const hasOffscreen =\r\n typeof OffscreenCanvas !== \"undefined\" ||\r\n (typeof document !== \"undefined\" &&\r\n !!document.createElement(\"canvas\").transferControlToOffscreen);\r\n const hasBlob = typeof Blob !== \"undefined\";\r\n return hasWorker && hasOffscreen && hasBlob;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n static isVideoSupported() {\r\n try {\r\n return (\r\n typeof VideoEncoder !== \"undefined\" &&\r\n typeof VideoDecoder !== \"undefined\"\r\n );\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n constructor(options = {}) {\r\n const weightsBaseUrl = options.weightsBaseUrl || \"/weights\";\r\n\r\n this.networks = options.networks || {\r\n small: {\r\n name: \"anime4k/cnn-2x-l\",\r\n weightsUrl: `${weightsBaseUrl}/cnn-8.json`,\r\n },\r\n medium: {\r\n name: \"anime4k/cnn-2x-16\",\r\n weightsUrl: `${weightsBaseUrl}/cnn-16.json`,\r\n },\r\n large: {\r\n name: \"anime4k/cnn-2x-28\",\r\n weightsUrl: `${weightsBaseUrl}/cnn-28.json`,\r\n },\r\n };\r\n\r\n this.networkSize = options.networkSize || \"medium\";\r\n this.weightsBaseUrl = weightsBaseUrl;\r\n this.workerUrl = options.workerUrl || \"/worker/main.js\";\r\n\r\n this.timeouts = {\r\n ...Upscaler.DEFAULT_TIMEOUTS,\r\n ...(options.timeouts || {}),\r\n };\r\n this.delays = { ...Upscaler.DEFAULT_DELAYS, ...(options.delays || {}) };\r\n\r\n this.imageScale =\r\n typeof options.imageScale === \"number\" && options.imageScale > 0\r\n ? options.imageScale\r\n : 2;\r\n this.videoScale =\r\n typeof options.videoScale === \"number\" && options.videoScale > 0\r\n ? options.videoScale\r\n : 2;\r\n\r\n this.weightsCache = new Map();\r\n this.workerInstance = null;\r\n this.messageHandlers = {};\r\n this.progressCallback = null;\r\n this.processingType = null;\r\n\r\n this.realtimeLoopId = null;\r\n this.realtimeState = null;\r\n }\r\n\r\n init({ prewarm = true } = {}) {\r\n if (!Upscaler.isSupported()) {\r\n throw new Error(\"Upscaler is not supported in this environment\");\r\n }\r\n if (prewarm) {\r\n this.getWorker().postMessage({ cmd: \"isSupported\" });\r\n }\r\n return this;\r\n }\r\n\r\n getWorker() {\r\n if (!this.workerInstance) {\r\n this.workerInstance = new Worker(this.workerUrl);\r\n this.workerInstance.onmessage = (event) =>\r\n this.handleWorkerMessage(event);\r\n }\r\n return this.workerInstance;\r\n }\r\n\r\n static extractProgressValue(data) {\r\n const value = data.data ?? data.progress ?? data.value ?? data.percentage;\r\n return typeof value === \"number\"\r\n ? Math.min(100, Math.max(0, Math.round(value)))\r\n : null;\r\n }\r\n\r\n handleBlobResponse(data) {\r\n const blobType =\r\n this.processingType === \"video\" ? \"videoBlob\" : \"imageBlob\";\r\n const handler = this.messageHandlers[blobType];\r\n if (data.data instanceof Blob && handler) {\r\n handler({ [blobType]: data.data });\r\n }\r\n }\r\n\r\n requestBlob() {\r\n const cmd =\r\n this.processingType === \"video\" ? \"getVideoBlob\" : \"getImageBlob\";\r\n this.getWorker().postMessage({ cmd });\r\n }\r\n\r\n handleWorkerMessage(event) {\r\n const { data } = event;\r\n if (!data.cmd) return;\r\n\r\n const { cmd } = data;\r\n\r\n if (cmd === \"progress\") {\r\n const progress = Upscaler.extractProgressValue(data);\r\n if (progress !== null && this.progressCallback) {\r\n this.progressCallback(progress);\r\n }\r\n if (this.messageHandlers.progress) this.messageHandlers.progress(data);\r\n } else if (cmd === \"finished\") {\r\n if (data.data instanceof Blob) {\r\n this.handleBlobResponse(data);\r\n } else {\r\n this.requestBlob();\r\n }\r\n } else if (this.messageHandlers[cmd]) {\r\n this.messageHandlers[cmd](data);\r\n }\r\n }\r\n\r\n async loadWeights(networkSize) {\r\n this.validateNetworkSize(networkSize);\r\n if (this.weightsCache.has(networkSize)) {\r\n return this.weightsCache.get(networkSize);\r\n }\r\n const network = this.networks[networkSize];\r\n const response = await fetch(network.weightsUrl);\r\n if (!response.ok)\r\n throw new Error(`Failed to fetch weights: ${response.statusText}`);\r\n const weights = await response.json();\r\n this.weightsCache.set(networkSize, weights);\r\n return weights;\r\n }\r\n\r\n static loadImageMetadata(arrayBuffer, mimeType) {\r\n return new Promise((resolve, reject) => {\r\n const blob = new Blob([arrayBuffer], { type: mimeType });\r\n const url = URL.createObjectURL(blob);\r\n const img = new Image();\r\n\r\n img.onload = () => {\r\n URL.revokeObjectURL(url);\r\n resolve({ width: img.width, height: img.height });\r\n };\r\n\r\n img.onerror = () => {\r\n URL.revokeObjectURL(url);\r\n reject(new Error(\"Failed to load image\"));\r\n };\r\n\r\n img.src = url;\r\n });\r\n }\r\n\r\n static loadVideoMetadata(file, timeoutMs) {\r\n return new Promise((resolve, reject) => {\r\n const url = URL.createObjectURL(file);\r\n const video = document.createElement(\"video\");\r\n video.src = url;\r\n\r\n const timeout = setTimeout(() => reject(new Error(\"Timeout\")), timeoutMs);\r\n\r\n video.onloadedmetadata = () => {\r\n clearTimeout(timeout);\r\n URL.revokeObjectURL(url);\r\n resolve({\r\n width: video.videoWidth,\r\n height: video.videoHeight,\r\n duration: video.duration,\r\n });\r\n };\r\n\r\n video.onerror = () => {\r\n clearTimeout(timeout);\r\n URL.revokeObjectURL(url);\r\n reject(new Error(\"Failed to load video\"));\r\n };\r\n });\r\n }\r\n\r\n createOffscreenCanvas(width, height, scale = 2) {\r\n const factor = typeof scale === \"number\" && scale > 0 ? scale : 1;\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = width * factor;\r\n canvas.height = height * factor;\r\n if (typeof canvas.transferControlToOffscreen !== \"function\") {\r\n throw new Error(\"OffscreenCanvas is not supported in this environment\");\r\n }\r\n return canvas.transferControlToOffscreen();\r\n }\r\n\r\n createBlobPromise(blobType, timeout) {\r\n return new Promise((resolve, reject) => {\r\n const timeoutId = setTimeout(() => {\r\n if (this.messageHandlers[blobType]) {\r\n delete this.messageHandlers[blobType];\r\n reject(new Error(`${blobType} processing timeout`));\r\n }\r\n }, timeout);\r\n\r\n this.messageHandlers[blobType] = (msg) => {\r\n delete this.messageHandlers[blobType];\r\n clearTimeout(timeoutId);\r\n const blob = msg[blobType] || msg.data;\r\n if (blob instanceof Blob) {\r\n resolve(blob);\r\n } else {\r\n reject(new Error(`Invalid ${blobType} format`));\r\n }\r\n };\r\n });\r\n }\r\n\r\n validateNetworkSize(size) {\r\n if (!this.networks[size]) {\r\n throw new Error(\r\n \"Invalid networkSize: use one of \" +\r\n Object.keys(this.networks).join(\", \"),\r\n );\r\n }\r\n }\r\n\r\n async upscaleImage(imageFile, networkSize, scaleOverride) {\r\n if (!imageFile) throw new Error(\"Image file is required\");\r\n const size = networkSize || this.networkSize;\r\n this.validateNetworkSize(size);\r\n\r\n this.processingType = \"image\";\r\n const arrayBuffer = await imageFile.arrayBuffer();\r\n const mimeType = imageFile.type || \"image/jpeg\";\r\n const { width, height } = await Upscaler.loadImageMetadata(\r\n arrayBuffer,\r\n mimeType,\r\n );\r\n\r\n\r\n const weights = await this.loadWeights(size);\r\n const network = this.networks[size];\r\n const scale =\r\n typeof scaleOverride === \"number\" && scaleOverride > 0\r\n ? scaleOverride\r\n : this.imageScale;\r\n const [canvasUp, canvasOrig] = [\r\n this.createOffscreenCanvas(width, height, scale),\r\n this.createOffscreenCanvas(width, height, 1),\r\n ];\r\n\r\n const blobPromise = this.createBlobPromise(\r\n \"imageBlob\",\r\n this.timeouts.IMAGE,\r\n );\r\n\r\n this.getWorker().postMessage(\r\n {\r\n cmd: \"init\",\r\n data: {\r\n imageArrayBuffer: arrayBuffer,\r\n imageMimeType: mimeType,\r\n upscaled: canvasUp,\r\n original: canvasOrig,\r\n resolution: { width, height },\r\n network_name: network.name,\r\n weights,\r\n },\r\n },\r\n [canvasUp, canvasOrig],\r\n );\r\n\r\n setTimeout(() => {\r\n this.getWorker().postMessage({\r\n cmd: \"network\",\r\n data: {\r\n name: network.name,\r\n imageArrayBuffer: arrayBuffer,\r\n imageMimeType: mimeType,\r\n weights,\r\n },\r\n });\r\n\r\n setTimeout(() => {\r\n this.getWorker().postMessage({\r\n cmd: \"getImageBlob\",\r\n data: { imageArrayBuffer: arrayBuffer, imageMimeType: mimeType },\r\n });\r\n }, this.delays.NETWORK);\r\n }, this.delays.INIT);\r\n\r\n return blobPromise;\r\n }\r\n\r\n async upscaleVideo(videoFile, networkSize, scaleOverride) {\r\n if (!videoFile) throw new Error(\"Video file is required\");\r\n const size = networkSize || this.networkSize;\r\n this.validateNetworkSize(size);\r\n\r\n if (!Upscaler.isVideoSupported()) {\r\n throw new Error(\"WebCodecs API not supported. Requires Chrome 94+\");\r\n }\r\n\r\n this.processingType = \"video\";\r\n const { width, height, duration } = await Upscaler.loadVideoMetadata(\r\n videoFile,\r\n this.timeouts.METADATA,\r\n );\r\n\r\n\r\n const weights = await this.loadWeights(size);\r\n const network = this.networks[size];\r\n const scale =\r\n typeof scaleOverride === \"number\" && scaleOverride > 0\r\n ? scaleOverride\r\n : this.videoScale;\r\n const [canvasOut, canvasIn] = [\r\n this.createOffscreenCanvas(width, height, scale),\r\n this.createOffscreenCanvas(width, height, 1),\r\n ];\r\n\r\n const blobPromise = this.createBlobPromise(\r\n \"videoBlob\",\r\n this.timeouts.VIDEO,\r\n );\r\n\r\n this.getWorker().postMessage(\r\n {\r\n cmd: \"process\",\r\n file: videoFile,\r\n fileSize: videoFile.size,\r\n duration,\r\n adjustedResolution: {\r\n adjustedInputWidth: width,\r\n adjustedInputHeight: height,\r\n adjustedOutputWidth: width * scale,\r\n adjustedOutputHeight: height * scale,\r\n },\r\n upscaled: canvasOut,\r\n original: canvasIn,\r\n weights,\r\n network_name: network.name,\r\n skipDemuxProgress: true,\r\n },\r\n [canvasOut, canvasIn],\r\n );\r\n\r\n return blobPromise;\r\n }\r\n\r\n async startRealtimeUpscale(\r\n videoElement,\r\n canvasElement,\r\n networkSize,\r\n scaleOverride,\r\n ) {\r\n if (!videoElement || !canvasElement) {\r\n throw new Error(\"videoElement and canvasElement are required\");\r\n }\r\n\r\n const size = networkSize || this.networkSize;\r\n this.validateNetworkSize(size);\r\n\r\n const network = this.networks[size];\r\n const weights = await this.loadWeights(size);\r\n\r\n const scale =\r\n typeof scaleOverride === \"number\" && scaleOverride > 0\r\n ? scaleOverride\r\n : this.videoScale;\r\n\r\n const ensureMetadata = () => {\r\n return new Promise((resolve, reject) => {\r\n if (videoElement.readyState >= 1) {\r\n resolve();\r\n return;\r\n }\r\n const onLoaded = () => {\r\n cleanup();\r\n resolve();\r\n };\r\n const onError = () => {\r\n cleanup();\r\n reject(new Error(\"Failed to load video metadata\"));\r\n };\r\n const cleanup = () => {\r\n videoElement.removeEventListener(\"loadedmetadata\", onLoaded);\r\n videoElement.removeEventListener(\"error\", onError);\r\n };\r\n videoElement.addEventListener(\"loadedmetadata\", onLoaded);\r\n videoElement.addEventListener(\"error\", onError);\r\n });\r\n };\r\n\r\n await ensureMetadata();\r\n\r\n const width = videoElement.videoWidth;\r\n const height = videoElement.videoHeight;\r\n if (!width || !height) {\r\n throw new Error(\"Invalid video dimensions\");\r\n }\r\n\r\n\r\n canvasElement.width = width * scale;\r\n canvasElement.height = height * scale;\r\n\r\n if (typeof canvasElement.transferControlToOffscreen !== \"function\") {\r\n throw new Error(\"OffscreenCanvas is not supported in this environment\");\r\n }\r\n\r\n const offscreen = canvasElement.transferControlToOffscreen();\r\n\r\n\r\n if (this.realtimeLoopId) {\r\n cancelAnimationFrame(this.realtimeLoopId);\r\n this.realtimeLoopId = null;\r\n }\r\n\r\n this.getWorker().postMessage(\r\n {\r\n cmd: \"realtimeInit\",\r\n data: {\r\n upscaled: offscreen,\r\n resolution: {\r\n width,\r\n height,\r\n scale,\r\n outputWidth: width * scale,\r\n outputHeight: height * scale,\r\n },\r\n network_name: network.name,\r\n weights,\r\n },\r\n },\r\n [offscreen],\r\n );\r\n\r\n\r\n this.realtimeState = {\r\n running: true,\r\n video: videoElement,\r\n canvas: canvasElement,\r\n scale,\r\n busy: false,\r\n frameIndex: 0,\r\n };\r\n\r\n const loop = async () => {\r\n if (!this.realtimeState || !this.realtimeState.running) return;\r\n const state = this.realtimeState;\r\n const v = state.video;\r\n\r\n if (!v.paused && !v.ended && !state.busy) {\r\n state.busy = true;\r\n try {\r\n const frame = await createImageBitmap(v);\r\n state.frameIndex += 1;\r\n \r\n this.getWorker().postMessage(\r\n {\r\n cmd: \"realtimeFrame\",\r\n frame,\r\n },\r\n [frame],\r\n );\r\n } catch (e) {\r\n console.warn(\"realtimeFrame error\", e);\r\n } finally {\r\n if (this.realtimeState) {\r\n this.realtimeState.busy = false;\r\n }\r\n }\r\n }\r\n\r\n this.realtimeLoopId = requestAnimationFrame(loop);\r\n };\r\n\r\n this.realtimeLoopId = requestAnimationFrame(loop);\r\n }\r\n\r\n stopRealtimeUpscale() {\r\n if (this.realtimeLoopId) {\r\n cancelAnimationFrame(this.realtimeLoopId);\r\n this.realtimeLoopId = null;\r\n }\r\n if (this.realtimeState) {\r\n this.realtimeState.running = false;\r\n this.realtimeState = null;\r\n }\r\n }\r\n\r\n async downloadUpscaled(file, networkSize, filename = null) {\r\n const isVideo = file.type.startsWith(\"video\");\r\n const size = networkSize || this.networkSize;\r\n const blob = isVideo\r\n ? await this.upscaleVideo(file, size)\r\n : await this.upscaleImage(file, size);\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download =\r\n filename || `upscaled_${Date.now()}.${isVideo ? \"mp4\" : \"png\"}`;\r\n link.click();\r\n URL.revokeObjectURL(url);\r\n return blob;\r\n }\r\n\r\n getSupportedNetworks() {\r\n return Object.keys(this.networks);\r\n }\r\n\r\n static async getGPUCapability() {\r\n try {\r\n if (navigator.gpu) {\r\n const adapter = await navigator.gpu.requestAdapter();\r\n if (adapter) {\r\n const buffer = adapter.limits.maxStorageBufferBindingSize / 512;\r\n const texture = 8192 * 8192;\r\n return Math.min(buffer, texture);\r\n }\r\n }\r\n const canvas = document.createElement(\"canvas\");\r\n const gl = canvas.getContext(\"webgl2\");\r\n if (gl) return gl.getParameter(gl.MAX_TEXTURE_SIZE) ** 2;\r\n return 8388608;\r\n } catch {\r\n return 8388608;\r\n }\r\n }\r\n\r\n static getBackendType() {\r\n try {\r\n if (navigator.gpu) return \"webgpu\";\r\n if (document.createElement(\"canvas\").getContext(\"webgl2\")) return \"webgl\";\r\n return \"unknown\";\r\n } catch {\r\n return \"unknown\";\r\n }\r\n }\r\n\r\n getAppState() {\r\n return {\r\n backend: Upscaler.getBackendType(),\r\n isProcessing: false,\r\n progress: 0,\r\n width: 0,\r\n height: 0,\r\n };\r\n }\r\n\r\n onProgress(callback) {\r\n if (typeof callback === \"function\") {\r\n this.progressCallback = callback;\r\n }\r\n }\r\n\r\n dispose() {\r\n this.stopRealtimeUpscale();\r\n if (this.workerInstance) {\r\n this.workerInstance.terminate();\r\n this.workerInstance = null;\r\n }\r\n this.messageHandlers = {};\r\n this.progressCallback = null;\r\n this.processingType = null;\r\n this.weightsCache.clear();\r\n }\r\n}","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"} \ No newline at end of file diff --git a/packages/artplayer-plugin-websr/src/index.js b/packages/artplayer-plugin-websr/src/index.js index 1f3b24f8b..d6f331fa1 100644 --- a/packages/artplayer-plugin-websr/src/index.js +++ b/packages/artplayer-plugin-websr/src/index.js @@ -6,7 +6,7 @@ export default function artplayerPluginWebsr( compare: false, }, ) { - return (art) => { + return async (art) => { const { $video, $player } = art.template; const $canvas = document.createElement("canvas"); @@ -21,7 +21,11 @@ export default function artplayerPluginWebsr( const upscaler = new Upscaler(option); upscaler.init(); - upscaler.startRealtimeUpscale($video, $canvas); + await upscaler.startRealtimeUpscale( + $video, + $canvas, + option.networkSize, + ); // 对比模式 let comparePosition = 50;