hls.js 1.6.0-beta.1.0.canary.10751 → 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.
@@ -400,7 +400,7 @@ function enableLogs(debugConfig, context, id) {
400
400
  // Some browsers don't allow to use bind on console object anyway
401
401
  // fallback to default if needed
402
402
  try {
403
- newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.10751"}`);
403
+ newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.10752"}`);
404
404
  } catch (e) {
405
405
  /* log fn threw an exception. All logger methods are no-ops. */
406
406
  return createLogger();
@@ -1129,7 +1129,7 @@ class AbrController extends Logger {
1129
1129
  const bwEstimate = this.getBwEstimate();
1130
1130
  const levels = hls.levels;
1131
1131
  const level = levels[frag.level];
1132
- const expectedLen = stats.total || Math.max(stats.loaded, Math.round(duration * level.averageBitrate / 8));
1132
+ const expectedLen = Math.max(stats.loaded, Math.round(duration * (frag.bitrate || level.averageBitrate) / 8));
1133
1133
  let timeStreaming = loadedFirstByte ? timeLoading - ttfb : timeLoading;
1134
1134
  if (timeStreaming < 1 && loadedFirstByte) {
1135
1135
  timeStreaming = Math.min(timeLoading, stats.loaded * 8 / bwEstimate);
@@ -1662,7 +1662,7 @@ class AbrController extends Logger {
1662
1662
  }
1663
1663
 
1664
1664
  // Use average bitrate when starvation delay (buffer length) is gt or eq two segment durations and rebuffering is not expected (maxStarvationDelay > 0)
1665
- const bitrate = currentFragDuration && bufferStarvationDelay >= currentFragDuration * 2 && maxStarvationDelay === 0 ? levels[i].averageBitrate : levels[i].maxBitrate;
1665
+ const bitrate = currentFragDuration && bufferStarvationDelay >= currentFragDuration * 2 && maxStarvationDelay === 0 ? levelInfo.averageBitrate : levelInfo.maxBitrate;
1666
1666
  const fetchDuration = this.getTimeToLoadFrag(ttfbEstimateSec, adjustedbw, bitrate * avgDuration, levelDetails === undefined);
1667
1667
  const canSwitchWithinTolerance =
1668
1668
  // if adjusted bw is greater than level bitrate AND
@@ -2869,6 +2869,8 @@ class Fragment extends BaseSegment {
2869
2869
  this._decryptdata = null;
2870
2870
  this._programDateTime = null;
2871
2871
  this._ref = null;
2872
+ // Approximate bit rate of the fragment expressed in bits per second (bps) as indicated by the last EXT-X-BITRATE (kbps) tag
2873
+ this._bitrate = void 0;
2872
2874
  this.rawProgramDateTime = null;
2873
2875
  this.tagList = [];
2874
2876
  // EXTINF has to be present for a m3u8 to be considered valid
@@ -2923,6 +2925,34 @@ class Fragment extends BaseSegment {
2923
2925
  this.urlId = 0;
2924
2926
  this.type = type;
2925
2927
  }
2928
+ get byteLength() {
2929
+ if (this.hasStats) {
2930
+ const total = this.stats.total;
2931
+ if (total) {
2932
+ return total;
2933
+ }
2934
+ }
2935
+ if (this.byteRange) {
2936
+ const start = this.byteRange[0];
2937
+ const end = this.byteRange[1];
2938
+ if (isFiniteNumber(start) && isFiniteNumber(end)) {
2939
+ return end - start;
2940
+ }
2941
+ }
2942
+ return null;
2943
+ }
2944
+ get bitrate() {
2945
+ if (this.byteLength) {
2946
+ return this.byteLength * 8 / this.duration;
2947
+ }
2948
+ if (this._bitrate) {
2949
+ return this._bitrate;
2950
+ }
2951
+ return null;
2952
+ }
2953
+ set bitrate(value) {
2954
+ this._bitrate = value;
2955
+ }
2926
2956
  get decryptdata() {
2927
2957
  const {
2928
2958
  levelkeys
@@ -4670,6 +4700,7 @@ class M3U8Parser {
4670
4700
  let currentPart = 0;
4671
4701
  let totalduration = 0;
4672
4702
  let discontinuityCounter = 0;
4703
+ let currentBitrate = 0;
4673
4704
  let prevFrag = null;
4674
4705
  let frag = new Fragment(type, base);
4675
4706
  let result;
@@ -4690,6 +4721,9 @@ class M3U8Parser {
4690
4721
  frag.start = totalduration;
4691
4722
  frag.sn = currentSN;
4692
4723
  frag.cc = discontinuityCounter;
4724
+ if (currentBitrate) {
4725
+ frag.bitrate = currentBitrate;
4726
+ }
4693
4727
  frag.level = id;
4694
4728
  if (currentInitSegment) {
4695
4729
  frag.initSegment = currentInitSegment;
@@ -4819,6 +4853,12 @@ class M3U8Parser {
4819
4853
  break;
4820
4854
  case 'BITRATE':
4821
4855
  frag.tagList.push([tag, value1]);
4856
+ currentBitrate = parseInt(value1) * 1000;
4857
+ if (isFiniteNumber(currentBitrate)) {
4858
+ frag.bitrate = currentBitrate;
4859
+ } else {
4860
+ currentBitrate = 0;
4861
+ }
4822
4862
  break;
4823
4863
  case 'DATERANGE':
4824
4864
  {
@@ -19043,7 +19083,7 @@ class GapController extends Logger {
19043
19083
  }
19044
19084
  }
19045
19085
 
19046
- const version = "1.6.0-beta.1.0.canary.10751";
19086
+ const version = "1.6.0-beta.1.0.canary.10752";
19047
19087
 
19048
19088
  // ensure the worker ends up in the bundle
19049
19089
  // If the worker should not be included this gets aliased to empty.js