hls.js 1.6.0-rc.1.0.canary.11078 → 1.6.0-rc.1.0.canary.11080

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.
@@ -402,7 +402,7 @@ function enableLogs(debugConfig, context, id) {
402
402
  // Some browsers don't allow to use bind on console object anyway
403
403
  // fallback to default if needed
404
404
  try {
405
- newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-rc.1.0.canary.11078"}`);
405
+ newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-rc.1.0.canary.11080"}`);
406
406
  } catch (e) {
407
407
  /* log fn threw an exception. All logger methods are no-ops. */
408
408
  return createLogger();
@@ -7964,6 +7964,14 @@ class BaseStreamController extends TaskLoop {
7964
7964
  return (_this$levelLastLoaded = this.levelLastLoaded) == null ? void 0 : _this$levelLastLoaded.details;
7965
7965
  }
7966
7966
  }
7967
+ get timelineOffset() {
7968
+ const configuredTimelineOffset = this.config.timelineOffset;
7969
+ if (configuredTimelineOffset) {
7970
+ var _this$getLevelDetails;
7971
+ return ((_this$getLevelDetails = this.getLevelDetails()) == null ? void 0 : _this$getLevelDetails.appliedTimelineOffset) || configuredTimelineOffset;
7972
+ }
7973
+ return 0;
7974
+ }
7967
7975
  onMediaAttached(event, data) {
7968
7976
  const media = this.media = this.mediaBuffer = data.media;
7969
7977
  media.removeEventListener('seeking', this.onMediaSeeking);
@@ -8661,8 +8669,8 @@ class BaseStreamController extends TaskLoop {
8661
8669
  const end = this.loadingParts ? levelDetails.partEnd : levelDetails.fragmentEnd;
8662
8670
  frag = this.getFragmentAtPosition(pos, end, levelDetails);
8663
8671
  }
8664
- frag = this.filterReplacedPrimary(frag, levelDetails);
8665
- return this.mapToInitFragWhenRequired(frag);
8672
+ const programFrag = this.filterReplacedPrimary(frag, levelDetails);
8673
+ return this.mapToInitFragWhenRequired(programFrag);
8666
8674
  }
8667
8675
  isLoopLoading(frag, targetBufferTime) {
8668
8676
  const trackerState = this.fragmentTracker.getState(frag);
@@ -8689,11 +8697,15 @@ class BaseStreamController extends TaskLoop {
8689
8697
  this.loopSn = undefined;
8690
8698
  return nextFragment;
8691
8699
  }
8700
+ get primaryPrefetch() {
8701
+ if (interstitialsEnabled(this.hls.config)) ;
8702
+ return false;
8703
+ }
8692
8704
  filterReplacedPrimary(frag, details) {
8693
8705
  if (!frag) {
8694
8706
  return frag;
8695
8707
  }
8696
- this.hls.config;
8708
+ if (interstitialsEnabled(this.hls.config)) ;
8697
8709
  return frag;
8698
8710
  }
8699
8711
  mapToInitFragWhenRequired(frag) {
@@ -8865,6 +8877,7 @@ class BaseStreamController extends TaskLoop {
8865
8877
  if (startPosition < sliding) {
8866
8878
  startPosition = -1;
8867
8879
  }
8880
+ const timelineOffset = this.timelineOffset;
8868
8881
  if (startPosition === -1) {
8869
8882
  // Use Playlist EXT-X-START:TIME-OFFSET when set
8870
8883
  // Prioritize Multivariant Playlist offset so that main, audio, and subtitle stream-controller start times match
@@ -8888,9 +8901,9 @@ class BaseStreamController extends TaskLoop {
8888
8901
  this.log(`setting startPosition to 0 by default`);
8889
8902
  this.startPosition = startPosition = 0;
8890
8903
  }
8891
- this.lastCurrentTime = startPosition;
8904
+ this.lastCurrentTime = startPosition + timelineOffset;
8892
8905
  }
8893
- this.nextLoadPosition = startPosition;
8906
+ this.nextLoadPosition = startPosition + timelineOffset;
8894
8907
  }
8895
8908
  getLoadPosition() {
8896
8909
  var _this$hls;
@@ -9170,6 +9183,9 @@ class BaseStreamController extends TaskLoop {
9170
9183
  return this._state;
9171
9184
  }
9172
9185
  }
9186
+ function interstitialsEnabled(config) {
9187
+ return false;
9188
+ }
9173
9189
 
9174
9190
  class BufferOperationQueue {
9175
9191
  constructor(sourceBufferReference) {
@@ -10210,17 +10226,10 @@ transfer tracks: ${stringify(transferredTracks, (key, value) => key === 'initSeg
10210
10226
  return type && !((_this$tracks$type4 = this.tracks[type]) != null && _this$tracks$type4.ended);
10211
10227
  });
10212
10228
  if (allTracksEnding) {
10213
- this.log(`Queueing EOS`);
10214
- this.blockUntilOpen(() => {
10215
- this.sourceBuffers.forEach(([type]) => {
10216
- if (type !== null) {
10217
- const track = this.tracks[type];
10218
- if (track) {
10219
- track.ending = false;
10220
- }
10221
- }
10222
- });
10223
- if (allowEndOfStream) {
10229
+ if (allowEndOfStream) {
10230
+ this.log(`Queueing EOS`);
10231
+ this.blockUntilOpen(() => {
10232
+ this.tracksEnded();
10224
10233
  const {
10225
10234
  mediaSource
10226
10235
  } = this;
@@ -10233,11 +10242,24 @@ transfer tracks: ${stringify(transferredTracks, (key, value) => key === 'initSeg
10233
10242
  this.log(`Calling mediaSource.endOfStream()`);
10234
10243
  // Allow this to throw and be caught by the enqueueing function
10235
10244
  mediaSource.endOfStream();
10236
- }
10245
+ this.hls.trigger(Events.BUFFERED_TO_END, undefined);
10246
+ });
10247
+ } else {
10248
+ this.tracksEnded();
10237
10249
  this.hls.trigger(Events.BUFFERED_TO_END, undefined);
10238
- });
10250
+ }
10239
10251
  }
10240
10252
  }
10253
+ tracksEnded() {
10254
+ this.sourceBuffers.forEach(([type]) => {
10255
+ if (type !== null) {
10256
+ const track = this.tracks[type];
10257
+ if (track) {
10258
+ track.ending = false;
10259
+ }
10260
+ }
10261
+ });
10262
+ }
10241
10263
  onLevelUpdated(event, {
10242
10264
  details
10243
10265
  }) {
@@ -18861,9 +18883,10 @@ class LatencyController {
18861
18883
  if (inLiveRange && distanceFromTarget > 0.05 && this.forwardBufferLength > 1) {
18862
18884
  const max = Math.min(2, Math.max(1.0, maxLiveSyncPlaybackRate));
18863
18885
  const rate = Math.round(2 / (1 + Math.exp(-0.75 * distanceFromTarget - this.edgeStalled)) * 20) / 20;
18864
- media.playbackRate = Math.min(max, Math.max(1, rate));
18886
+ const playbackRate = Math.min(max, Math.max(1, rate));
18887
+ this.changeMediaPlaybackRate(media, playbackRate);
18865
18888
  } else if (media.playbackRate !== 1 && media.playbackRate !== 0) {
18866
- media.playbackRate = 1;
18889
+ this.changeMediaPlaybackRate(media, 1);
18867
18890
  }
18868
18891
  };
18869
18892
  this.hls = hls;
@@ -19022,6 +19045,14 @@ class LatencyController {
19022
19045
  this.hls.logger.warn('[latency-controller]: Stall detected, adjusting target latency');
19023
19046
  }
19024
19047
  }
19048
+ changeMediaPlaybackRate(media, playbackRate) {
19049
+ var _this$hls2, _this$targetLatency;
19050
+ if (media.playbackRate === playbackRate) {
19051
+ return;
19052
+ }
19053
+ (_this$hls2 = this.hls) == null ? void 0 : _this$hls2.logger.debug(`[latency-controller]: latency=${this.latency.toFixed(3)}, targetLatency=${(_this$targetLatency = this.targetLatency) == null ? void 0 : _this$targetLatency.toFixed(3)}, forwardBufferLength=${this.forwardBufferLength.toFixed(3)}: adjusting playback rate from ${media.playbackRate} to ${playbackRate}`);
19054
+ media.playbackRate = playbackRate;
19055
+ }
19025
19056
  estimateLiveEdge() {
19026
19057
  const levelDetails = this.levelDetails;
19027
19058
  if (levelDetails === null) {
@@ -19637,7 +19668,7 @@ function assignTrackIdsByGroup(tracks) {
19637
19668
  });
19638
19669
  }
19639
19670
 
19640
- const version = "1.6.0-rc.1.0.canary.11078";
19671
+ const version = "1.6.0-rc.1.0.canary.11080";
19641
19672
 
19642
19673
  // ensure the worker ends up in the bundle
19643
19674
  // If the worker should not be included this gets aliased to empty.js
@@ -20160,7 +20191,7 @@ class StreamController extends BaseStreamController {
20160
20191
  startPosition = lastCurrentTime;
20161
20192
  }
20162
20193
  this.state = State.IDLE;
20163
- this.nextLoadPosition = this.lastCurrentTime = startPosition;
20194
+ this.nextLoadPosition = this.lastCurrentTime = startPosition + this.timelineOffset;
20164
20195
  this.startPosition = skipSeekToStartPosition ? -1 : startPosition;
20165
20196
  this.tick();
20166
20197
  } else {
@@ -20236,7 +20267,7 @@ class StreamController extends BaseStreamController {
20236
20267
  // if start level not parsed yet OR
20237
20268
  // if video not attached AND start fragment already requested OR start frag prefetch not enabled
20238
20269
  // exit loop, as we either need more info (level not parsed) or we need media to be attached to load new fragment
20239
- if (levelLastLoaded === null || !media && (this.startFragRequested || !hls.config.startFragPrefetch)) {
20270
+ if (levelLastLoaded === null || !media && !this.primaryPrefetch && (this.startFragRequested || !hls.config.startFragPrefetch)) {
20240
20271
  return;
20241
20272
  }
20242
20273
 
@@ -20866,11 +20897,11 @@ class StreamController extends BaseStreamController {
20866
20897
  }
20867
20898
 
20868
20899
  // Offset start position by timeline offset
20869
- const details = this.getLevelDetails();
20870
- const configuredTimelineOffset = this.config.timelineOffset;
20871
- if (configuredTimelineOffset && startPosition) {
20872
- startPosition += (details == null ? void 0 : details.appliedTimelineOffset) || configuredTimelineOffset;
20900
+ const timelineOffset = this.timelineOffset;
20901
+ if (timelineOffset && startPosition) {
20902
+ startPosition += timelineOffset;
20873
20903
  }
20904
+ const details = this.getLevelDetails();
20874
20905
  const buffered = BufferHelper.getBuffered(media);
20875
20906
  const bufferStart = buffered.length ? buffered.start(0) : 0;
20876
20907
  const delta = bufferStart - startPosition;