hls.js 1.6.0-beta.1.0.canary.10745 → 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.light.js CHANGED
@@ -1025,7 +1025,7 @@
1025
1025
  // Some browsers don't allow to use bind on console object anyway
1026
1026
  // fallback to default if needed
1027
1027
  try {
1028
- newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.10745");
1028
+ newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.10746");
1029
1029
  } catch (e) {
1030
1030
  /* log fn threw an exception. All logger methods are no-ops. */
1031
1031
  return createLogger();
@@ -3167,17 +3167,21 @@
3167
3167
  AUDIOVIDEO: "audiovideo"
3168
3168
  };
3169
3169
  var BaseSegment = /*#__PURE__*/function () {
3170
- function BaseSegment(baseurl) {
3171
- var _this$elementaryStrea;
3170
+ function BaseSegment(base) {
3172
3171
  this._byteRange = null;
3173
3172
  this._url = null;
3173
+ this._stats = null;
3174
+ this._streams = null;
3174
3175
  // baseurl is the URL to the playlist
3175
- this.baseurl = void 0;
3176
+ this.base = void 0;
3176
3177
  // relurl is the portion of the URL that comes from inside the playlist.
3177
3178
  this.relurl = void 0;
3178
- // Holds the types of data this fragment supports
3179
- this.elementaryStreams = (_this$elementaryStrea = {}, _this$elementaryStrea[ElementaryStreamTypes.AUDIO] = null, _this$elementaryStrea[ElementaryStreamTypes.VIDEO] = null, _this$elementaryStrea[ElementaryStreamTypes.AUDIOVIDEO] = null, _this$elementaryStrea);
3180
- this.baseurl = baseurl;
3179
+ if (typeof base === 'string') {
3180
+ base = {
3181
+ url: base
3182
+ };
3183
+ }
3184
+ this.base = base;
3181
3185
  }
3182
3186
 
3183
3187
  // setByteRange converts a EXT-X-BYTERANGE attribute into a two element array
@@ -3199,9 +3203,14 @@
3199
3203
  elementaryStreams[ElementaryStreamTypes.AUDIOVIDEO] = null;
3200
3204
  };
3201
3205
  return _createClass(BaseSegment, [{
3206
+ key: "baseurl",
3207
+ get: function get() {
3208
+ return this.base.url;
3209
+ }
3210
+ }, {
3202
3211
  key: "byteRange",
3203
3212
  get: function get() {
3204
- if (!this._byteRange) {
3213
+ if (this._byteRange === null) {
3205
3214
  return [];
3206
3215
  }
3207
3216
  return this._byteRange;
@@ -3216,6 +3225,39 @@
3216
3225
  get: function get() {
3217
3226
  return this.byteRange[1];
3218
3227
  }
3228
+ }, {
3229
+ key: "elementaryStreams",
3230
+ get: function get() {
3231
+ if (this._streams === null) {
3232
+ var _this$_streams;
3233
+ this._streams = (_this$_streams = {}, _this$_streams[ElementaryStreamTypes.AUDIO] = null, _this$_streams[ElementaryStreamTypes.VIDEO] = null, _this$_streams[ElementaryStreamTypes.AUDIOVIDEO] = null, _this$_streams);
3234
+ }
3235
+ return this._streams;
3236
+ },
3237
+ set: function set(value) {
3238
+ this._streams = value;
3239
+ }
3240
+ }, {
3241
+ key: "hasStats",
3242
+ get: function get() {
3243
+ return this._stats !== null;
3244
+ }
3245
+ }, {
3246
+ key: "hasStreams",
3247
+ get: function get() {
3248
+ return this._streams !== null;
3249
+ }
3250
+ }, {
3251
+ key: "stats",
3252
+ get: function get() {
3253
+ if (this._stats === null) {
3254
+ this._stats = new LoadStats();
3255
+ }
3256
+ return this._stats;
3257
+ },
3258
+ set: function set(value) {
3259
+ this._stats = value;
3260
+ }
3219
3261
  }, {
3220
3262
  key: "url",
3221
3263
  get: function get() {
@@ -3235,12 +3277,13 @@
3235
3277
  * Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.
3236
3278
  */
3237
3279
  var Fragment = /*#__PURE__*/function (_BaseSegment2) {
3238
- function Fragment(type, baseurl) {
3280
+ function Fragment(type, base) {
3239
3281
  var _this;
3240
- _this = _BaseSegment2.call(this, baseurl) || this;
3282
+ _this = _BaseSegment2.call(this, base) || this;
3241
3283
  _this._decryptdata = null;
3284
+ _this._programDateTime = null;
3285
+ _this._ref = null;
3242
3286
  _this.rawProgramDateTime = null;
3243
- _this.programDateTime = null;
3244
3287
  _this.tagList = [];
3245
3288
  // EXTINF has to be present for a m3u8 to be considered valid
3246
3289
  _this.duration = 0;
@@ -3278,8 +3321,6 @@
3278
3321
  _this.maxStartPTS = void 0;
3279
3322
  // The minimum ending Presentation Time Stamp (audio/video PTS) of the fragment. Set after transmux complete.
3280
3323
  _this.minEndPTS = void 0;
3281
- // Load/parse timing information
3282
- _this.stats = new LoadStats();
3283
3324
  // Init Segment bytes (unset for media segments)
3284
3325
  _this.data = void 0;
3285
3326
  // A flag indicating whether the segment was downloaded in order to test bitrate, and was not buffered
@@ -3299,6 +3340,21 @@
3299
3340
  }
3300
3341
  _inheritsLoose(Fragment, _BaseSegment2);
3301
3342
  var _proto2 = Fragment.prototype;
3343
+ _proto2.addStart = function addStart(value) {
3344
+ this.setStart(this.start + value);
3345
+ };
3346
+ _proto2.setStart = function setStart(value) {
3347
+ this.start = value;
3348
+ if (this._ref) {
3349
+ this._ref.start = value;
3350
+ }
3351
+ };
3352
+ _proto2.setDuration = function setDuration(value) {
3353
+ this.duration = value;
3354
+ if (this._ref) {
3355
+ this._ref.duration = value;
3356
+ }
3357
+ };
3302
3358
  _proto2.setKeyFormat = function setKeyFormat(keyFormat) {
3303
3359
  if (this.levelkeys) {
3304
3360
  var key = this.levelkeys[keyFormat];
@@ -3364,9 +3420,6 @@
3364
3420
  if (this.programDateTime === null) {
3365
3421
  return null;
3366
3422
  }
3367
- if (!isFiniteNumber(this.programDateTime)) {
3368
- return null;
3369
- }
3370
3423
  var duration = !isFiniteNumber(this.duration) ? 0 : this.duration;
3371
3424
  return this.programDateTime + duration * 1000;
3372
3425
  }
@@ -3388,6 +3441,38 @@
3388
3441
  }
3389
3442
  return false;
3390
3443
  }
3444
+ }, {
3445
+ key: "programDateTime",
3446
+ get: function get() {
3447
+ if (this._programDateTime === null && this.rawProgramDateTime) {
3448
+ this.programDateTime = Date.parse(this.rawProgramDateTime);
3449
+ }
3450
+ return this._programDateTime;
3451
+ },
3452
+ set: function set(value) {
3453
+ if (!isFiniteNumber(value)) {
3454
+ this._programDateTime = this.rawProgramDateTime = null;
3455
+ return;
3456
+ }
3457
+ this._programDateTime = value;
3458
+ }
3459
+ }, {
3460
+ key: "ref",
3461
+ get: function get() {
3462
+ if (this.sn === 'initSegment') {
3463
+ return null;
3464
+ }
3465
+ if (!this._ref) {
3466
+ this._ref = {
3467
+ base: this.base,
3468
+ start: this.start,
3469
+ duration: this.duration,
3470
+ sn: this.sn,
3471
+ programDateTime: this.programDateTime
3472
+ };
3473
+ }
3474
+ return this._ref;
3475
+ }
3391
3476
  }]);
3392
3477
  }(BaseSegment);
3393
3478
 
@@ -3395,9 +3480,9 @@
3395
3480
  * Object representing parsed data from an HLS Partial Segment. Found in {@link hls.js#LevelDetails.partList}.
3396
3481
  */
3397
3482
  var Part = /*#__PURE__*/function (_BaseSegment3) {
3398
- function Part(partAttrs, frag, baseurl, index, previous) {
3483
+ function Part(partAttrs, frag, base, index, previous) {
3399
3484
  var _this2;
3400
- _this2 = _BaseSegment3.call(this, baseurl) || this;
3485
+ _this2 = _BaseSegment3.call(this, base) || this;
3401
3486
  _this2.fragOffset = 0;
3402
3487
  _this2.duration = 0;
3403
3488
  _this2.gap = false;
@@ -3405,7 +3490,6 @@
3405
3490
  _this2.relurl = void 0;
3406
3491
  _this2.fragment = void 0;
3407
3492
  _this2.index = void 0;
3408
- _this2.stats = new LoadStats();
3409
3493
  _this2.duration = partAttrs.decimalFloatingPoint('DURATION');
3410
3494
  _this2.gap = partAttrs.bool('GAP');
3411
3495
  _this2.independent = partAttrs.bool('INDEPENDENT');
@@ -7055,13 +7139,9 @@
7055
7139
  // duration (#EXTINF:<duration>,<title>), group 1 => duration, group 2 => title
7056
7140
  /(?!#) *(\S[^\r\n]*)/.source,
7057
7141
  // segment URI, group 3 => the URI (note newline is not eaten)
7058
- /#EXT-X-BYTERANGE:*(.+)/.source,
7059
- // next segment's byterange, group 4 => range spec (x@y)
7060
- /#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,
7061
- // next segment's program date/time group 5 => the datetime spec
7062
7142
  /#.*/.source // All other non-segment oriented tags will match with all groups empty
7063
7143
  ].join('|'), 'g');
7064
- var 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('|'));
7144
+ var 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('|'));
7065
7145
  var M3U8Parser = /*#__PURE__*/function () {
7066
7146
  function M3U8Parser() {}
7067
7147
  M3U8Parser.findGroup = function findGroup(groups, mediaGroupId) {
@@ -7251,6 +7331,9 @@
7251
7331
  return results;
7252
7332
  };
7253
7333
  M3U8Parser.parseLevelPlaylist = function parseLevelPlaylist(string, baseurl, id, type, levelUrlId, multivariantVariableList) {
7334
+ var base = {
7335
+ url: baseurl
7336
+ };
7254
7337
  var level = new LevelDetails(baseurl);
7255
7338
  var fragments = level.fragments;
7256
7339
  var programDateTimes = [];
@@ -7261,7 +7344,7 @@
7261
7344
  var totalduration = 0;
7262
7345
  var discontinuityCounter = 0;
7263
7346
  var prevFrag = null;
7264
- var frag = new Fragment(type, baseurl);
7347
+ var frag = new Fragment(type, base);
7265
7348
  var result;
7266
7349
  var i;
7267
7350
  var levelkeys;
@@ -7274,7 +7357,7 @@
7274
7357
  while ((result = LEVEL_PLAYLIST_REGEX_FAST.exec(string)) !== null) {
7275
7358
  if (createNextFrag) {
7276
7359
  createNextFrag = false;
7277
- frag = new Fragment(type, baseurl);
7360
+ frag = new Fragment(type, base);
7278
7361
  // setup the next fragment for part loading
7279
7362
  frag.playlistOffset = totalduration;
7280
7363
  frag.start = totalduration;
@@ -7283,8 +7366,10 @@
7283
7366
  frag.level = id;
7284
7367
  if (currentInitSegment) {
7285
7368
  frag.initSegment = currentInitSegment;
7286
- frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;
7287
- currentInitSegment.rawProgramDateTime = null;
7369
+ if (currentInitSegment.rawProgramDateTime) {
7370
+ frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;
7371
+ currentInitSegment.rawProgramDateTime = null;
7372
+ }
7288
7373
  if (nextByteRange) {
7289
7374
  frag.setByteRange(nextByteRange);
7290
7375
  nextByteRange = null;
@@ -7321,22 +7406,6 @@
7321
7406
  currentPart = 0;
7322
7407
  createNextFrag = true;
7323
7408
  }
7324
- } else if (result[4]) {
7325
- // X-BYTERANGE
7326
- var data = (' ' + result[4]).slice(1);
7327
- if (prevFrag) {
7328
- frag.setByteRange(data, prevFrag);
7329
- } else {
7330
- frag.setByteRange(data);
7331
- }
7332
- } else if (result[5]) {
7333
- // PROGRAM-DATE-TIME
7334
- // avoid sliced strings https://github.com/video-dev/hls.js/issues/939
7335
- frag.rawProgramDateTime = (' ' + result[5]).slice(1);
7336
- frag.tagList.push(['PROGRAM-DATE-TIME', frag.rawProgramDateTime]);
7337
- if (firstPdtIndex === -1) {
7338
- firstPdtIndex = fragments.length;
7339
- }
7340
7409
  } else {
7341
7410
  result = result[0].match(LEVEL_PLAYLIST_REGEX_SLOW);
7342
7411
  if (!result) {
@@ -7344,7 +7413,7 @@
7344
7413
  continue;
7345
7414
  }
7346
7415
  for (i = 1; i < result.length; i++) {
7347
- if (typeof result[i] !== 'undefined') {
7416
+ if (result[i] !== undefined) {
7348
7417
  break;
7349
7418
  }
7350
7419
  }
@@ -7352,8 +7421,23 @@
7352
7421
  // avoid sliced strings https://github.com/video-dev/hls.js/issues/939
7353
7422
  var tag = (' ' + result[i]).slice(1);
7354
7423
  var value1 = (' ' + result[i + 1]).slice(1);
7355
- var value2 = result[i + 2] ? (' ' + result[i + 2]).slice(1) : '';
7424
+ var value2 = result[i + 2] ? (' ' + result[i + 2]).slice(1) : null;
7356
7425
  switch (tag) {
7426
+ case 'BYTERANGE':
7427
+ if (prevFrag) {
7428
+ frag.setByteRange(value1, prevFrag);
7429
+ } else {
7430
+ frag.setByteRange(value1);
7431
+ }
7432
+ break;
7433
+ case 'PROGRAM-DATE-TIME':
7434
+ // avoid sliced strings https://github.com/video-dev/hls.js/issues/939
7435
+ frag.rawProgramDateTime = value1;
7436
+ frag.tagList.push(['PROGRAM-DATE-TIME', value1]);
7437
+ if (firstPdtIndex === -1) {
7438
+ firstPdtIndex = fragments.length;
7439
+ }
7440
+ break;
7357
7441
  case 'PLAYLIST-TYPE':
7358
7442
  level.type = value1.toUpperCase();
7359
7443
  break;
@@ -7460,7 +7544,7 @@
7460
7544
  // Initial segment tag is after segment duration tag.
7461
7545
  // #EXTINF: 6.0
7462
7546
  // #EXT-X-MAP:URI="init.mp4
7463
- var init = new Fragment(type, baseurl);
7547
+ var init = new Fragment(type, base);
7464
7548
  setInitSegment(init, mapAttrs, id, levelkeys);
7465
7549
  currentInitSegment = init;
7466
7550
  frag.initSegment = currentInitSegment;
@@ -7509,7 +7593,7 @@
7509
7593
  var previousFragmentPart = currentPart > 0 ? partList[partList.length - 1] : undefined;
7510
7594
  var index = currentPart++;
7511
7595
  var partAttrs = new AttrList(value1, level);
7512
- var part = new Part(partAttrs, frag, baseurl, index, previousFragmentPart);
7596
+ var part = new Part(partAttrs, frag, base, index, previousFragmentPart);
7513
7597
  partList.push(part);
7514
7598
  frag.duration += part.duration;
7515
7599
  break;
@@ -7601,11 +7685,11 @@
7601
7685
  for (var i = dateRangeIds.length; i--;) {
7602
7686
  var dateRange = details.dateRanges[dateRangeIds[i]];
7603
7687
  var startDateTime = dateRange.startDate.getTime();
7604
- dateRange.tagAnchor = lastProgramDateTime;
7688
+ dateRange.tagAnchor = lastProgramDateTime.ref;
7605
7689
  for (var j = programDateTimeCount; j--;) {
7606
7690
  var fragIndex = findFragmentWithStartDate(details, startDateTime, programDateTimes, j, playlistEnd);
7607
7691
  if (fragIndex !== -1) {
7608
- dateRange.tagAnchor = details.fragments[fragIndex];
7692
+ dateRange.tagAnchor = details.fragments[fragIndex].ref;
7609
7693
  break;
7610
7694
  }
7611
7695
  }
@@ -7614,25 +7698,27 @@
7614
7698
  function findFragmentWithStartDate(details, startDateTime, programDateTimes, index, endTime) {
7615
7699
  var pdtFragment = programDateTimes[index];
7616
7700
  if (pdtFragment) {
7617
- var _programDateTimes;
7618
7701
  // find matching range between PDT tags
7619
- var durationBetweenPdt = (((_programDateTimes = programDateTimes[index + 1]) == null ? void 0 : _programDateTimes.start) || endTime) - pdtFragment.start;
7620
7702
  var pdtStart = pdtFragment.programDateTime;
7621
- if ((startDateTime >= pdtStart || index === 0) && startDateTime <= pdtStart + durationBetweenPdt * 1000) {
7622
- // map to fragment with date-time range
7623
- var startIndex = programDateTimes[index].sn - details.startSN;
7624
- var fragments = details.fragments;
7625
- if (fragments.length > programDateTimes.length) {
7626
- var endSegment = programDateTimes[index + 1] || fragments[fragments.length - 1];
7627
- var endIndex = endSegment.sn - details.startSN;
7628
- for (var i = endIndex; i > startIndex; i--) {
7629
- var fragStartDateTime = fragments[i].programDateTime;
7630
- if (startDateTime >= fragStartDateTime && startDateTime < fragStartDateTime + fragments[i].duration * 1000) {
7631
- return i;
7703
+ if (startDateTime >= pdtStart || index === 0) {
7704
+ var _programDateTimes;
7705
+ var durationBetweenPdt = (((_programDateTimes = programDateTimes[index + 1]) == null ? void 0 : _programDateTimes.start) || endTime) - pdtFragment.start;
7706
+ if (startDateTime <= pdtStart + durationBetweenPdt * 1000) {
7707
+ // map to fragment with date-time range
7708
+ var startIndex = programDateTimes[index].sn - details.startSN;
7709
+ var fragments = details.fragments;
7710
+ if (fragments.length > programDateTimes.length) {
7711
+ var endSegment = programDateTimes[index + 1] || fragments[fragments.length - 1];
7712
+ var endIndex = endSegment.sn - details.startSN;
7713
+ for (var i = endIndex; i > startIndex; i--) {
7714
+ var fragStartDateTime = fragments[i].programDateTime;
7715
+ if (startDateTime >= fragStartDateTime && startDateTime < fragStartDateTime + fragments[i].duration * 1000) {
7716
+ return i;
7717
+ }
7632
7718
  }
7633
7719
  }
7720
+ return startIndex;
7634
7721
  }
7635
- return startIndex;
7636
7722
  }
7637
7723
  }
7638
7724
  return -1;
@@ -7703,12 +7789,6 @@
7703
7789
  }
7704
7790
  function assignProgramDateTime(frag, prevFrag, programDateTimes) {
7705
7791
  if (frag.rawProgramDateTime) {
7706
- frag.programDateTime = Date.parse(frag.rawProgramDateTime);
7707
- if (!isFiniteNumber(frag.programDateTime)) {
7708
- frag.programDateTime = null;
7709
- frag.rawProgramDateTime = null;
7710
- return;
7711
- }
7712
7792
  programDateTimes.push(frag);
7713
7793
  } else if (prevFrag != null && prevFrag.programDateTime) {
7714
7794
  frag.programDateTime = prevFrag.endProgramDateTime;
@@ -7752,19 +7832,19 @@
7752
7832
  frag = fragTo;
7753
7833
  }
7754
7834
  if (frag.duration !== duration) {
7755
- frag.duration = duration;
7835
+ frag.setDuration(duration);
7756
7836
  }
7757
7837
  // we dont know startPTS[toIdx]
7758
7838
  } else if (fragTo.sn > fragFrom.sn) {
7759
7839
  var contiguous = fragFrom.cc === fragTo.cc;
7760
7840
  // TODO: With part-loading end/durations we need to confirm the whole fragment is loaded before using (or setting) minEndPTS
7761
7841
  if (contiguous && fragFrom.minEndPTS) {
7762
- fragTo.start = fragFrom.start + (fragFrom.minEndPTS - fragFrom.start);
7842
+ fragTo.setStart(fragFrom.start + (fragFrom.minEndPTS - fragFrom.start));
7763
7843
  } else {
7764
- fragTo.start = fragFrom.start + fragFrom.duration;
7844
+ fragTo.setStart(fragFrom.start + fragFrom.duration);
7765
7845
  }
7766
7846
  } else {
7767
- fragTo.start = Math.max(fragFrom.start - fragTo.duration, 0);
7847
+ fragTo.setStart(Math.max(fragFrom.start - fragTo.duration, 0));
7768
7848
  }
7769
7849
  }
7770
7850
  function updateFragPTSDTS(details, frag, startPTS, endPTS, startDTS, endDTS) {
@@ -7795,9 +7875,9 @@
7795
7875
  }
7796
7876
  var drift = startPTS - frag.start;
7797
7877
  if (frag.start !== 0) {
7798
- frag.start = startPTS;
7878
+ frag.setStart(startPTS);
7799
7879
  }
7800
- frag.duration = endPTS - frag.start;
7880
+ frag.setDuration(endPTS - frag.start);
7801
7881
  frag.startPTS = startPTS;
7802
7882
  frag.maxStartPTS = maxStartPTS;
7803
7883
  frag.startDTS = startDTS;
@@ -7860,13 +7940,13 @@
7860
7940
  ccOffset = oldFrag.cc - newFrag.cc;
7861
7941
  }
7862
7942
  if (isFiniteNumber(oldFrag.startPTS) && isFiniteNumber(oldFrag.endPTS)) {
7863
- newFrag.start = newFrag.startPTS = oldFrag.startPTS;
7943
+ newFrag.setStart(newFrag.startPTS = oldFrag.startPTS);
7864
7944
  newFrag.startDTS = oldFrag.startDTS;
7865
7945
  newFrag.maxStartPTS = oldFrag.maxStartPTS;
7866
7946
  newFrag.endPTS = oldFrag.endPTS;
7867
7947
  newFrag.endDTS = oldFrag.endDTS;
7868
7948
  newFrag.minEndPTS = oldFrag.minEndPTS;
7869
- newFrag.duration = oldFrag.endPTS - oldFrag.startPTS;
7949
+ newFrag.setDuration(oldFrag.endPTS - oldFrag.startPTS);
7870
7950
  if (newFrag.duration) {
7871
7951
  PTSFrag = newFrag;
7872
7952
  }
@@ -7874,9 +7954,13 @@
7874
7954
  // PTS is known when any segment has startPTS and endPTS
7875
7955
  newDetails.PTSKnown = newDetails.alignedSliding = true;
7876
7956
  }
7877
- newFrag.elementaryStreams = oldFrag.elementaryStreams;
7957
+ if (oldFrag.hasStreams) {
7958
+ newFrag.elementaryStreams = oldFrag.elementaryStreams;
7959
+ }
7878
7960
  newFrag.loader = oldFrag.loader;
7879
- newFrag.stats = oldFrag.stats;
7961
+ if (oldFrag.hasStats) {
7962
+ newFrag.stats = oldFrag.stats;
7963
+ }
7880
7964
  if (oldFrag.initSegment) {
7881
7965
  newFrag.initSegment = oldFrag.initSegment;
7882
7966
  currentInitSegment = oldFrag.initSegment;
@@ -8047,14 +8131,14 @@
8047
8131
  }
8048
8132
  addSliding(newDetails, sliding);
8049
8133
  }
8050
- function addSliding(details, start) {
8051
- if (start) {
8134
+ function addSliding(details, sliding) {
8135
+ if (sliding) {
8052
8136
  var fragments = details.fragments;
8053
8137
  for (var i = details.skippedSegments; i < fragments.length; i++) {
8054
- fragments[i].start += start;
8138
+ fragments[i].addStart(sliding);
8055
8139
  }
8056
8140
  if (details.fragmentHint) {
8057
- details.fragmentHint.start += start;
8141
+ details.fragmentHint.addStart(sliding);
8058
8142
  }
8059
8143
  }
8060
8144
  }
@@ -16080,11 +16164,12 @@
16080
16164
  }, {
16081
16165
  key: "maxLatency",
16082
16166
  get: function get() {
16167
+ var _this$hls;
16083
16168
  var config = this.config;
16084
16169
  if (config.liveMaxLatencyDuration !== undefined) {
16085
16170
  return config.liveMaxLatencyDuration;
16086
16171
  }
16087
- var levelDetails = this.hls.latestLevelDetails;
16172
+ var levelDetails = (_this$hls = this.hls) == null ? void 0 : _this$hls.latestLevelDetails;
16088
16173
  return levelDetails ? config.liveMaxLatencyDurationCount * levelDetails.targetduration : 0;
16089
16174
  }
16090
16175
  }, {
@@ -19554,7 +19639,7 @@
19554
19639
  return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
19555
19640
  }
19556
19641
 
19557
- var version = "1.6.0-beta.1.0.canary.10745";
19642
+ var version = "1.6.0-beta.1.0.canary.10746";
19558
19643
 
19559
19644
  // ensure the worker ends up in the bundle
19560
19645
  // If the worker should not be included this gets aliased to empty.js