libbitsub 1.12.0 → 1.13.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.
Files changed (77) hide show
  1. package/README.md +6 -4
  2. package/dist/index.d.ts +5 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +5 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/integrations/hlsjs.d.ts +6 -0
  7. package/dist/integrations/hlsjs.d.ts.map +1 -1
  8. package/dist/integrations/hlsjs.js +3 -0
  9. package/dist/integrations/hlsjs.js.map +1 -1
  10. package/dist/integrations/index.d.ts +10 -2
  11. package/dist/integrations/index.d.ts.map +1 -1
  12. package/dist/integrations/index.js +10 -2
  13. package/dist/integrations/index.js.map +1 -1
  14. package/dist/integrations/react.d.ts +10 -1
  15. package/dist/integrations/react.d.ts.map +1 -1
  16. package/dist/integrations/react.js +4 -1
  17. package/dist/integrations/react.js.map +1 -1
  18. package/dist/integrations/shaka.d.ts +6 -0
  19. package/dist/integrations/shaka.d.ts.map +1 -1
  20. package/dist/integrations/shaka.js +3 -0
  21. package/dist/integrations/shaka.js.map +1 -1
  22. package/dist/integrations/shared.d.ts +2 -0
  23. package/dist/integrations/shared.d.ts.map +1 -1
  24. package/dist/integrations/shared.js.map +1 -1
  25. package/dist/integrations/videojs.d.ts +9 -0
  26. package/dist/integrations/videojs.d.ts.map +1 -1
  27. package/dist/integrations/videojs.js +3 -0
  28. package/dist/integrations/videojs.js.map +1 -1
  29. package/dist/ts/capabilities.d.ts +6 -0
  30. package/dist/ts/capabilities.d.ts.map +1 -1
  31. package/dist/ts/capabilities.js +6 -0
  32. package/dist/ts/capabilities.js.map +1 -1
  33. package/dist/ts/diagnostics.d.ts +6 -0
  34. package/dist/ts/diagnostics.d.ts.map +1 -1
  35. package/dist/ts/diagnostics.js +6 -0
  36. package/dist/ts/diagnostics.js.map +1 -1
  37. package/dist/ts/frame-export.d.ts +4 -0
  38. package/dist/ts/frame-export.d.ts.map +1 -1
  39. package/dist/ts/frame-export.js +14 -0
  40. package/dist/ts/frame-export.js.map +1 -1
  41. package/dist/ts/parsers.d.ts.map +1 -1
  42. package/dist/ts/parsers.js +8 -4
  43. package/dist/ts/parsers.js.map +1 -1
  44. package/dist/ts/range-loader.d.ts +8 -0
  45. package/dist/ts/range-loader.d.ts.map +1 -1
  46. package/dist/ts/range-loader.js +102 -21
  47. package/dist/ts/range-loader.js.map +1 -1
  48. package/dist/ts/renderers.d.ts +27 -4
  49. package/dist/ts/renderers.d.ts.map +1 -1
  50. package/dist/ts/renderers.js +225 -126
  51. package/dist/ts/renderers.js.map +1 -1
  52. package/dist/ts/types.d.ts +45 -0
  53. package/dist/ts/types.d.ts.map +1 -1
  54. package/dist/ts/utils.d.ts +16 -0
  55. package/dist/ts/utils.d.ts.map +1 -1
  56. package/dist/ts/utils.js +70 -15
  57. package/dist/ts/utils.js.map +1 -1
  58. package/dist/ts/video-frame-scheduler.d.ts +18 -1
  59. package/dist/ts/video-frame-scheduler.d.ts.map +1 -1
  60. package/dist/ts/video-frame-scheduler.js +83 -4
  61. package/dist/ts/video-frame-scheduler.js.map +1 -1
  62. package/dist/ts/worker.d.ts.map +1 -1
  63. package/dist/ts/worker.js +15 -6
  64. package/dist/ts/worker.js.map +1 -1
  65. package/package.json +6 -1
  66. package/pkg/README.md +6 -4
  67. package/pkg/libbitsub.d.ts +15 -0
  68. package/pkg/libbitsub.js +27 -0
  69. package/pkg/libbitsub_bg.wasm +0 -0
  70. package/pkg/libbitsub_bg.wasm.d.ts +3 -0
  71. package/pkg/package.json +1 -1
  72. package/src/integrations/hlsjs.ts +6 -0
  73. package/src/integrations/index.ts +10 -2
  74. package/src/integrations/react.tsx +10 -1
  75. package/src/integrations/shaka.ts +6 -0
  76. package/src/integrations/shared.ts +2 -0
  77. package/src/integrations/videojs.ts +9 -0
@@ -1,3 +1,10 @@
1
+ const defaultWatchdogTimer = {
2
+ now: () => performance.now(),
3
+ request: (callback, delay) => setTimeout(callback, delay),
4
+ cancel: (handle) => clearTimeout(handle)
5
+ };
6
+ const watchdogInterval = 250;
7
+ const watchdogGrace = 1000;
1
8
  const defaultAnimationFrameScheduler = {
2
9
  request: (callback) => requestAnimationFrame(callback),
3
10
  cancel: (handle) => cancelAnimationFrame(handle)
@@ -13,14 +20,21 @@ export class VideoFrameScheduler {
13
20
  video;
14
21
  onFrame;
15
22
  animationFrames;
23
+ watchdogTimer;
16
24
  animationFrameHandle = null;
17
25
  videoFrameHandle = null;
26
+ watchdogHandle = null;
27
+ lastWatchdogTime = 0;
28
+ lastProgressTime = 0;
29
+ lastVideoTime = 0;
30
+ progressingSince = null;
18
31
  generation = 0;
19
32
  useVideoFrames;
20
- constructor(video, frameAware, onFrame, animationFrames = defaultAnimationFrameScheduler) {
33
+ constructor(video, frameAware, onFrame, animationFrames = defaultAnimationFrameScheduler, watchdogTimer = defaultWatchdogTimer) {
21
34
  this.video = video;
22
35
  this.onFrame = onFrame;
23
36
  this.animationFrames = animationFrames;
37
+ this.watchdogTimer = watchdogTimer;
24
38
  this.useVideoFrames = supportsFrameAwareSync(video, frameAware);
25
39
  }
26
40
  get mode() {
@@ -28,11 +42,21 @@ export class VideoFrameScheduler {
28
42
  }
29
43
  start() {
30
44
  this.stop();
45
+ // Fallback is deliberate and permanent for this scheduler's lifetime,
46
+ // including restarts. Re-probing a stalled native-HLS callback source
47
+ // would repeatedly freeze subtitles for the watchdog grace period.
31
48
  const generation = this.generation;
49
+ this.resetWatchdogEvidence();
32
50
  this.schedule(generation);
51
+ if (this.useVideoFrames)
52
+ this.scheduleWatchdog(generation);
33
53
  }
34
54
  stop() {
35
55
  this.generation++;
56
+ if (this.watchdogHandle !== null) {
57
+ this.watchdogTimer.cancel(this.watchdogHandle);
58
+ this.watchdogHandle = null;
59
+ }
36
60
  if (this.videoFrameHandle !== null) {
37
61
  const cancelVideoFrameCallback = this.video.cancelVideoFrameCallback;
38
62
  if (typeof cancelVideoFrameCallback === 'function') {
@@ -50,6 +74,56 @@ export class VideoFrameScheduler {
50
74
  this.animationFrameHandle = null;
51
75
  }
52
76
  }
77
+ resetWatchdogEvidence() {
78
+ this.lastWatchdogTime = this.watchdogTimer.now();
79
+ this.lastProgressTime = this.lastWatchdogTime;
80
+ this.lastVideoTime = this.video.currentTime;
81
+ this.progressingSince = null;
82
+ }
83
+ scheduleWatchdog(generation) {
84
+ this.watchdogHandle = this.watchdogTimer.request(() => {
85
+ if (generation !== this.generation || !this.useVideoFrames)
86
+ return;
87
+ this.watchdogHandle = null;
88
+ const now = this.watchdogTimer.now();
89
+ const currentTime = this.video.currentTime;
90
+ const elapsed = now - this.lastWatchdogTime;
91
+ const playing = !this.video.paused &&
92
+ !this.video.seeking &&
93
+ !this.video.ended &&
94
+ (this.video.readyState === undefined || this.video.readyState >= 3);
95
+ if (!playing ||
96
+ !Number.isFinite(elapsed) ||
97
+ elapsed < 0 ||
98
+ elapsed > watchdogInterval * 3 ||
99
+ !Number.isFinite(currentTime) ||
100
+ !Number.isFinite(this.lastVideoTime) ||
101
+ currentTime < this.lastVideoTime) {
102
+ this.progressingSince = null;
103
+ this.lastProgressTime = now;
104
+ }
105
+ else if (currentTime > this.lastVideoTime) {
106
+ this.lastProgressTime = now;
107
+ this.progressingSince ??= this.lastWatchdogTime;
108
+ if (now - this.progressingSince >= watchdogGrace) {
109
+ // Invalidate the pending video callback before cancellation: some
110
+ // implementations can still deliver a cancelled callback.
111
+ this.useVideoFrames = false;
112
+ this.stop();
113
+ this.schedule(this.generation);
114
+ return;
115
+ }
116
+ }
117
+ else if (now - this.lastProgressTime >= watchdogGrace) {
118
+ // Brief equal samples can come from a quantized media clock. Only
119
+ // sustained inactivity discards progress, and only advancement fails.
120
+ this.progressingSince = null;
121
+ }
122
+ this.lastWatchdogTime = now;
123
+ this.lastVideoTime = currentTime;
124
+ this.scheduleWatchdog(generation);
125
+ }, watchdogInterval);
126
+ }
53
127
  schedule(generation) {
54
128
  if (generation !== this.generation)
55
129
  return;
@@ -58,9 +132,10 @@ export class VideoFrameScheduler {
58
132
  if (typeof requestVideoFrameCallback === 'function') {
59
133
  try {
60
134
  this.videoFrameHandle = requestVideoFrameCallback.call(this.video, (_now, metadata) => {
61
- this.videoFrameHandle = null;
62
- if (generation !== this.generation)
135
+ if (generation !== this.generation || !this.useVideoFrames)
63
136
  return;
137
+ this.videoFrameHandle = null;
138
+ this.resetWatchdogEvidence();
64
139
  const mediaTime = Number.isFinite(metadata.mediaTime) ? metadata.mediaTime : this.video.currentTime;
65
140
  try {
66
141
  this.onFrame({
@@ -82,10 +157,14 @@ export class VideoFrameScheduler {
82
157
  this.useVideoFrames = false;
83
158
  }
84
159
  }
160
+ if (this.watchdogHandle !== null) {
161
+ this.watchdogTimer.cancel(this.watchdogHandle);
162
+ this.watchdogHandle = null;
163
+ }
85
164
  this.animationFrameHandle = this.animationFrames.request(() => {
86
- this.animationFrameHandle = null;
87
165
  if (generation !== this.generation)
88
166
  return;
167
+ this.animationFrameHandle = null;
89
168
  try {
90
169
  this.onFrame({ mediaTime: this.video.currentTime, presentedFrames: null });
91
170
  }
@@ -1 +1 @@
1
- {"version":3,"file":"video-frame-scheduler.js","sourceRoot":"","sources":["../../src/ts/video-frame-scheduler.ts"],"names":[],"mappings":"AAkBA,MAAM,8BAA8B,GAA4B;IAC9D,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC;IACtD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC;CACjD,CAAA;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,OAAO,GAAG,IAAI;IAC5E,OAAO,OAAO,IAAI,OAAO,KAAK,CAAC,yBAAyB,KAAK,UAAU,CAAA;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IAOX,KAAK;IAEL,OAAO;IACP,eAAe;IAT1B,oBAAoB,GAAkB,IAAI,CAAA;IAC1C,gBAAgB,GAAkB,IAAI,CAAA;IACtC,UAAU,GAAG,CAAC,CAAA;IACd,cAAc,CAAS;IAE/B,YACmB,KAAuB,EACxC,UAAmB,EACF,OAAuC,EACvC,eAAe,GAA4B,8BAA8B;qBAHzE,KAAK;uBAEL,OAAO;+BACP,eAAe;QAEhC,IAAI,CAAC,cAAc,GAAG,sBAAsB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IACjE,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAA;IAChE,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,EAAE,CAAA;QACX,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QAClC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;IAC3B,CAAC;IAED,IAAI;QACF,IAAI,CAAC,UAAU,EAAE,CAAA;QAEjB,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACnC,MAAM,wBAAwB,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAA;YACpE,IAAI,OAAO,wBAAwB,KAAK,UAAU,EAAE,CAAC;gBACnD,IAAI,CAAC;oBACH,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;gBAClE,CAAC;gBAAC,MAAM,CAAC;oBACP,qEAAqE;gBACvE,CAAC;YACH,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;QAC9B,CAAC;QAED,IAAI,IAAI,CAAC,oBAAoB,KAAK,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YACtD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;QAClC,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,UAAkB;QACjC,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU;YAAE,OAAM;QAE1C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,yBAAyB,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAA;YACtE,IAAI,OAAO,yBAAyB,KAAK,UAAU,EAAE,CAAC;gBACpD,IAAI,CAAC;oBACH,IAAI,CAAC,gBAAgB,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;wBACpF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;wBAC5B,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU;4BAAE,OAAM;wBAE1C,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAA;wBACnG,IAAI,CAAC;4BACH,IAAI,CAAC,OAAO,CAAC;gCACX,SAAS;gCACT,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;6BAC7F,CAAC,CAAA;wBACJ,CAAC;gCAAS,CAAC;4BACT,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;wBAC3B,CAAC;oBACH,CAAC,CAAC,CAAA;oBACF,OAAM;gBACR,CAAC;gBAAC,MAAM,CAAC;oBACP,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;gBAC7B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;YAChC,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU;gBAAE,OAAM;YAC1C,IAAI,CAAC;gBACH,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5E,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"video-frame-scheduler.js","sourceRoot":"","sources":["../../src/ts/video-frame-scheduler.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/ts/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAiB5D,0CAA0C;AAC1C,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AA0sBD,kEAAkE;AAClE,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBnD;AAED,iDAAiD;AACjD,wBAAgB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtC;AAED,uEAAuE;AACvE,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3C;AAuED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,SAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAMtG;AAkDD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAc1C"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/ts/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAiB5D,0CAA0C;AAC1C,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAmtBD,kEAAkE;AAClE,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBnD;AAED,iDAAiD;AACjD,wBAAgB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtC;AAED,uEAAuE;AACvE,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAI3C;AAuED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,SAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAMtG;AAkDD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAc1C"}
package/dist/ts/worker.js CHANGED
@@ -276,10 +276,12 @@ self.onmessage = async function(event) {
276
276
  parser.reset();
277
277
  pgsParsers.set(request.sessionId, parser);
278
278
  }
279
+ // Send only timestamps added by this chunk (from timestampBase).
280
+ const timestampBase = parser.count;
279
281
  const added = parser.feed(new Uint8Array(request.data));
280
- const timestamps = parser.getTimestamps();
282
+ const timestamps = parser.getTimestampsFrom(timestampBase);
281
283
  postResponse(
282
- { type: 'pgsProgress', count: parser.count, added, partial: true, metadata: buildPgsMetadata(parser), timestamps },
284
+ { type: 'pgsProgress', count: parser.count, added, partial: true, metadata: buildPgsMetadata(parser), timestamps, timestampBase },
283
285
  [timestamps.buffer],
284
286
  _id
285
287
  );
@@ -350,11 +352,15 @@ self.onmessage = async function(event) {
350
352
  parser.reset();
351
353
  dvbParsers.set(request.sessionId, parser);
352
354
  }
355
+ // Send only changed entries: new cues plus the previous last cue,
356
+ // whose end time a new cue can shorten.
357
+ const previousCount = parser.count;
353
358
  const added = parser.feed(new Uint8Array(request.data));
354
- const timestamps = parser.getTimestamps();
355
- const endTimestamps = parser.getEndTimestamps();
359
+ const timestampBase = added > 0 ? Math.max(0, previousCount - 1) : parser.count;
360
+ const timestamps = parser.getTimestampsFrom(timestampBase);
361
+ const endTimestamps = parser.getEndTimestampsFrom(timestampBase);
356
362
  postResponse(
357
- { type: 'dvbProgress', count: parser.count, added, partial: true, metadata: buildDvbMetadata(parser), timestamps, endTimestamps },
363
+ { type: 'dvbProgress', count: parser.count, added, partial: true, metadata: buildDvbMetadata(parser), timestamps, endTimestamps, timestampBase },
358
364
  [timestamps.buffer, endTimestamps.buffer],
359
365
  _id
360
366
  );
@@ -533,7 +539,10 @@ self.onmessage = async function(event) {
533
539
  }
534
540
  case 'getVobSubTimestamps': {
535
541
  const parser = vobSubParsers.get(request.sessionId);
536
- postResponse({ type: 'vobSubTimestamps', timestamps: parser ? parser.getTimestamps() : new Float64Array(0) }, [], _id);
542
+ const timestamps = parser ? parser.getTimestamps() : new Float64Array(0);
543
+ const endTimestamps = new Float64Array(timestamps.length);
544
+ for (let i = 0; i < timestamps.length; i++) endTimestamps[i] = parser.getCueEndTime(i);
545
+ postResponse({ type: 'vobSubTimestamps', timestamps, endTimestamps }, [], _id);
537
546
  break;
538
547
  }
539
548
  case 'clearPgsCache': {
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/ts/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/ts/worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "libbitsub",
3
- "version": "1.12.0",
3
+ "version": "1.13.0",
4
4
  "author": "altqx",
5
5
  "license": "MIT",
6
6
  "description": "High-performance WASM renderer for graphical subtitles (PGS, VobSub, and DVB)",
@@ -78,6 +78,9 @@
78
78
  "build:wasm:bundler": "wasm-pack build --target bundler --out-dir pkg-bundler",
79
79
  "build:ts": "tsc",
80
80
  "build": "bun run build:wasm:release && bun run build:ts",
81
+ "demo:build": "bun demo/build.ts",
82
+ "demo:dev": "bun run demo:build && wrangler dev --config demo/wrangler.jsonc",
83
+ "demo:deploy": "bun run demo:build && wrangler deploy --config demo/wrangler.jsonc",
81
84
  "clean": "rm -rf pkg pkg-bundler dist target",
82
85
  "test": "cargo test --workspace",
83
86
  "test:ts": "bun test src/ts",
@@ -88,8 +91,10 @@
88
91
  },
89
92
  "devDependencies": {
90
93
  "@types/react": "^19.2.17",
94
+ "dashjs": "5.2.1",
91
95
  "prettier": "^3.9.6",
92
96
  "react": "^19.2.8",
97
+ "libbitsub-registry": "npm:libbitsub@1.12.0",
93
98
  "typescript": "^7.0.2"
94
99
  },
95
100
  "peerDependencies": {
package/pkg/README.md CHANGED
@@ -34,7 +34,7 @@ https://gist.github.com/user-attachments/assets/a89ae9fe-23e4-4bc3-8cad-16a3f0fe
34
34
 
35
35
  ### Live demo
36
36
 
37
- https://a.rafasu.com/v
37
+ https://libbitsub.altqx.com
38
38
 
39
39
  ## Installation
40
40
 
@@ -293,9 +293,10 @@ selection does not transfer a caller-owned canvas to a worker; request
293
293
 
294
294
  Frame-aware synchronization is enabled by default. On browsers with
295
295
  `requestVideoFrameCallback()`, cue lookup uses the `mediaTime` of the frame sent
296
- to the compositor instead of polling `video.currentTime`. Older browsers fall
297
- back to `requestAnimationFrame()` automatically; set `frameAwareSync: false` to
298
- force that compatibility path. The active path is available as
296
+ to the compositor instead of polling `video.currentTime`. The scheduler falls
297
+ back to `requestAnimationFrame()` automatically when frame callbacks are unavailable
298
+ or stop arriving during advancing playback; set `frameAwareSync: false` to force
299
+ that compatibility path. The active path is available as
299
300
  `renderer.getSynchronizationMode()` and as `getStats().syncMode`.
300
301
 
301
302
  ### VobSub renderer
@@ -934,6 +935,7 @@ interface VideoSubtitleOptions {
934
935
  }
935
936
  streamingLoad?: boolean // default true — progressive URL loads
936
937
  rangeRequests?: boolean // default true — use HTTP Range when supported
938
+ maxSubtitleBytes?: number // default 256 MiB — larger downloads are rejected
937
939
  onEvent?: (event: SubtitleRendererEvent) => void
938
940
  }
939
941
  ```
@@ -16,7 +16,15 @@ export class DvbParser {
16
16
  getCuePageState(index: number): number;
17
17
  getCueStartTime(index: number): number;
18
18
  getEndTimestamps(): Float64Array;
19
+ /**
20
+ * Get cue end times starting at cue `start`, for incremental updates.
21
+ */
22
+ getEndTimestampsFrom(start: number): Float64Array;
19
23
  getTimestamps(): Float64Array;
24
+ /**
25
+ * Get cue start times starting at cue `start`, for incremental updates.
26
+ */
27
+ getTimestampsFrom(start: number): Float64Array;
20
28
  constructor();
21
29
  parse(data: Uint8Array): number;
22
30
  renderAtIndex(index: number): SubtitleFrame | undefined;
@@ -44,6 +52,10 @@ export class PgsParser {
44
52
  getCuePaletteId(index: number): number;
45
53
  getCueStartTime(index: number): number;
46
54
  getTimestamps(): Float64Array;
55
+ /**
56
+ * Get timestamps starting at cue `start`, for incremental updates.
57
+ */
58
+ getTimestampsFrom(start: number): Float64Array;
47
59
  constructor();
48
60
  parse(data: Uint8Array): number;
49
61
  renderAtIndex(index: number): SubtitleFrame | undefined;
@@ -217,7 +229,9 @@ export interface InitOutput {
217
229
  readonly dvbparser_getCuePageState: (a: number, b: number) => number;
218
230
  readonly dvbparser_getCueStartTime: (a: number, b: number) => number;
219
231
  readonly dvbparser_getEndTimestamps: (a: number) => any;
232
+ readonly dvbparser_getEndTimestampsFrom: (a: number, b: number) => any;
220
233
  readonly dvbparser_getTimestamps: (a: number) => any;
234
+ readonly dvbparser_getTimestampsFrom: (a: number, b: number) => any;
221
235
  readonly dvbparser_lastRenderIssue: (a: number) => [number, number];
222
236
  readonly dvbparser_new: () => number;
223
237
  readonly dvbparser_parse: (a: number, b: number, c: number) => number;
@@ -238,6 +252,7 @@ export interface InitOutput {
238
252
  readonly pgsparser_getCuePaletteId: (a: number, b: number) => number;
239
253
  readonly pgsparser_getCueStartTime: (a: number, b: number) => number;
240
254
  readonly pgsparser_getTimestamps: (a: number) => any;
255
+ readonly pgsparser_getTimestampsFrom: (a: number, b: number) => any;
241
256
  readonly pgsparser_lastRenderIssue: (a: number) => [number, number];
242
257
  readonly pgsparser_new: () => number;
243
258
  readonly pgsparser_parse: (a: number, b: number, c: number) => number;
package/pkg/libbitsub.js CHANGED
@@ -88,6 +88,15 @@ export class DvbParser {
88
88
  const ret = wasm.dvbparser_getEndTimestamps(this.__wbg_ptr);
89
89
  return ret;
90
90
  }
91
+ /**
92
+ * Get cue end times starting at cue `start`, for incremental updates.
93
+ * @param {number} start
94
+ * @returns {Float64Array}
95
+ */
96
+ getEndTimestampsFrom(start) {
97
+ const ret = wasm.dvbparser_getEndTimestampsFrom(this.__wbg_ptr, start);
98
+ return ret;
99
+ }
91
100
  /**
92
101
  * @returns {Float64Array}
93
102
  */
@@ -95,6 +104,15 @@ export class DvbParser {
95
104
  const ret = wasm.dvbparser_getTimestamps(this.__wbg_ptr);
96
105
  return ret;
97
106
  }
107
+ /**
108
+ * Get cue start times starting at cue `start`, for incremental updates.
109
+ * @param {number} start
110
+ * @returns {Float64Array}
111
+ */
112
+ getTimestampsFrom(start) {
113
+ const ret = wasm.dvbparser_getTimestampsFrom(this.__wbg_ptr, start);
114
+ return ret;
115
+ }
98
116
  /**
99
117
  * @returns {string}
100
118
  */
@@ -257,6 +275,15 @@ export class PgsParser {
257
275
  const ret = wasm.pgsparser_getTimestamps(this.__wbg_ptr);
258
276
  return ret;
259
277
  }
278
+ /**
279
+ * Get timestamps starting at cue `start`, for incremental updates.
280
+ * @param {number} start
281
+ * @returns {Float64Array}
282
+ */
283
+ getTimestampsFrom(start) {
284
+ const ret = wasm.pgsparser_getTimestampsFrom(this.__wbg_ptr, start);
285
+ return ret;
286
+ }
260
287
  /**
261
288
  * @returns {string}
262
289
  */
Binary file
@@ -19,7 +19,9 @@ export const dvbparser_getCueEndTime: (a: number, b: number) => number;
19
19
  export const dvbparser_getCuePageState: (a: number, b: number) => number;
20
20
  export const dvbparser_getCueStartTime: (a: number, b: number) => number;
21
21
  export const dvbparser_getEndTimestamps: (a: number) => any;
22
+ export const dvbparser_getEndTimestampsFrom: (a: number, b: number) => any;
22
23
  export const dvbparser_getTimestamps: (a: number) => any;
24
+ export const dvbparser_getTimestampsFrom: (a: number, b: number) => any;
23
25
  export const dvbparser_lastRenderIssue: (a: number) => [number, number];
24
26
  export const dvbparser_new: () => number;
25
27
  export const dvbparser_parse: (a: number, b: number, c: number) => number;
@@ -40,6 +42,7 @@ export const pgsparser_getCueEndTime: (a: number, b: number) => number;
40
42
  export const pgsparser_getCuePaletteId: (a: number, b: number) => number;
41
43
  export const pgsparser_getCueStartTime: (a: number, b: number) => number;
42
44
  export const pgsparser_getTimestamps: (a: number) => any;
45
+ export const pgsparser_getTimestampsFrom: (a: number, b: number) => any;
43
46
  export const pgsparser_lastRenderIssue: (a: number) => [number, number];
44
47
  export const pgsparser_new: () => number;
45
48
  export const pgsparser_parse: (a: number, b: number, c: number) => number;
package/pkg/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "altqx"
6
6
  ],
7
7
  "description": "High-performance WASM renderer for graphical subtitles (PGS, VobSub, and DVB)",
8
- "version": "1.12.0",
8
+ "version": "1.13.0",
9
9
  "license": "MIT",
10
10
  "repository": {
11
11
  "type": "git",
@@ -4,6 +4,8 @@
4
4
  * hls.js handles HLS media and WebVTT/IMSC text tracks; use this helper for
5
5
  * external PGS/VobSub/MKS bitmap overlays on the same media element.
6
6
  *
7
+ * @module
8
+ *
7
9
  * @example
8
10
  * ```ts
9
11
  * import Hls from 'hls.js'
@@ -33,8 +35,10 @@ export interface HlsLike {
33
35
  }
34
36
  }
35
37
 
38
+ /** Options for attachBitSubToHls(). */
36
39
  export type BitSubHlsOptions = AttachBitSubOptions
37
40
 
41
+ /** Handle returned by attachBitSubToHls(). */
38
42
  export interface BitSubHlsHandle extends BitSubController {
39
43
  /** Underlying hls.js instance. */
40
44
  readonly hls: HlsLike
@@ -150,5 +154,7 @@ export function attachBitSubToHls(hls: HlsLike, options: BitSubHlsOptions = {}):
150
154
  }
151
155
  }
152
156
 
157
+ /** Shared attach options and controller types. */
153
158
  export type { AttachBitSubOptions, BitSubController, BitSubSourceOptions, BitSubRenderer } from './shared'
159
+ /** Attach or construct a libbitsub controller. */
154
160
  export { attachBitSub, createBitSubRenderer } from './shared'
@@ -1,9 +1,13 @@
1
1
  /**
2
2
  * Optional player integrations for libbitsub.
3
- * Prefer deep imports (`libbitsub/videojs`, `libbitsub/shaka`, `libbitsub/hlsjs`, `libbitsub/react`)
4
- * so unused peer dependencies stay out of your bundle.
3
+ *
4
+ * Prefer deep imports (`libbitsub/videojs`, `libbitsub/shaka`, `libbitsub/hlsjs`,
5
+ * `libbitsub/react`) so unused peer dependencies stay out of your bundle.
6
+ *
7
+ * @module
5
8
  */
6
9
 
10
+ /** Shared attach/create helpers used by every player adapter. */
7
11
  export {
8
12
  attachBitSub,
9
13
  createBitSubRenderer,
@@ -13,6 +17,7 @@ export {
13
17
  type BitSubSourceOptions
14
18
  } from './shared'
15
19
 
20
+ /** Video.js plugin and player typings. */
16
21
  export {
17
22
  registerBitSubPlugin,
18
23
  type BitSubVideoJsApi,
@@ -22,10 +27,13 @@ export {
22
27
  type VideoJsPlayerLike
23
28
  } from './videojs'
24
29
 
30
+ /** Shaka Player adapter. */
25
31
  export { attachBitSubToShaka, type BitSubShakaHandle, type BitSubShakaOptions, type ShakaPlayerLike } from './shaka'
26
32
 
33
+ /** hls.js adapter. */
27
34
  export { attachBitSubToHls, type BitSubHlsHandle, type BitSubHlsOptions, type HlsLike } from './hlsjs'
28
35
 
36
+ /** React hook and overlay component. */
29
37
  export {
30
38
  BitSubOverlay,
31
39
  useBitSub,
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Optional React bindings for libbitsub bitmap subtitles.
3
3
  *
4
- * Peer dependency: react >= 18
4
+ * Peer dependency: react >= 18.
5
+ *
6
+ * @module
5
7
  *
6
8
  * @example
7
9
  * ```tsx
@@ -26,13 +28,16 @@ import { useEffect, useRef, useState, type CSSProperties, type ReactElement, typ
26
28
  import { attachBitSub, type AttachBitSubOptions, type BitSubController, type BitSubSourceOptions } from './shared'
27
29
  import type { SubtitleDisplaySettings, SubtitleDiagnosticWarning, SubtitleRendererEvent } from '../wrapper'
28
30
 
31
+ /** Subtitle source fields accepted by the React bindings. */
29
32
  export type BitSubReactSource = BitSubSourceOptions
30
33
 
34
+ /** Options for useBitSub(). */
31
35
  export interface UseBitSubOptions extends BitSubReactSource {
32
36
  /** When false, do not load even if source fields are set. Default true. */
33
37
  enabled?: boolean
34
38
  }
35
39
 
40
+ /** Return value of useBitSub(). */
36
41
  export interface UseBitSubResult {
37
42
  controller: BitSubController | null
38
43
  error: Error | null
@@ -152,6 +157,7 @@ export function useBitSub(
152
157
  return { controller, error }
153
158
  }
154
159
 
160
+ /** Props for BitSubOverlay. */
155
161
  export interface BitSubOverlayProps extends UseBitSubOptions {
156
162
  videoRef: RefObject<HTMLVideoElement | null>
157
163
  /** Optional class name applied to a zero-size host span for debugging. */
@@ -171,6 +177,9 @@ export function BitSubOverlay(props: BitSubOverlayProps): ReactElement | null {
171
177
  return <span className={className} style={{ display: 'none', ...style }} aria-hidden='true' />
172
178
  }
173
179
 
180
+ /** Shared attach options and controller types. */
174
181
  export type { AttachBitSubOptions, BitSubController, BitSubSourceOptions, BitSubRenderer } from './shared'
182
+ /** Attach or construct a libbitsub controller. */
175
183
  export { attachBitSub, createBitSubRenderer } from './shared'
184
+ /** Runtime overlay display settings. */
176
185
  export type { SubtitleDisplaySettings }
@@ -4,6 +4,8 @@
4
4
  * Bitmap PGS/VobSub tracks are not native Shaka text tracks — this helper
5
5
  * overlays libbitsub on the player media element.
6
6
  *
7
+ * @module
8
+ *
7
9
  * @example
8
10
  * ```ts
9
11
  * import shaka from 'shaka-player'
@@ -26,8 +28,10 @@ export interface ShakaPlayerLike {
26
28
  removeEventListener?(type: string, listener: (...args: unknown[]) => void): void
27
29
  }
28
30
 
31
+ /** Options for attachBitSubToShaka(). */
29
32
  export type BitSubShakaOptions = AttachBitSubOptions
30
33
 
34
+ /** Handle returned by attachBitSubToShaka(). */
31
35
  export interface BitSubShakaHandle extends BitSubController {
32
36
  /** Underlying Shaka player reference. */
33
37
  readonly player: ShakaPlayerLike
@@ -88,5 +92,7 @@ export function attachBitSubToShaka(player: ShakaPlayerLike, options: BitSubShak
88
92
  }
89
93
  }
90
94
 
95
+ /** Shared attach options and controller types. */
91
96
  export type { AttachBitSubOptions, BitSubController, BitSubSourceOptions, BitSubRenderer } from './shared'
97
+ /** Attach or construct a libbitsub controller. */
92
98
  export { attachBitSub, createBitSubRenderer } from './shared'
@@ -19,6 +19,7 @@ export type BitSubRenderer = PgsRenderer | VobSubRenderer | DvbRenderer
19
19
  /** Subtitle source + renderer options without a bound video element. */
20
20
  export type BitSubSourceOptions = Omit<AutoVideoSubtitleOptions, 'video'>
21
21
 
22
+ /** Handle returned by player adapters. */
22
23
  export interface BitSubController {
23
24
  /** Active renderer, or null when no track is loaded. */
24
25
  readonly renderer: BitSubRenderer | null
@@ -40,6 +41,7 @@ export interface BitSubController {
40
41
  setVideo(video: HTMLVideoElement | null): void
41
42
  }
42
43
 
44
+ /** Options for attachBitSub(). */
43
45
  export interface AttachBitSubOptions extends BitSubSourceOptions {
44
46
  /** When false, skip the initial load even if source fields are present. Default true. */
45
47
  autoLoad?: boolean
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * Optional Video.js plugin for libbitsub bitmap subtitles.
3
3
  *
4
+ * @module
5
+ *
4
6
  * @example
5
7
  * ```ts
6
8
  * import videojs from 'video.js'
@@ -26,24 +28,29 @@ export interface VideoJsPlayerLike {
26
28
  trigger?(event: string, data?: unknown): void
27
29
  }
28
30
 
31
+ /** Minimal Video.js plugin instance surface. */
29
32
  export interface VideoJsPluginBase {
30
33
  player: VideoJsPlayerLike
31
34
  options_: unknown
32
35
  dispose(): void
33
36
  }
34
37
 
38
+ /** Minimal Video.js plugin constructor surface. */
35
39
  export interface VideoJsPluginConstructor {
36
40
  new (player: VideoJsPlayerLike, options?: unknown): VideoJsPluginBase
37
41
  prototype: VideoJsPluginBase
38
42
  }
39
43
 
44
+ /** Minimal video.js factory used by the plugin. */
40
45
  export interface VideoJsLike {
41
46
  getPlugin(name: string): VideoJsPluginConstructor
42
47
  registerPlugin(name: string, plugin: unknown): void
43
48
  }
44
49
 
50
+ /** Options for player.bitsub(). */
45
51
  export type BitSubVideoJsOptions = AttachBitSubOptions
46
52
 
53
+ /** Video.js player.bitsub() API. */
47
54
  export interface BitSubVideoJsApi {
48
55
  /** Active controller, if any. */
49
56
  controller(): BitSubController | null
@@ -196,5 +203,7 @@ export type VideoJsBitSubPlayer = VideoJsPlayerLike & {
196
203
  bitsub(options?: BitSubVideoJsOptions): BitSubVideoJsApi
197
204
  }
198
205
 
206
+ /** Shared attach options and controller types. */
199
207
  export type { AttachBitSubOptions, BitSubController, BitSubSourceOptions, BitSubRenderer } from './shared'
208
+ /** Attach or construct a libbitsub controller. */
200
209
  export { attachBitSub, createBitSubRenderer } from './shared'