hls.js 1.5.13 → 1.5.14-0.canary.10415

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 +4211 -2666
  5. package/dist/hls.js.d.ts +179 -110
  6. package/dist/hls.js.map +1 -1
  7. package/dist/hls.light.js +2841 -1921
  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 +2569 -1639
  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 +3572 -2017
  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 +156 -136
  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 +234 -89
  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 +84 -47
  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 +32 -62
  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
+ protected loadingParts: boolean;
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,15 +291,16 @@ 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;
292
300
  protected bufferFragmentData(data: RemuxedTrack, frag: Fragment, part: Part | null, chunkMeta: ChunkMetadata, noBacktracking?: boolean): void;
293
301
  protected flushBufferGap(frag: Fragment): void;
294
302
  protected getFwdBufferInfo(bufferable: Bufferable | null, type: PlaylistLevelType): BufferInfo | null;
295
- protected getFwdBufferInfoAtPos(bufferable: Bufferable | null, pos: number, type: PlaylistLevelType): BufferInfo | null;
303
+ private getFwdBufferInfoAtPos;
296
304
  protected getMaxBufferLength(levelBitrate?: number): number;
297
305
  protected reduceMaxBufferLength(threshold: number, fragDuration: number): boolean;
298
306
  protected getAppendedFrag(position: number, playlistType?: PlaylistLevelType): Fragment | 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;
@@ -1338,7 +1372,7 @@ declare class Hls implements HlsEventEmitter {
1338
1372
  private emeController;
1339
1373
  private cmcdController;
1340
1374
  private _media;
1341
- private url;
1375
+ private _url;
1342
1376
  private triggeringException?;
1343
1377
  /**
1344
1378
  * Get the video-dev/hls.js package version.
@@ -1397,6 +1431,10 @@ declare class Hls implements HlsEventEmitter {
1397
1431
  * Set the source URL. Can be relative or absolute.
1398
1432
  */
1399
1433
  loadSource(url: string): void;
1434
+ /**
1435
+ * Gets the currently loaded URL
1436
+ */
1437
+ get url(): string | null;
1400
1438
  /**
1401
1439
  * Start loading data from the stream source.
1402
1440
  * Depending on default config, client starts loading automatically when a source is set.
@@ -1410,11 +1448,11 @@ declare class Hls implements HlsEventEmitter {
1410
1448
  */
1411
1449
  stopLoad(): void;
1412
1450
  /**
1413
- * Resumes stream controller segment loading if previously started.
1451
+ * Resumes stream controller segment loading after `pauseBuffering` has been called.
1414
1452
  */
1415
1453
  resumeBuffering(): void;
1416
1454
  /**
1417
- * Stops stream controller segment loading without changing 'started' state like stopLoad().
1455
+ * Prevents stream controller from loading new segments until `resumeBuffering` is called.
1418
1456
  * This allows for media buffering to be paused without interupting playlist loading.
1419
1457
  */
1420
1458
  pauseBuffering(): void;
@@ -1559,6 +1597,7 @@ declare class Hls implements HlsEventEmitter {
1559
1597
  */
1560
1598
  get playingDate(): Date | null;
1561
1599
  get mainForwardBufferInfo(): BufferInfo | null;
1600
+ get maxBufferLength(): number;
1562
1601
  /**
1563
1602
  * Find and select the best matching audio track, making a level switch when a Group change is necessary.
1564
1603
  * Updates `hls.config.audioPreference`. Returns the selected track, or null when no matching track is found.
@@ -1638,6 +1677,7 @@ declare class Hls implements HlsEventEmitter {
1638
1677
  * target distance from the edge as calculated by the latency controller
1639
1678
  */
1640
1679
  get targetLatency(): number | null;
1680
+ set targetLatency(latency: number);
1641
1681
  /**
1642
1682
  * the rate at which the edge of the current live playlist is advancing or 1 if there is none
1643
1683
  */
@@ -1646,6 +1686,11 @@ declare class Hls implements HlsEventEmitter {
1646
1686
  * set to true when startLoad is called before MANIFEST_PARSED event
1647
1687
  */
1648
1688
  get forceStartLoad(): boolean;
1689
+ /**
1690
+ * ContentSteering pathwayPriority getter/setter
1691
+ */
1692
+ get pathwayPriority(): string[] | null;
1693
+ set pathwayPriority(pathwayPriority: string[]);
1649
1694
  }
1650
1695
  export default Hls;
1651
1696
 
@@ -1706,6 +1751,7 @@ export declare interface HlsListeners {
1706
1751
  [Events.MEDIA_ATTACHED]: (event: Events.MEDIA_ATTACHED, data: MediaAttachedData) => void;
1707
1752
  [Events.MEDIA_DETACHING]: (event: Events.MEDIA_DETACHING) => void;
1708
1753
  [Events.MEDIA_DETACHED]: (event: Events.MEDIA_DETACHED) => void;
1754
+ [Events.MEDIA_ENDED]: (event: Events.MEDIA_ENDED, data: MediaEndedData) => void;
1709
1755
  [Events.BUFFER_RESET]: (event: Events.BUFFER_RESET) => void;
1710
1756
  [Events.BUFFER_CODECS]: (event: Events.BUFFER_CODECS, data: BufferCodecsData) => void;
1711
1757
  [Events.BUFFER_CREATED]: (event: Events.BUFFER_CREATED, data: BufferCreatedData) => void;
@@ -1816,8 +1862,8 @@ export declare interface ILogger {
1816
1862
  }
1817
1863
 
1818
1864
  export declare interface InitPTSFoundData {
1819
- id: string;
1820
- frag: Fragment;
1865
+ id: PlaylistLevelType;
1866
+ frag: MediaFragment;
1821
1867
  initPTS: number;
1822
1868
  timescale: number;
1823
1869
  }
@@ -1896,6 +1942,7 @@ export declare type LatencyControllerConfig = {
1896
1942
  liveSyncDuration?: number;
1897
1943
  liveMaxLatencyDuration?: number;
1898
1944
  maxLiveSyncPlaybackRate: number;
1945
+ liveSyncOnStallIncrease: number;
1899
1946
  };
1900
1947
 
1901
1948
  export declare class Level {
@@ -1979,10 +2026,11 @@ export declare class LevelDetails {
1979
2026
  averagetargetduration?: number;
1980
2027
  endCC: number;
1981
2028
  endSN: number;
1982
- fragments: Fragment[];
1983
- fragmentHint?: Fragment;
2029
+ fragments: MediaFragment[];
2030
+ fragmentHint?: MediaFragment;
1984
2031
  partList: Part[] | null;
1985
2032
  dateRanges: Record<string, DateRange>;
2033
+ dateRangeTagCount: number;
1986
2034
  live: boolean;
1987
2035
  ageHeader: number;
1988
2036
  advancedDateTime?: number;
@@ -2257,6 +2305,16 @@ export declare class LoadStats implements LoaderStats {
2257
2305
  buffering: HlsProgressivePerformanceTiming;
2258
2306
  }
2259
2307
 
2308
+ export declare class Logger implements ILogger {
2309
+ trace: ILogFunction;
2310
+ debug: ILogFunction;
2311
+ log: ILogFunction;
2312
+ warn: ILogFunction;
2313
+ info: ILogFunction;
2314
+ error: ILogFunction;
2315
+ constructor(label: string, logger: ILogger);
2316
+ }
2317
+
2260
2318
  export declare type MainPlaylistType = AudioPlaylistType | 'VIDEO';
2261
2319
 
2262
2320
  export declare interface ManifestLoadedData {
@@ -2332,6 +2390,14 @@ export declare type MediaDecodingInfo = {
2332
2390
  error?: Error;
2333
2391
  };
2334
2392
 
2393
+ export declare interface MediaEndedData {
2394
+ stalled: boolean;
2395
+ }
2396
+
2397
+ export declare interface MediaFragment extends Fragment {
2398
+ sn: number;
2399
+ }
2400
+
2335
2401
  export declare type MediaKeyFunc = (keySystem: KeySystems, supportedConfigurations: MediaKeySystemConfiguration[]) => Promise<MediaKeySystemAccess>;
2336
2402
 
2337
2403
  export declare interface MediaKeySessionContext {
@@ -2401,6 +2467,8 @@ export declare type MP4RemuxerConfig = {
2401
2467
  export declare interface NetworkComponentAPI extends ComponentAPI {
2402
2468
  startLoad(startPosition: number): void;
2403
2469
  stopLoad(): void;
2470
+ pauseBuffering?(): void;
2471
+ resumeBuffering?(): void;
2404
2472
  }
2405
2473
 
2406
2474
  export declare const enum NetworkErrorAction {
@@ -2433,6 +2501,17 @@ declare interface PACData {
2433
2501
  italics: boolean;
2434
2502
  }
2435
2503
 
2504
+ export declare type ParsedMultivariantPlaylist = {
2505
+ contentSteering: ContentSteeringOptions | null;
2506
+ levels: LevelParsed[];
2507
+ playlistParsingError: Error | null;
2508
+ sessionData: Record<string, AttrList> | null;
2509
+ sessionKeys: LevelKey[] | null;
2510
+ startTimeOffset: number | null;
2511
+ variableList: VariableMap | null;
2512
+ hasVariableRefs: boolean;
2513
+ };
2514
+
2436
2515
  /**
2437
2516
  * Object representing parsed data from an HLS Partial Segment. Found in {@link hls.js#LevelDetails.partList}.
2438
2517
  */
@@ -2442,10 +2521,10 @@ export declare class Part extends BaseSegment {
2442
2521
  readonly gap: boolean;
2443
2522
  readonly independent: boolean;
2444
2523
  readonly relurl: string;
2445
- readonly fragment: Fragment;
2524
+ readonly fragment: MediaFragment;
2446
2525
  readonly index: number;
2447
2526
  stats: LoadStats;
2448
- constructor(partAttrs: AttrList, frag: Fragment, baseurl: string, index: number, previous?: Part);
2527
+ constructor(partAttrs: AttrList, frag: MediaFragment, baseurl: string, index: number, previous?: Part);
2449
2528
  get start(): number;
2450
2529
  get end(): number;
2451
2530
  get loaded(): boolean;
@@ -2640,16 +2719,14 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2640
2719
  private altAudio;
2641
2720
  private audioOnly;
2642
2721
  private fragPlaying;
2643
- private onvplaying;
2644
- private onvseeked;
2645
2722
  private fragLastKbps;
2646
2723
  private couldBacktrack;
2647
2724
  private backtrackFragment;
2648
2725
  private audioCodecSwitch;
2649
2726
  private videoBuffer;
2650
2727
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
2651
- private _registerListeners;
2652
- protected _unregisterListeners(): void;
2728
+ protected registerListeners(): void;
2729
+ protected unregisterListeners(): void;
2653
2730
  protected onHandlerDestroying(): void;
2654
2731
  startLoad(startPosition: number): void;
2655
2732
  stopLoad(): void;
@@ -2673,7 +2750,7 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2673
2750
  protected onMediaDetaching(): void;
2674
2751
  private onMediaPlaying;
2675
2752
  private onMediaSeeked;
2676
- private onManifestLoading;
2753
+ protected onManifestLoading(): void;
2677
2754
  private onManifestParsed;
2678
2755
  private onLevelLoading;
2679
2756
  private onLevelLoaded;
@@ -2682,7 +2759,7 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2682
2759
  private onAudioTrackSwitched;
2683
2760
  private onBufferCreated;
2684
2761
  private onFragBuffered;
2685
- private onError;
2762
+ protected onError(event: Events.ERROR, data: ErrorData): void;
2686
2763
  private checkBuffer;
2687
2764
  private onFragLoadEmergencyAborted;
2688
2765
  private onBufferFlushed;
@@ -2697,13 +2774,14 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2697
2774
  private _handleTransmuxComplete;
2698
2775
  private _bufferInitSegment;
2699
2776
  getMainFwdBufferInfo(): BufferInfo | null;
2777
+ get maxBufferLength(): number;
2700
2778
  private backtrack;
2701
2779
  private checkFragmentChanged;
2702
2780
  get nextLevel(): number;
2703
2781
  get currentFrag(): Fragment | null;
2704
2782
  get currentProgramDateTime(): Date | null;
2705
2783
  get currentLevel(): number;
2706
- get nextBufferedFrag(): Fragment | null;
2784
+ get nextBufferedFrag(): MediaFragment | null;
2707
2785
  get forceStartLoad(): boolean;
2708
2786
  }
2709
2787
 
@@ -2739,11 +2817,6 @@ declare class StyledUnicodeChar {
2739
2817
  isEmpty(): boolean;
2740
2818
  }
2741
2819
 
2742
- declare interface SubtitleFragProcessed {
2743
- success: boolean;
2744
- frag: Fragment;
2745
- }
2746
-
2747
2820
  export declare interface SubtitleFragProcessedData {
2748
2821
  success: boolean;
2749
2822
  frag: Fragment;
@@ -2768,22 +2841,21 @@ export declare class SubtitleStreamController extends BaseStreamController imple
2768
2841
  private mainDetails;
2769
2842
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
2770
2843
  protected onHandlerDestroying(): void;
2771
- private _registerListeners;
2772
- private _unregisterListeners;
2844
+ protected registerListeners(): void;
2845
+ protected unregisterListeners(): void;
2773
2846
  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;
2847
+ protected onManifestLoading(): void;
2848
+ protected onMediaDetaching(): void;
2849
+ private onLevelLoaded;
2850
+ private onSubtitleFragProcessed;
2851
+ private onBufferFlushing;
2852
+ private onFragBuffered;
2853
+ protected onError(event: Events.ERROR, data: ErrorData): void;
2854
+ private onSubtitleTracksUpdated;
2855
+ private onSubtitleTrackSwitch;
2856
+ private onSubtitleTrackLoaded;
2784
2857
  _handleFragmentLoadComplete(fragLoadedData: FragLoadedData): void;
2785
2858
  doTick(): void;
2786
- protected getMaxBufferLength(mainBufferLength?: number): number;
2787
2859
  protected loadFragment(frag: Fragment, level: Level, targetBufferTime: number): void;
2788
2860
  get mediaBufferTimeRanges(): Bufferable;
2789
2861
  }
@@ -2797,10 +2869,10 @@ export declare class SubtitleTrackController extends BasePlaylistController {
2797
2869
  private currentTrack;
2798
2870
  private selectDefaultTrack;
2799
2871
  private queuedDefaultTrack;
2800
- private asyncPollTrackChange;
2801
2872
  private useTextTrackPolling;
2802
2873
  private subtitlePollingInterval;
2803
2874
  private _subtitleDisplay;
2875
+ private asyncPollTrackChange;
2804
2876
  constructor(hls: Hls);
2805
2877
  destroy(): void;
2806
2878
  get subtitleDisplay(): boolean;
@@ -2885,12 +2957,12 @@ export declare interface SubtitleTrackSwitchData {
2885
2957
  * we are limiting the task execution per call stack to exactly one, but scheduling/post-poning further
2886
2958
  * task processing on the next main loop iteration (also known as "next tick" in the Node/JS runtime lingo).
2887
2959
  */
2888
- declare class TaskLoop {
2960
+ declare class TaskLoop extends Logger {
2889
2961
  private readonly _boundTick;
2890
2962
  private _tickTimer;
2891
2963
  private _tickInterval;
2892
2964
  private _tickCallCount;
2893
- constructor();
2965
+ constructor(label: string, logger: ILogger);
2894
2966
  destroy(): void;
2895
2967
  protected onHandlerDestroying(): void;
2896
2968
  protected onHandlerDestroyed(): void;
@@ -3021,10 +3093,6 @@ export declare interface TrackSet {
3021
3093
  audiovideo?: Track;
3022
3094
  }
3023
3095
 
3024
- declare interface TrackSwitchedData {
3025
- id: number;
3026
- }
3027
-
3028
3096
  declare class TransmuxerInterface {
3029
3097
  error: Error | null;
3030
3098
  private hls;
@@ -3041,7 +3109,7 @@ declare class TransmuxerInterface {
3041
3109
  constructor(hls: Hls, id: PlaylistLevelType, onTransmuxComplete: (transmuxResult: TransmuxerResult) => void, onFlush: (chunkMeta: ChunkMetadata) => void);
3042
3110
  resetWorker(): void;
3043
3111
  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;
3112
+ 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
3113
  flush(chunkMeta: ChunkMetadata): void;
3046
3114
  private transmuxerError;
3047
3115
  private handleFlushResult;
@@ -3100,6 +3168,7 @@ declare const VideoRangeValues: readonly ["SDR", "PQ", "HLG"];
3100
3168
  export declare type VideoSelectionOption = {
3101
3169
  preferHDR?: boolean;
3102
3170
  allowedVideoRanges?: Array<VideoRange>;
3171
+ videoCodec?: string;
3103
3172
  };
3104
3173
 
3105
3174
  export { }