hls.js 1.5.12 → 1.5.13-0.canary.10403

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 (103) hide show
  1. package/README.md +4 -3
  2. package/dist/hls-demo.js +41 -38
  3. package/dist/hls-demo.js.map +1 -1
  4. package/dist/hls.js +4174 -2625
  5. package/dist/hls.js.d.ts +173 -108
  6. package/dist/hls.js.map +1 -1
  7. package/dist/hls.light.js +2851 -1914
  8. package/dist/hls.light.js.map +1 -1
  9. package/dist/hls.light.min.js +1 -1
  10. package/dist/hls.light.min.js.map +1 -1
  11. package/dist/hls.light.mjs +2560 -1608
  12. package/dist/hls.light.mjs.map +1 -1
  13. package/dist/hls.min.js +1 -1
  14. package/dist/hls.min.js.map +1 -1
  15. package/dist/hls.mjs +3546 -1982
  16. package/dist/hls.mjs.map +1 -1
  17. package/dist/hls.worker.js +1 -1
  18. package/dist/hls.worker.js.map +1 -1
  19. package/package.json +38 -38
  20. package/src/config.ts +5 -2
  21. package/src/controller/abr-controller.ts +39 -25
  22. package/src/controller/audio-stream-controller.ts +141 -137
  23. package/src/controller/audio-track-controller.ts +1 -1
  24. package/src/controller/base-playlist-controller.ts +27 -10
  25. package/src/controller/base-stream-controller.ts +215 -82
  26. package/src/controller/buffer-controller.ts +250 -97
  27. package/src/controller/buffer-operation-queue.ts +16 -19
  28. package/src/controller/cap-level-controller.ts +3 -2
  29. package/src/controller/cmcd-controller.ts +51 -14
  30. package/src/controller/content-steering-controller.ts +29 -15
  31. package/src/controller/eme-controller.ts +10 -23
  32. package/src/controller/error-controller.ts +28 -22
  33. package/src/controller/fps-controller.ts +8 -3
  34. package/src/controller/fragment-finders.ts +44 -16
  35. package/src/controller/fragment-tracker.ts +58 -25
  36. package/src/controller/gap-controller.ts +43 -16
  37. package/src/controller/id3-track-controller.ts +45 -35
  38. package/src/controller/latency-controller.ts +18 -13
  39. package/src/controller/level-controller.ts +37 -19
  40. package/src/controller/stream-controller.ts +100 -83
  41. package/src/controller/subtitle-stream-controller.ts +35 -47
  42. package/src/controller/subtitle-track-controller.ts +5 -3
  43. package/src/controller/timeline-controller.ts +20 -22
  44. package/src/crypt/aes-crypto.ts +21 -2
  45. package/src/crypt/decrypter-aes-mode.ts +4 -0
  46. package/src/crypt/decrypter.ts +32 -16
  47. package/src/crypt/fast-aes-key.ts +28 -5
  48. package/src/demux/audio/aacdemuxer.ts +2 -2
  49. package/src/demux/audio/ac3-demuxer.ts +4 -3
  50. package/src/demux/audio/adts.ts +9 -4
  51. package/src/demux/audio/base-audio-demuxer.ts +16 -14
  52. package/src/demux/audio/mp3demuxer.ts +4 -3
  53. package/src/demux/audio/mpegaudio.ts +1 -1
  54. package/src/demux/mp4demuxer.ts +7 -7
  55. package/src/demux/sample-aes.ts +2 -0
  56. package/src/demux/transmuxer-interface.ts +8 -16
  57. package/src/demux/transmuxer-worker.ts +4 -4
  58. package/src/demux/transmuxer.ts +16 -3
  59. package/src/demux/tsdemuxer.ts +75 -38
  60. package/src/demux/video/avc-video-parser.ts +210 -121
  61. package/src/demux/video/base-video-parser.ts +135 -2
  62. package/src/demux/video/exp-golomb.ts +0 -208
  63. package/src/demux/video/hevc-video-parser.ts +749 -0
  64. package/src/events.ts +8 -1
  65. package/src/exports-named.ts +1 -1
  66. package/src/hls.ts +73 -43
  67. package/src/loader/date-range.ts +71 -5
  68. package/src/loader/fragment-loader.ts +23 -21
  69. package/src/loader/fragment.ts +8 -4
  70. package/src/loader/key-loader.ts +3 -1
  71. package/src/loader/level-details.ts +6 -6
  72. package/src/loader/level-key.ts +10 -9
  73. package/src/loader/m3u8-parser.ts +138 -144
  74. package/src/loader/playlist-loader.ts +5 -7
  75. package/src/remux/mp4-generator.ts +196 -1
  76. package/src/remux/mp4-remuxer.ts +36 -16
  77. package/src/remux/passthrough-remuxer.ts +1 -1
  78. package/src/task-loop.ts +5 -2
  79. package/src/types/component-api.ts +3 -1
  80. package/src/types/demuxer.ts +3 -0
  81. package/src/types/events.ts +19 -6
  82. package/src/types/fragment-tracker.ts +2 -2
  83. package/src/types/media-playlist.ts +9 -1
  84. package/src/types/remuxer.ts +1 -1
  85. package/src/utils/attr-list.ts +96 -9
  86. package/src/utils/buffer-helper.ts +12 -31
  87. package/src/utils/cea-608-parser.ts +1 -3
  88. package/src/utils/codecs.ts +34 -5
  89. package/src/utils/encryption-methods-util.ts +21 -0
  90. package/src/utils/fetch-loader.ts +1 -1
  91. package/src/utils/hash.ts +10 -0
  92. package/src/utils/hdr.ts +4 -7
  93. package/src/utils/imsc1-ttml-parser.ts +1 -1
  94. package/src/utils/keysystem-util.ts +1 -6
  95. package/src/utils/level-helper.ts +71 -44
  96. package/src/utils/logger.ts +58 -23
  97. package/src/utils/mp4-tools.ts +5 -3
  98. package/src/utils/rendition-helper.ts +100 -74
  99. package/src/utils/utf8-utils.ts +18 -0
  100. package/src/utils/variable-substitution.ts +0 -19
  101. package/src/utils/webvtt-parser.ts +2 -12
  102. package/src/demux/id3.ts +0 -411
  103. package/src/types/general.ts +0 -6
package/dist/hls.js.d.ts CHANGED
@@ -6,7 +6,7 @@ export declare interface AbrComponentAPI extends ComponentAPI {
6
6
  resetEstimator(abrEwmaDefaultEstimate: number): any;
7
7
  }
8
8
 
9
- export declare class AbrController implements AbrComponentAPI {
9
+ export declare class AbrController extends Logger implements AbrComponentAPI {
10
10
  protected hls: Hls;
11
11
  private lastLevelLoadSec;
12
12
  private lastLoadedFragLevel;
@@ -69,7 +69,7 @@ export declare type ABRControllerConfig = {
69
69
 
70
70
  export declare class AttrList {
71
71
  [key: string]: any;
72
- constructor(attrs: string | Record<string, any>);
72
+ constructor(attrs: string | Record<string, any>, parsed?: Pick<ParsedMultivariantPlaylist | LevelDetails, 'variableList' | 'hasVariableRefs' | 'playlistParsingError'>);
73
73
  get clientAttrs(): string[];
74
74
  decimalInteger(attrName: string): number;
75
75
  hexadecimalInteger(attrName: string): Uint8Array | null;
@@ -77,12 +77,17 @@ export declare class AttrList {
77
77
  decimalFloatingPoint(attrName: string): number;
78
78
  optionalFloat(attrName: string, defaultValue: number): number;
79
79
  enumeratedString(attrName: string): string | undefined;
80
+ enumeratedStringList<T extends {
81
+ [key: string]: boolean;
82
+ }>(attrName: string, dict: T): {
83
+ [key in keyof T]: boolean;
84
+ };
80
85
  bool(attrName: string): boolean;
81
86
  decimalResolution(attrName: string): {
82
87
  width: number;
83
88
  height: number;
84
89
  } | undefined;
85
- static parseAttrList(input: string): Record<string, any>;
90
+ static parseAttrList(input: string, parsed?: Pick<ParsedMultivariantPlaylist | LevelDetails, 'variableList' | 'hasVariableRefs' | 'playlistParsingError'>): Record<string, string>;
86
91
  }
87
92
 
88
93
  export declare type AudioPlaylistType = 'AUDIO';
@@ -99,9 +104,8 @@ export declare type AudioSelectionOption = {
99
104
  };
100
105
 
101
106
  export declare class AudioStreamController extends BaseStreamController implements NetworkComponentAPI {
102
- private videoBuffer;
103
- private videoTrackCC;
104
- private waitingVideoCC;
107
+ private videoAnchor;
108
+ private mainFragLoading;
105
109
  private bufferedTrack;
106
110
  private switchingTrack;
107
111
  private trackId;
@@ -112,28 +116,29 @@ export declare class AudioStreamController extends BaseStreamController implemen
112
116
  private cachedTrackLoadedData;
113
117
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
114
118
  protected onHandlerDestroying(): void;
115
- private _registerListeners;
116
- private _unregisterListeners;
119
+ protected registerListeners(): void;
120
+ protected unregisterListeners(): void;
117
121
  onInitPtsFound(event: Events.INIT_PTS_FOUND, { frag, id, initPTS, timescale }: InitPTSFoundData): void;
122
+ private findSyncFrag;
118
123
  startLoad(startPosition: number): void;
119
124
  doTick(): void;
120
125
  clearWaitingFragment(): void;
121
126
  protected resetLoadingState(): void;
122
127
  protected onTickEnd(): void;
123
128
  private doTickIdle;
124
- protected getMaxBufferLength(mainBufferLength?: number): number;
125
- onMediaDetaching(): void;
126
- onAudioTracksUpdated(event: Events.AUDIO_TRACKS_UPDATED, { audioTracks }: AudioTracksUpdatedData): void;
127
- onAudioTrackSwitching(event: Events.AUDIO_TRACK_SWITCHING, data: AudioTrackSwitchingData): void;
128
- onManifestLoading(): void;
129
- onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData): void;
130
- onAudioTrackLoaded(event: Events.AUDIO_TRACK_LOADED, data: TrackLoadedData): void;
129
+ protected onMediaDetaching(): void;
130
+ private onAudioTracksUpdated;
131
+ private onAudioTrackSwitching;
132
+ protected onManifestLoading(): void;
133
+ private onLevelLoaded;
134
+ private onAudioTrackLoaded;
131
135
  _handleFragmentLoadProgress(data: FragLoadedData): void;
132
136
  protected _handleFragmentLoadComplete(fragLoadedData: FragLoadedData): void;
133
- onBufferReset(): void;
134
- onBufferCreated(event: Events.BUFFER_CREATED, data: BufferCreatedData): void;
135
- onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData): void;
136
- private onError;
137
+ private onBufferReset;
138
+ private onBufferCreated;
139
+ private onFragLoading;
140
+ private onFragBuffered;
141
+ protected onError(event: Events.ERROR, data: ErrorData): void;
137
142
  private onBufferFlushing;
138
143
  private onBufferFlushed;
139
144
  private _handleTransmuxComplete;
@@ -188,13 +193,11 @@ export declare interface BackBufferData {
188
193
  bufferEnd: number;
189
194
  }
190
195
 
191
- export declare class BasePlaylistController implements NetworkComponentAPI {
196
+ export declare class BasePlaylistController extends Logger implements NetworkComponentAPI {
192
197
  protected hls: Hls;
193
198
  protected timer: number;
194
199
  protected requestScheduled: number;
195
200
  protected canLoad: boolean;
196
- protected log: (msg: any) => void;
197
- protected warn: (msg: any) => void;
198
201
  constructor(hls: Hls, logPrefix: string);
199
202
  destroy(): void;
200
203
  protected clearTimer(): void;
@@ -226,7 +229,7 @@ export declare class BaseSegment {
226
229
 
227
230
  export declare class BaseStreamController extends TaskLoop implements NetworkComponentAPI {
228
231
  protected hls: Hls;
229
- protected fragPrevious: Fragment | null;
232
+ protected fragPrevious: MediaFragment | null;
230
233
  protected fragCurrent: Fragment | null;
231
234
  protected fragmentTracker: FragmentTracker;
232
235
  protected transmuxer: TransmuxerInterface | null;
@@ -249,22 +252,26 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
249
252
  protected startFragRequested: boolean;
250
253
  protected decrypter: Decrypter;
251
254
  protected initPTS: RationalTimestamp[];
252
- protected onvseeking: EventListener | null;
253
- protected onvended: EventListener | null;
254
- private readonly logPrefix;
255
- protected log: (msg: any) => void;
256
- protected warn: (msg: any) => void;
255
+ protected buffering: boolean;
256
+ private loadingParts;
257
+ private loopSn?;
257
258
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader, logPrefix: string, playlistType: PlaylistLevelType);
259
+ protected registerListeners(): void;
260
+ protected unregisterListeners(): void;
258
261
  protected doTick(): void;
259
262
  protected onTickEnd(): void;
260
263
  startLoad(startPosition: number): void;
261
264
  stopLoad(): void;
265
+ pauseBuffering(): void;
266
+ resumeBuffering(): void;
262
267
  protected _streamEnded(bufferInfo: BufferInfo, levelDetails: LevelDetails): boolean;
263
268
  protected getLevelDetails(): LevelDetails | undefined;
264
269
  protected onMediaAttached(event: Events.MEDIA_ATTACHED, data: MediaAttachedData): void;
265
270
  protected onMediaDetaching(): void;
266
- protected onMediaSeeking(): void;
267
- protected onMediaEnded(): void;
271
+ protected onManifestLoading(): void;
272
+ protected onError(event: Events.ERROR, data: ErrorData): void;
273
+ protected onMediaSeeking: () => void;
274
+ protected onMediaEnded: () => void;
268
275
  protected onManifestLoaded(event: Events.MANIFEST_LOADED, data: ManifestLoadedData): void;
269
276
  protected onHandlerDestroying(): void;
270
277
  protected onHandlerDestroyed(): void;
@@ -284,8 +291,9 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
284
291
  private doFragPartsLoad;
285
292
  private handleFragLoadError;
286
293
  protected _handleTransmuxerFlush(chunkMeta: ChunkMetadata): void;
294
+ private shouldLoadParts;
287
295
  protected getCurrentContext(chunkMeta: ChunkMetadata): {
288
- frag: Fragment;
296
+ frag: MediaFragment;
289
297
  part: Part | null;
290
298
  level: Level;
291
299
  } | null;
@@ -302,8 +310,8 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
302
310
  mapToInitFragWhenRequired(frag: Fragment | null): typeof frag;
303
311
  getNextPart(partList: Part[], frag: Fragment, targetBufferTime: number): number;
304
312
  private loadedEndOfParts;
305
- protected getInitialLiveFragment(levelDetails: LevelDetails, fragments: Array<Fragment>): Fragment | null;
306
- protected getFragmentAtPosition(bufferEnd: number, end: number, levelDetails: LevelDetails): Fragment | null;
313
+ protected getInitialLiveFragment(levelDetails: LevelDetails, fragments: MediaFragment[]): MediaFragment | null;
314
+ protected getFragmentAtPosition(bufferEnd: number, end: number, levelDetails: LevelDetails): MediaFragment | null;
307
315
  protected synchronizeToLiveEdge(levelDetails: LevelDetails): void;
308
316
  protected alignPlaylists(details: LevelDetails, previousDetails: LevelDetails | undefined, switchDetails: LevelDetails | undefined): number;
309
317
  protected waitForCdnTuneIn(details: LevelDetails): boolean | 0;
@@ -353,17 +361,20 @@ export declare interface BufferCodecsData {
353
361
  audio?: Track;
354
362
  }
355
363
 
356
- export declare class BufferController implements ComponentAPI {
364
+ export declare class BufferController extends Logger implements ComponentAPI {
357
365
  private details;
358
366
  private _objectUrl;
359
367
  private operationQueue;
360
368
  private listeners;
361
369
  private hls;
370
+ private fragmentTracker;
362
371
  bufferCodecEventsExpected: number;
363
372
  private _bufferCodecEventsTotal;
364
373
  media: HTMLMediaElement | null;
365
374
  mediaSource: MediaSource | null;
366
375
  private lastMpegAudioChunk;
376
+ private blockedAudioAppend;
377
+ private lastVideoAppendEnd;
367
378
  private appendSource;
368
379
  appendErrors: {
369
380
  audio: number;
@@ -373,10 +384,7 @@ export declare class BufferController implements ComponentAPI {
373
384
  tracks: TrackSet;
374
385
  pendingTracks: TrackSet;
375
386
  sourceBuffer: SourceBuffers;
376
- protected log: (msg: any) => void;
377
- protected warn: (msg: any, obj?: any) => void;
378
- protected error: (msg: any, obj?: any) => void;
379
- constructor(hls: Hls);
387
+ constructor(hls: Hls, fragmentTracker: FragmentTracker);
380
388
  hasSourceTypes(): boolean;
381
389
  destroy(): void;
382
390
  protected registerListeners(): void;
@@ -391,13 +399,18 @@ export declare class BufferController implements ComponentAPI {
391
399
  protected onBufferReset(): void;
392
400
  private resetBuffer;
393
401
  protected onBufferCodecs(event: Events.BUFFER_CODECS, data: BufferCodecsData): void;
394
- protected appendChangeType(type: any, mimeType: any): void;
402
+ protected appendChangeType(type: SourceBufferName, mimeType: string): void;
403
+ private blockAudio;
404
+ private unblockAudio;
395
405
  protected onBufferAppending(event: Events.BUFFER_APPENDING, eventData: BufferAppendingData): void;
406
+ private getFlushOp;
396
407
  protected onBufferFlushing(event: Events.BUFFER_FLUSHING, data: BufferFlushingData): void;
397
408
  protected onFragParsed(event: Events.FRAG_PARSED, data: FragParsedData): void;
398
409
  private onFragChanged;
399
410
  protected onBufferEos(event: Events.BUFFER_EOS, data: BufferEOSData): void;
400
411
  protected onLevelUpdated(event: Events.LEVEL_UPDATED, { details }: LevelUpdatedData): void;
412
+ private onError;
413
+ private resetAppendErrors;
401
414
  trimBuffers(): void;
402
415
  flushBackBuffer(currentTime: number, targetDuration: number, targetBackBufferPosition: number): void;
403
416
  flushFrontBuffer(currentTime: number, targetDuration: number, targetFrontBufferPosition: number): void;
@@ -406,8 +419,8 @@ export declare class BufferController implements ComponentAPI {
406
419
  * 'liveDurationInfinity` is set to `true`
407
420
  * More details: https://github.com/video-dev/hls.js/issues/355
408
421
  */
409
- private updateMediaElementDuration;
410
- updateSeekableRange(levelDetails: any): void;
422
+ private getDurationAndRange;
423
+ private updateMediaSource;
411
424
  protected checkPendingTracks(): void;
412
425
  protected createSourceBuffers(tracks: TrackSet): void;
413
426
  private _onMediaSourceOpen;
@@ -602,6 +615,8 @@ export declare class CMCDController implements ComponentAPI {
602
615
  * Apply CMCD data to a segment request
603
616
  */
604
617
  private applyFragmentData;
618
+ private getNextFrag;
619
+ private getNextPart;
605
620
  /**
606
621
  * The CMCD object type.
607
622
  */
@@ -635,13 +650,12 @@ export declare interface ComponentAPI {
635
650
  destroy(): void;
636
651
  }
637
652
 
638
- export declare class ContentSteeringController implements NetworkComponentAPI {
653
+ export declare class ContentSteeringController extends Logger implements NetworkComponentAPI {
639
654
  private readonly hls;
640
- private log;
641
655
  private loader;
642
656
  private uri;
643
657
  private pathwayId;
644
- private pathwayPriority;
658
+ private _pathwayPriority;
645
659
  private timeToLoad;
646
660
  private reloadTimer;
647
661
  private updated;
@@ -654,6 +668,9 @@ export declare class ContentSteeringController implements NetworkComponentAPI {
654
668
  constructor(hls: Hls);
655
669
  private registerListeners;
656
670
  private unregisterListeners;
671
+ pathways(): string[];
672
+ get pathwayPriority(): string[] | null;
673
+ set pathwayPriority(pathwayPriority: string[]);
657
674
  startLoad(): void;
658
675
  stopLoad(): void;
659
676
  clearTimeout(): void;
@@ -689,20 +706,32 @@ export declare interface CuesParsedData {
689
706
 
690
707
  export declare class DateRange {
691
708
  attr: AttrList;
709
+ tagAnchor: Fragment | null;
710
+ tagOrder: number;
692
711
  private _startDate;
693
712
  private _endDate?;
713
+ private _cue?;
694
714
  private _badValueForSameId?;
695
- constructor(dateRangeAttr: AttrList, dateRangeWithSameId?: DateRange);
715
+ constructor(dateRangeAttr: AttrList, dateRangeWithSameId?: DateRange | undefined, tagCount?: number);
696
716
  get id(): string;
697
717
  get class(): string;
718
+ get cue(): DateRangeCue;
719
+ get startTime(): number;
698
720
  get startDate(): Date;
699
721
  get endDate(): Date | null;
700
722
  get duration(): number | null;
701
723
  get plannedDuration(): number | null;
702
724
  get endOnNext(): boolean;
725
+ get isInterstitial(): boolean;
703
726
  get isValid(): boolean;
704
727
  }
705
728
 
729
+ export declare type DateRangeCue = {
730
+ pre: boolean;
731
+ post: boolean;
732
+ once: boolean;
733
+ };
734
+
706
735
  declare interface DecryptData {
707
736
  uri: string;
708
737
  method: string;
@@ -727,6 +756,7 @@ declare class Decrypter {
727
756
  private currentIV;
728
757
  private currentResult;
729
758
  private useSoftware;
759
+ private enableSoftwareAES;
730
760
  constructor(config: HlsConfig, { removePKCS7Padding }?: {
731
761
  removePKCS7Padding?: boolean | undefined;
732
762
  });
@@ -734,14 +764,19 @@ declare class Decrypter {
734
764
  isSync(): boolean;
735
765
  flush(): Uint8Array | null;
736
766
  reset(): void;
737
- decrypt(data: Uint8Array | ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer>;
738
- softwareDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer): ArrayBuffer | null;
739
- webCryptoDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer>;
767
+ decrypt(data: Uint8Array | ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): Promise<ArrayBuffer>;
768
+ softwareDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): ArrayBuffer | null;
769
+ webCryptoDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): Promise<ArrayBuffer>;
740
770
  private onWebCryptoError;
741
771
  private getValidChunk;
742
772
  private logOnce;
743
773
  }
744
774
 
775
+ declare const enum DecrypterAesMode {
776
+ cbc = 0,
777
+ ctr = 1
778
+ }
779
+
745
780
  declare type DRMSystemConfiguration = {
746
781
  licenseUrl: string;
747
782
  serverCertificateUrl?: string;
@@ -787,7 +822,7 @@ export declare const enum ElementaryStreamTypes {
787
822
  * @class
788
823
  * @constructor
789
824
  */
790
- export declare class EMEController implements ComponentAPI {
825
+ export declare class EMEController extends Logger implements ComponentAPI {
791
826
  static CDMCleanupPromise: Promise<void> | void;
792
827
  private readonly hls;
793
828
  private readonly config;
@@ -798,12 +833,6 @@ export declare class EMEController implements ComponentAPI {
798
833
  private mediaKeySessions;
799
834
  private keyIdToKeySessionPromise;
800
835
  private setMediaKeysQueue;
801
- private onMediaEncrypted;
802
- private onWaitingForKey;
803
- private debug;
804
- private log;
805
- private warn;
806
- private error;
807
836
  constructor(hls: Hls);
808
837
  destroy(): void;
809
838
  private registerListeners;
@@ -824,8 +853,8 @@ export declare class EMEController implements ComponentAPI {
824
853
  private handleError;
825
854
  private getKeySystemForKeyPromise;
826
855
  private getKeySystemSelectionPromise;
827
- private _onMediaEncrypted;
828
- private _onWaitingForKey;
856
+ private onMediaEncrypted;
857
+ private onWaitingForKey;
829
858
  private attemptSetMediaKeys;
830
859
  private generateRequestWithPreferredKeySession;
831
860
  private onKeyStatusChange;
@@ -859,13 +888,10 @@ export declare const enum ErrorActionFlags {
859
888
  SwitchToSDR = 4
860
889
  }
861
890
 
862
- export declare class ErrorController implements NetworkComponentAPI {
891
+ export declare class ErrorController extends Logger implements NetworkComponentAPI {
863
892
  private readonly hls;
864
893
  private playlistError;
865
894
  private penalizedRenditions;
866
- private log;
867
- private warn;
868
- private error;
869
895
  constructor(hls: Hls);
870
896
  private registerListeners;
871
897
  private unregisterListeners;
@@ -975,6 +1001,7 @@ export declare enum Events {
975
1001
  MEDIA_ATTACHED = "hlsMediaAttached",
976
1002
  MEDIA_DETACHING = "hlsMediaDetaching",
977
1003
  MEDIA_DETACHED = "hlsMediaDetached",
1004
+ MEDIA_ENDED = "hlsMediaEnded",
978
1005
  BUFFER_RESET = "hlsBufferReset",
979
1006
  BUFFER_CODECS = "hlsBufferCodecs",
980
1007
  BUFFER_CREATED = "hlsBufferCreated",
@@ -1068,6 +1095,7 @@ export declare class FPSController implements ComponentAPI {
1068
1095
  protected unregisterListeners(): void;
1069
1096
  destroy(): void;
1070
1097
  protected onMediaAttaching(event: Events.MEDIA_ATTACHING, data: MediaAttachingData): void;
1098
+ private onMediaDetaching;
1071
1099
  checkFPS(video: HTMLVideoElement, decodedFrames: number, droppedFrames: number): void;
1072
1100
  checkFPSInterval(): void;
1073
1101
  }
@@ -1160,8 +1188,8 @@ export declare class Fragment extends BaseSegment {
1160
1188
  cc: number;
1161
1189
  startPTS?: number;
1162
1190
  endPTS?: number;
1163
- startDTS: number;
1164
- endDTS: number;
1191
+ startDTS?: number;
1192
+ endDTS?: number;
1165
1193
  start: number;
1166
1194
  deltaPTS?: number;
1167
1195
  maxStartPTS?: number;
@@ -1249,20 +1277,21 @@ declare class FragmentTracker implements ComponentAPI {
1249
1277
  * A buffered Fragment is one whose loading, parsing and appending is done (completed or "partial" meaning aborted).
1250
1278
  * If not found any Fragment, return null
1251
1279
  */
1252
- getBufferedFrag(position: number, levelType: PlaylistLevelType): Fragment | null;
1280
+ getBufferedFrag(position: number, levelType: PlaylistLevelType): MediaFragment | null;
1281
+ getFragAtPos(position: number, levelType: PlaylistLevelType, buffered?: boolean): MediaFragment | null;
1253
1282
  /**
1254
1283
  * Partial fragments effected by coded frame eviction will be removed
1255
1284
  * The browser will unload parts of the buffer to free up memory for new buffer data
1256
1285
  * Fragments will need to be reloaded when the buffer is freed up, removing partial fragments will allow them to reload(since there might be parts that are still playable)
1257
1286
  */
1258
- detectEvictedFragments(elementaryStream: SourceBufferName, timeRange: TimeRanges, playlistType: PlaylistLevelType, appendedPart?: Part | null): void;
1287
+ detectEvictedFragments(elementaryStream: SourceBufferName, timeRange: TimeRanges, playlistType: PlaylistLevelType, appendedPart?: Part | null, removeAppending?: boolean): void;
1259
1288
  /**
1260
1289
  * Checks if the fragment passed in is loaded in the buffer properly
1261
1290
  * Partially loaded fragments will be registered as a partial fragment
1262
1291
  */
1263
1292
  detectPartialFragments(data: FragBufferedData): void;
1264
1293
  private removeParts;
1265
- fragBuffered(frag: Fragment, force?: true): void;
1294
+ fragBuffered(frag: MediaFragment, force?: true): void;
1266
1295
  private getBufferedTimes;
1267
1296
  /**
1268
1297
  * Gets the partial fragment for a certain time
@@ -1271,10 +1300,12 @@ declare class FragmentTracker implements ComponentAPI {
1271
1300
  isEndListAppended(type: PlaylistLevelType): boolean;
1272
1301
  getState(fragment: Fragment): FragmentState;
1273
1302
  private isTimeBuffered;
1303
+ private onManifestLoading;
1274
1304
  private onFragLoaded;
1275
1305
  private onBufferAppended;
1276
1306
  private onFragBuffered;
1277
1307
  private hasFragment;
1308
+ hasFragments(type?: PlaylistLevelType): boolean;
1278
1309
  hasParts(type: PlaylistLevelType): boolean;
1279
1310
  removeFragmentsInRange(start: number, end: number, playlistType: PlaylistLevelType, withGapOnly?: boolean, unbufferedOnly?: boolean): void;
1280
1311
  removeFragment(fragment: Fragment): void;
@@ -1321,9 +1352,12 @@ declare class Hls implements HlsEventEmitter {
1321
1352
  * The configuration object provided on player instantiation.
1322
1353
  */
1323
1354
  readonly userConfig: Partial<HlsConfig>;
1355
+ /**
1356
+ * The logger functions used by this player instance, configured on player instantiation.
1357
+ */
1358
+ readonly logger: ILogger;
1324
1359
  private coreComponents;
1325
1360
  private networkControllers;
1326
- private started;
1327
1361
  private _emitter;
1328
1362
  private _autoLevelCapping;
1329
1363
  private _maxHdcpLevel;
@@ -1410,11 +1444,11 @@ declare class Hls implements HlsEventEmitter {
1410
1444
  */
1411
1445
  stopLoad(): void;
1412
1446
  /**
1413
- * Resumes stream controller segment loading if previously started.
1447
+ * Resumes stream controller segment loading after `pauseBuffering` has been called.
1414
1448
  */
1415
1449
  resumeBuffering(): void;
1416
1450
  /**
1417
- * Stops stream controller segment loading without changing 'started' state like stopLoad().
1451
+ * Prevents stream controller from loading new segments until `resumeBuffering` is called.
1418
1452
  * This allows for media buffering to be paused without interupting playlist loading.
1419
1453
  */
1420
1454
  pauseBuffering(): void;
@@ -1559,6 +1593,7 @@ declare class Hls implements HlsEventEmitter {
1559
1593
  */
1560
1594
  get playingDate(): Date | null;
1561
1595
  get mainForwardBufferInfo(): BufferInfo | null;
1596
+ get maxBufferLength(): number;
1562
1597
  /**
1563
1598
  * Find and select the best matching audio track, making a level switch when a Group change is necessary.
1564
1599
  * Updates `hls.config.audioPreference`. Returns the selected track, or null when no matching track is found.
@@ -1638,6 +1673,7 @@ declare class Hls implements HlsEventEmitter {
1638
1673
  * target distance from the edge as calculated by the latency controller
1639
1674
  */
1640
1675
  get targetLatency(): number | null;
1676
+ set targetLatency(latency: number);
1641
1677
  /**
1642
1678
  * the rate at which the edge of the current live playlist is advancing or 1 if there is none
1643
1679
  */
@@ -1646,6 +1682,11 @@ declare class Hls implements HlsEventEmitter {
1646
1682
  * set to true when startLoad is called before MANIFEST_PARSED event
1647
1683
  */
1648
1684
  get forceStartLoad(): boolean;
1685
+ /**
1686
+ * ContentSteering pathwayPriority getter/setter
1687
+ */
1688
+ get pathwayPriority(): string[] | null;
1689
+ set pathwayPriority(pathwayPriority: string[]);
1649
1690
  }
1650
1691
  export default Hls;
1651
1692
 
@@ -1706,6 +1747,7 @@ export declare interface HlsListeners {
1706
1747
  [Events.MEDIA_ATTACHED]: (event: Events.MEDIA_ATTACHED, data: MediaAttachedData) => void;
1707
1748
  [Events.MEDIA_DETACHING]: (event: Events.MEDIA_DETACHING) => void;
1708
1749
  [Events.MEDIA_DETACHED]: (event: Events.MEDIA_DETACHED) => void;
1750
+ [Events.MEDIA_ENDED]: (event: Events.MEDIA_ENDED, data: MediaEndedData) => void;
1709
1751
  [Events.BUFFER_RESET]: (event: Events.BUFFER_RESET) => void;
1710
1752
  [Events.BUFFER_CODECS]: (event: Events.BUFFER_CODECS, data: BufferCodecsData) => void;
1711
1753
  [Events.BUFFER_CREATED]: (event: Events.BUFFER_CREATED, data: BufferCreatedData) => void;
@@ -1816,8 +1858,8 @@ export declare interface ILogger {
1816
1858
  }
1817
1859
 
1818
1860
  export declare interface InitPTSFoundData {
1819
- id: string;
1820
- frag: Fragment;
1861
+ id: PlaylistLevelType;
1862
+ frag: MediaFragment;
1821
1863
  initPTS: number;
1822
1864
  timescale: number;
1823
1865
  }
@@ -1896,6 +1938,7 @@ export declare type LatencyControllerConfig = {
1896
1938
  liveSyncDuration?: number;
1897
1939
  liveMaxLatencyDuration?: number;
1898
1940
  maxLiveSyncPlaybackRate: number;
1941
+ liveSyncOnStallIncrease: number;
1899
1942
  };
1900
1943
 
1901
1944
  export declare class Level {
@@ -1979,10 +2022,11 @@ export declare class LevelDetails {
1979
2022
  averagetargetduration?: number;
1980
2023
  endCC: number;
1981
2024
  endSN: number;
1982
- fragments: Fragment[];
1983
- fragmentHint?: Fragment;
2025
+ fragments: MediaFragment[];
2026
+ fragmentHint?: MediaFragment;
1984
2027
  partList: Part[] | null;
1985
2028
  dateRanges: Record<string, DateRange>;
2029
+ dateRangeTagCount: number;
1986
2030
  live: boolean;
1987
2031
  ageHeader: number;
1988
2032
  advancedDateTime?: number;
@@ -2257,6 +2301,16 @@ export declare class LoadStats implements LoaderStats {
2257
2301
  buffering: HlsProgressivePerformanceTiming;
2258
2302
  }
2259
2303
 
2304
+ export declare class Logger implements ILogger {
2305
+ trace: ILogFunction;
2306
+ debug: ILogFunction;
2307
+ log: ILogFunction;
2308
+ warn: ILogFunction;
2309
+ info: ILogFunction;
2310
+ error: ILogFunction;
2311
+ constructor(label: string, logger: ILogger);
2312
+ }
2313
+
2260
2314
  export declare type MainPlaylistType = AudioPlaylistType | 'VIDEO';
2261
2315
 
2262
2316
  export declare interface ManifestLoadedData {
@@ -2332,6 +2386,14 @@ export declare type MediaDecodingInfo = {
2332
2386
  error?: Error;
2333
2387
  };
2334
2388
 
2389
+ export declare interface MediaEndedData {
2390
+ stalled: boolean;
2391
+ }
2392
+
2393
+ export declare interface MediaFragment extends Fragment {
2394
+ sn: number;
2395
+ }
2396
+
2335
2397
  export declare type MediaKeyFunc = (keySystem: KeySystems, supportedConfigurations: MediaKeySystemConfiguration[]) => Promise<MediaKeySystemAccess>;
2336
2398
 
2337
2399
  export declare interface MediaKeySessionContext {
@@ -2401,6 +2463,8 @@ export declare type MP4RemuxerConfig = {
2401
2463
  export declare interface NetworkComponentAPI extends ComponentAPI {
2402
2464
  startLoad(startPosition: number): void;
2403
2465
  stopLoad(): void;
2466
+ pauseBuffering?(): void;
2467
+ resumeBuffering?(): void;
2404
2468
  }
2405
2469
 
2406
2470
  export declare const enum NetworkErrorAction {
@@ -2433,6 +2497,17 @@ declare interface PACData {
2433
2497
  italics: boolean;
2434
2498
  }
2435
2499
 
2500
+ export declare type ParsedMultivariantPlaylist = {
2501
+ contentSteering: ContentSteeringOptions | null;
2502
+ levels: LevelParsed[];
2503
+ playlistParsingError: Error | null;
2504
+ sessionData: Record<string, AttrList> | null;
2505
+ sessionKeys: LevelKey[] | null;
2506
+ startTimeOffset: number | null;
2507
+ variableList: VariableMap | null;
2508
+ hasVariableRefs: boolean;
2509
+ };
2510
+
2436
2511
  /**
2437
2512
  * Object representing parsed data from an HLS Partial Segment. Found in {@link hls.js#LevelDetails.partList}.
2438
2513
  */
@@ -2442,10 +2517,10 @@ export declare class Part extends BaseSegment {
2442
2517
  readonly gap: boolean;
2443
2518
  readonly independent: boolean;
2444
2519
  readonly relurl: string;
2445
- readonly fragment: Fragment;
2520
+ readonly fragment: MediaFragment;
2446
2521
  readonly index: number;
2447
2522
  stats: LoadStats;
2448
- constructor(partAttrs: AttrList, frag: Fragment, baseurl: string, index: number, previous?: Part);
2523
+ constructor(partAttrs: AttrList, frag: MediaFragment, baseurl: string, index: number, previous?: Part);
2449
2524
  get start(): number;
2450
2525
  get end(): number;
2451
2526
  get loaded(): boolean;
@@ -2640,16 +2715,14 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2640
2715
  private altAudio;
2641
2716
  private audioOnly;
2642
2717
  private fragPlaying;
2643
- private onvplaying;
2644
- private onvseeked;
2645
2718
  private fragLastKbps;
2646
2719
  private couldBacktrack;
2647
2720
  private backtrackFragment;
2648
2721
  private audioCodecSwitch;
2649
2722
  private videoBuffer;
2650
2723
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
2651
- private _registerListeners;
2652
- protected _unregisterListeners(): void;
2724
+ protected registerListeners(): void;
2725
+ protected unregisterListeners(): void;
2653
2726
  protected onHandlerDestroying(): void;
2654
2727
  startLoad(startPosition: number): void;
2655
2728
  stopLoad(): void;
@@ -2673,7 +2746,7 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2673
2746
  protected onMediaDetaching(): void;
2674
2747
  private onMediaPlaying;
2675
2748
  private onMediaSeeked;
2676
- private onManifestLoading;
2749
+ protected onManifestLoading(): void;
2677
2750
  private onManifestParsed;
2678
2751
  private onLevelLoading;
2679
2752
  private onLevelLoaded;
@@ -2682,7 +2755,7 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2682
2755
  private onAudioTrackSwitched;
2683
2756
  private onBufferCreated;
2684
2757
  private onFragBuffered;
2685
- private onError;
2758
+ protected onError(event: Events.ERROR, data: ErrorData): void;
2686
2759
  private checkBuffer;
2687
2760
  private onFragLoadEmergencyAborted;
2688
2761
  private onBufferFlushed;
@@ -2697,13 +2770,14 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2697
2770
  private _handleTransmuxComplete;
2698
2771
  private _bufferInitSegment;
2699
2772
  getMainFwdBufferInfo(): BufferInfo | null;
2773
+ get maxBufferLength(): number;
2700
2774
  private backtrack;
2701
2775
  private checkFragmentChanged;
2702
2776
  get nextLevel(): number;
2703
2777
  get currentFrag(): Fragment | null;
2704
2778
  get currentProgramDateTime(): Date | null;
2705
2779
  get currentLevel(): number;
2706
- get nextBufferedFrag(): Fragment | null;
2780
+ get nextBufferedFrag(): MediaFragment | null;
2707
2781
  get forceStartLoad(): boolean;
2708
2782
  }
2709
2783
 
@@ -2739,11 +2813,6 @@ declare class StyledUnicodeChar {
2739
2813
  isEmpty(): boolean;
2740
2814
  }
2741
2815
 
2742
- declare interface SubtitleFragProcessed {
2743
- success: boolean;
2744
- frag: Fragment;
2745
- }
2746
-
2747
2816
  export declare interface SubtitleFragProcessedData {
2748
2817
  success: boolean;
2749
2818
  frag: Fragment;
@@ -2768,22 +2837,21 @@ export declare class SubtitleStreamController extends BaseStreamController imple
2768
2837
  private mainDetails;
2769
2838
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
2770
2839
  protected onHandlerDestroying(): void;
2771
- private _registerListeners;
2772
- private _unregisterListeners;
2840
+ protected registerListeners(): void;
2841
+ protected unregisterListeners(): void;
2773
2842
  startLoad(startPosition: number): void;
2774
- onManifestLoading(): void;
2775
- onMediaDetaching(): void;
2776
- onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData): void;
2777
- onSubtitleFragProcessed(event: Events.SUBTITLE_FRAG_PROCESSED, data: SubtitleFragProcessed): void;
2778
- onBufferFlushing(event: Events.BUFFER_FLUSHING, data: BufferFlushingData): void;
2779
- onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData): void;
2780
- onError(event: Events.ERROR, data: ErrorData): void;
2781
- onSubtitleTracksUpdated(event: Events.SUBTITLE_TRACKS_UPDATED, { subtitleTracks }: SubtitleTracksUpdatedData): void;
2782
- onSubtitleTrackSwitch(event: Events.SUBTITLE_TRACK_SWITCH, data: TrackSwitchedData): void;
2783
- onSubtitleTrackLoaded(event: Events.SUBTITLE_TRACK_LOADED, data: TrackLoadedData): void;
2843
+ protected onManifestLoading(): void;
2844
+ protected onMediaDetaching(): void;
2845
+ private onLevelLoaded;
2846
+ private onSubtitleFragProcessed;
2847
+ private onBufferFlushing;
2848
+ private onFragBuffered;
2849
+ protected onError(event: Events.ERROR, data: ErrorData): void;
2850
+ private onSubtitleTracksUpdated;
2851
+ private onSubtitleTrackSwitch;
2852
+ private onSubtitleTrackLoaded;
2784
2853
  _handleFragmentLoadComplete(fragLoadedData: FragLoadedData): void;
2785
2854
  doTick(): void;
2786
- protected getMaxBufferLength(mainBufferLength?: number): number;
2787
2855
  protected loadFragment(frag: Fragment, level: Level, targetBufferTime: number): void;
2788
2856
  get mediaBufferTimeRanges(): Bufferable;
2789
2857
  }
@@ -2797,10 +2865,10 @@ export declare class SubtitleTrackController extends BasePlaylistController {
2797
2865
  private currentTrack;
2798
2866
  private selectDefaultTrack;
2799
2867
  private queuedDefaultTrack;
2800
- private asyncPollTrackChange;
2801
2868
  private useTextTrackPolling;
2802
2869
  private subtitlePollingInterval;
2803
2870
  private _subtitleDisplay;
2871
+ private asyncPollTrackChange;
2804
2872
  constructor(hls: Hls);
2805
2873
  destroy(): void;
2806
2874
  get subtitleDisplay(): boolean;
@@ -2885,12 +2953,12 @@ export declare interface SubtitleTrackSwitchData {
2885
2953
  * we are limiting the task execution per call stack to exactly one, but scheduling/post-poning further
2886
2954
  * task processing on the next main loop iteration (also known as "next tick" in the Node/JS runtime lingo).
2887
2955
  */
2888
- declare class TaskLoop {
2956
+ declare class TaskLoop extends Logger {
2889
2957
  private readonly _boundTick;
2890
2958
  private _tickTimer;
2891
2959
  private _tickInterval;
2892
2960
  private _tickCallCount;
2893
- constructor();
2961
+ constructor(label: string, logger: ILogger);
2894
2962
  destroy(): void;
2895
2963
  protected onHandlerDestroying(): void;
2896
2964
  protected onHandlerDestroyed(): void;
@@ -3021,10 +3089,6 @@ export declare interface TrackSet {
3021
3089
  audiovideo?: Track;
3022
3090
  }
3023
3091
 
3024
- declare interface TrackSwitchedData {
3025
- id: number;
3026
- }
3027
-
3028
3092
  declare class TransmuxerInterface {
3029
3093
  error: Error | null;
3030
3094
  private hls;
@@ -3041,7 +3105,7 @@ declare class TransmuxerInterface {
3041
3105
  constructor(hls: Hls, id: PlaylistLevelType, onTransmuxComplete: (transmuxResult: TransmuxerResult) => void, onFlush: (chunkMeta: ChunkMetadata) => void);
3042
3106
  resetWorker(): void;
3043
3107
  destroy(): void;
3044
- push(data: ArrayBuffer, initSegmentData: Uint8Array | undefined, audioCodec: string | undefined, videoCodec: string | undefined, frag: Fragment, part: Part | null, duration: number, accurateTimeOffset: boolean, chunkMeta: ChunkMetadata, defaultInitPTS?: RationalTimestamp): void;
3108
+ push(data: ArrayBuffer, initSegmentData: Uint8Array | undefined, audioCodec: string | undefined, videoCodec: string | undefined, frag: MediaFragment, part: Part | null, duration: number, accurateTimeOffset: boolean, chunkMeta: ChunkMetadata, defaultInitPTS?: RationalTimestamp): void;
3045
3109
  flush(chunkMeta: ChunkMetadata): void;
3046
3110
  private transmuxerError;
3047
3111
  private handleFlushResult;
@@ -3100,6 +3164,7 @@ declare const VideoRangeValues: readonly ["SDR", "PQ", "HLG"];
3100
3164
  export declare type VideoSelectionOption = {
3101
3165
  preferHDR?: boolean;
3102
3166
  allowedVideoRanges?: Array<VideoRange>;
3167
+ videoCodec?: string;
3103
3168
  };
3104
3169
 
3105
3170
  export { }