akarisub 0.2.2 → 1.0.1

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 (78) hide show
  1. package/README.md +198 -167
  2. package/THIRD_PARTY_NOTICES.md +55 -163
  3. package/dist/COPYRIGHT +56 -164
  4. package/dist/index.d.ts +26 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +24 -147
  7. package/dist/index.js.map +1 -0
  8. package/dist/ts/akarisub.d.ts +323 -0
  9. package/dist/ts/akarisub.d.ts.map +1 -0
  10. package/dist/ts/akarisub.js +2235 -0
  11. package/dist/ts/akarisub.js.map +1 -0
  12. package/dist/ts/timing.d.ts +63 -0
  13. package/dist/ts/timing.d.ts.map +1 -0
  14. package/dist/ts/timing.js +219 -0
  15. package/dist/ts/timing.js.map +1 -0
  16. package/dist/ts/{ts/types.d.ts → types.d.ts} +176 -78
  17. package/dist/ts/types.d.ts.map +1 -0
  18. package/dist/ts/types.js +2 -0
  19. package/dist/ts/{ts/types.js.map → types.js.map} +1 -1
  20. package/dist/ts/{ts/utils.d.ts → utils.d.ts} +24 -37
  21. package/dist/ts/utils.d.ts.map +1 -0
  22. package/dist/ts/{ts/utils.js → utils.js} +12 -56
  23. package/dist/ts/utils.js.map +1 -0
  24. package/dist/ts/wasm.d.ts +12 -0
  25. package/dist/ts/wasm.d.ts.map +1 -0
  26. package/dist/ts/wasm.js +46 -0
  27. package/dist/ts/wasm.js.map +1 -0
  28. package/dist/ts/{ts/webgl2-renderer.d.ts → webgl2-renderer.d.ts} +17 -12
  29. package/dist/ts/webgl2-renderer.d.ts.map +1 -0
  30. package/dist/ts/{ts/webgl2-renderer.js → webgl2-renderer.js} +17 -27
  31. package/dist/ts/webgl2-renderer.js.map +1 -0
  32. package/dist/ts/webgpu-renderer.d.ts +88 -0
  33. package/dist/ts/webgpu-renderer.d.ts.map +1 -0
  34. package/dist/ts/{ts/webgpu-renderer.js → webgpu-renderer.js} +173 -71
  35. package/dist/ts/webgpu-renderer.js.map +1 -0
  36. package/dist/ts/worker.d.ts +2 -0
  37. package/dist/ts/{ts/worker.d.ts.map → worker.d.ts.map} +1 -1
  38. package/dist/ts/{ts/worker.js → worker.js} +1064 -264
  39. package/dist/ts/worker.js.map +1 -0
  40. package/dist/wrapper.d.ts +8 -0
  41. package/dist/wrapper.d.ts.map +1 -0
  42. package/dist/{ts/index.js → wrapper.js} +4 -14
  43. package/dist/wrapper.js.map +1 -0
  44. package/package.json +24 -22
  45. package/pkg/akarisub.js +53 -0
  46. package/{dist/akarisub-worker.wasm → pkg/akarisub.wasm} +0 -0
  47. package/src/wrapper.ts +46 -0
  48. package/dist/akarisub-worker.js +0 -39
  49. package/dist/akarisub.umd.js +0 -159
  50. package/dist/ts/index.d.ts +0 -14
  51. package/dist/ts/index.d.ts.map +0 -1
  52. package/dist/ts/index.js.map +0 -1
  53. package/dist/ts/ts/akarisub.d.ts +0 -225
  54. package/dist/ts/ts/akarisub.d.ts.map +0 -1
  55. package/dist/ts/ts/akarisub.js +0 -1073
  56. package/dist/ts/ts/akarisub.js.map +0 -1
  57. package/dist/ts/ts/types.d.ts.map +0 -1
  58. package/dist/ts/ts/types.js +0 -5
  59. package/dist/ts/ts/utils.d.ts.map +0 -1
  60. package/dist/ts/ts/utils.js.map +0 -1
  61. package/dist/ts/ts/webgl2-renderer.d.ts.map +0 -1
  62. package/dist/ts/ts/webgl2-renderer.js.map +0 -1
  63. package/dist/ts/ts/webgpu-renderer.d.ts +0 -62
  64. package/dist/ts/ts/webgpu-renderer.d.ts.map +0 -1
  65. package/dist/ts/ts/webgpu-renderer.js.map +0 -1
  66. package/dist/ts/ts/worker.d.ts +0 -6
  67. package/dist/ts/ts/worker.js.map +0 -1
  68. package/dist/ts/wrapper.d.ts +0 -8
  69. package/dist/ts/wrapper.d.ts.map +0 -1
  70. package/dist/ts/wrapper.js +0 -9
  71. package/dist/ts/wrapper.js.map +0 -1
  72. package/src/ts/akarisub.ts +0 -1272
  73. package/src/ts/types.ts +0 -397
  74. package/src/ts/utils.ts +0 -512
  75. package/src/ts/webgl2-renderer.ts +0 -426
  76. package/src/ts/webgpu-renderer.ts +0 -691
  77. package/src/ts/worker.ts +0 -2052
  78. /package/{dist → assets}/default.woff2 +0 -0
package/src/ts/types.ts DELETED
@@ -1,397 +0,0 @@
1
- /**
2
- * Type definitions for AkariSub TypeScript implementation.
3
- */
4
-
5
- // =============================================================================
6
- // ASS/SSA Subtitle Types
7
- // =============================================================================
8
-
9
- /** ASS Event (dialogue/subtitle entry) */
10
- export interface ASSEvent {
11
- /** Start Time of the Event (in milliseconds) */
12
- Start: number
13
- /** Duration of the Event (in milliseconds) */
14
- Duration: number
15
- /** Style name */
16
- Style: string
17
- /** Character name (for information only) */
18
- Name: string
19
- /** Left Margin override in pixels */
20
- MarginL: number
21
- /** Right Margin override in pixels */
22
- MarginR: number
23
- /** Bottom Margin override in pixels */
24
- MarginV: number
25
- /** Transition Effect */
26
- Effect: string
27
- /** Subtitle Text */
28
- Text: string
29
- /** Read order number */
30
- ReadOrder: number
31
- /** Z-index layer */
32
- Layer: number
33
- /** Internal index */
34
- _index?: number
35
- }
36
-
37
- /** ASS Style definition */
38
- export interface ASSStyle {
39
- /** Style name (case sensitive) */
40
- Name: string
41
- /** Font family name */
42
- FontName: string
43
- /** Font size */
44
- FontSize: number
45
- /** Primary color (RGBA as uint32) */
46
- PrimaryColour: number
47
- /** Secondary color (RGBA as uint32) */
48
- SecondaryColour: number
49
- /** Outline color (RGBA as uint32) */
50
- OutlineColour: number
51
- /** Background/shadow color (RGBA as uint32) */
52
- BackColour: number
53
- /** Bold (-1 = true, 0 = false) */
54
- Bold: number
55
- /** Italic (-1 = true, 0 = false) */
56
- Italic: number
57
- /** Underline (-1 = true, 0 = false) */
58
- Underline: number
59
- /** StrikeOut (-1 = true, 0 = false) */
60
- StrikeOut: number
61
- /** Width scale (percent) */
62
- ScaleX: number
63
- /** Height scale (percent) */
64
- ScaleY: number
65
- /** Extra spacing between characters (pixels) */
66
- Spacing: number
67
- /** Rotation angle (degrees) */
68
- Angle: number
69
- /** Border style (1 = outline + shadow, 3 = opaque box) */
70
- BorderStyle: number
71
- /** Outline width (0-4 pixels) */
72
- Outline: number
73
- /** Shadow depth (0-4 pixels) */
74
- Shadow: number
75
- /** Alignment (1-9, numpad style) */
76
- Alignment: number
77
- /** Left margin (pixels) */
78
- MarginL: number
79
- /** Right margin (pixels) */
80
- MarginR: number
81
- /** Vertical margin (pixels) */
82
- MarginV: number
83
- /** Font encoding */
84
- Encoding: number
85
- /** Treat font name as pattern */
86
- treat_fontname_as_pattern: number
87
- /** Blur amount */
88
- Blur: number
89
- /** Text justification */
90
- Justify: number
91
- }
92
-
93
- // =============================================================================
94
- // Performance Stats Types
95
- // =============================================================================
96
-
97
- /** Performance statistics for the renderer */
98
- export interface PerformanceStats {
99
- /** Total frames rendered since reset */
100
- framesRendered: number
101
- /** Number of frames dropped */
102
- framesDropped: number
103
- /** Average render time in milliseconds */
104
- avgRenderTime: number
105
- /** Maximum render time in milliseconds */
106
- maxRenderTime: number
107
- /** Minimum render time in milliseconds */
108
- minRenderTime: number
109
- /** Last render time in milliseconds */
110
- lastRenderTime: number
111
- /** Estimated render FPS based on timing */
112
- renderFps: number
113
- /** Whether using Web Worker */
114
- usingWorker: boolean
115
- /** Whether offscreen rendering is enabled */
116
- offscreenRender: boolean
117
- /** Whether on-demand rendering is enabled */
118
- onDemandRender: boolean
119
- /** Number of pending render operations */
120
- pendingRenders: number
121
- /** Total subtitle events in current track */
122
- totalEvents: number
123
- /** Number of cache hits (unchanged frames) */
124
- cacheHits: number
125
- /** Number of cache misses (rendered frames) */
126
- cacheMisses: number
127
- }
128
-
129
- // =============================================================================
130
- // AkariSub Options Types
131
- // =============================================================================
132
-
133
- /** Configuration options for AkariSub */
134
- export interface AkariSubOptions {
135
- /** Video element to sync with and overlay */
136
- video?: HTMLVideoElement
137
- /** Custom canvas element (optional if video is provided) */
138
- canvas?: HTMLCanvasElement
139
- /** Image blending mode: 'js' for hardware acceleration, 'wasm' for software */
140
- blendMode?: 'js' | 'wasm'
141
- /** Use async rendering with ImageBitmap (default: true) */
142
- asyncRender?: boolean
143
- /** Use offscreen canvas rendering (default: true) */
144
- offscreenRender?: boolean
145
- /** Use requestVideoFrameCallback for precise sync (default: true) */
146
- onDemandRender?: boolean
147
- /** Target FPS when not using onDemandRender (default: 24) */
148
- targetFps?: number
149
- /** Time offset in seconds (default: 0) */
150
- timeOffset?: number
151
- /** Enable debug logging (default: false) */
152
- debug?: boolean
153
- /** Scale factor for subtitles (default: 1.0) */
154
- prescaleFactor?: number
155
- /** Height limit for prescaling (default: 1080) */
156
- prescaleHeightLimit?: number
157
- /** Maximum render height, 0 = no limit (default: 0) */
158
- maxRenderHeight?: number
159
- /** Attempt to drop all animations (default: false) */
160
- dropAllAnimations?: boolean
161
- /** Drop all blur effects for performance (default: false) */
162
- dropAllBlur?: boolean
163
- /** Clamp \\pos values to script resolution (default: false) */
164
- clampPos?: boolean
165
- /** URL to the worker script */
166
- workerUrl?: string
167
- /** URL to the WASM binary */
168
- wasmUrl?: string
169
- /** URL to subtitle file */
170
- subUrl?: string
171
- /** Subtitle content as string or UTF-8 bytes */
172
- subContent?: string | Uint8Array | ArrayBuffer
173
- /** Encrypted subtitle content decrypted inside the worker before loading into libass */
174
- encryptedSubContent?: EncryptedSubtitleContent
175
- /** Array of font URLs or Uint8Arrays */
176
- fonts?: (string | Uint8Array)[]
177
- /** Available fonts map (lowercase name -> URL/data) */
178
- availableFonts?: Record<string, string | Uint8Array>
179
- /** Fallback font families in order (default: ['liberation sans']). Fontconfig uses these for cascade. */
180
- fallbackFonts?: string[]
181
- /** Use Local Font Access API (default: true if available) */
182
- useLocalFonts?: boolean
183
- /** libass bitmap cache memory limit in MiB */
184
- libassMemoryLimit?: number
185
- /** libass glyph cache limit */
186
- libassGlyphLimit?: number
187
- /** Callback invoked when all GPU renderers (WebGPU, WebGL2) are unavailable and the renderer falls back to Canvas2D */
188
- onCanvasFallback?: () => void
189
- /** Additional time in seconds to render subtitles ahead for pipeline latency compensation (default: 0.008) */
190
- renderAhead?: number
191
- /** Pre-render early track windows after load to warm libass caches (default: false) */
192
- fullTrackWarmup?: boolean
193
- }
194
-
195
- export interface EncryptedSubtitleContent {
196
- /** Non-extractable AES-GCM content key from akari-crypto's v2 transport flow */
197
- contentKey: CryptoKey
198
- /** Single encrypted subtitle payload */
199
- encrypted?: ArrayBuffer
200
- /** Chunked encrypted subtitle payloads, in display file order */
201
- encryptedChunks?: ArrayBuffer[]
202
- }
203
-
204
- // =============================================================================
205
- // Callback Types (deprecated - use Promise-based API instead)
206
- // =============================================================================
207
-
208
- /** @deprecated Use Promise-based getEvents() instead */
209
- export type ASSEventCallback = (error: Error | null, events: ASSEvent[]) => void
210
- /** @deprecated Use Promise-based getStyles() instead */
211
- export type ASSStyleCallback = (error: Error | null, styles: ASSStyle[]) => void
212
- /** @deprecated Use Promise-based getStats() instead */
213
- export type PerformanceStatsCallback = (error: Error | null, stats: PerformanceStats | null) => void
214
- /** @deprecated Use Promise-based resetStats() instead */
215
- export type ResetStatsCallback = (error: Error | null) => void
216
-
217
- // =============================================================================
218
- // Worker Message Types
219
- // =============================================================================
220
-
221
- /** Image data for rendering */
222
- export interface RenderImage {
223
- x: number
224
- y: number
225
- w: number
226
- h: number
227
- image: ImageBitmap | ArrayBuffer | Uint8Array | Uint8ClampedArray | number
228
- }
229
-
230
- /** Render timing debug info */
231
- export interface RenderTimes {
232
- WASMRenderTime?: number
233
- WASMBitmapDecodeTime?: number
234
- JSRenderTime?: number
235
- JSBitmapGenerationTime?: number
236
- IPCTime?: number
237
- bitmaps?: number
238
- }
239
-
240
- /** Worker -> Main thread message for rendering */
241
- export interface RenderMessage {
242
- target: 'render'
243
- asyncRender: boolean
244
- images: RenderImage[]
245
- times: RenderTimes
246
- width: number
247
- height: number
248
- colorSpace: string | null
249
- }
250
-
251
- /** Worker -> Main thread messages */
252
- export type WorkerOutboundMessage =
253
- | { target: 'ready' }
254
- | { target: 'trackReady' }
255
- | { target: 'unbusy' }
256
- | { target: 'console'; command: string; content: string }
257
- | { target: 'getLocalFont'; font: string }
258
- | { target: 'verifyColorSpace'; subtitleColorSpace: string | null }
259
- | { target: 'getEvents'; events: ASSEvent[] }
260
- | { target: 'getStyles'; styles: ASSStyle[]; time: number }
261
- | { target: 'getStats'; stats: Partial<PerformanceStats> }
262
- | { target: 'resetStats'; success: boolean }
263
- | { target: 'getEventCount'; count: number }
264
- | { target: 'getStyleCount'; count: number }
265
- | RenderMessage
266
-
267
- /** Main thread -> Worker init message */
268
- export interface WorkerInitMessage {
269
- target: 'init'
270
- wasmUrl: string
271
- asyncRender: boolean
272
- fullTrackWarmup: boolean
273
- onDemandRender: boolean
274
- initialTime: number
275
- width: number
276
- height: number
277
- blendMode: 'js' | 'wasm'
278
- subUrl?: string
279
- subContent?: string | Uint8Array | ArrayBuffer | null
280
- encryptedSubContent?: EncryptedSubtitleContent | null
281
- fonts: (string | Uint8Array)[]
282
- availableFonts: Record<string, string | Uint8Array>
283
- fallbackFonts: string[]
284
- debug: boolean
285
- targetFps: number
286
- dropAllAnimations?: boolean
287
- dropAllBlur?: boolean
288
- clampPos?: boolean
289
- libassMemoryLimit?: number
290
- libassGlyphLimit?: number
291
- useLocalFonts: boolean
292
- hasBitmapBug: boolean
293
- }
294
-
295
- /** Main thread -> Worker messages */
296
- export type WorkerInboundMessage =
297
- | WorkerInitMessage
298
- | { target: 'offscreenCanvas'; transferable: [OffscreenCanvas] }
299
- | { target: 'detachOffscreen' }
300
- | { target: 'canvas'; width: number; height: number; videoWidth: number; videoHeight: number; force?: boolean }
301
- | { target: 'video'; currentTime?: number; isPaused?: boolean; rate?: number; colorSpace?: string | null }
302
- | { target: 'setTrack'; content: string | Uint8Array | ArrayBuffer }
303
- | { target: 'setEncryptedTrack'; content: EncryptedSubtitleContent }
304
- | { target: 'setTrackByUrl'; url: string }
305
- | { target: 'freeTrack' }
306
- | { target: 'demand'; time: number }
307
- | { target: 'destroy' }
308
- | { target: 'addFont'; font: string | Uint8Array }
309
- | { target: 'defaultFont'; font: string }
310
- | { target: 'createEvent'; event: Partial<ASSEvent> }
311
- | { target: 'setEvent'; event: Partial<ASSEvent>; index: number }
312
- | { target: 'removeEvent'; index: number }
313
- | { target: 'getEvents' }
314
- | { target: 'createStyle'; style: Partial<ASSStyle> }
315
- | { target: 'setStyle'; style: Partial<ASSStyle>; index: number }
316
- | { target: 'removeStyle'; index: number }
317
- | { target: 'getStyles' }
318
- | { target: 'styleOverride'; style: Partial<ASSStyle> }
319
- | { target: 'disableStyleOverride' }
320
- | { target: 'getStats' }
321
- | { target: 'resetStats' }
322
- | { target: 'getEventCount' }
323
- | { target: 'getStyleCount' }
324
- | { target: 'getColorSpace' }
325
-
326
- // =============================================================================
327
- // RVFC Types
328
- // =============================================================================
329
-
330
- /** requestVideoFrameCallback metadata */
331
- export interface VideoFrameCallbackMetadata {
332
- /** The current media time of the frame being displayed (seconds) */
333
- mediaTime: number
334
- /** Video intrinsic width */
335
- width: number
336
- /** Video intrinsic height */
337
- height: number
338
- /** Number of frames presented so far */
339
- presentedFrames?: number
340
- /** Time spent processing the frame (milliseconds) */
341
- processingDuration?: number
342
- /** Expected time when this frame will be displayed (DOMHighResTimeStamp) */
343
- expectedDisplayTime?: number
344
- /** Time at which the frame was presented (DOMHighResTimeStamp) */
345
- presentationTime?: number
346
- }
347
-
348
- // =============================================================================
349
- // Color Space Types
350
- // =============================================================================
351
-
352
- export type WebYCbCrColorSpace = 'BT709' | 'BT601'
353
- export type SubtitleColorSpace = 'BT601' | 'BT709' | 'SMPTE240M' | 'FCC' | null
354
-
355
- // =============================================================================
356
- // AkariSub WASM Module Types
357
- // =============================================================================
358
-
359
- /** Emscripten AkariSub Module (C ABI exports) */
360
- export interface AkariSubModule extends EmscriptenModule {
361
- _malloc: (size: number) => number
362
- _free: (ptr: number) => void
363
- _akarisub_create: (width: number, height: number, fallbackFontPtr: number, debug: number) => number
364
- _akarisub_destroy: (handle: number) => void
365
- _akarisub_set_drop_animations: (handle: number, value: number) => void
366
- _akarisub_create_track_mem: (handle: number, contentPtr: number) => void
367
- _akarisub_remove_track: (handle: number) => void
368
- _akarisub_resize_canvas: (handle: number, width: number, height: number, videoWidth: number, videoHeight: number) => void
369
- _akarisub_add_font: (handle: number, namePtr: number, dataPtr: number, size: number) => void
370
- _akarisub_reload_fonts: (handle: number) => void
371
- _akarisub_set_default_font: (handle: number, fontPtr: number) => void
372
- _akarisub_set_fallback_fonts: (handle: number, fontsPtr: number) => void
373
- _akarisub_set_memory_limits: (handle: number, glyphLimit: number, memoryLimit: number) => void
374
- _akarisub_get_event_count: (handle: number) => number
375
- _akarisub_alloc_event: (handle: number) => number
376
- _akarisub_remove_event: (handle: number, index: number) => void
377
- _akarisub_get_style_count: (handle: number) => number
378
- _akarisub_alloc_style: (handle: number) => number
379
- _akarisub_remove_style: (handle: number, index: number) => void
380
- _akarisub_style_override_index: (handle: number, index: number) => void
381
- _akarisub_disable_style_override: (handle: number) => void
382
- _akarisub_get_track_color_space: (handle: number) => number
383
- _akarisub_event_get_int: (handle: number, index: number, field: number) => number
384
- _akarisub_event_set_int: (handle: number, index: number, field: number, value: number) => void
385
- _akarisub_event_get_str: (handle: number, index: number, field: number) => number
386
- _akarisub_event_set_str: (handle: number, index: number, field: number, valuePtr: number) => void
387
- _akarisub_style_get_num: (handle: number, index: number, field: number) => number
388
- _akarisub_style_set_num: (handle: number, index: number, field: number, value: number) => void
389
- _akarisub_style_get_str: (handle: number, index: number, field: number) => number
390
- _akarisub_style_set_str: (handle: number, index: number, field: number, valuePtr: number) => void
391
- _akarisub_get_event_time_range: (handle: number, outPtr: number) => number
392
- _akarisub_get_empty_window: (handle: number, tm: number, outPtr: number) => number
393
- _akarisub_render_blend_collect: (handle: number, time: number, force: number, outPtr: number, maxItems: number) => number
394
- _akarisub_render_image_collect: (handle: number, time: number, force: number, outPtr: number, maxItems: number) => number
395
- FS_createPath: (parent: string, path: string, canRead: boolean, canWrite: boolean) => void
396
- FS_createDataFile: (parent: string, name: string | null, data: Uint8Array, canRead: boolean, canWrite: boolean, canOwn?: boolean) => void
397
- }