jassub 2.4.3 → 2.5.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 CHANGED
@@ -38,7 +38,7 @@ The
38
38
 
39
39
  headers are recommended to use this library, as it uses SharedArrayBuffer for multi-threading, but if you can't set them, it will fallback automatically to work in single-threaded mode. Firefox doesn't support threading so they are not required there.
40
40
 
41
- At minimum WASM + TextDecoder + OffscreenCanvas + Web Workers + Proxy + AbortController + Fetch + Promise + getVideoPlaybackQuality/requestVideoFrameCallback are required for JASSUB to work.
41
+ At minimum WASM + TextDecoder + OffscreenCanvas + Web Workers + Proxy + Fetch + Promise + getVideoPlaybackQuality/requestVideoFrameCallback are required for JASSUB to work.
42
42
 
43
43
  <!--
44
44
  WASM: 57 11 52 / 51 11 47
@@ -49,12 +49,11 @@ BigInt: 67 15 68
49
49
  Web Workers: 4 4 3.5
50
50
  Promise: 33 7.1 29 / 4 3.1 2
51
51
  Proxy: 49 10 18
52
- AbortController: 66 12 57 / 4 3.1 2
53
52
  Fetch: 42 10.1 39 / 41 10.1 34
54
53
  getVPQ/rVFC: 80 8 42 / 28 8 42
55
54
  -->
56
55
 
57
- JASSUB supports Chrome/Safari/Firefox 80/17/105, you bring the support down to 67/16.2/68 if you enable some flags/settings in your browser for these features, and polyfill AbortController. For other engines other polyfills might be needed. Babel is also recommended if you need to support older JS engines as JASSUB ships as ES modules with modern syntax.
56
+ JASSUB supports Chrome/Safari/Firefox 80/17/105, you bring the support down to 67/16.2/68 if you enable some flags/settings in your browser for these features. For other engines polyfills might be needed. Babel is also recommended if you need to support older JS engines as JASSUB ships as ES modules with modern syntax.
58
57
 
59
58
  <!-- See https://github.com/gpuweb/gpuweb/wiki/Implementation-Status for a WebGPU support table, and what flags you might need to enable it in your browser if you want to utilise it instead of WebGL2. -->
60
59
 
@@ -108,7 +107,7 @@ const instance = new JASSUB({
108
107
 
109
108
  await instance.ready
110
109
 
111
- instance.setCurrentTime(15)
110
+ instance.manualRender({ expectedDisplayTime: performance.now(), width: 1920, height: 1080, mediaTime: 10.20 })
112
111
  ```
113
112
 
114
113
  # Docs
package/dist/jassub.d.ts CHANGED
@@ -3,6 +3,12 @@ import { Debug } from './debug.ts';
3
3
  import type { WeightValue } from './worker/util.ts';
4
4
  import type { ASSRenderer } from './worker/worker';
5
5
  import type { Remote } from 'abslink';
6
+ export declare const webYCbCrMap: {
7
+ readonly rgb: "RGB";
8
+ readonly bt709: "BT709";
9
+ readonly bt470bg: "BT601";
10
+ readonly smpte170m: "BT601";
11
+ };
6
12
  export type JASSUBOptions = {
7
13
  timeOffset?: number;
8
14
  debug?: boolean;
@@ -45,8 +51,6 @@ export default class JASSUB {
45
51
  _videoHeight: number;
46
52
  _videoColorSpace: string | null;
47
53
  _canvas: HTMLCanvasElement;
48
- _canvasParent: HTMLDivElement | undefined;
49
- _ctrl: AbortController;
50
54
  _ro: ResizeObserver;
51
55
  _destroyed: boolean;
52
56
  _lastDemandTime: Pick<VideoFrameCallbackMetadata, 'expectedDisplayTime' | 'width' | 'height' | 'mediaTime'>;
@@ -55,23 +59,28 @@ export default class JASSUB {
55
59
  constructor(opts: JASSUBOptions);
56
60
  static _supportsSIMD?: boolean;
57
61
  static _test(): void;
58
- resize(forceRepaint?: boolean, width?: number, height?: number, top?: number, left?: number): Promise<void>;
59
- _getVideoPosition(width?: number, height?: number): {
60
- width: number;
61
- height: number;
62
+ resize(forceRepaint?: boolean, renderWidth?: number, renderHeight?: number): Promise<void>;
63
+ _getElementBoundingBox(el: Element, videoWidth: number, videoHeight: number): {
62
64
  x: number;
63
65
  y: number;
66
+ width: number;
67
+ height: number;
64
68
  };
65
- _computeCanvasSize(width?: number, height?: number): {
69
+ _computeRenderSize(width?: number, height?: number): {
66
70
  width: number;
67
71
  height: number;
68
72
  };
69
- setVideo(video: HTMLVideoElement): Promise<void>;
73
+ setVideo(target: HTMLVideoElement): Promise<void>;
70
74
  _getLocalFont(font: string, weight?: WeightValue): Promise<Uint8Array<ArrayBuffer> | undefined>;
71
75
  _handleRVFC(data: VideoFrameCallbackMetadata): void;
72
76
  manualRender(data: Pick<VideoFrameCallbackMetadata, 'expectedDisplayTime' | 'width' | 'height' | 'mediaTime'>): Promise<void>;
73
77
  _demandRender(repaint?: boolean): Promise<void>;
74
- _updateColorSpace(): Promise<void>;
78
+ _boundUpdateColorSpace: ({ target }: {
79
+ target: EventTarget | null;
80
+ }) => void;
81
+ _updateColorSpace({ target }: {
82
+ target: EventTarget | null;
83
+ }): void;
75
84
  _removeListeners(): void;
76
85
  destroy(): Promise<void>;
77
86
  }
package/dist/jassub.js CHANGED
@@ -2,7 +2,7 @@ import 'rvfc-polyfill';
2
2
  import { proxy, releaseProxy } from 'abslink';
3
3
  import { wrap } from 'abslink/w3c';
4
4
  import { Debug } from "./debug.js";
5
- const webYCbCrMap = {
5
+ export const webYCbCrMap = {
6
6
  rgb: 'RGB',
7
7
  bt709: 'BT709',
8
8
  // these might not be exactly correct? oops?
@@ -23,8 +23,6 @@ export default class JASSUB {
23
23
  _videoHeight = 0;
24
24
  _videoColorSpace = null;
25
25
  _canvas;
26
- _canvasParent;
27
- _ctrl = new AbortController();
28
26
  _ro = new ResizeObserver(async () => {
29
27
  await this.ready;
30
28
  this.resize();
@@ -45,14 +43,10 @@ export default class JASSUB {
45
43
  this._video = opts.video;
46
44
  this._canvas = opts.canvas ?? document.createElement('canvas');
47
45
  if (this._video && !opts.canvas) {
48
- this._canvasParent = document.createElement('div');
49
- this._canvasParent.className = 'JASSUB';
50
- this._canvasParent.style.position = 'relative';
51
- this._canvas.style.display = 'block';
46
+ this._canvas.className = 'JASSUB';
52
47
  this._canvas.style.position = 'absolute';
53
48
  this._canvas.style.pointerEvents = 'none';
54
- this._canvasParent.appendChild(this._canvas);
55
- this._video.insertAdjacentElement('afterend', this._canvasParent);
49
+ this._video.insertAdjacentElement('afterend', this._canvas);
56
50
  }
57
51
  const ctrl = this._canvas.transferControlToOffscreen();
58
52
  this.debug = opts.debug ? new Debug() : null;
@@ -87,8 +81,12 @@ export default class JASSUB {
87
81
  }, proxy(font => this._getLocalFont(font)));
88
82
  await this.renderer.ready();
89
83
  })();
90
- if (this._video)
84
+ if (this._video) {
91
85
  this.setVideo(this._video);
86
+ }
87
+ else {
88
+ this._ro.observe(this._canvas);
89
+ }
92
90
  this._worker.postMessage({ name: 'offscreenCanvas', ctrl }, [ctrl]);
93
91
  }
94
92
  static _supportsSIMD;
@@ -105,94 +103,71 @@ export default class JASSUB {
105
103
  if (!(module instanceof WebAssembly.Module) || !(new WebAssembly.Instance(module) instanceof WebAssembly.Instance))
106
104
  throw new Error('WASM not supported');
107
105
  }
108
- async resize(forceRepaint = !!this._video?.paused, width = 0, height = 0, top = 0, left = 0) {
109
- if ((!width || !height) && this._video) {
110
- const videoSize = this._getVideoPosition();
111
- let renderSize = null;
112
- // support anamorphic video
113
- if (this._videoWidth) {
114
- const widthRatio = this._video.videoWidth / this._videoWidth;
115
- const heightRatio = this._video.videoHeight / this._videoHeight;
116
- renderSize = this._computeCanvasSize((videoSize.width || 0) / widthRatio, (videoSize.height || 0) / heightRatio);
117
- }
118
- else {
119
- renderSize = this._computeCanvasSize(videoSize.width || 0, videoSize.height || 0);
120
- }
121
- width = renderSize.width;
122
- height = renderSize.height;
123
- if (this._canvasParent) {
124
- top = videoSize.y - (this._canvasParent.getBoundingClientRect().top - this._video.getBoundingClientRect().top);
125
- left = videoSize.x;
126
- }
127
- this._canvas.style.width = videoSize.width + 'px';
128
- this._canvas.style.height = videoSize.height + 'px';
106
+ async resize(forceRepaint = !!this._video?.paused, renderWidth = 0, renderHeight = 0) {
107
+ const videoWidth = this._video?.videoWidth ?? this._videoWidth;
108
+ const videoHeight = this._video?.videoHeight ?? this._videoHeight;
109
+ const videoSize = this._getElementBoundingBox(this._video ?? this._canvas, videoWidth, videoHeight);
110
+ if (!renderWidth || !renderHeight) {
111
+ // || 1 for divide by zero safety
112
+ const widthScale = (this._videoWidth / videoWidth) || 1;
113
+ const heightScale = (this._videoHeight / videoHeight) || 1;
114
+ const { width, height } = this._computeRenderSize(videoSize.width * widthScale, videoSize.height * heightScale);
115
+ renderWidth = Math.round(width);
116
+ renderHeight = Math.round(height);
129
117
  }
130
- if (this._canvasParent) {
131
- this._canvas.style.top = top + 'px';
132
- this._canvas.style.left = left + 'px';
118
+ if (this._video) {
119
+ this._canvas.style.width = Math.round(videoSize.width) + 'px';
120
+ this._canvas.style.height = Math.round(videoSize.height) + 'px';
121
+ this._canvas.style.top = videoSize.y + 'px';
122
+ this._canvas.style.left = videoSize.x + 'px';
133
123
  }
134
- await this.renderer._resizeCanvas(width, height, (this._videoWidth || this._video?.videoWidth) ?? width, (this._videoHeight || this._video?.videoHeight) ?? height);
124
+ await this.renderer._resizeCanvas(renderWidth, renderHeight, this._videoWidth || renderWidth, this._videoHeight || renderHeight);
135
125
  if (this._lastDemandTime)
136
126
  await this._demandRender(forceRepaint);
137
127
  }
138
- _getVideoPosition(width = this._video.videoWidth, height = this._video.videoHeight) {
139
- const videoRatio = width / height;
140
- const { offsetWidth, offsetHeight } = this._video;
141
- const elementRatio = offsetWidth / offsetHeight;
142
- width = offsetWidth;
143
- height = offsetHeight;
128
+ _getElementBoundingBox(el, videoWidth, videoHeight) {
129
+ const { width, height, x, y } = el.getBoundingClientRect();
130
+ const videoRatio = videoWidth / videoHeight;
131
+ const elementRatio = width / height;
144
132
  if (elementRatio > videoRatio) {
145
- width = Math.floor(offsetHeight * videoRatio);
133
+ videoHeight = height;
134
+ videoWidth = height * videoRatio;
146
135
  }
147
136
  else {
148
- height = Math.floor(offsetWidth / videoRatio);
137
+ videoHeight = width / videoRatio;
138
+ videoWidth = width;
149
139
  }
150
- const x = (offsetWidth - width) / 2;
151
- const y = (offsetHeight - height) / 2;
152
- return { width, height, x, y };
140
+ return { x: x + (width - videoWidth) / 2, y: y + (height - videoHeight) / 2, width: videoWidth, height: videoHeight };
153
141
  }
154
- _computeCanvasSize(width = 0, height = 0) {
142
+ _computeRenderSize(width = 0, height = 0) {
143
+ if (height <= 0 || width <= 0)
144
+ return { width: 0, height: 0 };
155
145
  const scalefactor = this.prescaleFactor <= 0 ? 1.0 : this.prescaleFactor;
156
146
  const ratio = self.devicePixelRatio || 1;
157
- if (height <= 0 || width <= 0) {
158
- width = 0;
159
- height = 0;
160
- }
161
- else {
162
- const sgn = scalefactor < 1 ? -1 : 1;
163
- let newH = height * ratio;
164
- if (sgn * newH * scalefactor <= sgn * this.prescaleHeightLimit) {
165
- newH *= scalefactor;
166
- }
167
- else if (sgn * newH < sgn * this.prescaleHeightLimit) {
168
- newH = this.prescaleHeightLimit;
169
- }
170
- if (this.maxRenderHeight > 0 && newH > this.maxRenderHeight)
171
- newH = this.maxRenderHeight;
172
- width *= newH / height;
173
- height = newH;
174
- }
147
+ const sgn = scalefactor < 1 ? -1 : 1;
148
+ let newH = height * ratio;
149
+ if (sgn * newH * scalefactor <= sgn * this.prescaleHeightLimit) {
150
+ newH *= scalefactor;
151
+ }
152
+ else if (sgn * newH < sgn * this.prescaleHeightLimit) {
153
+ newH = this.prescaleHeightLimit;
154
+ }
155
+ if (this.maxRenderHeight > 0 && newH > this.maxRenderHeight)
156
+ newH = this.maxRenderHeight;
157
+ width *= newH / height;
158
+ height = newH;
175
159
  return { width, height };
176
160
  }
177
- async setVideo(video) {
178
- if (video instanceof HTMLVideoElement) {
179
- this._removeListeners();
180
- this._video = video;
181
- await this.ready;
182
- this._video.requestVideoFrameCallback((now, data) => this._handleRVFC(data));
183
- // everything else is unreliable for this, loadedmetadata and loadeddata included.
184
- if ('VideoFrame' in globalThis) {
185
- video.addEventListener('loadedmetadata', () => this._updateColorSpace(), this._ctrl);
186
- if (video.readyState > 2)
187
- this._updateColorSpace();
188
- }
189
- if (video.videoWidth > 0)
190
- this.resize();
191
- this._ro.observe(video);
192
- }
193
- else {
194
- throw new Error('Video element invalid!');
161
+ async setVideo(target) {
162
+ this._removeListeners();
163
+ this._video = target;
164
+ this._ro.observe(target);
165
+ if (typeof VideoFrame !== 'undefined') {
166
+ target.addEventListener('loadedmetadata', this._boundUpdateColorSpace);
167
+ this._updateColorSpace({ target });
195
168
  }
169
+ await this.ready;
170
+ this._video.requestVideoFrameCallback((now, data) => this._handleRVFC(data));
196
171
  }
197
172
  async _getLocalFont(font, weight = 'regular') {
198
173
  // electron by default has all permissions enabled, and it doesn't have perm query
@@ -242,12 +217,15 @@ export default class JASSUB {
242
217
  if (this._skipped)
243
218
  await this._demandRender();
244
219
  }
245
- async _updateColorSpace() {
246
- await this.ready;
220
+ _boundUpdateColorSpace = this._updateColorSpace.bind(this);
221
+ _updateColorSpace({ target }) {
247
222
  this._video.requestVideoFrameCallback(async () => {
223
+ if (this._destroyed || this._video !== target)
224
+ return;
248
225
  try {
249
226
  const frame = new VideoFrame(this._video);
250
227
  frame.close();
228
+ await this.ready;
251
229
  await this.renderer._setColorSpace(webYCbCrMap[frame.colorSpace.matrix]);
252
230
  }
253
231
  catch (e) {
@@ -257,19 +235,14 @@ export default class JASSUB {
257
235
  });
258
236
  }
259
237
  _removeListeners() {
260
- if (this._video) {
261
- if (this._ro)
262
- this._ro.unobserve(this._video);
263
- this._ctrl.abort();
264
- this._ctrl = new AbortController();
265
- }
238
+ this._ro.disconnect();
239
+ this._video?.removeEventListener('loadedmetadata', this._boundUpdateColorSpace);
266
240
  }
267
241
  async destroy() {
268
242
  if (this._destroyed)
269
243
  return;
270
244
  this._destroyed = true;
271
- if (this._video && this._canvasParent)
272
- this._video.parentNode?.removeChild(this._canvasParent);
245
+ this._canvas.remove();
273
246
  this._removeListeners();
274
247
  await this.renderer?.[releaseProxy]();
275
248
  this._worker.terminate();
@@ -1 +1 @@
1
- {"version":3,"file":"jassub.js","sourceRoot":"","sources":["../src/jassub.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jassub.js","sourceRoot":"","sources":["../src/jassub.ts"],"names":[],"mappings":"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"}
@@ -11,8 +11,9 @@ export const WEIGHT_MAP = [
11
11
  'black',
12
12
  'ultrablack'
13
13
  ];
14
- export const IS_FIREFOX = navigator.userAgent.toLowerCase().includes('firefox');
15
- export const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
14
+ const UA = navigator.userAgent.toLowerCase();
15
+ export const IS_FIREFOX = UA.includes('firefox');
16
+ export const IS_SAFARI = /applewebkit\/[\d.]+ \(khtml, like gecko\)(?!.*chrome\/)/.test(UA);
16
17
  const a = 'BT601';
17
18
  const b = 'BT709';
18
19
  const c = 'SMPTE240M';
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/worker/util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/worker/util.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jassub",
3
- "version": "2.4.3",
3
+ "version": "2.5.0",
4
4
  "description": "The Fastest JavaScript SSA/ASS Subtitle Renderer For Browsers",
5
5
  "main": "dist/jassub.js",
6
6
  "type": "module",
package/src/jassub.ts CHANGED
@@ -14,7 +14,7 @@ declare const self: typeof globalThis & {
14
14
  queryLocalFonts: (opts?: { postscriptNames?: string[] }) => ReturnType<typeof queryRemoteFonts>
15
15
  }
16
16
 
17
- const webYCbCrMap = {
17
+ export const webYCbCrMap = {
18
18
  rgb: 'RGB',
19
19
  bt709: 'BT709',
20
20
  // these might not be exactly correct? oops?
@@ -65,8 +65,6 @@ export default class JASSUB {
65
65
  _videoHeight = 0
66
66
  _videoColorSpace: string | null = null
67
67
  _canvas
68
- _canvasParent
69
- _ctrl = new AbortController()
70
68
  _ro = new ResizeObserver(async () => {
71
69
  await this.ready
72
70
  this.resize()
@@ -87,16 +85,11 @@ export default class JASSUB {
87
85
  this._video = opts.video
88
86
  this._canvas = opts.canvas ?? document.createElement('canvas')
89
87
  if (this._video && !opts.canvas) {
90
- this._canvasParent = document.createElement('div')
91
- this._canvasParent.className = 'JASSUB'
92
- this._canvasParent.style.position = 'relative'
93
-
94
- this._canvas.style.display = 'block'
88
+ this._canvas.className = 'JASSUB'
95
89
  this._canvas.style.position = 'absolute'
96
90
  this._canvas.style.pointerEvents = 'none'
97
- this._canvasParent.appendChild(this._canvas)
98
91
 
99
- this._video.insertAdjacentElement('afterend', this._canvasParent)
92
+ this._video.insertAdjacentElement('afterend', this._canvas)
100
93
  }
101
94
 
102
95
  const ctrl = this._canvas.transferControlToOffscreen()
@@ -141,7 +134,11 @@ export default class JASSUB {
141
134
  await this.renderer.ready()
142
135
  })()
143
136
 
144
- if (this._video) this.setVideo(this._video)
137
+ if (this._video) {
138
+ this.setVideo(this._video)
139
+ } else {
140
+ this._ro.observe(this._canvas)
141
+ }
145
142
  this._worker.postMessage({ name: 'offscreenCanvas', ctrl }, [ctrl])
146
143
  }
147
144
 
@@ -160,102 +157,88 @@ export default class JASSUB {
160
157
  if (!(module instanceof WebAssembly.Module) || !(new WebAssembly.Instance(module) instanceof WebAssembly.Instance)) throw new Error('WASM not supported')
161
158
  }
162
159
 
163
- async resize (forceRepaint = !!this._video?.paused, width = 0, height = 0, top = 0, left = 0) {
164
- if ((!width || !height) && this._video) {
165
- const videoSize = this._getVideoPosition()
166
- let renderSize = null
167
- // support anamorphic video
168
- if (this._videoWidth) {
169
- const widthRatio = this._video.videoWidth / this._videoWidth
170
- const heightRatio = this._video.videoHeight / this._videoHeight
171
- renderSize = this._computeCanvasSize((videoSize.width || 0) / widthRatio, (videoSize.height || 0) / heightRatio)
172
- } else {
173
- renderSize = this._computeCanvasSize(videoSize.width || 0, videoSize.height || 0)
174
- }
175
- width = renderSize.width
176
- height = renderSize.height
177
- if (this._canvasParent) {
178
- top = videoSize.y - (this._canvasParent.getBoundingClientRect().top - this._video.getBoundingClientRect().top)
179
- left = videoSize.x
180
- }
181
- this._canvas.style.width = videoSize.width + 'px'
182
- this._canvas.style.height = videoSize.height + 'px'
160
+ async resize (forceRepaint = !!this._video?.paused, renderWidth = 0, renderHeight = 0) {
161
+ const videoWidth = this._video?.videoWidth ?? this._videoWidth
162
+ const videoHeight = this._video?.videoHeight ?? this._videoHeight
163
+ const videoSize = this._getElementBoundingBox(this._video ?? this._canvas, videoWidth, videoHeight)
164
+
165
+ if (!renderWidth || !renderHeight) {
166
+ // || 1 for divide by zero safety
167
+ const widthScale = (this._videoWidth / videoWidth) || 1
168
+ const heightScale = (this._videoHeight / videoHeight) || 1
169
+
170
+ const { width, height } = this._computeRenderSize(videoSize.width * widthScale, videoSize.height * heightScale)
171
+ renderWidth = Math.round(width)
172
+ renderHeight = Math.round(height)
183
173
  }
184
174
 
185
- if (this._canvasParent) {
186
- this._canvas.style.top = top + 'px'
187
- this._canvas.style.left = left + 'px'
175
+ if (this._video) {
176
+ this._canvas.style.width = Math.round(videoSize.width) + 'px'
177
+ this._canvas.style.height = Math.round(videoSize.height) + 'px'
178
+ this._canvas.style.top = videoSize.y + 'px'
179
+ this._canvas.style.left = videoSize.x + 'px'
188
180
  }
189
181
 
190
182
  await this.renderer._resizeCanvas(
191
- width,
192
- height,
193
- (this._videoWidth || this._video?.videoWidth) ?? width,
194
- (this._videoHeight || this._video?.videoHeight) ?? height
183
+ renderWidth,
184
+ renderHeight,
185
+ this._videoWidth || renderWidth,
186
+ this._videoHeight || renderHeight
195
187
  )
196
188
 
197
189
  if (this._lastDemandTime) await this._demandRender(forceRepaint)
198
190
  }
199
191
 
200
- _getVideoPosition (width = this._video!.videoWidth, height = this._video!.videoHeight) {
201
- const videoRatio = width / height
202
- const { offsetWidth, offsetHeight } = this._video!
203
- const elementRatio = offsetWidth / offsetHeight
204
- width = offsetWidth
205
- height = offsetHeight
192
+ _getElementBoundingBox (el: Element, videoWidth: number, videoHeight: number) {
193
+ const { width, height, x, y } = el.getBoundingClientRect()
194
+
195
+ const videoRatio = videoWidth / videoHeight
196
+ const elementRatio = width / height
197
+
206
198
  if (elementRatio > videoRatio) {
207
- width = Math.floor(offsetHeight * videoRatio)
199
+ videoHeight = height
200
+ videoWidth = height * videoRatio
208
201
  } else {
209
- height = Math.floor(offsetWidth / videoRatio)
202
+ videoHeight = width / videoRatio
203
+ videoWidth = width
210
204
  }
211
205
 
212
- const x = (offsetWidth - width) / 2
213
- const y = (offsetHeight - height) / 2
214
-
215
- return { width, height, x, y }
206
+ return { x: x + (width - videoWidth) / 2, y: y + (height - videoHeight) / 2, width: videoWidth, height: videoHeight }
216
207
  }
217
208
 
218
- _computeCanvasSize (width = 0, height = 0) {
209
+ _computeRenderSize (width = 0, height = 0) {
210
+ if (height <= 0 || width <= 0) return { width: 0, height: 0 }
211
+
219
212
  const scalefactor = this.prescaleFactor <= 0 ? 1.0 : this.prescaleFactor
220
213
  const ratio = self.devicePixelRatio || 1
221
214
 
222
- if (height <= 0 || width <= 0) {
223
- width = 0
224
- height = 0
225
- } else {
226
- const sgn = scalefactor < 1 ? -1 : 1
227
- let newH = height * ratio
228
- if (sgn * newH * scalefactor <= sgn * this.prescaleHeightLimit) {
229
- newH *= scalefactor
230
- } else if (sgn * newH < sgn * this.prescaleHeightLimit) {
231
- newH = this.prescaleHeightLimit
232
- }
215
+ const sgn = scalefactor < 1 ? -1 : 1
216
+ let newH = height * ratio
217
+ if (sgn * newH * scalefactor <= sgn * this.prescaleHeightLimit) {
218
+ newH *= scalefactor
219
+ } else if (sgn * newH < sgn * this.prescaleHeightLimit) {
220
+ newH = this.prescaleHeightLimit
221
+ }
233
222
 
234
- if (this.maxRenderHeight > 0 && newH > this.maxRenderHeight) newH = this.maxRenderHeight
223
+ if (this.maxRenderHeight > 0 && newH > this.maxRenderHeight) newH = this.maxRenderHeight
235
224
 
236
- width *= newH / height
237
- height = newH
238
- }
225
+ width *= newH / height
226
+ height = newH
239
227
 
240
228
  return { width, height }
241
229
  }
242
230
 
243
- async setVideo (video: HTMLVideoElement) {
244
- if (video instanceof HTMLVideoElement) {
245
- this._removeListeners()
246
- this._video = video
247
- await this.ready
248
- this._video.requestVideoFrameCallback((now, data) => this._handleRVFC(data))
249
- // everything else is unreliable for this, loadedmetadata and loadeddata included.
250
- if ('VideoFrame' in globalThis) {
251
- video.addEventListener('loadedmetadata', () => this._updateColorSpace(), this._ctrl)
252
- if (video.readyState > 2) this._updateColorSpace()
253
- }
254
- if (video.videoWidth > 0) this.resize()
255
- this._ro.observe(video)
256
- } else {
257
- throw new Error('Video element invalid!')
231
+ async setVideo (target: HTMLVideoElement) {
232
+ this._removeListeners()
233
+ this._video = target
234
+ this._ro.observe(target)
235
+ if (typeof VideoFrame !== 'undefined') {
236
+ target.addEventListener('loadedmetadata', this._boundUpdateColorSpace)
237
+ this._updateColorSpace({ target })
258
238
  }
239
+
240
+ await this.ready
241
+ this._video.requestVideoFrameCallback((now, data) => this._handleRVFC(data))
259
242
  }
260
243
 
261
244
  async _getLocalFont (font: string, weight: WeightValue = 'regular') {
@@ -314,12 +297,15 @@ export default class JASSUB {
314
297
  if (this._skipped) await this._demandRender()
315
298
  }
316
299
 
317
- async _updateColorSpace () {
318
- await this.ready
300
+ _boundUpdateColorSpace = this._updateColorSpace.bind(this)
301
+
302
+ _updateColorSpace ({ target }: { target: EventTarget | null }) {
319
303
  this._video!.requestVideoFrameCallback(async () => {
304
+ if (this._destroyed || this._video !== target) return
320
305
  try {
321
- const frame = new VideoFrame(this._video!)
306
+ const frame = new VideoFrame(this._video)
322
307
  frame.close()
308
+ await this.ready
323
309
  await this.renderer._setColorSpace(webYCbCrMap[frame.colorSpace.matrix!])
324
310
  } catch (e) {
325
311
  // sources can be tainted
@@ -329,17 +315,14 @@ export default class JASSUB {
329
315
  }
330
316
 
331
317
  _removeListeners () {
332
- if (this._video) {
333
- if (this._ro) this._ro.unobserve(this._video)
334
- this._ctrl.abort()
335
- this._ctrl = new AbortController()
336
- }
318
+ this._ro.disconnect()
319
+ this._video?.removeEventListener('loadedmetadata', this._boundUpdateColorSpace)
337
320
  }
338
321
 
339
322
  async destroy () {
340
323
  if (this._destroyed) return
341
324
  this._destroyed = true
342
- if (this._video && this._canvasParent) this._video.parentNode?.removeChild(this._canvasParent)
325
+ this._canvas.remove()
343
326
  this._removeListeners()
344
327
  await this.renderer?.[releaseProxy]()
345
328
  this._worker.terminate()
@@ -21,8 +21,9 @@ export const WEIGHT_MAP = [
21
21
 
22
22
  export type WeightValue = typeof WEIGHT_MAP[number]
23
23
 
24
- export const IS_FIREFOX = navigator.userAgent.toLowerCase().includes('firefox')
25
- export const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent)
24
+ const UA = navigator.userAgent.toLowerCase()
25
+ export const IS_FIREFOX = UA.includes('firefox')
26
+ export const IS_SAFARI = /applewebkit\/[\d.]+ \(khtml, like gecko\)(?!.*chrome\/)/.test(UA)
26
27
 
27
28
  const a = 'BT601'
28
29
  const b = 'BT709'