hls.js 1.5.5 → 1.5.6-0.canary.10001

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 (68) 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 +2075 -1166
  5. package/dist/hls.js.d.ts +65 -50
  6. package/dist/hls.js.map +1 -1
  7. package/dist/hls.light.js +1148 -859
  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 +984 -696
  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 +1757 -863
  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 +20 -20
  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 +25 -32
  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
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;
@@ -111,8 +111,8 @@ export declare class AudioStreamController extends BaseStreamController implemen
111
111
  private cachedTrackLoadedData;
112
112
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
113
113
  protected onHandlerDestroying(): void;
114
- private _registerListeners;
115
- private _unregisterListeners;
114
+ protected registerListeners(): void;
115
+ protected unregisterListeners(): void;
116
116
  onInitPtsFound(event: Events.INIT_PTS_FOUND, { frag, id, initPTS, timescale }: InitPTSFoundData): void;
117
117
  startLoad(startPosition: number): void;
118
118
  doTick(): void;
@@ -132,7 +132,7 @@ export declare class AudioStreamController extends BaseStreamController implemen
132
132
  onBufferReset(): void;
133
133
  onBufferCreated(event: Events.BUFFER_CREATED, data: BufferCreatedData): void;
134
134
  onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData): void;
135
- private onError;
135
+ protected onError(event: Events.ERROR, data: ErrorData): void;
136
136
  private onBufferFlushing;
137
137
  private onBufferFlushed;
138
138
  private _handleTransmuxComplete;
@@ -187,13 +187,11 @@ export declare interface BackBufferData {
187
187
  bufferEnd: number;
188
188
  }
189
189
 
190
- export declare class BasePlaylistController implements NetworkComponentAPI {
190
+ export declare class BasePlaylistController extends Logger implements NetworkComponentAPI {
191
191
  protected hls: Hls;
192
192
  protected timer: number;
193
193
  protected requestScheduled: number;
194
194
  protected canLoad: boolean;
195
- protected log: (msg: any) => void;
196
- protected warn: (msg: any) => void;
197
195
  constructor(hls: Hls, logPrefix: string);
198
196
  destroy(): void;
199
197
  protected clearTimer(): void;
@@ -248,22 +246,25 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
248
246
  protected startFragRequested: boolean;
249
247
  protected decrypter: Decrypter;
250
248
  protected initPTS: RationalTimestamp[];
251
- protected onvseeking: EventListener | null;
252
- protected onvended: EventListener | null;
253
- private readonly logPrefix;
254
- protected log: (msg: any) => void;
255
- protected warn: (msg: any) => void;
249
+ protected buffering: boolean;
250
+ private loadingParts;
256
251
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader, logPrefix: string, playlistType: PlaylistLevelType);
252
+ protected registerListeners(): void;
253
+ protected unregisterListeners(): void;
257
254
  protected doTick(): void;
258
255
  protected onTickEnd(): void;
259
256
  startLoad(startPosition: number): void;
260
257
  stopLoad(): void;
258
+ pauseBuffering(): void;
259
+ resumeBuffering(): void;
261
260
  protected _streamEnded(bufferInfo: BufferInfo, levelDetails: LevelDetails): boolean;
262
261
  protected getLevelDetails(): LevelDetails | undefined;
263
262
  protected onMediaAttached(event: Events.MEDIA_ATTACHED, data: MediaAttachedData): void;
264
263
  protected onMediaDetaching(): void;
265
- protected onMediaSeeking(): void;
266
- protected onMediaEnded(): void;
264
+ protected onManifestLoading(): void;
265
+ protected onError(event: Events.ERROR, data: ErrorData): void;
266
+ protected onMediaSeeking: () => void;
267
+ protected onMediaEnded: () => void;
267
268
  protected onManifestLoaded(event: Events.MANIFEST_LOADED, data: ManifestLoadedData): void;
268
269
  protected onHandlerDestroying(): void;
269
270
  protected onHandlerDestroyed(): void;
@@ -283,6 +284,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
283
284
  private doFragPartsLoad;
284
285
  private handleFragLoadError;
285
286
  protected _handleTransmuxerFlush(chunkMeta: ChunkMetadata): void;
287
+ private shouldLoadParts;
286
288
  protected getCurrentContext(chunkMeta: ChunkMetadata): {
287
289
  frag: Fragment;
288
290
  part: Part | null;
@@ -352,7 +354,7 @@ export declare interface BufferCodecsData {
352
354
  audio?: Track;
353
355
  }
354
356
 
355
- export declare class BufferController implements ComponentAPI {
357
+ export declare class BufferController extends Logger implements ComponentAPI {
356
358
  private details;
357
359
  private _objectUrl;
358
360
  private operationQueue;
@@ -372,9 +374,6 @@ export declare class BufferController implements ComponentAPI {
372
374
  tracks: TrackSet;
373
375
  pendingTracks: TrackSet;
374
376
  sourceBuffer: SourceBuffers;
375
- protected log: (msg: any) => void;
376
- protected warn: (msg: any, obj?: any) => void;
377
- protected error: (msg: any, obj?: any) => void;
378
377
  constructor(hls: Hls);
379
378
  hasSourceTypes(): boolean;
380
379
  destroy(): void;
@@ -601,6 +600,7 @@ export declare class CMCDController implements ComponentAPI {
601
600
  * Apply CMCD data to a segment request
602
601
  */
603
602
  private applyFragmentData;
603
+ private getNextFrag;
604
604
  /**
605
605
  * The CMCD object type.
606
606
  */
@@ -634,9 +634,8 @@ export declare interface ComponentAPI {
634
634
  destroy(): void;
635
635
  }
636
636
 
637
- export declare class ContentSteeringController implements NetworkComponentAPI {
637
+ export declare class ContentSteeringController extends Logger implements NetworkComponentAPI {
638
638
  private readonly hls;
639
- private log;
640
639
  private loader;
641
640
  private uri;
642
641
  private pathwayId;
@@ -726,6 +725,7 @@ declare class Decrypter {
726
725
  private currentIV;
727
726
  private currentResult;
728
727
  private useSoftware;
728
+ private enableSoftwareAES;
729
729
  constructor(config: HlsConfig, { removePKCS7Padding }?: {
730
730
  removePKCS7Padding?: boolean | undefined;
731
731
  });
@@ -733,14 +733,19 @@ declare class Decrypter {
733
733
  isSync(): boolean;
734
734
  flush(): Uint8Array | null;
735
735
  reset(): void;
736
- decrypt(data: Uint8Array | ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer>;
737
- softwareDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer): ArrayBuffer | null;
738
- webCryptoDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer>;
736
+ decrypt(data: Uint8Array | ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): Promise<ArrayBuffer>;
737
+ softwareDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): ArrayBuffer | null;
738
+ webCryptoDecrypt(data: Uint8Array, key: ArrayBuffer, iv: ArrayBuffer, aesMode: DecrypterAesMode): Promise<ArrayBuffer>;
739
739
  private onWebCryptoError;
740
740
  private getValidChunk;
741
741
  private logOnce;
742
742
  }
743
743
 
744
+ declare const enum DecrypterAesMode {
745
+ cbc = 0,
746
+ ctr = 1
747
+ }
748
+
744
749
  declare type DRMSystemConfiguration = {
745
750
  licenseUrl: string;
746
751
  serverCertificateUrl?: string;
@@ -786,7 +791,7 @@ export declare const enum ElementaryStreamTypes {
786
791
  * @class
787
792
  * @constructor
788
793
  */
789
- export declare class EMEController implements ComponentAPI {
794
+ export declare class EMEController extends Logger implements ComponentAPI {
790
795
  static CDMCleanupPromise: Promise<void> | void;
791
796
  private readonly hls;
792
797
  private readonly config;
@@ -797,12 +802,6 @@ export declare class EMEController implements ComponentAPI {
797
802
  private mediaKeySessions;
798
803
  private keyIdToKeySessionPromise;
799
804
  private setMediaKeysQueue;
800
- private onMediaEncrypted;
801
- private onWaitingForKey;
802
- private debug;
803
- private log;
804
- private warn;
805
- private error;
806
805
  constructor(hls: Hls);
807
806
  destroy(): void;
808
807
  private registerListeners;
@@ -823,8 +822,8 @@ export declare class EMEController implements ComponentAPI {
823
822
  private handleError;
824
823
  private getKeySystemForKeyPromise;
825
824
  private getKeySystemSelectionPromise;
826
- private _onMediaEncrypted;
827
- private _onWaitingForKey;
825
+ private onMediaEncrypted;
826
+ private onWaitingForKey;
828
827
  private attemptSetMediaKeys;
829
828
  private generateRequestWithPreferredKeySession;
830
829
  private onKeyStatusChange;
@@ -858,13 +857,10 @@ export declare const enum ErrorActionFlags {
858
857
  SwitchToSDR = 4
859
858
  }
860
859
 
861
- export declare class ErrorController implements NetworkComponentAPI {
860
+ export declare class ErrorController extends Logger implements NetworkComponentAPI {
862
861
  private readonly hls;
863
862
  private playlistError;
864
863
  private penalizedRenditions;
865
- private log;
866
- private warn;
867
- private error;
868
864
  constructor(hls: Hls);
869
865
  private registerListeners;
870
866
  private unregisterListeners;
@@ -974,6 +970,7 @@ export declare enum Events {
974
970
  MEDIA_ATTACHED = "hlsMediaAttached",
975
971
  MEDIA_DETACHING = "hlsMediaDetaching",
976
972
  MEDIA_DETACHED = "hlsMediaDetached",
973
+ MEDIA_ENDED = "hlsMediaEnded",
977
974
  BUFFER_RESET = "hlsBufferReset",
978
975
  BUFFER_CODECS = "hlsBufferCodecs",
979
976
  BUFFER_CREATED = "hlsBufferCreated",
@@ -1320,9 +1317,12 @@ declare class Hls implements HlsEventEmitter {
1320
1317
  * The configuration object provided on player instantiation.
1321
1318
  */
1322
1319
  readonly userConfig: Partial<HlsConfig>;
1320
+ /**
1321
+ * The logger functions used by this player instance, configured on player instantiation.
1322
+ */
1323
+ readonly logger: ILogger;
1323
1324
  private coreComponents;
1324
1325
  private networkControllers;
1325
- private started;
1326
1326
  private _emitter;
1327
1327
  private _autoLevelCapping;
1328
1328
  private _maxHdcpLevel;
@@ -1409,11 +1409,11 @@ declare class Hls implements HlsEventEmitter {
1409
1409
  */
1410
1410
  stopLoad(): void;
1411
1411
  /**
1412
- * Resumes stream controller segment loading if previously started.
1412
+ * Resumes stream controller segment loading after `pauseBuffering` has been called.
1413
1413
  */
1414
1414
  resumeBuffering(): void;
1415
1415
  /**
1416
- * Stops stream controller segment loading without changing 'started' state like stopLoad().
1416
+ * Prevents stream controller from loading new segments until `resumeBuffering` is called.
1417
1417
  * This allows for media buffering to be paused without interupting playlist loading.
1418
1418
  */
1419
1419
  pauseBuffering(): void;
@@ -1705,6 +1705,7 @@ export declare interface HlsListeners {
1705
1705
  [Events.MEDIA_ATTACHED]: (event: Events.MEDIA_ATTACHED, data: MediaAttachedData) => void;
1706
1706
  [Events.MEDIA_DETACHING]: (event: Events.MEDIA_DETACHING) => void;
1707
1707
  [Events.MEDIA_DETACHED]: (event: Events.MEDIA_DETACHED) => void;
1708
+ [Events.MEDIA_ENDED]: (event: Events.MEDIA_ENDED, data: MediaEndedData) => void;
1708
1709
  [Events.BUFFER_RESET]: (event: Events.BUFFER_RESET) => void;
1709
1710
  [Events.BUFFER_CODECS]: (event: Events.BUFFER_CODECS, data: BufferCodecsData) => void;
1710
1711
  [Events.BUFFER_CREATED]: (event: Events.BUFFER_CREATED, data: BufferCreatedData) => void;
@@ -2256,6 +2257,16 @@ export declare class LoadStats implements LoaderStats {
2256
2257
  buffering: HlsProgressivePerformanceTiming;
2257
2258
  }
2258
2259
 
2260
+ export declare class Logger implements ILogger {
2261
+ trace: ILogFunction;
2262
+ debug: ILogFunction;
2263
+ log: ILogFunction;
2264
+ warn: ILogFunction;
2265
+ info: ILogFunction;
2266
+ error: ILogFunction;
2267
+ constructor(label: string, logger: ILogger);
2268
+ }
2269
+
2259
2270
  export declare type MainPlaylistType = AudioPlaylistType | 'VIDEO';
2260
2271
 
2261
2272
  export declare interface ManifestLoadedData {
@@ -2331,6 +2342,10 @@ export declare type MediaDecodingInfo = {
2331
2342
  error?: Error;
2332
2343
  };
2333
2344
 
2345
+ export declare interface MediaEndedData {
2346
+ stalled: boolean;
2347
+ }
2348
+
2334
2349
  export declare type MediaKeyFunc = (keySystem: KeySystems, supportedConfigurations: MediaKeySystemConfiguration[]) => Promise<MediaKeySystemAccess>;
2335
2350
 
2336
2351
  export declare interface MediaKeySessionContext {
@@ -2400,6 +2415,8 @@ export declare type MP4RemuxerConfig = {
2400
2415
  export declare interface NetworkComponentAPI extends ComponentAPI {
2401
2416
  startLoad(startPosition: number): void;
2402
2417
  stopLoad(): void;
2418
+ pauseBuffering?(): void;
2419
+ resumeBuffering?(): void;
2403
2420
  }
2404
2421
 
2405
2422
  export declare const enum NetworkErrorAction {
@@ -2639,16 +2656,14 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2639
2656
  private altAudio;
2640
2657
  private audioOnly;
2641
2658
  private fragPlaying;
2642
- private onvplaying;
2643
- private onvseeked;
2644
2659
  private fragLastKbps;
2645
2660
  private couldBacktrack;
2646
2661
  private backtrackFragment;
2647
2662
  private audioCodecSwitch;
2648
2663
  private videoBuffer;
2649
2664
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
2650
- private _registerListeners;
2651
- protected _unregisterListeners(): void;
2665
+ protected registerListeners(): void;
2666
+ protected unregisterListeners(): void;
2652
2667
  protected onHandlerDestroying(): void;
2653
2668
  startLoad(startPosition: number): void;
2654
2669
  stopLoad(): void;
@@ -2672,7 +2687,7 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2672
2687
  protected onMediaDetaching(): void;
2673
2688
  private onMediaPlaying;
2674
2689
  private onMediaSeeked;
2675
- private onManifestLoading;
2690
+ protected onManifestLoading(): void;
2676
2691
  private onManifestParsed;
2677
2692
  private onLevelLoading;
2678
2693
  private onLevelLoaded;
@@ -2681,7 +2696,7 @@ declare class StreamController extends BaseStreamController implements NetworkCo
2681
2696
  private onAudioTrackSwitched;
2682
2697
  private onBufferCreated;
2683
2698
  private onFragBuffered;
2684
- private onError;
2699
+ protected onError(event: Events.ERROR, data: ErrorData): void;
2685
2700
  private checkBuffer;
2686
2701
  private onFragLoadEmergencyAborted;
2687
2702
  private onBufferFlushed;
@@ -2767,8 +2782,8 @@ export declare class SubtitleStreamController extends BaseStreamController imple
2767
2782
  private mainDetails;
2768
2783
  constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader);
2769
2784
  protected onHandlerDestroying(): void;
2770
- private _registerListeners;
2771
- private _unregisterListeners;
2785
+ protected registerListeners(): void;
2786
+ protected unregisterListeners(): void;
2772
2787
  startLoad(startPosition: number): void;
2773
2788
  onManifestLoading(): void;
2774
2789
  onMediaDetaching(): void;
@@ -2796,10 +2811,10 @@ export declare class SubtitleTrackController extends BasePlaylistController {
2796
2811
  private currentTrack;
2797
2812
  private selectDefaultTrack;
2798
2813
  private queuedDefaultTrack;
2799
- private asyncPollTrackChange;
2800
2814
  private useTextTrackPolling;
2801
2815
  private subtitlePollingInterval;
2802
2816
  private _subtitleDisplay;
2817
+ private asyncPollTrackChange;
2803
2818
  constructor(hls: Hls);
2804
2819
  destroy(): void;
2805
2820
  get subtitleDisplay(): boolean;
@@ -2884,12 +2899,12 @@ export declare interface SubtitleTrackSwitchData {
2884
2899
  * we are limiting the task execution per call stack to exactly one, but scheduling/post-poning further
2885
2900
  * task processing on the next main loop iteration (also known as "next tick" in the Node/JS runtime lingo).
2886
2901
  */
2887
- declare class TaskLoop {
2902
+ declare class TaskLoop extends Logger {
2888
2903
  private readonly _boundTick;
2889
2904
  private _tickTimer;
2890
2905
  private _tickInterval;
2891
2906
  private _tickCallCount;
2892
- constructor();
2907
+ constructor(label: string, logger: ILogger);
2893
2908
  destroy(): void;
2894
2909
  protected onHandlerDestroying(): void;
2895
2910
  protected onHandlerDestroyed(): void;