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 +48 -43
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +5 -2
- package/dist/hls.light.js.map +1 -1
- package/dist/hls.light.min.js +1 -1
- package/dist/hls.light.min.js.map +1 -1
- package/dist/hls.light.mjs +5 -2
- package/dist/hls.light.mjs.map +1 -1
- package/dist/hls.min.js +1 -1
- package/dist/hls.min.js.map +1 -1
- package/dist/hls.mjs +52 -49
- package/dist/hls.mjs.map +1 -1
- package/dist/hls.worker.js +1 -1
- package/package.json +1 -1
- package/src/controller/base-stream-controller.ts +4 -0
- package/src/controller/subtitle-stream-controller.ts +21 -20
- package/src/controller/timeline-controller.ts +23 -24
- package/src/utils/webvtt-parser.ts +8 -6
- package/src/utils/xhr-loader.ts +1 -0
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
18255
|
-
|
|
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 =
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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.
|
|
26263
|
+
return "1.4.7";
|
|
26259
26264
|
}
|
|
26260
26265
|
}, {
|
|
26261
26266
|
key: "Events",
|