hls.js 1.6.0-beta.1.0.canary.10764 → 1.6.0-beta.1.0.canary.10766
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.d.mts +6 -0
- package/dist/hls.d.ts +6 -0
- package/dist/hls.js +89 -39
- package/dist/hls.js.d.ts +6 -0
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +72 -29
- 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 +70 -29
- 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 +87 -39
- package/dist/hls.mjs.map +1 -1
- package/dist/hls.worker.js +1 -1
- package/dist/hls.worker.js.map +1 -1
- package/package.json +1 -1
- package/src/controller/abr-controller.ts +6 -2
- package/src/controller/audio-stream-controller.ts +7 -7
- package/src/controller/audio-track-controller.ts +1 -0
- package/src/controller/base-stream-controller.ts +35 -20
- package/src/controller/level-controller.ts +3 -2
- package/src/controller/stream-controller.ts +7 -7
- package/src/controller/subtitle-stream-controller.ts +9 -5
- package/src/controller/subtitle-track-controller.ts +1 -0
- package/src/loader/fragment.ts +5 -1
- package/src/loader/playlist-loader.ts +38 -8
- package/src/types/events.ts +4 -0
- package/src/types/loader.ts +4 -1
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.
|
1031
|
+
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.10766");
|
1032
1032
|
} catch (e) {
|
1033
1033
|
/* log fn threw an exception. All logger methods are no-ops. */
|
1034
1034
|
return createLogger();
|
@@ -3272,6 +3272,10 @@
|
|
3272
3272
|
}
|
3273
3273
|
}]);
|
3274
3274
|
}();
|
3275
|
+
function isMediaFragment(frag) {
|
3276
|
+
return frag.sn !== 'initSegment';
|
3277
|
+
}
|
3278
|
+
|
3275
3279
|
/**
|
3276
3280
|
* Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.
|
3277
3281
|
*/
|
@@ -3492,7 +3496,7 @@
|
|
3492
3496
|
}, {
|
3493
3497
|
key: "ref",
|
3494
3498
|
get: function get() {
|
3495
|
-
if (this
|
3499
|
+
if (!isMediaFragment(this)) {
|
3496
3500
|
return null;
|
3497
3501
|
}
|
3498
3502
|
if (!this._ref) {
|
@@ -16882,7 +16886,7 @@
|
|
16882
16886
|
var _data$deliveryDirecti2;
|
16883
16887
|
var level = data.level,
|
16884
16888
|
details = data.details;
|
16885
|
-
var curLevel =
|
16889
|
+
var curLevel = data.levelInfo;
|
16886
16890
|
if (!curLevel) {
|
16887
16891
|
var _data$deliveryDirecti;
|
16888
16892
|
this.warn("Invalid level index " + level);
|
@@ -16893,7 +16897,7 @@
|
|
16893
16897
|
}
|
16894
16898
|
|
16895
16899
|
// only process level loaded events matching with expected level
|
16896
|
-
if (
|
16900
|
+
if (curLevel === this.currentLevel) {
|
16897
16901
|
// reset level load error counter on successful level loaded only if there is no issues with fragments
|
16898
16902
|
if (curLevel.fragmentError === 0) {
|
16899
16903
|
curLevel.loadError = 0;
|
@@ -16931,6 +16935,7 @@
|
|
16931
16935
|
this.hls.trigger(Events.LEVEL_LOADING, {
|
16932
16936
|
url: url,
|
16933
16937
|
level: currentLevelIndex,
|
16938
|
+
levelInfo: currentLevel,
|
16934
16939
|
pathwayId: currentLevel.attrs['PATHWAY-ID'],
|
16935
16940
|
id: 0,
|
16936
16941
|
// Deprecated Level urlId
|
@@ -18251,7 +18256,7 @@
|
|
18251
18256
|
_proto.fragBufferedComplete = function fragBufferedComplete(frag, part) {
|
18252
18257
|
var media = this.mediaBuffer ? this.mediaBuffer : this.media;
|
18253
18258
|
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)') + ")");
|
18254
|
-
if (frag
|
18259
|
+
if (isMediaFragment(frag)) {
|
18255
18260
|
var _this$levels;
|
18256
18261
|
if (frag.type !== PlaylistLevelType.SUBTITLE) {
|
18257
18262
|
var el = frag.elementaryStreams;
|
@@ -18325,7 +18330,7 @@
|
|
18325
18330
|
this.keyLoader.loadClear(frag, details.encryptedFragments);
|
18326
18331
|
}
|
18327
18332
|
var fragPrevious = this.fragPrevious;
|
18328
|
-
if (frag
|
18333
|
+
if (isMediaFragment(frag) && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
|
18329
18334
|
var shouldLoadParts = this.shouldLoadParts(level.details, frag.end);
|
18330
18335
|
if (shouldLoadParts !== this.loadingParts) {
|
18331
18336
|
this.log("LL-Part loading " + (shouldLoadParts ? 'ON' : 'OFF') + " loading sn " + (fragPrevious == null ? void 0 : fragPrevious.sn) + "->" + frag.sn);
|
@@ -18333,7 +18338,7 @@
|
|
18333
18338
|
}
|
18334
18339
|
}
|
18335
18340
|
targetBufferTime = Math.max(frag.start, targetBufferTime || 0);
|
18336
|
-
if (this.loadingParts && frag
|
18341
|
+
if (this.loadingParts && isMediaFragment(frag)) {
|
18337
18342
|
var partList = details.partList;
|
18338
18343
|
if (partList && progressCallback) {
|
18339
18344
|
if (targetBufferTime > frag.end && details.fragmentHint) {
|
@@ -18376,7 +18381,7 @@
|
|
18376
18381
|
}
|
18377
18382
|
}
|
18378
18383
|
}
|
18379
|
-
if (frag
|
18384
|
+
if (isMediaFragment(frag) && this.loadingParts) {
|
18380
18385
|
this.log("LL-Part loading OFF after next part miss @" + targetBufferTime.toFixed(2));
|
18381
18386
|
this.loadingParts = false;
|
18382
18387
|
} else if (!frag.url) {
|
@@ -18918,7 +18923,7 @@
|
|
18918
18923
|
return pos;
|
18919
18924
|
};
|
18920
18925
|
_proto.handleFragLoadAborted = function handleFragLoadAborted(frag, part) {
|
18921
|
-
if (this.transmuxer && frag
|
18926
|
+
if (this.transmuxer && isMediaFragment(frag) && frag.stats.aborted) {
|
18922
18927
|
this.warn("Fragment " + frag.sn + (part ? ' part ' + part.index : '') + " of level " + frag.level + " was aborted");
|
18923
18928
|
this.resetFragmentLoading(frag);
|
18924
18929
|
}
|
@@ -18953,10 +18958,18 @@
|
|
18953
18958
|
var errorAction = data.errorAction;
|
18954
18959
|
var _ref2 = errorAction || {},
|
18955
18960
|
action = _ref2.action,
|
18961
|
+
flags = _ref2.flags,
|
18956
18962
|
_ref2$retryCount = _ref2.retryCount,
|
18957
18963
|
retryCount = _ref2$retryCount === void 0 ? 0 : _ref2$retryCount,
|
18958
18964
|
retryConfig = _ref2.retryConfig;
|
18959
|
-
|
18965
|
+
var couldRetry = !!errorAction && !!retryConfig;
|
18966
|
+
var retry = couldRetry && action === NetworkErrorAction.RetryRequest;
|
18967
|
+
var noAlternate = couldRetry && !errorAction.resolved && flags === ErrorActionFlags.MoveAllAlternatesMatchingHost;
|
18968
|
+
if (!retry && noAlternate && isMediaFragment(frag) && !frag.endList) {
|
18969
|
+
this.resetFragmentErrors(filterType);
|
18970
|
+
this.treatAsGap(frag);
|
18971
|
+
errorAction.resolved = true;
|
18972
|
+
} else if ((retry || noAlternate) && retryCount < retryConfig.maxNumRetry) {
|
18960
18973
|
this.resetStartWhenNotLoaded(this.levelLastLoaded);
|
18961
18974
|
var delay = getRetryDelay(retryConfig, retryCount);
|
18962
18975
|
this.warn("Fragment " + frag.sn + " of " + filterType + " " + frag.level + " errored with " + data.details + ", retrying loading " + (retryCount + 1) + "/" + retryConfig.maxNumRetry + " in " + delay + "ms");
|
@@ -18974,7 +18987,7 @@
|
|
18974
18987
|
this.warn(data.details + " reached or exceeded max retry (" + retryCount + ")");
|
18975
18988
|
return;
|
18976
18989
|
}
|
18977
|
-
} else if (
|
18990
|
+
} else if (action === NetworkErrorAction.SendAlternateToPenaltyBox) {
|
18978
18991
|
this.state = State.WAITING_LEVEL;
|
18979
18992
|
} else {
|
18980
18993
|
this.state = State.ERROR;
|
@@ -19110,10 +19123,7 @@
|
|
19110
19123
|
var error = new Error("Found no media in fragment " + frag.sn + " of level " + frag.level + " resetting transmuxer to fallback to playlist timing");
|
19111
19124
|
if (level.fragmentError === 0) {
|
19112
19125
|
// Mark and track the odd empty segment as a gap to avoid reloading
|
19113
|
-
level
|
19114
|
-
frag.gap = true;
|
19115
|
-
this.fragmentTracker.removeFragment(frag);
|
19116
|
-
this.fragmentTracker.fragBuffered(frag, true);
|
19126
|
+
this.treatAsGap(frag, level);
|
19117
19127
|
}
|
19118
19128
|
this.warn(error.message);
|
19119
19129
|
this.hls.trigger(Events.ERROR, {
|
@@ -19147,6 +19157,14 @@
|
|
19147
19157
|
}
|
19148
19158
|
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') : '');
|
19149
19159
|
};
|
19160
|
+
_proto.treatAsGap = function treatAsGap(frag, level) {
|
19161
|
+
if (level) {
|
19162
|
+
level.fragmentError++;
|
19163
|
+
}
|
19164
|
+
frag.gap = true;
|
19165
|
+
this.fragmentTracker.removeFragment(frag);
|
19166
|
+
this.fragmentTracker.fragBuffered(frag, true);
|
19167
|
+
};
|
19150
19168
|
_proto.resetTransmuxer = function resetTransmuxer() {
|
19151
19169
|
var _this$transmuxer2;
|
19152
19170
|
(_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
|
@@ -19691,7 +19709,7 @@
|
|
19691
19709
|
return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
|
19692
19710
|
}
|
19693
19711
|
|
19694
|
-
var version = "1.6.0-beta.1.0.canary.
|
19712
|
+
var version = "1.6.0-beta.1.0.canary.10766";
|
19695
19713
|
|
19696
19714
|
// ensure the worker ends up in the bundle
|
19697
19715
|
// If the worker should not be included this gets aliased to empty.js
|
@@ -20335,7 +20353,7 @@
|
|
20335
20353
|
var targetBufferTime = this.backtrackFragment ? this.backtrackFragment.start : bufferInfo.end;
|
20336
20354
|
var frag = this.getNextFragment(targetBufferTime, levelDetails);
|
20337
20355
|
// Avoid backtracking by loading an earlier segment in streams with segments that do not start with a key frame (flagged by `couldBacktrack`)
|
20338
|
-
if (this.couldBacktrack && !this.fragPrevious && frag && frag
|
20356
|
+
if (this.couldBacktrack && !this.fragPrevious && frag && isMediaFragment(frag) && this.fragmentTracker.getState(frag) !== FragmentState.OK) {
|
20339
20357
|
var _this$backtrackFragme;
|
20340
20358
|
var backtrackSn = ((_this$backtrackFragme = this.backtrackFragment) != null ? _this$backtrackFragme : frag).sn;
|
20341
20359
|
var fragIdx = backtrackSn - levelDetails.startSN;
|
@@ -20372,7 +20390,7 @@
|
|
20372
20390
|
// Check if fragment is not loaded
|
20373
20391
|
var fragState = this.fragmentTracker.getState(frag);
|
20374
20392
|
if (fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {
|
20375
|
-
if (frag
|
20393
|
+
if (!isMediaFragment(frag)) {
|
20376
20394
|
this._loadInitSegment(frag, level);
|
20377
20395
|
} else if (this.bitrateTest) {
|
20378
20396
|
this.log("Fragment " + frag.sn + " of level " + frag.level + " is being downloaded to test bitrate and will not be buffered");
|
@@ -20560,7 +20578,7 @@
|
|
20560
20578
|
if (!levels || this.state !== State.IDLE) {
|
20561
20579
|
return;
|
20562
20580
|
}
|
20563
|
-
var level =
|
20581
|
+
var level = data.levelInfo;
|
20564
20582
|
if (!level.details || level.details.live && this.levelLastLoaded !== level || this.waitForCdnTuneIn(level.details)) {
|
20565
20583
|
this.state = State.WAITING_LEVEL;
|
20566
20584
|
}
|
@@ -20577,7 +20595,7 @@
|
|
20577
20595
|
return;
|
20578
20596
|
}
|
20579
20597
|
this.log("Level " + newLevelId + " loaded [" + newDetails.startSN + "," + newDetails.endSN + "]" + (newDetails.lastPartSn ? "[part-" + newDetails.lastPartSn + "-" + newDetails.lastPartIndex + "]" : '') + ", cc [" + newDetails.startCC + ", " + newDetails.endCC + "] duration:" + duration);
|
20580
|
-
var curLevel =
|
20598
|
+
var curLevel = data.levelInfo;
|
20581
20599
|
var fragCurrent = this.fragCurrent;
|
20582
20600
|
if (fragCurrent && (this.state === State.FRAG_LOADING || this.state === State.FRAG_LOADING_WAITING_RETRY)) {
|
20583
20601
|
if (fragCurrent.level !== data.level && fragCurrent.loader) {
|
@@ -20782,7 +20800,7 @@
|
|
20782
20800
|
}
|
20783
20801
|
var stats = part ? part.stats : frag.stats;
|
20784
20802
|
this.fragLastKbps = Math.round(8 * stats.total / (stats.buffering.end - stats.loading.first));
|
20785
|
-
if (frag
|
20803
|
+
if (isMediaFragment(frag)) {
|
20786
20804
|
this.fragPrevious = frag;
|
20787
20805
|
}
|
20788
20806
|
this.fragBufferedComplete(frag, part);
|
@@ -21639,6 +21657,7 @@
|
|
21639
21657
|
hls.on(Events.LEVEL_LOADING, this.onLevelLoading, this);
|
21640
21658
|
hls.on(Events.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this);
|
21641
21659
|
hls.on(Events.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this);
|
21660
|
+
hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);
|
21642
21661
|
};
|
21643
21662
|
_proto.unregisterListeners = function unregisterListeners() {
|
21644
21663
|
var hls = this.hls;
|
@@ -21646,6 +21665,7 @@
|
|
21646
21665
|
hls.off(Events.LEVEL_LOADING, this.onLevelLoading, this);
|
21647
21666
|
hls.off(Events.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this);
|
21648
21667
|
hls.off(Events.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this);
|
21668
|
+
hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);
|
21649
21669
|
}
|
21650
21670
|
|
21651
21671
|
/**
|
@@ -21695,7 +21715,8 @@
|
|
21695
21715
|
responseType: 'text',
|
21696
21716
|
type: PlaylistContextType.MANIFEST,
|
21697
21717
|
url: url,
|
21698
|
-
deliveryDirectives: null
|
21718
|
+
deliveryDirectives: null,
|
21719
|
+
levelOrTrack: null
|
21699
21720
|
});
|
21700
21721
|
};
|
21701
21722
|
_proto.onLevelLoading = function onLevelLoading(event, data) {
|
@@ -21703,7 +21724,8 @@
|
|
21703
21724
|
level = data.level,
|
21704
21725
|
pathwayId = data.pathwayId,
|
21705
21726
|
url = data.url,
|
21706
|
-
deliveryDirectives = data.deliveryDirectives
|
21727
|
+
deliveryDirectives = data.deliveryDirectives,
|
21728
|
+
levelInfo = data.levelInfo;
|
21707
21729
|
this.load({
|
21708
21730
|
id: id,
|
21709
21731
|
level: level,
|
@@ -21711,14 +21733,16 @@
|
|
21711
21733
|
responseType: 'text',
|
21712
21734
|
type: PlaylistContextType.LEVEL,
|
21713
21735
|
url: url,
|
21714
|
-
deliveryDirectives: deliveryDirectives
|
21736
|
+
deliveryDirectives: deliveryDirectives,
|
21737
|
+
levelOrTrack: levelInfo
|
21715
21738
|
});
|
21716
21739
|
};
|
21717
21740
|
_proto.onAudioTrackLoading = function onAudioTrackLoading(event, data) {
|
21718
21741
|
var id = data.id,
|
21719
21742
|
groupId = data.groupId,
|
21720
21743
|
url = data.url,
|
21721
|
-
deliveryDirectives = data.deliveryDirectives
|
21744
|
+
deliveryDirectives = data.deliveryDirectives,
|
21745
|
+
track = data.track;
|
21722
21746
|
this.load({
|
21723
21747
|
id: id,
|
21724
21748
|
groupId: groupId,
|
@@ -21726,14 +21750,16 @@
|
|
21726
21750
|
responseType: 'text',
|
21727
21751
|
type: PlaylistContextType.AUDIO_TRACK,
|
21728
21752
|
url: url,
|
21729
|
-
deliveryDirectives: deliveryDirectives
|
21753
|
+
deliveryDirectives: deliveryDirectives,
|
21754
|
+
levelOrTrack: track
|
21730
21755
|
});
|
21731
21756
|
};
|
21732
21757
|
_proto.onSubtitleTrackLoading = function onSubtitleTrackLoading(event, data) {
|
21733
21758
|
var id = data.id,
|
21734
21759
|
groupId = data.groupId,
|
21735
21760
|
url = data.url,
|
21736
|
-
deliveryDirectives = data.deliveryDirectives
|
21761
|
+
deliveryDirectives = data.deliveryDirectives,
|
21762
|
+
track = data.track;
|
21737
21763
|
this.load({
|
21738
21764
|
id: id,
|
21739
21765
|
groupId: groupId,
|
@@ -21741,9 +21767,23 @@
|
|
21741
21767
|
responseType: 'text',
|
21742
21768
|
type: PlaylistContextType.SUBTITLE_TRACK,
|
21743
21769
|
url: url,
|
21744
|
-
deliveryDirectives: deliveryDirectives
|
21770
|
+
deliveryDirectives: deliveryDirectives,
|
21771
|
+
levelOrTrack: track
|
21745
21772
|
});
|
21746
21773
|
};
|
21774
|
+
_proto.onLevelsUpdated = function onLevelsUpdated(event, data) {
|
21775
|
+
// abort and delete loader of removed levels
|
21776
|
+
var loader = this.loaders[PlaylistContextType.LEVEL];
|
21777
|
+
if (loader) {
|
21778
|
+
var context = loader.context;
|
21779
|
+
if (context && !data.levels.some(function (lvl) {
|
21780
|
+
return lvl === context.levelOrTrack;
|
21781
|
+
})) {
|
21782
|
+
loader.abort();
|
21783
|
+
delete this.loaders[PlaylistContextType.LEVEL];
|
21784
|
+
}
|
21785
|
+
}
|
21786
|
+
};
|
21747
21787
|
_proto.load = function load(context) {
|
21748
21788
|
var _context$deliveryDire,
|
21749
21789
|
_this = this;
|
@@ -21755,7 +21795,7 @@
|
|
21755
21795
|
var loader = this.getInternalLoader(context);
|
21756
21796
|
if (loader) {
|
21757
21797
|
var loaderContext = loader.context;
|
21758
|
-
if (loaderContext && loaderContext.url === context.url && loaderContext.
|
21798
|
+
if (loaderContext && loaderContext.url === context.url && loaderContext.levelOrTrack === context.levelOrTrack) {
|
21759
21799
|
// same URL can't overlap
|
21760
21800
|
this.hls.logger.trace('[playlist-loader]: playlist request ongoing');
|
21761
21801
|
return;
|
@@ -22076,6 +22116,7 @@
|
|
22076
22116
|
case PlaylistContextType.LEVEL:
|
22077
22117
|
hls.trigger(Events.LEVEL_LOADED, {
|
22078
22118
|
details: levelDetails,
|
22119
|
+
levelInfo: context.levelOrTrack || hls.levels[0],
|
22079
22120
|
level: levelIndex || 0,
|
22080
22121
|
id: id || 0,
|
22081
22122
|
stats: stats,
|
@@ -22086,6 +22127,7 @@
|
|
22086
22127
|
case PlaylistContextType.AUDIO_TRACK:
|
22087
22128
|
hls.trigger(Events.AUDIO_TRACK_LOADED, {
|
22088
22129
|
details: levelDetails,
|
22130
|
+
track: context.levelOrTrack,
|
22089
22131
|
id: id || 0,
|
22090
22132
|
groupId: groupId || '',
|
22091
22133
|
stats: stats,
|
@@ -22096,6 +22138,7 @@
|
|
22096
22138
|
case PlaylistContextType.SUBTITLE_TRACK:
|
22097
22139
|
hls.trigger(Events.SUBTITLE_TRACK_LOADED, {
|
22098
22140
|
details: levelDetails,
|
22141
|
+
track: context.levelOrTrack,
|
22099
22142
|
id: id || 0,
|
22100
22143
|
groupId: groupId || '',
|
22101
22144
|
stats: stats,
|