hls.js 1.5.5-0.canary.9985 → 1.5.5-0.canary.9986
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 +63 -6
- package/dist/hls.js.d.ts +2 -0
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +63 -6
- 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 +63 -6
- 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 +63 -6
- 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 +93 -4
package/dist/hls.js
CHANGED
@@ -644,7 +644,7 @@
|
|
644
644
|
// Some browsers don't allow to use bind on console object anyway
|
645
645
|
// fallback to default if needed
|
646
646
|
try {
|
647
|
-
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.5-0.canary.
|
647
|
+
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.5-0.canary.9986");
|
648
648
|
} catch (e) {
|
649
649
|
/* log fn threw an exception. All logger methods are no-ops. */
|
650
650
|
return createLogger();
|
@@ -9554,6 +9554,7 @@
|
|
9554
9554
|
_this.decrypter = void 0;
|
9555
9555
|
_this.initPTS = [];
|
9556
9556
|
_this.buffering = true;
|
9557
|
+
_this.loadingParts = false;
|
9557
9558
|
_this.onMediaSeeking = function () {
|
9558
9559
|
var _assertThisInitialize = _assertThisInitialized(_this),
|
9559
9560
|
config = _assertThisInitialize.config,
|
@@ -9589,6 +9590,14 @@
|
|
9589
9590
|
// Remove gap fragments
|
9590
9591
|
_this.fragmentTracker.removeFragmentsInRange(currentTime, Infinity, _this.playlistType, true);
|
9591
9592
|
_this.lastCurrentTime = currentTime;
|
9593
|
+
if (!_this.loadingParts) {
|
9594
|
+
var bufferEnd = Math.max(bufferInfo.end, currentTime);
|
9595
|
+
var shouldLoadParts = _this.shouldLoadParts(_this.getLevelDetails(), bufferEnd);
|
9596
|
+
if (shouldLoadParts) {
|
9597
|
+
_this.log("LL-Part loading ON after seeking to " + currentTime.toFixed(2) + " with buffer @" + bufferEnd.toFixed(2));
|
9598
|
+
_this.loadingParts = shouldLoadParts;
|
9599
|
+
}
|
9600
|
+
}
|
9592
9601
|
}
|
9593
9602
|
|
9594
9603
|
// in case seeking occurs although no media buffered, adjust startPosition and nextLoadPosition to seek target
|
@@ -9998,8 +10007,16 @@
|
|
9998
10007
|
} else if (!frag.encrypted && details.encryptedFragments.length) {
|
9999
10008
|
this.keyLoader.loadClear(frag, details.encryptedFragments);
|
10000
10009
|
}
|
10010
|
+
var fragPrevious = this.fragPrevious;
|
10011
|
+
if (frag.sn !== 'initSegment' && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
|
10012
|
+
var shouldLoadParts = this.shouldLoadParts(level.details, frag.end);
|
10013
|
+
if (shouldLoadParts !== this.loadingParts) {
|
10014
|
+
this.log("LL-Part loading " + (shouldLoadParts ? 'ON' : 'OFF') + " loading sn " + (fragPrevious == null ? void 0 : fragPrevious.sn) + "->" + frag.sn);
|
10015
|
+
this.loadingParts = shouldLoadParts;
|
10016
|
+
}
|
10017
|
+
}
|
10001
10018
|
targetBufferTime = Math.max(frag.start, targetBufferTime || 0);
|
10002
|
-
if (this.
|
10019
|
+
if (this.loadingParts && frag.sn !== 'initSegment') {
|
10003
10020
|
var partList = details.partList;
|
10004
10021
|
if (partList && progressCallback) {
|
10005
10022
|
if (targetBufferTime > frag.end && details.fragmentHint) {
|
@@ -10041,6 +10058,13 @@
|
|
10041
10058
|
}
|
10042
10059
|
}
|
10043
10060
|
}
|
10061
|
+
if (frag.sn !== 'initSegment' && this.loadingParts) {
|
10062
|
+
this.log("LL-Part loading OFF after next part miss @" + targetBufferTime.toFixed(2));
|
10063
|
+
this.loadingParts = false;
|
10064
|
+
} else if (!frag.url) {
|
10065
|
+
// Selected fragment hint for part but not loading parts
|
10066
|
+
return Promise.resolve(null);
|
10067
|
+
}
|
10044
10068
|
this.log("Loading fragment " + frag.sn + " cc: " + frag.cc + " " + (details ? 'of [' + details.startSN + '-' + details.endSN + '] ' : '') + (this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track') + ": " + frag.level + ", target: " + parseFloat(targetBufferTime.toFixed(3)));
|
10045
10069
|
// Don't update nextLoadPosition for fragments which are not buffered
|
10046
10070
|
if (isFiniteNumber(frag.sn) && !this.bitrateTest) {
|
@@ -10143,8 +10167,36 @@
|
|
10143
10167
|
if (part) {
|
10144
10168
|
part.stats.parsing.end = now;
|
10145
10169
|
}
|
10170
|
+
// See if part loading should be disabled/enabled based on buffer and playback position.
|
10171
|
+
if (frag.sn !== 'initSegment') {
|
10172
|
+
var levelDetails = this.getLevelDetails();
|
10173
|
+
var loadingPartsAtEdge = levelDetails && frag.sn > levelDetails.endSN;
|
10174
|
+
var shouldLoadParts = loadingPartsAtEdge || this.shouldLoadParts(levelDetails, frag.end);
|
10175
|
+
if (shouldLoadParts !== this.loadingParts) {
|
10176
|
+
this.log("LL-Part loading " + (shouldLoadParts ? 'ON' : 'OFF') + " after parsing segment ending @" + frag.end.toFixed(2));
|
10177
|
+
this.loadingParts = shouldLoadParts;
|
10178
|
+
}
|
10179
|
+
}
|
10146
10180
|
this.updateLevelTiming(frag, part, level, chunkMeta.partial);
|
10147
10181
|
};
|
10182
|
+
_proto.shouldLoadParts = function shouldLoadParts(details, bufferEnd) {
|
10183
|
+
if (this.config.lowLatencyMode) {
|
10184
|
+
if (!details) {
|
10185
|
+
return this.loadingParts;
|
10186
|
+
}
|
10187
|
+
if (details != null && details.partList) {
|
10188
|
+
var _details$fragmentHint;
|
10189
|
+
// Buffer must be ahead of first part + duration of parts after last segment
|
10190
|
+
// and playback must be at or past segment adjacent to part list
|
10191
|
+
var firstPart = details.partList[0];
|
10192
|
+
var safePartStart = firstPart.end + (((_details$fragmentHint = details.fragmentHint) == null ? void 0 : _details$fragmentHint.duration) || 0);
|
10193
|
+
if (bufferEnd >= safePartStart && this.lastCurrentTime > firstPart.start - firstPart.fragment.duration) {
|
10194
|
+
return true;
|
10195
|
+
}
|
10196
|
+
}
|
10197
|
+
}
|
10198
|
+
return false;
|
10199
|
+
};
|
10148
10200
|
_proto.getCurrentContext = function getCurrentContext(chunkMeta) {
|
10149
10201
|
var levels = this.levels,
|
10150
10202
|
fragCurrent = this.fragCurrent;
|
@@ -10279,7 +10331,8 @@
|
|
10279
10331
|
// find fragment index, contiguous with end of buffer position
|
10280
10332
|
var config = this.config;
|
10281
10333
|
var start = fragments[0].start;
|
10282
|
-
var
|
10334
|
+
var canLoadParts = config.lowLatencyMode && !!levelDetails.partList;
|
10335
|
+
var frag = null;
|
10283
10336
|
if (levelDetails.live) {
|
10284
10337
|
var initialLiveManifestSize = config.initialLiveManifestSize;
|
10285
10338
|
if (fragLen < initialLiveManifestSize) {
|
@@ -10291,6 +10344,10 @@
|
|
10291
10344
|
// Do not load using live logic if the starting frag is requested - we want to use getFragmentAtPosition() so that
|
10292
10345
|
// we get the fragment matching that start time
|
10293
10346
|
if (!levelDetails.PTSKnown && !this.startFragRequested && this.startPosition === -1 || pos < start) {
|
10347
|
+
if (canLoadParts && !this.loadingParts) {
|
10348
|
+
this.log("LL-Part loading ON for initial live fragment");
|
10349
|
+
this.loadingParts = true;
|
10350
|
+
}
|
10294
10351
|
frag = this.getInitialLiveFragment(levelDetails, fragments);
|
10295
10352
|
this.startPosition = this.nextLoadPosition = frag ? this.hls.liveSyncPosition || frag.start : pos;
|
10296
10353
|
}
|
@@ -10301,7 +10358,7 @@
|
|
10301
10358
|
|
10302
10359
|
// If we haven't run into any special cases already, just load the fragment most closely matching the requested position
|
10303
10360
|
if (!frag) {
|
10304
|
-
var end =
|
10361
|
+
var end = this.loadingParts ? levelDetails.partEnd : levelDetails.fragmentEnd;
|
10305
10362
|
frag = this.getFragmentAtPosition(pos, end, levelDetails);
|
10306
10363
|
}
|
10307
10364
|
return this.mapToInitFragWhenRequired(frag);
|
@@ -10415,7 +10472,7 @@
|
|
10415
10472
|
var fragmentHint = levelDetails.fragmentHint;
|
10416
10473
|
var tolerance = config.maxFragLookUpTolerance;
|
10417
10474
|
var partList = levelDetails.partList;
|
10418
|
-
var loadingParts = !!(
|
10475
|
+
var loadingParts = !!(this.loadingParts && partList != null && partList.length && fragmentHint);
|
10419
10476
|
if (loadingParts && fragmentHint && !this.bitrateTest) {
|
10420
10477
|
// Include incomplete fragment with parts at end
|
10421
10478
|
fragments = fragments.concat(fragmentHint);
|
@@ -30034,7 +30091,7 @@
|
|
30034
30091
|
* Get the video-dev/hls.js package version.
|
30035
30092
|
*/
|
30036
30093
|
function get() {
|
30037
|
-
return "1.5.5-0.canary.
|
30094
|
+
return "1.5.5-0.canary.9986";
|
30038
30095
|
}
|
30039
30096
|
}, {
|
30040
30097
|
key: "Events",
|
package/dist/hls.js.d.ts
CHANGED
@@ -247,6 +247,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
|
|
247
247
|
protected decrypter: Decrypter;
|
248
248
|
protected initPTS: RationalTimestamp[];
|
249
249
|
protected buffering: boolean;
|
250
|
+
private loadingParts;
|
250
251
|
constructor(hls: Hls, fragmentTracker: FragmentTracker, keyLoader: KeyLoader, logPrefix: string, playlistType: PlaylistLevelType);
|
251
252
|
protected registerListeners(): void;
|
252
253
|
protected unregisterListeners(): void;
|
@@ -283,6 +284,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
|
|
283
284
|
private doFragPartsLoad;
|
284
285
|
private handleFragLoadError;
|
285
286
|
protected _handleTransmuxerFlush(chunkMeta: ChunkMetadata): void;
|
287
|
+
private shouldLoadParts;
|
286
288
|
protected getCurrentContext(chunkMeta: ChunkMetadata): {
|
287
289
|
frag: Fragment;
|
288
290
|
part: Part | null;
|