jassub 2.3.2 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/worker/renderers/2d-renderer.d.ts +16 -0
- package/dist/worker/renderers/2d-renderer.js +71 -0
- package/dist/worker/renderers/2d-renderer.js.map +1 -0
- package/dist/worker/renderers/webgl1-renderer.d.ts +38 -0
- package/dist/worker/renderers/webgl1-renderer.js +363 -0
- package/dist/worker/renderers/webgl1-renderer.js.map +1 -0
- package/dist/worker/renderers/webgl2-renderer.d.ts +32 -0
- package/dist/worker/renderers/webgl2-renderer.js +361 -0
- package/dist/worker/renderers/webgl2-renderer.js.map +1 -0
- package/dist/worker/renderers/webgpu-renderer.d.ts +50 -0
- package/dist/worker/renderers/webgpu-renderer.js +404 -0
- package/dist/worker/renderers/webgpu-renderer.js.map +1 -0
- package/dist/worker/util.d.ts +23 -0
- package/dist/worker/util.js +57 -0
- package/dist/worker/util.js.map +1 -1
- package/dist/worker/worker.d.ts +4 -2
- package/dist/worker/worker.js +21 -7
- package/dist/worker/worker.js.map +1 -1
- package/package.json +1 -1
- package/src/worker/renderers/2d-renderer.ts +81 -0
- package/src/worker/renderers/webgl1-renderer.ts +445 -0
- package/src/worker/{webgl-renderer.ts → renderers/webgl2-renderer.ts} +2 -65
- package/src/worker/{webgpu-renderer.ts → renderers/webgpu-renderer.ts} +1 -1
- package/src/worker/util.ts +64 -0
- package/src/worker/worker.ts +17 -5
package/src/worker/util.ts
CHANGED
|
@@ -41,3 +41,67 @@ export async function fetchtext (url: string) {
|
|
|
41
41
|
const res = await _fetch(url)
|
|
42
42
|
return await res.text()
|
|
43
43
|
}
|
|
44
|
+
|
|
45
|
+
export const THREAD_COUNT = !IS_FIREFOX && self.crossOriginIsolated ? Math.min(Math.max(1, navigator.hardwareConcurrency - 2), 8) : 1
|
|
46
|
+
|
|
47
|
+
// @ts-expect-error new experimental API
|
|
48
|
+
export const SUPPORTS_GROWTH = !!WebAssembly.Memory.prototype.toResizableBuffer
|
|
49
|
+
|
|
50
|
+
// HACK: 3 memory hacks to support here:
|
|
51
|
+
// 1. Chrome WASM Growable memory which can use a reference to the buffer to fix visual artifacts, which happen both with multithreading or without [fastest]
|
|
52
|
+
// 2. Chrome WASM non-growable, but mult-threaded only memory which needs to re-create the HEAPU8 on growth because of race conditions [medium]
|
|
53
|
+
// 3. Firefox non-growable memory which needs a copy of the data into a non-resizable buffer and can't use a reference [fastest single threaded, but only on Firefox, on Chrome this is slowest]
|
|
54
|
+
export const SHOULD_REFERENCE_MEMORY = !IS_FIREFOX && (SUPPORTS_GROWTH || THREAD_COUNT > 1)
|
|
55
|
+
|
|
56
|
+
export const IDENTITY_MATRIX = new Float32Array([
|
|
57
|
+
1, 0, 0,
|
|
58
|
+
0, 1, 0,
|
|
59
|
+
0, 0, 1
|
|
60
|
+
])
|
|
61
|
+
|
|
62
|
+
// Color matrix conversion map - mat3x3 for WebGL2
|
|
63
|
+
// Each matrix converts FROM the key color space TO the nested key color space
|
|
64
|
+
export const colorMatrixConversionMap = {
|
|
65
|
+
BT601: {
|
|
66
|
+
BT709: new Float32Array([
|
|
67
|
+
1.0863, 0.0965, -0.01411,
|
|
68
|
+
-0.0723, 0.8451, -0.0277,
|
|
69
|
+
-0.0141, 0.0584, 1.0418
|
|
70
|
+
]),
|
|
71
|
+
BT601: IDENTITY_MATRIX
|
|
72
|
+
},
|
|
73
|
+
BT709: {
|
|
74
|
+
BT601: new Float32Array([
|
|
75
|
+
0.9137, 0.0784, 0.0079,
|
|
76
|
+
-0.1049, 1.1722, -0.0671,
|
|
77
|
+
0.0096, 0.0322, 0.9582
|
|
78
|
+
]),
|
|
79
|
+
BT709: IDENTITY_MATRIX
|
|
80
|
+
},
|
|
81
|
+
FCC: {
|
|
82
|
+
BT709: new Float32Array([
|
|
83
|
+
1.0873, -0.0736, -0.0137,
|
|
84
|
+
0.0974, 0.8494, 0.0531,
|
|
85
|
+
-0.0127, -0.0251, 1.0378
|
|
86
|
+
]),
|
|
87
|
+
BT601: new Float32Array([
|
|
88
|
+
1.001, -0.0008, -0.0002,
|
|
89
|
+
0.0009, 1.005, -0.006,
|
|
90
|
+
0.0013, 0.0027, 0.996
|
|
91
|
+
])
|
|
92
|
+
},
|
|
93
|
+
SMPTE240M: {
|
|
94
|
+
BT709: new Float32Array([
|
|
95
|
+
0.9993, 0.0006, 0.0001,
|
|
96
|
+
-0.0004, 0.9812, 0.0192,
|
|
97
|
+
-0.0034, -0.0114, 1.0148
|
|
98
|
+
]),
|
|
99
|
+
BT601: new Float32Array([
|
|
100
|
+
0.913, 0.0774, 0.0096,
|
|
101
|
+
-0.1051, 1.1508, -0.0456,
|
|
102
|
+
0.0063, 0.0207, 0.973
|
|
103
|
+
])
|
|
104
|
+
}
|
|
105
|
+
} as const
|
|
106
|
+
|
|
107
|
+
export type ColorSpace = keyof typeof colorMatrixConversionMap
|
package/src/worker/worker.ts
CHANGED
|
@@ -5,8 +5,10 @@ import { queryRemoteFonts } from 'lfa-ponyfill'
|
|
|
5
5
|
|
|
6
6
|
import WASM from '../wasm/jassub-worker.js'
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { Canvas2DRenderer } from './renderers/2d-renderer.ts'
|
|
9
|
+
import { WebGL1Renderer } from './renderers/webgl1-renderer.ts'
|
|
10
|
+
import { WebGL2Renderer } from './renderers/webgl2-renderer.ts'
|
|
11
|
+
import { _applyKeys, _fetch, fetchtext, LIBASS_YCBCR_MAP, THREAD_COUNT, WEIGHT_MAP, type ASSEvent, type ASSImage, type ASSStyle, type WeightValue } from './util.ts'
|
|
10
12
|
|
|
11
13
|
import type { JASSUB, MainModule } from '../wasm/types.d.ts'
|
|
12
14
|
// import { WebGPURenderer } from './webgpu-renderer'
|
|
@@ -38,7 +40,7 @@ export class ASSRenderer {
|
|
|
38
40
|
_subtitleColorSpace?: 'BT601' | 'BT709' | 'SMPTE240M' | 'FCC' | null
|
|
39
41
|
_videoColorSpace?: 'BT709' | 'BT601'
|
|
40
42
|
_malloc!: (size: number) => number
|
|
41
|
-
_gpurender
|
|
43
|
+
_gpurender: WebGL2Renderer | WebGL1Renderer | Canvas2DRenderer
|
|
42
44
|
|
|
43
45
|
debug = false
|
|
44
46
|
|
|
@@ -57,7 +59,7 @@ export class ASSRenderer {
|
|
|
57
59
|
globalThis.fetch = _ => _fetch(data.wasmUrl)
|
|
58
60
|
|
|
59
61
|
// TODO: abslink doesnt support transferables yet
|
|
60
|
-
const handleMessage =
|
|
62
|
+
const handleMessage = ({ data }: MessageEvent) => {
|
|
61
63
|
if (data.name === 'offscreenCanvas') {
|
|
62
64
|
// await this._ready // needed for webGPU
|
|
63
65
|
this._offCanvas = data.ctrl
|
|
@@ -70,6 +72,16 @@ export class ASSRenderer {
|
|
|
70
72
|
// const devicePromise = navigator.gpu?.requestAdapter({
|
|
71
73
|
// powerPreference: 'high-performance'
|
|
72
74
|
// }).then(adapter => adapter?.requestDevice())
|
|
75
|
+
try {
|
|
76
|
+
const testCanvas = new OffscreenCanvas(1, 1)
|
|
77
|
+
if (testCanvas.getContext('webgl2')) {
|
|
78
|
+
this._gpurender = new WebGL2Renderer()
|
|
79
|
+
} else {
|
|
80
|
+
this._gpurender = testCanvas.getContext('webgl') ? new WebGL1Renderer() : new Canvas2DRenderer()
|
|
81
|
+
}
|
|
82
|
+
} catch {
|
|
83
|
+
this._gpurender = new Canvas2DRenderer()
|
|
84
|
+
}
|
|
73
85
|
|
|
74
86
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
75
87
|
this._ready = (WASM({ __url: data.wasmUrl, __out: (log: string) => this._log(log) }) as Promise<MainModule>).then(async ({ _malloc, JASSUB }) => {
|
|
@@ -78,7 +90,7 @@ export class ASSRenderer {
|
|
|
78
90
|
this._wasm = new JASSUB(data.width, data.height, this._defaultFont)
|
|
79
91
|
// Firefox seems to have issues with multithreading in workers
|
|
80
92
|
// a worker inside a worker does not recieve messages properly
|
|
81
|
-
this._wasm.setThreads(
|
|
93
|
+
this._wasm.setThreads(THREAD_COUNT)
|
|
82
94
|
|
|
83
95
|
this._loadInitialFonts(data.fonts)
|
|
84
96
|
|