hls.js 1.6.0-beta.1.0.canary.10750 → 1.6.0-beta.1.0.canary.10752

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
@@ -1028,7 +1028,7 @@
1028
1028
  // Some browsers don't allow to use bind on console object anyway
1029
1029
  // fallback to default if needed
1030
1030
  try {
1031
- newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.10750");
1031
+ newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.10752");
1032
1032
  } catch (e) {
1033
1033
  /* log fn threw an exception. All logger methods are no-ops. */
1034
1034
  return createLogger();
@@ -1817,7 +1817,7 @@
1817
1817
  var bwEstimate = _this.getBwEstimate();
1818
1818
  var levels = hls.levels;
1819
1819
  var level = levels[frag.level];
1820
- var expectedLen = stats.total || Math.max(stats.loaded, Math.round(duration * level.averageBitrate / 8));
1820
+ var expectedLen = Math.max(stats.loaded, Math.round(duration * (frag.bitrate || level.averageBitrate) / 8));
1821
1821
  var timeStreaming = loadedFirstByte ? timeLoading - ttfb : timeLoading;
1822
1822
  if (timeStreaming < 1 && loadedFirstByte) {
1823
1823
  timeStreaming = Math.min(timeLoading, stats.loaded * 8 / bwEstimate);
@@ -2272,7 +2272,7 @@
2272
2272
  }
2273
2273
 
2274
2274
  // Use average bitrate when starvation delay (buffer length) is gt or eq two segment durations and rebuffering is not expected (maxStarvationDelay > 0)
2275
- var bitrate = currentFragDuration && bufferStarvationDelay >= currentFragDuration * 2 && maxStarvationDelay === 0 ? levels[i].averageBitrate : levels[i].maxBitrate;
2275
+ var bitrate = currentFragDuration && bufferStarvationDelay >= currentFragDuration * 2 && maxStarvationDelay === 0 ? levelInfo.averageBitrate : levelInfo.maxBitrate;
2276
2276
  var fetchDuration = _this3.getTimeToLoadFrag(ttfbEstimateSec, adjustedbw, bitrate * avgDuration, levelDetails === undefined);
2277
2277
  var canSwitchWithinTolerance =
2278
2278
  // if adjusted bw is greater than level bitrate AND
@@ -3286,6 +3286,8 @@
3286
3286
  _this._decryptdata = null;
3287
3287
  _this._programDateTime = null;
3288
3288
  _this._ref = null;
3289
+ // Approximate bit rate of the fragment expressed in bits per second (bps) as indicated by the last EXT-X-BITRATE (kbps) tag
3290
+ _this._bitrate = void 0;
3289
3291
  _this.rawProgramDateTime = null;
3290
3292
  _this.tagList = [];
3291
3293
  // EXTINF has to be present for a m3u8 to be considered valid
@@ -3393,6 +3395,38 @@
3393
3395
  info.endDTS = Math.max(info.endDTS, endDTS);
3394
3396
  };
3395
3397
  return _createClass(Fragment, [{
3398
+ key: "byteLength",
3399
+ get: function get() {
3400
+ if (this.hasStats) {
3401
+ var total = this.stats.total;
3402
+ if (total) {
3403
+ return total;
3404
+ }
3405
+ }
3406
+ if (this.byteRange) {
3407
+ var start = this.byteRange[0];
3408
+ var end = this.byteRange[1];
3409
+ if (isFiniteNumber(start) && isFiniteNumber(end)) {
3410
+ return end - start;
3411
+ }
3412
+ }
3413
+ return null;
3414
+ }
3415
+ }, {
3416
+ key: "bitrate",
3417
+ get: function get() {
3418
+ if (this.byteLength) {
3419
+ return this.byteLength * 8 / this.duration;
3420
+ }
3421
+ if (this._bitrate) {
3422
+ return this._bitrate;
3423
+ }
3424
+ return null;
3425
+ },
3426
+ set: function set(value) {
3427
+ this._bitrate = value;
3428
+ }
3429
+ }, {
3396
3430
  key: "decryptdata",
3397
3431
  get: function get() {
3398
3432
  var levelkeys = this.levelkeys;
@@ -7346,6 +7380,7 @@
7346
7380
  var currentPart = 0;
7347
7381
  var totalduration = 0;
7348
7382
  var discontinuityCounter = 0;
7383
+ var currentBitrate = 0;
7349
7384
  var prevFrag = null;
7350
7385
  var frag = new Fragment(type, base);
7351
7386
  var result;
@@ -7366,6 +7401,9 @@
7366
7401
  frag.start = totalduration;
7367
7402
  frag.sn = currentSN;
7368
7403
  frag.cc = discontinuityCounter;
7404
+ if (currentBitrate) {
7405
+ frag.bitrate = currentBitrate;
7406
+ }
7369
7407
  frag.level = id;
7370
7408
  if (currentInitSegment) {
7371
7409
  frag.initSegment = currentInitSegment;
@@ -7495,6 +7533,12 @@
7495
7533
  break;
7496
7534
  case 'BITRATE':
7497
7535
  frag.tagList.push([tag, value1]);
7536
+ currentBitrate = parseInt(value1) * 1000;
7537
+ if (isFiniteNumber(currentBitrate)) {
7538
+ frag.bitrate = currentBitrate;
7539
+ } else {
7540
+ currentBitrate = 0;
7541
+ }
7498
7542
  break;
7499
7543
  case 'DATERANGE':
7500
7544
  {
@@ -14129,7 +14173,7 @@
14129
14173
  var _this$currentTransmux = this.currentTransmuxState,
14130
14174
  accurateTimeOffset = _this$currentTransmux.accurateTimeOffset,
14131
14175
  timeOffset = _this$currentTransmux.timeOffset;
14132
- this.logger.log("[transmuxer.ts]: Flushed " + this.id + " sn: " + chunkMeta.sn + (chunkMeta.part > -1 ? ' p: ' + chunkMeta.part : '') + " of " + (this.id === PlaylistLevelType.MAIN ? 'level' : 'track') + " " + chunkMeta.level);
14176
+ this.logger.log("[transmuxer.ts]: Flushed " + this.id + " sn: " + chunkMeta.sn + (chunkMeta.part > -1 ? ' part: ' + chunkMeta.part : '') + " of " + (this.id === PlaylistLevelType.MAIN ? 'level' : 'track') + " " + chunkMeta.level);
14133
14177
  var remuxResult = this.remuxer.remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, true, this.id);
14134
14178
  transmuxResults.push({
14135
14179
  remuxResult: remuxResult,
@@ -18034,23 +18078,25 @@
18034
18078
  this.startFragRequested = true;
18035
18079
  this._loadFragForPlayback(frag, level, targetBufferTime);
18036
18080
  };
18037
- _proto._loadFragForPlayback = function _loadFragForPlayback(frag, level, targetBufferTime) {
18081
+ _proto._loadFragForPlayback = function _loadFragForPlayback(fragment, level, targetBufferTime) {
18038
18082
  var _this3 = this;
18039
18083
  var progressCallback = function progressCallback(data) {
18084
+ var frag = data.frag;
18040
18085
  if (_this3.fragContextChanged(frag)) {
18041
- _this3.warn("Fragment " + frag.sn + (data.part ? ' p: ' + data.part.index : '') + " of level " + frag.level + " was dropped during download.");
18086
+ _this3.warn(frag.type + " sn: " + frag.sn + (data.part ? ' part: ' + data.part.index : '') + " of " + _this3.fragInfo(frag, false, data.part) + ") was dropped during download.");
18042
18087
  _this3.fragmentTracker.removeFragment(frag);
18043
18088
  return;
18044
18089
  }
18045
18090
  frag.stats.chunkCount++;
18046
18091
  _this3._handleFragmentLoadProgress(data);
18047
18092
  };
18048
- this._doFragLoad(frag, level, targetBufferTime, progressCallback).then(function (data) {
18093
+ this._doFragLoad(fragment, level, targetBufferTime, progressCallback).then(function (data) {
18049
18094
  if (!data) {
18050
18095
  // if we're here we probably needed to backtrack or are waiting for more parts
18051
18096
  return;
18052
18097
  }
18053
18098
  var state = _this3.state;
18099
+ var frag = data.frag;
18054
18100
  if (_this3.fragContextChanged(frag)) {
18055
18101
  if (state === State.FRAG_LOADING || !_this3.fragCurrent && state === State.PARSING) {
18056
18102
  _this3.fragmentTracker.removeFragment(frag);
@@ -18070,7 +18116,7 @@
18070
18116
  return;
18071
18117
  }
18072
18118
  _this3.warn("Frag error: " + ((reason == null ? void 0 : reason.message) || reason));
18073
- _this3.resetFragmentLoading(frag);
18119
+ _this3.resetFragmentLoading(fragment);
18074
18120
  });
18075
18121
  };
18076
18122
  _proto.clearTrackerIfNeeded = function clearTrackerIfNeeded(frag) {
@@ -18135,16 +18181,18 @@
18135
18181
  };
18136
18182
  this.hls.trigger(Events.BUFFER_FLUSHING, flushScope);
18137
18183
  };
18138
- _proto._loadInitSegment = function _loadInitSegment(frag, level) {
18184
+ _proto._loadInitSegment = function _loadInitSegment(fragment, level) {
18139
18185
  var _this4 = this;
18140
- this._doFragLoad(frag, level).then(function (data) {
18141
- if (!data || _this4.fragContextChanged(frag) || !_this4.levels) {
18186
+ this._doFragLoad(fragment, level).then(function (data) {
18187
+ var frag = data == null ? void 0 : data.frag;
18188
+ if (!frag || _this4.fragContextChanged(frag) || !_this4.levels) {
18142
18189
  throw new Error('init load aborted');
18143
18190
  }
18144
18191
  return data;
18145
18192
  }).then(function (data) {
18146
18193
  var hls = _this4.hls;
18147
- var payload = data.payload;
18194
+ var frag = data.frag,
18195
+ payload = data.payload;
18148
18196
  var decryptData = frag.decryptdata;
18149
18197
 
18150
18198
  // check to see if the payload needs to be decrypted
@@ -18181,7 +18229,7 @@
18181
18229
  return;
18182
18230
  }
18183
18231
  _this4.warn(reason);
18184
- _this4.resetFragmentLoading(frag);
18232
+ _this4.resetFragmentLoading(fragment);
18185
18233
  });
18186
18234
  };
18187
18235
  _proto.completeInitSegmentLoad = function completeInitSegmentLoad(data) {
@@ -18204,7 +18252,7 @@
18204
18252
  };
18205
18253
  _proto.fragBufferedComplete = function fragBufferedComplete(frag, part) {
18206
18254
  var media = this.mediaBuffer ? this.mediaBuffer : this.media;
18207
- this.log("Buffered " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag) + " > buffer:" + (media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : '(detached)') + ")");
18255
+ this.log("Buffered " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag, false, part) + " > buffer:" + (media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : '(detached)') + ")");
18208
18256
  if (frag.sn !== 'initSegment') {
18209
18257
  var _this$levels;
18210
18258
  if (frag.type !== PlaylistLevelType.SUBTITLE) {
@@ -18296,7 +18344,8 @@
18296
18344
  var partIndex = this.getNextPart(partList, frag, targetBufferTime);
18297
18345
  if (partIndex > -1) {
18298
18346
  var part = partList[partIndex];
18299
- this.log("Loading part sn: " + frag.sn + " p: " + part.index + " cc: " + frag.cc + " of playlist [" + details.startSN + "-" + details.endSN + "] parts [0-" + partIndex + "-" + (partList.length - 1) + "] " + this.playlistLabel() + ": " + frag.level + ", target: " + parseFloat(targetBufferTime.toFixed(3)));
18347
+ frag = this.fragCurrent = part.fragment;
18348
+ this.log("Loading " + frag.type + " sn: " + frag.sn + " part: " + part.index + " (" + partIndex + "/" + (partList.length - 1) + ") of " + this.fragInfo(frag, false, part) + ") cc: " + frag.cc + " [" + details.startSN + "-" + details.endSN + "], target: " + parseFloat(targetBufferTime.toFixed(3)));
18300
18349
  this.nextLoadPosition = part.start + part.duration;
18301
18350
  this.state = State.FRAG_LOADING;
18302
18351
  var _result;
@@ -19084,7 +19133,7 @@
19084
19133
  // For this error fallthrough. Marking parsed will allow advancing to next fragment.
19085
19134
  }
19086
19135
  this.state = State.PARSED;
19087
- this.log("Parsed " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag) + ")");
19136
+ this.log("Parsed " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag, false, part) + ")");
19088
19137
  this.hls.trigger(Events.FRAG_PARSED, {
19089
19138
  frag: frag,
19090
19139
  part: part
@@ -19093,12 +19142,12 @@
19093
19142
  _proto.playlistLabel = function playlistLabel() {
19094
19143
  return this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track';
19095
19144
  };
19096
- _proto.fragInfo = function fragInfo(frag, pts) {
19145
+ _proto.fragInfo = function fragInfo(frag, pts, part) {
19097
19146
  var _ref3, _ref4;
19098
19147
  if (pts === void 0) {
19099
19148
  pts = true;
19100
19149
  }
19101
- return this.playlistLabel() + " " + frag.level + " (frag:[" + ((_ref3 = pts ? frag.startPTS : frag.start) != null ? _ref3 : NaN).toFixed(3) + "-" + ((_ref4 = pts ? frag.endPTS : frag.end) != null ? _ref4 : NaN).toFixed(3) + "]";
19150
+ return this.playlistLabel() + " " + frag.level + " (" + (part ? 'part' : 'frag') + ":[" + ((_ref3 = pts && !part ? frag.startPTS : (part || frag).start) != null ? _ref3 : NaN).toFixed(3) + "-" + ((_ref4 = pts && !part ? frag.endPTS : (part || frag).end) != null ? _ref4 : NaN).toFixed(3) + "]" + (part && frag.type === 'main' ? 'INDEPENDENT=' + (part.independent ? 'YES' : 'NO') : '');
19102
19151
  };
19103
19152
  _proto.resetTransmuxer = function resetTransmuxer() {
19104
19153
  var _this$transmuxer2;
@@ -19644,7 +19693,7 @@
19644
19693
  return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
19645
19694
  }
19646
19695
 
19647
- var version = "1.6.0-beta.1.0.canary.10750";
19696
+ var version = "1.6.0-beta.1.0.canary.10752";
19648
19697
 
19649
19698
  // ensure the worker ends up in the bundle
19650
19699
  // If the worker should not be included this gets aliased to empty.js
@@ -19916,7 +19965,7 @@
19916
19965
  var initSegmentChange = !(lastFrag && ((_frag$initSegment = frag.initSegment) == null ? void 0 : _frag$initSegment.url) === ((_lastFrag$initSegment = lastFrag.initSegment) == null ? void 0 : _lastFrag$initSegment.url));
19917
19966
  var state = new TransmuxState(discontinuity, contiguous, accurateTimeOffset, trackSwitch, timeOffset, initSegmentChange);
19918
19967
  if (!contiguous || discontinuity || initSegmentChange) {
19919
- this.hls.logger.log("[transmuxer-interface, " + frag.type + "]: Starting new transmux session for sn: " + chunkMeta.sn + " p: " + chunkMeta.part + " level: " + chunkMeta.level + " id: " + chunkMeta.id + "\n discontinuity: " + discontinuity + "\n trackSwitch: " + trackSwitch + "\n contiguous: " + contiguous + "\n accurateTimeOffset: " + accurateTimeOffset + "\n timeOffset: " + timeOffset + "\n initSegmentChange: " + initSegmentChange);
19968
+ this.hls.logger.log("[transmuxer-interface]: Starting new transmux session for " + frag.type + " sn: " + chunkMeta.sn + (chunkMeta.part > -1 ? ' part: ' + chunkMeta.part : '') + " " + (this.id === PlaylistLevelType.MAIN ? 'level' : 'track') + ": " + chunkMeta.level + " id: " + chunkMeta.id + "\n discontinuity: " + discontinuity + "\n trackSwitch: " + trackSwitch + "\n contiguous: " + contiguous + "\n accurateTimeOffset: " + accurateTimeOffset + "\n timeOffset: " + timeOffset + "\n initSegmentChange: " + initSegmentChange);
19920
19969
  var config = new TransmuxConfig(audioCodec, videoCodec, initSegmentData, duration, defaultInitPTS);
19921
19970
  this.configureTransmuxer(config);
19922
19971
  }
@@ -20889,12 +20938,13 @@
20889
20938
  }
20890
20939
  return audioCodec;
20891
20940
  };
20892
- _proto._loadBitrateTestFrag = function _loadBitrateTestFrag(frag, level) {
20941
+ _proto._loadBitrateTestFrag = function _loadBitrateTestFrag(fragment, level) {
20893
20942
  var _this2 = this;
20894
- frag.bitrateTest = true;
20895
- this._doFragLoad(frag, level).then(function (data) {
20943
+ fragment.bitrateTest = true;
20944
+ this._doFragLoad(fragment, level).then(function (data) {
20896
20945
  var hls = _this2.hls;
20897
- if (!data || _this2.fragContextChanged(frag)) {
20946
+ var frag = data == null ? void 0 : data.frag;
20947
+ if (!frag || _this2.fragContextChanged(frag)) {
20898
20948
  return;
20899
20949
  }
20900
20950
  level.fragmentError = 0;