hls.js 1.5.6 → 1.5.7-0.canary.10015

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 (69) hide show
  1. package/README.md +1 -0
  2. package/dist/hls-demo.js +10 -0
  3. package/dist/hls-demo.js.map +1 -1
  4. package/dist/hls.js +2077 -1166
  5. package/dist/hls.js.d.ts +65 -50
  6. package/dist/hls.js.map +1 -1
  7. package/dist/hls.light.js +1149 -858
  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 +985 -695
  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 +1758 -862
  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 +21 -21
  20. package/src/config.ts +3 -2
  21. package/src/controller/abr-controller.ts +21 -20
  22. package/src/controller/audio-stream-controller.ts +15 -16
  23. package/src/controller/audio-track-controller.ts +1 -1
  24. package/src/controller/base-playlist-controller.ts +20 -8
  25. package/src/controller/base-stream-controller.ts +149 -33
  26. package/src/controller/buffer-controller.ts +11 -11
  27. package/src/controller/cap-level-controller.ts +1 -2
  28. package/src/controller/cmcd-controller.ts +27 -6
  29. package/src/controller/content-steering-controller.ts +8 -6
  30. package/src/controller/eme-controller.ts +9 -22
  31. package/src/controller/error-controller.ts +6 -8
  32. package/src/controller/fps-controller.ts +2 -3
  33. package/src/controller/gap-controller.ts +43 -16
  34. package/src/controller/latency-controller.ts +9 -11
  35. package/src/controller/level-controller.ts +12 -18
  36. package/src/controller/stream-controller.ts +24 -31
  37. package/src/controller/subtitle-stream-controller.ts +13 -14
  38. package/src/controller/subtitle-track-controller.ts +5 -3
  39. package/src/controller/timeline-controller.ts +23 -30
  40. package/src/crypt/aes-crypto.ts +21 -2
  41. package/src/crypt/decrypter-aes-mode.ts +4 -0
  42. package/src/crypt/decrypter.ts +32 -18
  43. package/src/crypt/fast-aes-key.ts +24 -5
  44. package/src/demux/audio/adts.ts +9 -4
  45. package/src/demux/sample-aes.ts +2 -0
  46. package/src/demux/transmuxer-interface.ts +4 -12
  47. package/src/demux/transmuxer-worker.ts +4 -4
  48. package/src/demux/transmuxer.ts +16 -3
  49. package/src/demux/tsdemuxer.ts +71 -37
  50. package/src/demux/video/avc-video-parser.ts +208 -119
  51. package/src/demux/video/base-video-parser.ts +134 -2
  52. package/src/demux/video/exp-golomb.ts +0 -208
  53. package/src/demux/video/hevc-video-parser.ts +746 -0
  54. package/src/events.ts +7 -0
  55. package/src/hls.ts +42 -34
  56. package/src/loader/fragment-loader.ts +9 -2
  57. package/src/loader/key-loader.ts +2 -0
  58. package/src/loader/level-key.ts +10 -9
  59. package/src/loader/playlist-loader.ts +4 -5
  60. package/src/remux/mp4-generator.ts +196 -1
  61. package/src/remux/mp4-remuxer.ts +23 -7
  62. package/src/task-loop.ts +5 -2
  63. package/src/types/component-api.ts +2 -0
  64. package/src/types/demuxer.ts +3 -0
  65. package/src/types/events.ts +4 -0
  66. package/src/utils/codecs.ts +33 -4
  67. package/src/utils/encryption-methods-util.ts +21 -0
  68. package/src/utils/logger.ts +54 -24
  69. package/src/utils/mp4-tools.ts +3 -1
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;
@@ -112,8 +112,8 @@ export declare class AudioStreamController extends BaseStreamController implemen
112
112
  private cachedTrackLoadedData;
113
113
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
114
114
  protected onHandlerDestroying(): void;
115
- private _registerListeners;
116
- private _unregisterListeners;
115
+ protected registerListeners(): void;
116
+ protected unregisterListeners(): void;
117
117
  onInitPtsFound(event: Events.INIT_PTS_FOUND, { frag, id, initPTS, timescale }: InitPTSFoundData): void;
118
118
  startLoad(startPosition: number): void;
119
119
  doTick(): void;
@@ -133,7 +133,7 @@ export declare class AudioStreamController extends BaseStreamController implemen
133
133
  onBufferReset(): void;
134
134
  onBufferCreated(event: Events.BUFFER_CREATED, data: BufferCreatedData): void;
135
135
  onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData): void;
136
- private onError;
136
+ protected onError(event: Events.ERROR, data: ErrorData): void;
137
137
  private onBufferFlushing;
138
138
  private onBufferFlushed;
139
139
  private _handleTransmuxComplete;
@@ -188,13 +188,11 @@ export declare interface BackBufferData {
188
188
  bufferEnd: number;
189
189
  }
190
190
 
191
- export declare class BasePlaylistController implements NetworkComponentAPI {
191
+ export declare class BasePlaylistController extends Logger implements NetworkComponentAPI {
192
192
  protected hls: Hls;
193
193
  protected timer: number;
194
194
  protected requestScheduled: number;
195
195
  protected canLoad: boolean;
196
- protected log: (msg: any) => void;
197
- protected warn: (msg: any) => void;
198
196
  constructor(hls: Hls, logPrefix: string);
199
197
  destroy(): void;
200
198
  protected clearTimer(): void;
@@ -249,22 +247,25 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
249
247
  protected startFragRequested: boolean;
250
248
  protected decrypter: Decrypter;
251
249
  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;
250
+ protected buffering: boolean;
251
+ private loadingParts;
257
252
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader, logPrefix: string, playlistType: PlaylistLevelType);
253
+ protected registerListeners(): void;
254
+ protected unregisterListeners(): void;
258
255
  protected doTick(): void;
259
256
  protected onTickEnd(): void;
260
257
  startLoad(startPosition: number): void;
261
258
  stopLoad(): void;
259
+ pauseBuffering(): void;
260
+ resumeBuffering(): void;
262
261
  protected _streamEnded(bufferInfo: BufferInfo, levelDetails: LevelDetails): boolean;
263
262
  protected getLevelDetails(): LevelDetails | undefined;
264
263
  protected onMediaAttached(event: Events.MEDIA_ATTACHED, data: MediaAttachedData): void;
265
264
  protected onMediaDetaching(): void;
266
- protected onMediaSeeking(): void;
267
- protected onMediaEnded(): void;
265
+ protected onManifestLoading(): void;
266
+ protected onError(event: Events.ERROR, data: ErrorData): void;
267
+ protected onMediaSeeking: () => void;
268
+ protected onMediaEnded: () => void;
268
269
  protected onManifestLoaded(event: Events.MANIFEST_LOADED, data: ManifestLoadedData): void;
269
270
  protected onHandlerDestroying(): void;
270
271
  protected onHandlerDestroyed(): void;
@@ -284,6 +285,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
284
285
  private doFragPartsLoad;
285
286
  private handleFragLoadError;
286
287
  protected _handleTransmuxerFlush(chunkMeta: ChunkMetadata): void;
288
+ private shouldLoadParts;
287
289
  protected getCurrentContext(chunkMeta: ChunkMetadata): {
288
290
  frag: Fragment;
289
291
  part: Part | null;
@@ -353,7 +355,7 @@ export declare interface BufferCodecsData {
353
355
  audio?: Track;
354
356
  }
355
357
 
356
- export declare class BufferController implements ComponentAPI {
358
+ export declare class BufferController extends Logger implements ComponentAPI {
357
359
  private details;
358
360
  private _objectUrl;
359
361
  private operationQueue;
@@ -373,9 +375,6 @@ export declare class BufferController implements ComponentAPI {
373
375
  tracks: TrackSet;
374
376
  pendingTracks: TrackSet;
375
377
  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
378
  constructor(hls: Hls);
380
379
  hasSourceTypes(): boolean;
381
380
  destroy(): void;
@@ -602,6 +601,7 @@ export declare class CMCDController implements ComponentAPI {
602
601
  * Apply CMCD data to a segment request
603
602
  */
604
603
  private applyFragmentData;
604
+ private getNextFrag;
605
605
  /**
606
606
  * The CMCD object type.
607
607
  */
@@ -635,9 +635,8 @@ export declare interface ComponentAPI {
635
635
  destroy(): void;
636
636
  }
637
637
 
638
- export declare class ContentSteeringController implements NetworkComponentAPI {
638
+ export declare class ContentSteeringController extends Logger implements NetworkComponentAPI {
639
639
  private readonly hls;
640
- private log;
641
640
  private loader;
642
641
  private uri;
643
642
  private pathwayId;
@@ -727,6 +726,7 @@ declare class Decrypter {
727
726
  private currentIV;
728
727
  private currentResult;
729
728
  private useSoftware;
729
+ private enableSoftwareAES;
730
730
  constructor(config: HlsConfig, { removePKCS7Padding }?: {
731
731
  removePKCS7Padding?: boolean | undefined;
732
732
  });
@@ -734,14 +734,19 @@ declare class Decrypter {
734
734
  isSync(): boolean;
735
735
  flush(): Uint8Array | null;
736
736
  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>;
737
+ decrypt(data: Uint8Array | ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): Promise<ArrayBuffer>;
738
+ softwareDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): ArrayBuffer | null;
739
+ webCryptoDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): Promise<ArrayBuffer>;
740
740
  private onWebCryptoError;
741
741
  private getValidChunk;
742
742
  private logOnce;
743
743
  }
744
744
 
745
+ declare const enum DecrypterAesMode {
746
+ cbc = 0,
747
+ ctr = 1
748
+ }
749
+
745
750
  declare type DRMSystemConfiguration = {
746
751
  licenseUrl: string;
747
752
  serverCertificateUrl?: string;
@@ -787,7 +792,7 @@ export declare const enum ElementaryStreamTypes {
787
792
  * @class
788
793
  * @constructor
789
794
  */
790
- export declare class EMEController implements ComponentAPI {
795
+ export declare class EMEController extends Logger implements ComponentAPI {
791
796
  static CDMCleanupPromise: Promise<void> | void;
792
797
  private readonly hls;
793
798
  private readonly config;
@@ -798,12 +803,6 @@ export declare class EMEController implements ComponentAPI {
798
803
  private mediaKeySessions;
799
804
  private keyIdToKeySessionPromise;
800
805
  private setMediaKeysQueue;
801
- private onMediaEncrypted;
802
- private onWaitingForKey;
803
- private debug;
804
- private log;
805
- private warn;
806
- private error;
807
806
  constructor(hls: Hls);
808
807
  destroy(): void;
809
808
  private registerListeners;
@@ -824,8 +823,8 @@ export declare class EMEController implements ComponentAPI {
824
823
  private handleError;
825
824
  private getKeySystemForKeyPromise;
826
825
  private getKeySystemSelectionPromise;
827
- private _onMediaEncrypted;
828
- private _onWaitingForKey;
826
+ private onMediaEncrypted;
827
+ private onWaitingForKey;
829
828
  private attemptSetMediaKeys;
830
829
  private generateRequestWithPreferredKeySession;
831
830
  private onKeyStatusChange;
@@ -859,13 +858,10 @@ export declare const enum ErrorActionFlags {
859
858
  SwitchToSDR = 4
860
859
  }
861
860
 
862
- export declare class ErrorController implements NetworkComponentAPI {
861
+ export declare class ErrorController extends Logger implements NetworkComponentAPI {
863
862
  private readonly hls;
864
863
  private playlistError;
865
864
  private penalizedRenditions;
866
- private log;
867
- private warn;
868
- private error;
869
865
  constructor(hls: Hls);
870
866
  private registerListeners;
871
867
  private unregisterListeners;
@@ -975,6 +971,7 @@ export declare enum Events {
975
971
  MEDIA_ATTACHED = "hlsMediaAttached",
976
972
  MEDIA_DETACHING = "hlsMediaDetaching",
977
973
  MEDIA_DETACHED = "hlsMediaDetached",
974
+ MEDIA_ENDED = "hlsMediaEnded",
978
975
  BUFFER_RESET = "hlsBufferReset",
979
976
  BUFFER_CODECS = "hlsBufferCodecs",
980
977
  BUFFER_CREATED = "hlsBufferCreated",
@@ -1321,9 +1318,12 @@ declare class Hls implements HlsEventEmitter {
1321
1318
  * The configuration object provided on player instantiation.
1322
1319
  */
1323
1320
  readonly userConfig: Partial<HlsConfig>;
1321
+ /**
1322
+ * The logger functions used by this player instance, configured on player instantiation.
1323
+ */
1324
+ readonly logger: ILogger;
1324
1325
  private coreComponents;
1325
1326
  private networkControllers;
1326
- private started;
1327
1327
  private _emitter;
1328
1328
  private _autoLevelCapping;
1329
1329
  private _maxHdcpLevel;
@@ -1410,11 +1410,11 @@ declare class Hls implements HlsEventEmitter {
1410
1410
  */
1411
1411
  stopLoad(): void;
1412
1412
  /**
1413
- * Resumes stream controller segment loading if previously started.
1413
+ * Resumes stream controller segment loading after `pauseBuffering` has been called.
1414
1414
  */
1415
1415
  resumeBuffering(): void;
1416
1416
  /**
1417
- * Stops stream controller segment loading without changing 'started' state like stopLoad().
1417
+ * Prevents stream controller from loading new segments until `resumeBuffering` is called.
1418
1418
  * This allows for media buffering to be paused without interupting playlist loading.
1419
1419
  */
1420
1420
  pauseBuffering(): void;
@@ -1706,6 +1706,7 @@ export declare interface HlsListeners {
1706
1706
  [Events.MEDIA_ATTACHED]: (event: Events.MEDIA_ATTACHED, data: MediaAttachedData) => void;
1707
1707
  [Events.MEDIA_DETACHING]: (event: Events.MEDIA_DETACHING) => void;
1708
1708
  [Events.MEDIA_DETACHED]: (event: Events.MEDIA_DETACHED) => void;
1709
+ [Events.MEDIA_ENDED]: (event: Events.MEDIA_ENDED, data: MediaEndedData) => void;
1709
1710
  [Events.BUFFER_RESET]: (event: Events.BUFFER_RESET) => void;
1710
1711
  [Events.BUFFER_CODECS]: (event: Events.BUFFER_CODECS, data: BufferCodecsData) => void;
1711
1712
  [Events.BUFFER_CREATED]: (event: Events.BUFFER_CREATED, data: BufferCreatedData) => void;
@@ -2257,6 +2258,16 @@ export declare class LoadStats implements LoaderStats {
2257
2258
  buffering: HlsProgressivePerformanceTiming;
2258
2259
  }
2259
2260
 
2261
+ export declare class Logger implements ILogger {
2262
+ trace: ILogFunction;
2263
+ debug: ILogFunction;
2264
+ log: ILogFunction;
2265
+ warn: ILogFunction;
2266
+ info: ILogFunction;
2267
+ error: ILogFunction;
2268
+ constructor(label: string, logger: ILogger);
2269
+ }
2270
+
2260
2271
  export declare type MainPlaylistType = AudioPlaylistType | 'VIDEO';
2261
2272
 
2262
2273
  export declare interface ManifestLoadedData {
@@ -2332,6 +2343,10 @@ export declare type MediaDecodingInfo = {
2332
2343
  error?: Error;
2333
2344
  };
2334
2345
 
2346
+ export declare interface MediaEndedData {
2347
+ stalled: boolean;
2348
+ }
2349
+
2335
2350
  export declare type MediaKeyFunc = (keySystem: KeySystems, supportedConfigurations: MediaKeySystemConfiguration[]) => Promise<MediaKeySystemAccess>;
2336
2351
 
2337
2352
  export declare interface MediaKeySessionContext {
@@ -2401,6 +2416,8 @@ export declare type MP4RemuxerConfig = {
2401
2416
  export declare interface NetworkComponentAPI extends ComponentAPI {
2402
2417
  startLoad(startPosition: number): void;
2403
2418
  stopLoad(): void;
2419
+ pauseBuffering?(): void;
2420
+ resumeBuffering?(): void;
2404
2421
  }
2405
2422
 
2406
2423
  export declare const enum NetworkErrorAction {
@@ -2640,16 +2657,14 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2640
2657
  private altAudio;
2641
2658
  private audioOnly;
2642
2659
  private fragPlaying;
2643
- private onvplaying;
2644
- private onvseeked;
2645
2660
  private fragLastKbps;
2646
2661
  private couldBacktrack;
2647
2662
  private backtrackFragment;
2648
2663
  private audioCodecSwitch;
2649
2664
  private videoBuffer;
2650
2665
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
2651
- private _registerListeners;
2652
- protected _unregisterListeners(): void;
2666
+ protected registerListeners(): void;
2667
+ protected unregisterListeners(): void;
2653
2668
  protected onHandlerDestroying(): void;
2654
2669
  startLoad(startPosition: number): void;
2655
2670
  stopLoad(): void;
@@ -2673,7 +2688,7 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2673
2688
  protected onMediaDetaching(): void;
2674
2689
  private onMediaPlaying;
2675
2690
  private onMediaSeeked;
2676
- private onManifestLoading;
2691
+ protected onManifestLoading(): void;
2677
2692
  private onManifestParsed;
2678
2693
  private onLevelLoading;
2679
2694
  private onLevelLoaded;
@@ -2682,7 +2697,7 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2682
2697
  private onAudioTrackSwitched;
2683
2698
  private onBufferCreated;
2684
2699
  private onFragBuffered;
2685
- private onError;
2700
+ protected onError(event: Events.ERROR, data: ErrorData): void;
2686
2701
  private checkBuffer;
2687
2702
  private onFragLoadEmergencyAborted;
2688
2703
  private onBufferFlushed;
@@ -2768,8 +2783,8 @@ export declare class SubtitleStreamController extends BaseStreamController imple
2768
2783
  private mainDetails;
2769
2784
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
2770
2785
  protected onHandlerDestroying(): void;
2771
- private _registerListeners;
2772
- private _unregisterListeners;
2786
+ protected registerListeners(): void;
2787
+ protected unregisterListeners(): void;
2773
2788
  startLoad(startPosition: number): void;
2774
2789
  onManifestLoading(): void;
2775
2790
  onMediaDetaching(): void;
@@ -2797,10 +2812,10 @@ export declare class SubtitleTrackController extends BasePlaylistController {
2797
2812
  private currentTrack;
2798
2813
  private selectDefaultTrack;
2799
2814
  private queuedDefaultTrack;
2800
- private asyncPollTrackChange;
2801
2815
  private useTextTrackPolling;
2802
2816
  private subtitlePollingInterval;
2803
2817
  private _subtitleDisplay;
2818
+ private asyncPollTrackChange;
2804
2819
  constructor(hls: Hls);
2805
2820
  destroy(): void;
2806
2821
  get subtitleDisplay(): boolean;
@@ -2885,12 +2900,12 @@ export declare interface SubtitleTrackSwitchData {
2885
2900
  * we are limiting the task execution per call stack to exactly one, but scheduling/post-poning further
2886
2901
  * task processing on the next main loop iteration (also known as "next tick" in the Node/JS runtime lingo).
2887
2902
  */
2888
- declare class TaskLoop {
2903
+ declare class TaskLoop extends Logger {
2889
2904
  private readonly _boundTick;
2890
2905
  private _tickTimer;
2891
2906
  private _tickInterval;
2892
2907
  private _tickCallCount;
2893
- constructor();
2908
+ constructor(label: string, logger: ILogger);
2894
2909
  destroy(): void;
2895
2910
  protected onHandlerDestroying(): void;
2896
2911
  protected onHandlerDestroyed(): void;