avbridge 2.3.0 → 2.6.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 (111) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/dist/{chunk-6UUT4BEA.cjs → chunk-2IJ66NTD.cjs} +13 -20
  3. package/dist/chunk-2IJ66NTD.cjs.map +1 -0
  4. package/dist/{chunk-XKPSTC34.cjs → chunk-2XW2O3YI.cjs} +5 -20
  5. package/dist/chunk-2XW2O3YI.cjs.map +1 -0
  6. package/dist/chunk-5KVLE6YI.js +167 -0
  7. package/dist/chunk-5KVLE6YI.js.map +1 -0
  8. package/dist/{chunk-7RGG6ME7.cjs → chunk-6SOFJV44.cjs} +422 -688
  9. package/dist/chunk-6SOFJV44.cjs.map +1 -0
  10. package/dist/{chunk-2PGRFCWB.js → chunk-CPJLFFCC.js} +8 -18
  11. package/dist/chunk-CPJLFFCC.js.map +1 -0
  12. package/dist/chunk-CPZ7PXAM.cjs +240 -0
  13. package/dist/chunk-CPZ7PXAM.cjs.map +1 -0
  14. package/dist/{chunk-QQXBPW72.js → chunk-E76AMWI4.js} +4 -18
  15. package/dist/chunk-E76AMWI4.js.map +1 -0
  16. package/dist/chunk-LUFA47FP.js +19 -0
  17. package/dist/chunk-LUFA47FP.js.map +1 -0
  18. package/dist/{chunk-NV7ILLWH.js → chunk-OGYHFY6K.js} +404 -665
  19. package/dist/chunk-OGYHFY6K.js.map +1 -0
  20. package/dist/chunk-Q2VUO52Z.cjs +374 -0
  21. package/dist/chunk-Q2VUO52Z.cjs.map +1 -0
  22. package/dist/chunk-QDJLQR53.cjs +22 -0
  23. package/dist/chunk-QDJLQR53.cjs.map +1 -0
  24. package/dist/chunk-S4WAZC2T.cjs +173 -0
  25. package/dist/chunk-S4WAZC2T.cjs.map +1 -0
  26. package/dist/chunk-SMH6IOP2.js +368 -0
  27. package/dist/chunk-SMH6IOP2.js.map +1 -0
  28. package/dist/chunk-SR3MPV4D.js +237 -0
  29. package/dist/chunk-SR3MPV4D.js.map +1 -0
  30. package/dist/chunk-X2K3GIWE.js +235 -0
  31. package/dist/chunk-X2K3GIWE.js.map +1 -0
  32. package/dist/chunk-ZCUXHW55.cjs +242 -0
  33. package/dist/chunk-ZCUXHW55.cjs.map +1 -0
  34. package/dist/element-browser.js +883 -492
  35. package/dist/element-browser.js.map +1 -1
  36. package/dist/element.cjs +88 -6
  37. package/dist/element.cjs.map +1 -1
  38. package/dist/element.d.cts +51 -1
  39. package/dist/element.d.ts +51 -1
  40. package/dist/element.js +87 -5
  41. package/dist/element.js.map +1 -1
  42. package/dist/index.cjs +523 -393
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.d.cts +2 -2
  45. package/dist/index.d.ts +2 -2
  46. package/dist/index.js +494 -366
  47. package/dist/index.js.map +1 -1
  48. package/dist/libav-demux-H2GS46GH.cjs +27 -0
  49. package/dist/libav-demux-H2GS46GH.cjs.map +1 -0
  50. package/dist/libav-demux-OWZ4T2YW.js +6 -0
  51. package/dist/libav-demux-OWZ4T2YW.js.map +1 -0
  52. package/dist/{libav-import-GST2AMPL.cjs → libav-import-2ZVKV2E7.cjs} +2 -2
  53. package/dist/{libav-import-GST2AMPL.cjs.map → libav-import-2ZVKV2E7.cjs.map} +1 -1
  54. package/dist/{libav-import-2JURFHEW.js → libav-import-6MGLCXVQ.js} +2 -2
  55. package/dist/{libav-import-2JURFHEW.js.map → libav-import-6MGLCXVQ.js.map} +1 -1
  56. package/dist/{player-B6WB74RD.d.ts → player-DGXeCNfD.d.cts} +41 -1
  57. package/dist/{player-B6WB74RD.d.cts → player-DGXeCNfD.d.ts} +41 -1
  58. package/dist/player.cjs +731 -472
  59. package/dist/player.cjs.map +1 -1
  60. package/dist/player.d.cts +229 -120
  61. package/dist/player.d.ts +229 -120
  62. package/dist/player.js +710 -451
  63. package/dist/player.js.map +1 -1
  64. package/dist/remux-OBSMIENG.cjs +35 -0
  65. package/dist/remux-OBSMIENG.cjs.map +1 -0
  66. package/dist/remux-WBYIZBBX.js +10 -0
  67. package/dist/remux-WBYIZBBX.js.map +1 -0
  68. package/dist/source-4TZ6KMNV.js +4 -0
  69. package/dist/{source-F656KYYV.js.map → source-4TZ6KMNV.js.map} +1 -1
  70. package/dist/source-7YLO6E7X.cjs +29 -0
  71. package/dist/{source-73CAH6HW.cjs.map → source-7YLO6E7X.cjs.map} +1 -1
  72. package/dist/source-MTX5ELUZ.js +4 -0
  73. package/dist/{source-QJR3OHTW.js.map → source-MTX5ELUZ.js.map} +1 -1
  74. package/dist/source-VFLXLOCN.cjs +29 -0
  75. package/dist/{source-VB74JQ7Z.cjs.map → source-VFLXLOCN.cjs.map} +1 -1
  76. package/dist/subtitles-4T74JRGT.js +4 -0
  77. package/dist/subtitles-4T74JRGT.js.map +1 -0
  78. package/dist/subtitles-QUH4LPI4.cjs +29 -0
  79. package/dist/subtitles-QUH4LPI4.cjs.map +1 -0
  80. package/package.json +1 -1
  81. package/src/convert/remux.ts +1 -35
  82. package/src/convert/transcode-libav.ts +691 -0
  83. package/src/convert/transcode.ts +12 -4
  84. package/src/element/avbridge-player.ts +100 -0
  85. package/src/element/avbridge-video.ts +140 -3
  86. package/src/element/player-styles.ts +12 -0
  87. package/src/errors.ts +6 -0
  88. package/src/player.ts +15 -16
  89. package/src/strategies/fallback/decoder.ts +96 -173
  90. package/src/strategies/fallback/index.ts +46 -2
  91. package/src/strategies/fallback/libav-import.ts +9 -1
  92. package/src/strategies/fallback/video-renderer.ts +107 -0
  93. package/src/strategies/hybrid/decoder.ts +88 -180
  94. package/src/strategies/hybrid/index.ts +35 -2
  95. package/src/strategies/native.ts +6 -3
  96. package/src/strategies/remux/index.ts +14 -2
  97. package/src/strategies/remux/pipeline.ts +72 -12
  98. package/src/subtitles/render.ts +8 -0
  99. package/src/types.ts +32 -0
  100. package/src/util/libav-demux.ts +405 -0
  101. package/src/util/time-ranges.ts +40 -0
  102. package/dist/chunk-2PGRFCWB.js.map +0 -1
  103. package/dist/chunk-6UUT4BEA.cjs.map +0 -1
  104. package/dist/chunk-7RGG6ME7.cjs.map +0 -1
  105. package/dist/chunk-NV7ILLWH.js.map +0 -1
  106. package/dist/chunk-QQXBPW72.js.map +0 -1
  107. package/dist/chunk-XKPSTC34.cjs.map +0 -1
  108. package/dist/source-73CAH6HW.cjs +0 -28
  109. package/dist/source-F656KYYV.js +0 -3
  110. package/dist/source-QJR3OHTW.js +0 -3
  111. package/dist/source-VB74JQ7Z.cjs +0 -28
package/dist/player.d.ts CHANGED
@@ -1,123 +1,3 @@
1
- /**
2
- * `<avbridge-player>` — YouTube-style controls element.
3
- *
4
- * Wraps `<avbridge-video>` with a full player UI: play/pause, seek bar,
5
- * volume, settings menu (speed, subtitles, audio tracks), fullscreen,
6
- * keyboard shortcuts, touch gestures, and auto-hiding controls.
7
- *
8
- * All properties, methods, and events from `<avbridge-video>` are proxied
9
- * through. Consumers interact with `<avbridge-player>` exclusively.
10
- */
11
- declare class AvbridgePlayerElement extends HTMLElement {
12
- static readonly observedAttributes: ("src" | "muted" | "autoplay" | "loop" | "preload" | "poster" | "playsinline" | "crossorigin" | "disableremoteplayback" | "preferstrategy")[];
13
- private _video;
14
- private _playBtn;
15
- private _overlayBtn;
16
- private _seekInput;
17
- private _seekProgress;
18
- private _seekBuffered;
19
- private _seekThumb;
20
- private _seekTooltip;
21
- private _timeDisplay;
22
- private _volumeBtn;
23
- private _volumeInput;
24
- private _settingsBtn;
25
- private _settingsMenu;
26
- private _fullscreenBtn;
27
- private _speedIndicator;
28
- private _rippleLeft;
29
- private _rippleRight;
30
- private _state;
31
- private _controlsTimer;
32
- private _settingsOpen;
33
- private _userSeeking;
34
- private _holdTimer;
35
- private _holdSpeedActive;
36
- private _savedPlaybackRate;
37
- private _lastTapTime;
38
- private _tapTimer;
39
- private _statsOpen;
40
- private _statsEl;
41
- private _statsInterval;
42
- private _eventCleanup;
43
- constructor();
44
- private _template;
45
- private _bindEvents;
46
- connectedCallback(): void;
47
- disconnectedCallback(): void;
48
- attributeChangedCallback(name: string, _old: string | null, value: string | null): void;
49
- private _setState;
50
- private _togglePlay;
51
- private _onSeekInput;
52
- private _onSeekCommit;
53
- /** Linear click-to-time mapping across the full track width (no edge clamping). */
54
- private _timeFromSeekPointer;
55
- private _onSeekPointerDown;
56
- private _onSeekHover;
57
- private _updateSeekVisuals;
58
- private _updateTime;
59
- private _toggleMute;
60
- private _updateVolume;
61
- private _toggleSettings;
62
- private _closeSettings;
63
- private _buildSettingsMenu;
64
- private _toggleStats;
65
- private _updateStats;
66
- private _toggleFullscreen;
67
- private _updateFullscreenIcon;
68
- private _showControls;
69
- private _scheduleHide;
70
- /** Track whether the last interaction was touch so click handler can skip. */
71
- private _lastPointerTypeWasTouch;
72
- private _onContainerClick;
73
- private _onContainerDblClick;
74
- private _onPointerDown;
75
- private _onPointerUp;
76
- private _cancelHold;
77
- private _doDoubleTap;
78
- private _onKeydown;
79
- private _clearTimers;
80
- get src(): string;
81
- set src(v: string);
82
- get source(): unknown;
83
- set source(v: unknown);
84
- get currentTime(): number;
85
- set currentTime(v: number);
86
- get duration(): number;
87
- get paused(): boolean;
88
- get ended(): boolean;
89
- get readyState(): number;
90
- get volume(): number;
91
- set volume(v: number);
92
- get muted(): boolean;
93
- set muted(v: boolean);
94
- get playbackRate(): number;
95
- set playbackRate(v: number);
96
- get autoplay(): boolean;
97
- set autoplay(v: boolean);
98
- get loop(): boolean;
99
- set loop(v: boolean);
100
- get videoWidth(): number;
101
- get videoHeight(): number;
102
- get buffered(): TimeRanges;
103
- get played(): TimeRanges;
104
- get seekable(): TimeRanges;
105
- get strategy(): string | undefined;
106
- get strategyClass(): string | undefined;
107
- get audioTracks(): unknown[];
108
- get subtitleTracks(): unknown[];
109
- get player(): unknown;
110
- get videoElement(): HTMLVideoElement;
111
- play(): Promise<void>;
112
- pause(): void;
113
- load(): Promise<void>;
114
- destroy(): Promise<void>;
115
- setAudioTrack(id: number): Promise<void>;
116
- setSubtitleTrack(id: number | null): Promise<void>;
117
- getDiagnostics(): unknown;
118
- canPlayType(mime: string): string;
119
- }
120
-
121
1
  /**
122
2
  * Core types shared across avbridge modules.
123
3
  *
@@ -364,6 +244,185 @@ interface PlayerEventMap {
364
244
  type PlayerEventName = keyof PlayerEventMap;
365
245
  /** Generic listener type re-exported for player.on overloads. */
366
246
  type Listener<T> = (payload: T) => void;
247
+ /**
248
+ * CustomEvents dispatched by `<avbridge-video>` and `<avbridge-player>`.
249
+ * Map each event name to the full `CustomEvent<Detail>` so addEventListener
250
+ * overloads can type the listener parameter correctly.
251
+ *
252
+ * Standard HTMLMediaElement events (play, pause, seeking, volumechange,
253
+ * etc.) are forwarded from the inner `<video>` as plain `Event`s and remain
254
+ * typed via the built-in `HTMLElementEventMap`. They are NOT in this map —
255
+ * TypeScript will pick up their native types automatically.
256
+ */
257
+ interface AvbridgeVideoElementEventMap {
258
+ strategychange: CustomEvent<{
259
+ strategy: StrategyName;
260
+ strategyClass: string | null;
261
+ reason: string;
262
+ from?: StrategyName;
263
+ currentTime?: number;
264
+ diagnostics: DiagnosticsSnapshot;
265
+ }>;
266
+ trackschange: CustomEvent<{
267
+ audioTracks: AudioTrackInfo[];
268
+ subtitleTracks: SubtitleTrackInfo[];
269
+ }>;
270
+ timeupdate: CustomEvent<{
271
+ currentTime: number;
272
+ }>;
273
+ ended: CustomEvent<Record<string, never>>;
274
+ ready: CustomEvent<{
275
+ diagnostics: DiagnosticsSnapshot;
276
+ }>;
277
+ destroy: CustomEvent<Record<string, never>>;
278
+ error: CustomEvent<{
279
+ error: Error;
280
+ diagnostics: DiagnosticsSnapshot | null;
281
+ }>;
282
+ progress: CustomEvent<{
283
+ buffered: TimeRanges;
284
+ }>;
285
+ loadstart: CustomEvent<Record<string, never>>;
286
+ }
287
+
288
+ /**
289
+ * `<avbridge-player>` — YouTube-style controls element.
290
+ *
291
+ * Wraps `<avbridge-video>` with a full player UI: play/pause, seek bar,
292
+ * volume, settings menu (speed, subtitles, audio tracks), fullscreen,
293
+ * keyboard shortcuts, touch gestures, and auto-hiding controls.
294
+ *
295
+ * All properties, methods, and events from `<avbridge-video>` are proxied
296
+ * through. Consumers interact with `<avbridge-player>` exclusively.
297
+ */
298
+
299
+ declare class AvbridgePlayerElement extends HTMLElement {
300
+ static readonly observedAttributes: ("src" | "muted" | "autoplay" | "loop" | "preload" | "poster" | "playsinline" | "crossorigin" | "disableremoteplayback" | "preferstrategy")[];
301
+ private _video;
302
+ private _playBtn;
303
+ private _overlayBtn;
304
+ private _seekInput;
305
+ private _seekProgress;
306
+ private _seekBuffered;
307
+ private _seekThumb;
308
+ private _seekTooltip;
309
+ private _timeDisplay;
310
+ private _volumeBtn;
311
+ private _volumeInput;
312
+ private _settingsBtn;
313
+ private _settingsMenu;
314
+ private _fullscreenBtn;
315
+ private _speedIndicator;
316
+ private _rippleLeft;
317
+ private _rippleRight;
318
+ private _state;
319
+ private _controlsTimer;
320
+ private _settingsOpen;
321
+ private _userSeeking;
322
+ private _holdTimer;
323
+ private _holdSpeedActive;
324
+ private _savedPlaybackRate;
325
+ private _lastTapTime;
326
+ private _tapTimer;
327
+ private _statsOpen;
328
+ private _statsEl;
329
+ private _statsInterval;
330
+ private _eventCleanup;
331
+ constructor();
332
+ private _template;
333
+ private _bindEvents;
334
+ connectedCallback(): void;
335
+ disconnectedCallback(): void;
336
+ attributeChangedCallback(name: string, _old: string | null, value: string | null): void;
337
+ private _setState;
338
+ private _togglePlay;
339
+ private _onSeekInput;
340
+ private _onSeekCommit;
341
+ /** Linear click-to-time mapping across the full track width (no edge clamping). */
342
+ private _timeFromSeekPointer;
343
+ private _onSeekPointerDown;
344
+ private _onSeekHover;
345
+ private _updateSeekVisuals;
346
+ private _updateTime;
347
+ private _toggleMute;
348
+ private _updateVolume;
349
+ private _toggleSettings;
350
+ private _closeSettings;
351
+ private _buildSettingsMenu;
352
+ private _toggleStats;
353
+ private _updateStats;
354
+ private _toggleFullscreen;
355
+ private _updateFullscreenIcon;
356
+ private _showControls;
357
+ private _scheduleHide;
358
+ /** Track whether the last interaction was touch so click handler can skip. */
359
+ private _lastPointerTypeWasTouch;
360
+ private _onContainerClick;
361
+ private _onContainerDblClick;
362
+ private _onPointerDown;
363
+ private _onPointerUp;
364
+ private _cancelHold;
365
+ private _doDoubleTap;
366
+ private _onKeydown;
367
+ private _clearTimers;
368
+ get src(): string;
369
+ set src(v: string);
370
+ get source(): unknown;
371
+ set source(v: unknown);
372
+ get currentTime(): number;
373
+ set currentTime(v: number);
374
+ get duration(): number;
375
+ get paused(): boolean;
376
+ get ended(): boolean;
377
+ get readyState(): number;
378
+ get volume(): number;
379
+ set volume(v: number);
380
+ get muted(): boolean;
381
+ set muted(v: boolean);
382
+ get playbackRate(): number;
383
+ set playbackRate(v: number);
384
+ get autoplay(): boolean;
385
+ set autoplay(v: boolean);
386
+ get loop(): boolean;
387
+ set loop(v: boolean);
388
+ get videoWidth(): number;
389
+ get videoHeight(): number;
390
+ get buffered(): TimeRanges;
391
+ get played(): TimeRanges;
392
+ get seekable(): TimeRanges;
393
+ get strategy(): string | undefined;
394
+ get strategyClass(): string | undefined;
395
+ get audioTracks(): unknown[];
396
+ get subtitleTracks(): unknown[];
397
+ /**
398
+ * External subtitle files to attach when the source loads. Forwarded
399
+ * to the inner <avbridge-video>. Takes effect on next bootstrap.
400
+ */
401
+ get subtitles(): unknown;
402
+ set subtitles(value: unknown);
403
+ /** Attach a subtitle track to the current playback without a reload. */
404
+ addSubtitle(subtitle: {
405
+ url: string;
406
+ language?: string;
407
+ format?: "vtt" | "srt";
408
+ }): Promise<void>;
409
+ get player(): unknown;
410
+ get videoElement(): HTMLVideoElement;
411
+ play(): Promise<void>;
412
+ pause(): void;
413
+ load(): Promise<void>;
414
+ destroy(): Promise<void>;
415
+ setAudioTrack(id: number): Promise<void>;
416
+ setSubtitleTrack(id: number | null): Promise<void>;
417
+ getDiagnostics(): unknown;
418
+ canPlayType(mime: string): string;
419
+ addEventListener<K extends keyof AvbridgeVideoElementEventMap>(type: K, listener: (this: AvbridgePlayerElement, ev: AvbridgeVideoElementEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
420
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: AvbridgePlayerElement, ev: HTMLElementEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
421
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
422
+ removeEventListener<K extends keyof AvbridgeVideoElementEventMap>(type: K, listener: (this: AvbridgePlayerElement, ev: AvbridgeVideoElementEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
423
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: AvbridgePlayerElement, ev: HTMLElementEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
424
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
425
+ }
367
426
 
368
427
  declare class UnifiedPlayer {
369
428
  private readonly options;
@@ -504,7 +563,20 @@ declare class AvbridgeVideoElement extends HTMLElementCtor {
504
563
  private _strategy;
505
564
  private _strategyClass;
506
565
  private _audioTracks;
566
+ /** Subtitle tracks reported by the active UnifiedPlayer (options.subtitles
567
+ * + embedded container tracks + programmatic addSubtitle calls). */
507
568
  private _subtitleTracks;
569
+ /** Subtitle tracks derived from light-DOM `<track>` children. Maintained
570
+ * by _syncTextTracks on every mutation. Merged into the public
571
+ * `subtitleTracks` getter so the player's settings menu sees them. */
572
+ private _htmlTrackInfo;
573
+ /**
574
+ * External subtitle list forwarded to `createPlayer()` on the next
575
+ * bootstrap. Setting this after bootstrap queues it for the next
576
+ * source change; consumers that need to swap subtitles mid-playback
577
+ * should set `source` to reload.
578
+ */
579
+ private _subtitles;
508
580
  /**
509
581
  * Initial strategy preference. `"auto"` means "let the classifier decide";
510
582
  * any other value is passed to `createPlayer({ initialStrategy })` and
@@ -621,6 +693,37 @@ declare class AvbridgeVideoElement extends HTMLElementCtor {
621
693
  get player(): UnifiedPlayer | null;
622
694
  get audioTracks(): AudioTrackInfo[];
623
695
  get subtitleTracks(): SubtitleTrackInfo[];
696
+ /**
697
+ * External subtitle files to attach when the source loads. Takes effect
698
+ * on the next bootstrap — set before assigning `source`, or reload via
699
+ * `load()` after changing. For dynamic post-bootstrap addition, use
700
+ * `addSubtitle()` instead.
701
+ *
702
+ * @example
703
+ * el.subtitles = [{ url: "/en.srt", format: "srt", language: "en" }];
704
+ * el.src = "/movie.mp4";
705
+ */
706
+ get subtitles(): Array<{
707
+ url: string;
708
+ language?: string;
709
+ format?: "vtt" | "srt";
710
+ }> | null;
711
+ set subtitles(value: Array<{
712
+ url: string;
713
+ language?: string;
714
+ format?: "vtt" | "srt";
715
+ }> | null);
716
+ /**
717
+ * Attach a subtitle track to the current playback without rebuilding
718
+ * the player. Works while the element is playing — converts SRT to
719
+ * VTT if needed, adds a `<track>` to the inner `<video>`. Canvas
720
+ * strategies pick up the new track via their textTracks watcher.
721
+ */
722
+ addSubtitle(subtitle: {
723
+ url: string;
724
+ language?: string;
725
+ format?: "vtt" | "srt";
726
+ }): Promise<void>;
624
727
  /** Force a (re-)bootstrap if a source is currently set. */
625
728
  load(): Promise<void>;
626
729
  /**
@@ -637,6 +740,12 @@ declare class AvbridgeVideoElement extends HTMLElementCtor {
637
740
  setAudioTrack(id: number): Promise<void>;
638
741
  setSubtitleTrack(id: number | null): Promise<void>;
639
742
  getDiagnostics(): DiagnosticsSnapshot | null;
743
+ addEventListener<K extends keyof AvbridgeVideoElementEventMap>(type: K, listener: (this: AvbridgeVideoElement, ev: AvbridgeVideoElementEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
744
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: AvbridgeVideoElement, ev: HTMLElementEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
745
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
746
+ removeEventListener<K extends keyof AvbridgeVideoElementEventMap>(type: K, listener: (this: AvbridgeVideoElement, ev: AvbridgeVideoElementEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
747
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: AvbridgeVideoElement, ev: HTMLElementEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
748
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
640
749
  private _dispatch;
641
750
  private _dispatchError;
642
751
  }