hls.js 1.4.6 → 1.4.7

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.js CHANGED
@@ -539,7 +539,7 @@
539
539
  // Some browsers don't allow to use bind on console object anyway
540
540
  // fallback to default if needed
541
541
  try {
542
- exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.4.6");
542
+ exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.4.7");
543
543
  } catch (e) {
544
544
  exportedLogger = fakeLogger;
545
545
  }
@@ -9661,6 +9661,8 @@
9661
9661
  } else {
9662
9662
  logger.warn(data.details + " reached or exceeded max retry (" + retryCount + ")");
9663
9663
  }
9664
+ } else if ((errorAction == null ? void 0 : errorAction.action) === NetworkErrorAction.SendAlternateToPenaltyBox) {
9665
+ this.state = State.WAITING_LEVEL;
9664
9666
  } else {
9665
9667
  this.state = State.ERROR;
9666
9668
  }
@@ -18030,14 +18032,7 @@
18030
18032
  var startOffset = data.startOffset,
18031
18033
  endOffset = data.endOffset;
18032
18034
  if (startOffset === 0 && endOffset !== Number.POSITIVE_INFINITY) {
18033
- var currentTrackId = this.currentTrackId,
18034
- levels = this.levels;
18035
- if (!levels.length || !levels[currentTrackId] || !levels[currentTrackId].details) {
18036
- return;
18037
- }
18038
- var trackDetails = levels[currentTrackId].details;
18039
- var targetDuration = trackDetails.targetduration;
18040
- var endOffsetSubtitles = endOffset - targetDuration;
18035
+ var endOffsetSubtitles = endOffset - 1;
18041
18036
  if (endOffsetSubtitles <= 0) {
18042
18037
  return;
18043
18038
  }
@@ -18231,17 +18226,14 @@
18231
18226
  if (!levels.length || !track || !track.details) {
18232
18227
  return;
18233
18228
  }
18234
-
18235
- // Expand range of subs loaded by one target-duration in either direction to make up for misaligned playlists
18236
- var trackDetails = track.details;
18237
- var targetDuration = trackDetails.targetduration;
18238
18229
  var config = this.config;
18239
18230
  var currentTime = this.getLoadPosition();
18240
- var bufferedInfo = BufferHelper.bufferedInfo(this.tracksBuffered[this.currentTrackId] || [], currentTime - targetDuration, config.maxBufferHole);
18231
+ var bufferedInfo = BufferHelper.bufferedInfo(this.tracksBuffered[this.currentTrackId] || [], currentTime, config.maxBufferHole);
18241
18232
  var targetBufferTime = bufferedInfo.end,
18242
18233
  bufferLen = bufferedInfo.len;
18243
18234
  var mainBufferInfo = this.getFwdBufferInfo(this.media, PlaylistLevelType.MAIN);
18244
- var maxBufLen = this.getMaxBufferLength(mainBufferInfo == null ? void 0 : mainBufferInfo.len) + targetDuration;
18235
+ var trackDetails = track.details;
18236
+ var maxBufLen = this.getMaxBufferLength(mainBufferInfo == null ? void 0 : mainBufferInfo.len) + trackDetails.levelTargetDuration;
18245
18237
  if (bufferLen > maxBufLen) {
18246
18238
  return;
18247
18239
  }
@@ -18251,8 +18243,9 @@
18251
18243
  var foundFrag = null;
18252
18244
  var fragPrevious = this.fragPrevious;
18253
18245
  if (targetBufferTime < end) {
18254
- var maxFragLookUpTolerance = config.maxFragLookUpTolerance;
18255
- foundFrag = findFragmentByPTS(fragPrevious, fragments, Math.max(fragments[0].start, targetBufferTime), maxFragLookUpTolerance);
18246
+ var tolerance = config.maxFragLookUpTolerance;
18247
+ var lookupTolerance = targetBufferTime > end - tolerance ? 0 : tolerance;
18248
+ foundFrag = findFragmentByPTS(fragPrevious, fragments, Math.max(fragments[0].start, targetBufferTime), lookupTolerance);
18256
18249
  if (!foundFrag && fragPrevious && fragPrevious.start < fragments[0].start) {
18257
18250
  foundFrag = fragments[0];
18258
18251
  }
@@ -18263,6 +18256,14 @@
18263
18256
  return;
18264
18257
  }
18265
18258
  foundFrag = this.mapToInitFragWhenRequired(foundFrag);
18259
+ if (foundFrag.sn !== 'initSegment') {
18260
+ // Load earlier fragment in same discontinuity to make up for misaligned playlists and cues that extend beyond end of segment
18261
+ var curSNIdx = foundFrag.sn - trackDetails.startSN;
18262
+ var prevFrag = fragments[curSNIdx - 1];
18263
+ if (prevFrag && prevFrag.cc === foundFrag.cc && this.fragmentTracker.getState(prevFrag) === FragmentState.NOT_LOADED) {
18264
+ foundFrag = prevFrag;
18265
+ }
18266
+ }
18266
18267
  if (this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED) {
18267
18268
  // only load if fragment is not loaded
18268
18269
  this.loadFragment(foundFrag, track, targetBufferTime);
@@ -21642,7 +21643,7 @@
21642
21643
  // Uint8Array.prototype.reduce is not implemented in IE11
21643
21644
  var vttLines = utf8ArrayToStr(new Uint8Array(vttByteArray)).trim().replace(LINEBREAKS, '\n').split('\n');
21644
21645
  var cues = [];
21645
- var init90kHz = toMpegTsClockFromTimescale(initPTS.baseTime, initPTS.timescale);
21646
+ var init90kHz = initPTS ? toMpegTsClockFromTimescale(initPTS.baseTime, initPTS.timescale) : 0;
21646
21647
  var cueTime = '00:00.000';
21647
21648
  var timestampMapMPEGTS = 0;
21648
21649
  var timestampMapLOCAL = 0;
@@ -21666,6 +21667,10 @@
21666
21667
  }
21667
21668
  }
21668
21669
  if (webVttMpegTsMapOffset) {
21670
+ if (!initPTS) {
21671
+ parsingError = new Error('Missing initPTS for VTT MPEGTS');
21672
+ return;
21673
+ }
21669
21674
  // If we have MPEGTS, offset = presentation time + discontinuity offset
21670
21675
  cueOffset = webVttMpegTsMapOffset - vttCCs.presentationOffset;
21671
21676
  }
@@ -22156,7 +22161,7 @@
22156
22161
  this.captionsTracks = {};
22157
22162
  this.nonNativeCaptionsTracks = {};
22158
22163
  this.textTracks = [];
22159
- this.unparsedVttFrags = this.unparsedVttFrags || [];
22164
+ this.unparsedVttFrags = [];
22160
22165
  this.initPTS = [];
22161
22166
  if (this.cea608Parser1 && this.cea608Parser2) {
22162
22167
  this.cea608Parser1.reset();
@@ -22298,24 +22303,9 @@
22298
22303
  _proto.onFragLoaded = function onFragLoaded(event, data) {
22299
22304
  var frag = data.frag,
22300
22305
  payload = data.payload;
22301
- var initPTS = this.initPTS,
22302
- unparsedVttFrags = this.unparsedVttFrags;
22303
22306
  if (frag.type === PlaylistLevelType.SUBTITLE) {
22304
22307
  // If fragment is subtitle type, parse as WebVTT.
22305
22308
  if (payload.byteLength) {
22306
- // We need an initial synchronisation PTS. Store fragments as long as none has arrived.
22307
- if (!initPTS[frag.cc]) {
22308
- unparsedVttFrags.push(data);
22309
- if (initPTS.length) {
22310
- // finish unsuccessfully, otherwise the subtitle-stream-controller could be blocked from loading new frags.
22311
- this.hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
22312
- success: false,
22313
- frag: frag,
22314
- error: new Error('Missing initial subtitle PTS')
22315
- });
22316
- }
22317
- return;
22318
- }
22319
22309
  var decryptData = frag.decryptdata;
22320
22310
  // fragment after decryption has a stats object
22321
22311
  var decrypted = ('stats' in data);
@@ -22334,7 +22324,7 @@
22334
22324
  if (trackPlaylistMedia && trackPlaylistMedia.textCodec === IMSC1_CODEC) {
22335
22325
  this._parseIMSC1(frag, payload);
22336
22326
  } else {
22337
- this._parseVTTs(frag, payload, vttCCs);
22327
+ this._parseVTTs(data);
22338
22328
  }
22339
22329
  }
22340
22330
  } else {
@@ -22365,22 +22355,40 @@
22365
22355
  });
22366
22356
  });
22367
22357
  };
22368
- _proto._parseVTTs = function _parseVTTs(frag, payload, vttCCs) {
22358
+ _proto._parseVTTs = function _parseVTTs(data) {
22369
22359
  var _frag$initSegment,
22370
22360
  _this5 = this;
22361
+ var frag = data.frag,
22362
+ payload = data.payload;
22363
+ // We need an initial synchronisation PTS. Store fragments as long as none has arrived
22364
+ var initPTS = this.initPTS,
22365
+ unparsedVttFrags = this.unparsedVttFrags;
22366
+ var maxAvCC = initPTS.length - 1;
22367
+ if (!initPTS[frag.cc] && maxAvCC === -1) {
22368
+ unparsedVttFrags.push(data);
22369
+ return;
22370
+ }
22371
22371
  var hls = this.hls;
22372
22372
  // Parse the WebVTT file contents.
22373
22373
  var payloadWebVTT = (_frag$initSegment = frag.initSegment) != null && _frag$initSegment.data ? appendUint8Array(frag.initSegment.data, new Uint8Array(payload)) : payload;
22374
- parseWebVTT(payloadWebVTT, this.initPTS[frag.cc], vttCCs, frag.cc, frag.start, function (cues) {
22374
+ parseWebVTT(payloadWebVTT, this.initPTS[frag.cc], this.vttCCs, frag.cc, frag.start, function (cues) {
22375
22375
  _this5._appendCues(cues, frag.level);
22376
22376
  hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
22377
22377
  success: true,
22378
22378
  frag: frag
22379
22379
  });
22380
22380
  }, function (error) {
22381
- _this5._fallbackToIMSC1(frag, payload);
22381
+ var missingInitPTS = error.message === 'Missing initPTS for VTT MPEGTS';
22382
+ if (missingInitPTS) {
22383
+ unparsedVttFrags.push(data);
22384
+ } else {
22385
+ _this5._fallbackToIMSC1(frag, payload);
22386
+ }
22382
22387
  // Something went wrong while parsing. Trigger event with success false.
22383
22388
  logger.log("Failed to parse VTT cue: " + error);
22389
+ if (missingInitPTS && maxAvCC > frag.cc) {
22390
+ return;
22391
+ }
22384
22392
  hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {
22385
22393
  success: false,
22386
22394
  frag: frag,
@@ -22431,10 +22439,6 @@
22431
22439
  _proto.onFragDecrypted = function onFragDecrypted(event, data) {
22432
22440
  var frag = data.frag;
22433
22441
  if (frag.type === PlaylistLevelType.SUBTITLE) {
22434
- if (!this.initPTS[frag.cc]) {
22435
- this.unparsedVttFrags.push(data);
22436
- return;
22437
- }
22438
22442
  this.onFragLoaded(Events.FRAG_LOADED, data);
22439
22443
  }
22440
22444
  };
@@ -24625,6 +24629,7 @@
24625
24629
  var stats = this.stats;
24626
24630
  stats.loading.first = 0;
24627
24631
  stats.loaded = 0;
24632
+ stats.aborted = false;
24628
24633
  var xhrSetup = this.xhrSetup;
24629
24634
  if (xhrSetup) {
24630
24635
  Promise.resolve().then(function () {
@@ -26255,7 +26260,7 @@
26255
26260
  * Get the video-dev/hls.js package version.
26256
26261
  */
26257
26262
  function get() {
26258
- return "1.4.6";
26263
+ return "1.4.7";
26259
26264
  }
26260
26265
  }, {
26261
26266
  key: "Events",