hls.js 1.6.0-beta.1.0.canary.10743 → 1.6.0-beta.1.0.canary.10746

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.
package/dist/hls.mjs CHANGED
@@ -397,7 +397,7 @@ function enableLogs(debugConfig, context, id) {
397
397
  // Some browsers don't allow to use bind on console object anyway
398
398
  // fallback to default if needed
399
399
  try {
400
- newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.10743"}`);
400
+ newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.10746"}`);
401
401
  } catch (e) {
402
402
  /* log fn threw an exception. All logger methods are no-ops. */
403
403
  return createLogger();
@@ -3634,20 +3634,21 @@ var ElementaryStreamTypes = {
3634
3634
  AUDIOVIDEO: "audiovideo"
3635
3635
  };
3636
3636
  class BaseSegment {
3637
- constructor(baseurl) {
3637
+ constructor(base) {
3638
3638
  this._byteRange = null;
3639
3639
  this._url = null;
3640
+ this._stats = null;
3641
+ this._streams = null;
3640
3642
  // baseurl is the URL to the playlist
3641
- this.baseurl = void 0;
3643
+ this.base = void 0;
3642
3644
  // relurl is the portion of the URL that comes from inside the playlist.
3643
3645
  this.relurl = void 0;
3644
- // Holds the types of data this fragment supports
3645
- this.elementaryStreams = {
3646
- [ElementaryStreamTypes.AUDIO]: null,
3647
- [ElementaryStreamTypes.VIDEO]: null,
3648
- [ElementaryStreamTypes.AUDIOVIDEO]: null
3649
- };
3650
- this.baseurl = baseurl;
3646
+ if (typeof base === 'string') {
3647
+ base = {
3648
+ url: base
3649
+ };
3650
+ }
3651
+ this.base = base;
3651
3652
  }
3652
3653
 
3653
3654
  // setByteRange converts a EXT-X-BYTERANGE attribute into a two element array
@@ -3661,8 +3662,11 @@ class BaseSegment {
3661
3662
  }
3662
3663
  this._byteRange = [start, parseInt(params[0]) + start];
3663
3664
  }
3665
+ get baseurl() {
3666
+ return this.base.url;
3667
+ }
3664
3668
  get byteRange() {
3665
- if (!this._byteRange) {
3669
+ if (this._byteRange === null) {
3666
3670
  return [];
3667
3671
  }
3668
3672
  return this._byteRange;
@@ -3673,6 +3677,34 @@ class BaseSegment {
3673
3677
  get byteRangeEndOffset() {
3674
3678
  return this.byteRange[1];
3675
3679
  }
3680
+ get elementaryStreams() {
3681
+ if (this._streams === null) {
3682
+ this._streams = {
3683
+ [ElementaryStreamTypes.AUDIO]: null,
3684
+ [ElementaryStreamTypes.VIDEO]: null,
3685
+ [ElementaryStreamTypes.AUDIOVIDEO]: null
3686
+ };
3687
+ }
3688
+ return this._streams;
3689
+ }
3690
+ set elementaryStreams(value) {
3691
+ this._streams = value;
3692
+ }
3693
+ get hasStats() {
3694
+ return this._stats !== null;
3695
+ }
3696
+ get hasStreams() {
3697
+ return this._streams !== null;
3698
+ }
3699
+ get stats() {
3700
+ if (this._stats === null) {
3701
+ this._stats = new LoadStats();
3702
+ }
3703
+ return this._stats;
3704
+ }
3705
+ set stats(value) {
3706
+ this._stats = value;
3707
+ }
3676
3708
  get url() {
3677
3709
  if (!this._url && this.baseurl && this.relurl) {
3678
3710
  this._url = urlToolkitExports.buildAbsoluteURL(this.baseurl, this.relurl, {
@@ -3697,11 +3729,12 @@ class BaseSegment {
3697
3729
  * Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.
3698
3730
  */
3699
3731
  class Fragment extends BaseSegment {
3700
- constructor(type, baseurl) {
3701
- super(baseurl);
3732
+ constructor(type, base) {
3733
+ super(base);
3702
3734
  this._decryptdata = null;
3735
+ this._programDateTime = null;
3736
+ this._ref = null;
3703
3737
  this.rawProgramDateTime = null;
3704
- this.programDateTime = null;
3705
3738
  this.tagList = [];
3706
3739
  // EXTINF has to be present for a m3u8 to be considered valid
3707
3740
  this.duration = 0;
@@ -3739,8 +3772,6 @@ class Fragment extends BaseSegment {
3739
3772
  this.maxStartPTS = void 0;
3740
3773
  // The minimum ending Presentation Time Stamp (audio/video PTS) of the fragment. Set after transmux complete.
3741
3774
  this.minEndPTS = void 0;
3742
- // Load/parse timing information
3743
- this.stats = new LoadStats();
3744
3775
  // Init Segment bytes (unset for media segments)
3745
3776
  this.data = void 0;
3746
3777
  // A flag indicating whether the segment was downloaded in order to test bitrate, and was not buffered
@@ -3784,9 +3815,6 @@ class Fragment extends BaseSegment {
3784
3815
  if (this.programDateTime === null) {
3785
3816
  return null;
3786
3817
  }
3787
- if (!isFiniteNumber(this.programDateTime)) {
3788
- return null;
3789
- }
3790
3818
  const duration = !isFiniteNumber(this.duration) ? 0 : this.duration;
3791
3819
  return this.programDateTime + duration * 1000;
3792
3820
  }
@@ -3806,6 +3834,49 @@ class Fragment extends BaseSegment {
3806
3834
  }
3807
3835
  return false;
3808
3836
  }
3837
+ get programDateTime() {
3838
+ if (this._programDateTime === null && this.rawProgramDateTime) {
3839
+ this.programDateTime = Date.parse(this.rawProgramDateTime);
3840
+ }
3841
+ return this._programDateTime;
3842
+ }
3843
+ set programDateTime(value) {
3844
+ if (!isFiniteNumber(value)) {
3845
+ this._programDateTime = this.rawProgramDateTime = null;
3846
+ return;
3847
+ }
3848
+ this._programDateTime = value;
3849
+ }
3850
+ get ref() {
3851
+ if (this.sn === 'initSegment') {
3852
+ return null;
3853
+ }
3854
+ if (!this._ref) {
3855
+ this._ref = {
3856
+ base: this.base,
3857
+ start: this.start,
3858
+ duration: this.duration,
3859
+ sn: this.sn,
3860
+ programDateTime: this.programDateTime
3861
+ };
3862
+ }
3863
+ return this._ref;
3864
+ }
3865
+ addStart(value) {
3866
+ this.setStart(this.start + value);
3867
+ }
3868
+ setStart(value) {
3869
+ this.start = value;
3870
+ if (this._ref) {
3871
+ this._ref.start = value;
3872
+ }
3873
+ }
3874
+ setDuration(value) {
3875
+ this.duration = value;
3876
+ if (this._ref) {
3877
+ this._ref.duration = value;
3878
+ }
3879
+ }
3809
3880
  setKeyFormat(keyFormat) {
3810
3881
  if (this.levelkeys) {
3811
3882
  const key = this.levelkeys[keyFormat];
@@ -3845,8 +3916,8 @@ class Fragment extends BaseSegment {
3845
3916
  * Object representing parsed data from an HLS Partial Segment. Found in {@link hls.js#LevelDetails.partList}.
3846
3917
  */
3847
3918
  class Part extends BaseSegment {
3848
- constructor(partAttrs, frag, baseurl, index, previous) {
3849
- super(baseurl);
3919
+ constructor(partAttrs, frag, base, index, previous) {
3920
+ super(base);
3850
3921
  this.fragOffset = 0;
3851
3922
  this.duration = 0;
3852
3923
  this.gap = false;
@@ -3854,7 +3925,6 @@ class Part extends BaseSegment {
3854
3925
  this.relurl = void 0;
3855
3926
  this.fragment = void 0;
3856
3927
  this.index = void 0;
3857
- this.stats = new LoadStats();
3858
3928
  this.duration = partAttrs.decimalFloatingPoint('DURATION');
3859
3929
  this.gap = partAttrs.bool('GAP');
3860
3930
  this.independent = partAttrs.bool('INDEPENDENT');
@@ -6641,13 +6711,9 @@ const LEVEL_PLAYLIST_REGEX_FAST = new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*
6641
6711
  // duration (#EXTINF:<duration>,<title>), group 1 => duration, group 2 => title
6642
6712
  /(?!#) *(\S[^\r\n]*)/.source,
6643
6713
  // segment URI, group 3 => the URI (note newline is not eaten)
6644
- /#EXT-X-BYTERANGE:*(.+)/.source,
6645
- // next segment's byterange, group 4 => range spec (x@y)
6646
- /#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,
6647
- // next segment's program date/time group 5 => the datetime spec
6648
6714
  /#.*/.source // All other non-segment oriented tags will match with all groups empty
6649
6715
  ].join('|'), 'g');
6650
- const LEVEL_PLAYLIST_REGEX_SLOW = new RegExp([/#(EXTM3U)/.source, /#EXT-X-(DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/.source, /#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\d+)/.source, /#EXT-X-(DISCONTINUITY|ENDLIST|GAP|INDEPENDENT-SEGMENTS)/.source, /(#)([^:]*):(.*)/.source, /(#)(.*)(?:.*)\r?\n?/.source].join('|'));
6716
+ const LEVEL_PLAYLIST_REGEX_SLOW = new RegExp([/#(EXTM3U)/.source, /#EXT-X-(PROGRAM-DATE-TIME|BYTERANGE|DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/.source, /#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\d+)/.source, /#EXT-X-(DISCONTINUITY|ENDLIST|GAP|INDEPENDENT-SEGMENTS)/.source, /(#)([^:]*):(.*)/.source, /(#)(.*)(?:.*)\r?\n?/.source].join('|'));
6651
6717
  class M3U8Parser {
6652
6718
  static findGroup(groups, mediaGroupId) {
6653
6719
  for (let i = 0; i < groups.length; i++) {
@@ -6837,6 +6903,9 @@ class M3U8Parser {
6837
6903
  return results;
6838
6904
  }
6839
6905
  static parseLevelPlaylist(string, baseurl, id, type, levelUrlId, multivariantVariableList) {
6906
+ const base = {
6907
+ url: baseurl
6908
+ };
6840
6909
  const level = new LevelDetails(baseurl);
6841
6910
  const fragments = level.fragments;
6842
6911
  const programDateTimes = [];
@@ -6847,7 +6916,7 @@ class M3U8Parser {
6847
6916
  let totalduration = 0;
6848
6917
  let discontinuityCounter = 0;
6849
6918
  let prevFrag = null;
6850
- let frag = new Fragment(type, baseurl);
6919
+ let frag = new Fragment(type, base);
6851
6920
  let result;
6852
6921
  let i;
6853
6922
  let levelkeys;
@@ -6860,7 +6929,7 @@ class M3U8Parser {
6860
6929
  while ((result = LEVEL_PLAYLIST_REGEX_FAST.exec(string)) !== null) {
6861
6930
  if (createNextFrag) {
6862
6931
  createNextFrag = false;
6863
- frag = new Fragment(type, baseurl);
6932
+ frag = new Fragment(type, base);
6864
6933
  // setup the next fragment for part loading
6865
6934
  frag.playlistOffset = totalduration;
6866
6935
  frag.start = totalduration;
@@ -6869,8 +6938,10 @@ class M3U8Parser {
6869
6938
  frag.level = id;
6870
6939
  if (currentInitSegment) {
6871
6940
  frag.initSegment = currentInitSegment;
6872
- frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;
6873
- currentInitSegment.rawProgramDateTime = null;
6941
+ if (currentInitSegment.rawProgramDateTime) {
6942
+ frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;
6943
+ currentInitSegment.rawProgramDateTime = null;
6944
+ }
6874
6945
  if (nextByteRange) {
6875
6946
  frag.setByteRange(nextByteRange);
6876
6947
  nextByteRange = null;
@@ -6907,22 +6978,6 @@ class M3U8Parser {
6907
6978
  currentPart = 0;
6908
6979
  createNextFrag = true;
6909
6980
  }
6910
- } else if (result[4]) {
6911
- // X-BYTERANGE
6912
- const data = (' ' + result[4]).slice(1);
6913
- if (prevFrag) {
6914
- frag.setByteRange(data, prevFrag);
6915
- } else {
6916
- frag.setByteRange(data);
6917
- }
6918
- } else if (result[5]) {
6919
- // PROGRAM-DATE-TIME
6920
- // avoid sliced strings https://github.com/video-dev/hls.js/issues/939
6921
- frag.rawProgramDateTime = (' ' + result[5]).slice(1);
6922
- frag.tagList.push(['PROGRAM-DATE-TIME', frag.rawProgramDateTime]);
6923
- if (firstPdtIndex === -1) {
6924
- firstPdtIndex = fragments.length;
6925
- }
6926
6981
  } else {
6927
6982
  result = result[0].match(LEVEL_PLAYLIST_REGEX_SLOW);
6928
6983
  if (!result) {
@@ -6930,7 +6985,7 @@ class M3U8Parser {
6930
6985
  continue;
6931
6986
  }
6932
6987
  for (i = 1; i < result.length; i++) {
6933
- if (typeof result[i] !== 'undefined') {
6988
+ if (result[i] !== undefined) {
6934
6989
  break;
6935
6990
  }
6936
6991
  }
@@ -6938,8 +6993,23 @@ class M3U8Parser {
6938
6993
  // avoid sliced strings https://github.com/video-dev/hls.js/issues/939
6939
6994
  const tag = (' ' + result[i]).slice(1);
6940
6995
  const value1 = (' ' + result[i + 1]).slice(1);
6941
- const value2 = result[i + 2] ? (' ' + result[i + 2]).slice(1) : '';
6996
+ const value2 = result[i + 2] ? (' ' + result[i + 2]).slice(1) : null;
6942
6997
  switch (tag) {
6998
+ case 'BYTERANGE':
6999
+ if (prevFrag) {
7000
+ frag.setByteRange(value1, prevFrag);
7001
+ } else {
7002
+ frag.setByteRange(value1);
7003
+ }
7004
+ break;
7005
+ case 'PROGRAM-DATE-TIME':
7006
+ // avoid sliced strings https://github.com/video-dev/hls.js/issues/939
7007
+ frag.rawProgramDateTime = value1;
7008
+ frag.tagList.push(['PROGRAM-DATE-TIME', value1]);
7009
+ if (firstPdtIndex === -1) {
7010
+ firstPdtIndex = fragments.length;
7011
+ }
7012
+ break;
6943
7013
  case 'PLAYLIST-TYPE':
6944
7014
  level.type = value1.toUpperCase();
6945
7015
  break;
@@ -7054,7 +7124,7 @@ class M3U8Parser {
7054
7124
  // Initial segment tag is after segment duration tag.
7055
7125
  // #EXTINF: 6.0
7056
7126
  // #EXT-X-MAP:URI="init.mp4
7057
- const init = new Fragment(type, baseurl);
7127
+ const init = new Fragment(type, base);
7058
7128
  setInitSegment(init, mapAttrs, id, levelkeys);
7059
7129
  currentInitSegment = init;
7060
7130
  frag.initSegment = currentInitSegment;
@@ -7103,7 +7173,7 @@ class M3U8Parser {
7103
7173
  const previousFragmentPart = currentPart > 0 ? partList[partList.length - 1] : undefined;
7104
7174
  const index = currentPart++;
7105
7175
  const partAttrs = new AttrList(value1, level);
7106
- const part = new Part(partAttrs, frag, baseurl, index, previousFragmentPart);
7176
+ const part = new Part(partAttrs, frag, base, index, previousFragmentPart);
7107
7177
  partList.push(part);
7108
7178
  frag.duration += part.duration;
7109
7179
  break;
@@ -7194,11 +7264,11 @@ function mapDateRanges(programDateTimes, details) {
7194
7264
  for (let i = dateRangeIds.length; i--;) {
7195
7265
  const dateRange = details.dateRanges[dateRangeIds[i]];
7196
7266
  const startDateTime = dateRange.startDate.getTime();
7197
- dateRange.tagAnchor = lastProgramDateTime;
7267
+ dateRange.tagAnchor = lastProgramDateTime.ref;
7198
7268
  for (let j = programDateTimeCount; j--;) {
7199
7269
  const fragIndex = findFragmentWithStartDate(details, startDateTime, programDateTimes, j, playlistEnd);
7200
7270
  if (fragIndex !== -1) {
7201
- dateRange.tagAnchor = details.fragments[fragIndex];
7271
+ dateRange.tagAnchor = details.fragments[fragIndex].ref;
7202
7272
  break;
7203
7273
  }
7204
7274
  }
@@ -7207,25 +7277,27 @@ function mapDateRanges(programDateTimes, details) {
7207
7277
  function findFragmentWithStartDate(details, startDateTime, programDateTimes, index, endTime) {
7208
7278
  const pdtFragment = programDateTimes[index];
7209
7279
  if (pdtFragment) {
7210
- var _programDateTimes;
7211
7280
  // find matching range between PDT tags
7212
- const durationBetweenPdt = (((_programDateTimes = programDateTimes[index + 1]) == null ? void 0 : _programDateTimes.start) || endTime) - pdtFragment.start;
7213
7281
  const pdtStart = pdtFragment.programDateTime;
7214
- if ((startDateTime >= pdtStart || index === 0) && startDateTime <= pdtStart + durationBetweenPdt * 1000) {
7215
- // map to fragment with date-time range
7216
- const startIndex = programDateTimes[index].sn - details.startSN;
7217
- const fragments = details.fragments;
7218
- if (fragments.length > programDateTimes.length) {
7219
- const endSegment = programDateTimes[index + 1] || fragments[fragments.length - 1];
7220
- const endIndex = endSegment.sn - details.startSN;
7221
- for (let i = endIndex; i > startIndex; i--) {
7222
- const fragStartDateTime = fragments[i].programDateTime;
7223
- if (startDateTime >= fragStartDateTime && startDateTime < fragStartDateTime + fragments[i].duration * 1000) {
7224
- return i;
7282
+ if (startDateTime >= pdtStart || index === 0) {
7283
+ var _programDateTimes;
7284
+ const durationBetweenPdt = (((_programDateTimes = programDateTimes[index + 1]) == null ? void 0 : _programDateTimes.start) || endTime) - pdtFragment.start;
7285
+ if (startDateTime <= pdtStart + durationBetweenPdt * 1000) {
7286
+ // map to fragment with date-time range
7287
+ const startIndex = programDateTimes[index].sn - details.startSN;
7288
+ const fragments = details.fragments;
7289
+ if (fragments.length > programDateTimes.length) {
7290
+ const endSegment = programDateTimes[index + 1] || fragments[fragments.length - 1];
7291
+ const endIndex = endSegment.sn - details.startSN;
7292
+ for (let i = endIndex; i > startIndex; i--) {
7293
+ const fragStartDateTime = fragments[i].programDateTime;
7294
+ if (startDateTime >= fragStartDateTime && startDateTime < fragStartDateTime + fragments[i].duration * 1000) {
7295
+ return i;
7296
+ }
7225
7297
  }
7226
7298
  }
7299
+ return startIndex;
7227
7300
  }
7228
- return startIndex;
7229
7301
  }
7230
7302
  }
7231
7303
  return -1;
@@ -7290,12 +7362,6 @@ function backfillProgramDateTimes(fragments, firstPdtIndex) {
7290
7362
  }
7291
7363
  function assignProgramDateTime(frag, prevFrag, programDateTimes) {
7292
7364
  if (frag.rawProgramDateTime) {
7293
- frag.programDateTime = Date.parse(frag.rawProgramDateTime);
7294
- if (!isFiniteNumber(frag.programDateTime)) {
7295
- frag.programDateTime = null;
7296
- frag.rawProgramDateTime = null;
7297
- return;
7298
- }
7299
7365
  programDateTimes.push(frag);
7300
7366
  } else if (prevFrag != null && prevFrag.programDateTime) {
7301
7367
  frag.programDateTime = prevFrag.endProgramDateTime;
@@ -7339,19 +7405,19 @@ function updateFromToPTS(fragFrom, fragTo) {
7339
7405
  frag = fragTo;
7340
7406
  }
7341
7407
  if (frag.duration !== duration) {
7342
- frag.duration = duration;
7408
+ frag.setDuration(duration);
7343
7409
  }
7344
7410
  // we dont know startPTS[toIdx]
7345
7411
  } else if (fragTo.sn > fragFrom.sn) {
7346
7412
  const contiguous = fragFrom.cc === fragTo.cc;
7347
7413
  // TODO: With part-loading end/durations we need to confirm the whole fragment is loaded before using (or setting) minEndPTS
7348
7414
  if (contiguous && fragFrom.minEndPTS) {
7349
- fragTo.start = fragFrom.start + (fragFrom.minEndPTS - fragFrom.start);
7415
+ fragTo.setStart(fragFrom.start + (fragFrom.minEndPTS - fragFrom.start));
7350
7416
  } else {
7351
- fragTo.start = fragFrom.start + fragFrom.duration;
7417
+ fragTo.setStart(fragFrom.start + fragFrom.duration);
7352
7418
  }
7353
7419
  } else {
7354
- fragTo.start = Math.max(fragFrom.start - fragTo.duration, 0);
7420
+ fragTo.setStart(Math.max(fragFrom.start - fragTo.duration, 0));
7355
7421
  }
7356
7422
  }
7357
7423
  function updateFragPTSDTS(details, frag, startPTS, endPTS, startDTS, endDTS) {
@@ -7382,9 +7448,9 @@ function updateFragPTSDTS(details, frag, startPTS, endPTS, startDTS, endDTS) {
7382
7448
  }
7383
7449
  const drift = startPTS - frag.start;
7384
7450
  if (frag.start !== 0) {
7385
- frag.start = startPTS;
7451
+ frag.setStart(startPTS);
7386
7452
  }
7387
- frag.duration = endPTS - frag.start;
7453
+ frag.setDuration(endPTS - frag.start);
7388
7454
  frag.startPTS = startPTS;
7389
7455
  frag.maxStartPTS = maxStartPTS;
7390
7456
  frag.startDTS = startDTS;
@@ -7447,13 +7513,13 @@ function mergeDetails(oldDetails, newDetails) {
7447
7513
  ccOffset = oldFrag.cc - newFrag.cc;
7448
7514
  }
7449
7515
  if (isFiniteNumber(oldFrag.startPTS) && isFiniteNumber(oldFrag.endPTS)) {
7450
- newFrag.start = newFrag.startPTS = oldFrag.startPTS;
7516
+ newFrag.setStart(newFrag.startPTS = oldFrag.startPTS);
7451
7517
  newFrag.startDTS = oldFrag.startDTS;
7452
7518
  newFrag.maxStartPTS = oldFrag.maxStartPTS;
7453
7519
  newFrag.endPTS = oldFrag.endPTS;
7454
7520
  newFrag.endDTS = oldFrag.endDTS;
7455
7521
  newFrag.minEndPTS = oldFrag.minEndPTS;
7456
- newFrag.duration = oldFrag.endPTS - oldFrag.startPTS;
7522
+ newFrag.setDuration(oldFrag.endPTS - oldFrag.startPTS);
7457
7523
  if (newFrag.duration) {
7458
7524
  PTSFrag = newFrag;
7459
7525
  }
@@ -7461,9 +7527,13 @@ function mergeDetails(oldDetails, newDetails) {
7461
7527
  // PTS is known when any segment has startPTS and endPTS
7462
7528
  newDetails.PTSKnown = newDetails.alignedSliding = true;
7463
7529
  }
7464
- newFrag.elementaryStreams = oldFrag.elementaryStreams;
7530
+ if (oldFrag.hasStreams) {
7531
+ newFrag.elementaryStreams = oldFrag.elementaryStreams;
7532
+ }
7465
7533
  newFrag.loader = oldFrag.loader;
7466
- newFrag.stats = oldFrag.stats;
7534
+ if (oldFrag.hasStats) {
7535
+ newFrag.stats = oldFrag.stats;
7536
+ }
7467
7537
  if (oldFrag.initSegment) {
7468
7538
  newFrag.initSegment = oldFrag.initSegment;
7469
7539
  currentInitSegment = oldFrag.initSegment;
@@ -7629,14 +7699,14 @@ function adjustSliding(oldDetails, newDetails, matchingStableVariantOrRendition
7629
7699
  }
7630
7700
  addSliding(newDetails, sliding);
7631
7701
  }
7632
- function addSliding(details, start) {
7633
- if (start) {
7702
+ function addSliding(details, sliding) {
7703
+ if (sliding) {
7634
7704
  const fragments = details.fragments;
7635
7705
  for (let i = details.skippedSegments; i < fragments.length; i++) {
7636
- fragments[i].start += start;
7706
+ fragments[i].addStart(sliding);
7637
7707
  }
7638
7708
  if (details.fragmentHint) {
7639
- details.fragmentHint.start += start;
7709
+ details.fragmentHint.addStart(sliding);
7640
7710
  }
7641
7711
  }
7642
7712
  }
@@ -9656,7 +9726,7 @@ var eventemitter3 = {exports: {}};
9656
9726
  var eventemitter3Exports = eventemitter3.exports;
9657
9727
  var EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
9658
9728
 
9659
- const version = "1.6.0-beta.1.0.canary.10743";
9729
+ const version = "1.6.0-beta.1.0.canary.10746";
9660
9730
 
9661
9731
  // ensure the worker ends up in the bundle
9662
9732
  // If the worker should not be included this gets aliased to empty.js
@@ -22535,7 +22605,7 @@ class InterstitialEvent {
22535
22605
  }
22536
22606
  }
22537
22607
  function getSnapToFragmentTime(time, frag) {
22538
- return time - frag.start < frag.duration / 2 && !(Math.abs(time - frag.end) < ALIGNED_END_THRESHOLD_SECONDS) ? frag.start : frag.end;
22608
+ return time - frag.start < frag.duration / 2 && !(Math.abs(time - (frag.start + frag.duration)) < ALIGNED_END_THRESHOLD_SECONDS) ? frag.start : frag.start + frag.duration;
22539
22609
  }
22540
22610
  function getInterstitialUrl(uri, sessionId, baseUrl) {
22541
22611
  const url = new self.URL(uri, baseUrl);
@@ -29709,13 +29779,14 @@ class LatencyController {
29709
29779
  return this._latency || 0;
29710
29780
  }
29711
29781
  get maxLatency() {
29782
+ var _this$hls;
29712
29783
  const {
29713
29784
  config
29714
29785
  } = this;
29715
29786
  if (config.liveMaxLatencyDuration !== undefined) {
29716
29787
  return config.liveMaxLatencyDuration;
29717
29788
  }
29718
- const levelDetails = this.hls.latestLevelDetails;
29789
+ const levelDetails = (_this$hls = this.hls) == null ? void 0 : _this$hls.latestLevelDetails;
29719
29790
  return levelDetails ? config.liveMaxLatencyDurationCount * levelDetails.targetduration : 0;
29720
29791
  }
29721
29792
  get targetLatency() {