hls.js 1.5.17 → 1.5.19
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 +342 -268
- package/dist/hls.js.d.ts +10 -6
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +112 -91
- 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 +111 -90
- 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 +292 -222
- 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/audio-stream-controller.ts +4 -2
- package/src/controller/base-stream-controller.ts +9 -0
- package/src/controller/buffer-controller.ts +1 -0
- package/src/controller/eme-controller.ts +184 -124
- package/src/controller/stream-controller.ts +4 -1
- package/src/hls.ts +24 -17
- package/src/loader/key-loader.ts +6 -1
- package/src/loader/level-key.ts +6 -30
- package/src/remux/mp4-remuxer.ts +11 -7
- package/src/types/component-api.ts +2 -0
- package/src/utils/level-helper.ts +37 -38
- package/src/utils/mediakeys-helper.ts +34 -1
- package/src/utils/xhr-loader.ts +52 -49
package/dist/hls.light.js
CHANGED
@@ -521,7 +521,7 @@
|
|
521
521
|
// Some browsers don't allow to use bind on console object anyway
|
522
522
|
// fallback to default if needed
|
523
523
|
try {
|
524
|
-
exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.5.
|
524
|
+
exportedLogger.log("Debug logs enabled for \"" + id + "\" in hls.js version " + "1.5.19");
|
525
525
|
} catch (e) {
|
526
526
|
exportedLogger = fakeLogger;
|
527
527
|
}
|
@@ -4979,15 +4979,16 @@
|
|
4979
4979
|
delete oldDetails.fragmentHint.endPTS;
|
4980
4980
|
}
|
4981
4981
|
// check if old/new playlists have fragments in common
|
4982
|
-
// loop through overlapping SN and update startPTS
|
4983
|
-
var ccOffset = 0;
|
4982
|
+
// loop through overlapping SN and update startPTS, cc, and duration if any found
|
4984
4983
|
var PTSFrag;
|
4985
|
-
mapFragmentIntersection(oldDetails, newDetails, function (oldFrag, newFrag) {
|
4986
|
-
if (
|
4987
|
-
|
4988
|
-
|
4989
|
-
|
4990
|
-
|
4984
|
+
mapFragmentIntersection(oldDetails, newDetails, function (oldFrag, newFrag, newFragIndex, newFragments) {
|
4985
|
+
if (newDetails.skippedSegments) {
|
4986
|
+
if (newFrag.cc !== oldFrag.cc) {
|
4987
|
+
var ccOffset = oldFrag.cc - newFrag.cc;
|
4988
|
+
for (var _i = newFragIndex; _i < newFragments.length; _i++) {
|
4989
|
+
newFragments[_i].cc += ccOffset;
|
4990
|
+
}
|
4991
|
+
}
|
4991
4992
|
}
|
4992
4993
|
if (isFiniteNumber(oldFrag.startPTS) && isFiniteNumber(oldFrag.endPTS)) {
|
4993
4994
|
newFrag.start = newFrag.startPTS = oldFrag.startPTS;
|
@@ -5012,8 +5013,9 @@
|
|
5012
5013
|
currentInitSegment = oldFrag.initSegment;
|
5013
5014
|
}
|
5014
5015
|
});
|
5016
|
+
var newFragments = newDetails.fragments;
|
5015
5017
|
if (currentInitSegment) {
|
5016
|
-
var fragmentsToCheck = newDetails.fragmentHint ?
|
5018
|
+
var fragmentsToCheck = newDetails.fragmentHint ? newFragments.concat(newDetails.fragmentHint) : newFragments;
|
5017
5019
|
fragmentsToCheck.forEach(function (frag) {
|
5018
5020
|
var _currentInitSegment;
|
5019
5021
|
if (frag && (!frag.initSegment || frag.initSegment.relurl === ((_currentInitSegment = currentInitSegment) == null ? void 0 : _currentInitSegment.relurl))) {
|
@@ -5022,29 +5024,22 @@
|
|
5022
5024
|
});
|
5023
5025
|
}
|
5024
5026
|
if (newDetails.skippedSegments) {
|
5025
|
-
newDetails.deltaUpdateFailed =
|
5027
|
+
newDetails.deltaUpdateFailed = newFragments.some(function (frag) {
|
5026
5028
|
return !frag;
|
5027
5029
|
});
|
5028
5030
|
if (newDetails.deltaUpdateFailed) {
|
5029
5031
|
logger.warn('[level-helper] Previous playlist missing segments skipped in delta playlist');
|
5030
|
-
for (var
|
5031
|
-
|
5032
|
+
for (var _i2 = newDetails.skippedSegments; _i2--;) {
|
5033
|
+
newFragments.shift();
|
5034
|
+
}
|
5035
|
+
newDetails.startSN = newFragments[0].sn;
|
5036
|
+
} else {
|
5037
|
+
if (newDetails.canSkipDateRanges) {
|
5038
|
+
newDetails.dateRanges = mergeDateRanges(oldDetails.dateRanges, newDetails.dateRanges, newDetails.recentlyRemovedDateranges);
|
5032
5039
|
}
|
5033
|
-
newDetails.startSN = newDetails.fragments[0].sn;
|
5034
|
-
newDetails.startCC = newDetails.fragments[0].cc;
|
5035
|
-
} else if (newDetails.canSkipDateRanges) {
|
5036
|
-
newDetails.dateRanges = mergeDateRanges(oldDetails.dateRanges, newDetails.dateRanges, newDetails.recentlyRemovedDateranges);
|
5037
|
-
}
|
5038
|
-
}
|
5039
|
-
var newFragments = newDetails.fragments;
|
5040
|
-
if (ccOffset) {
|
5041
|
-
logger.warn('discontinuity sliding from playlist, take drift into account');
|
5042
|
-
for (var _i2 = 0; _i2 < newFragments.length; _i2++) {
|
5043
|
-
newFragments[_i2].cc += ccOffset;
|
5044
5040
|
}
|
5045
|
-
}
|
5046
|
-
if (newDetails.skippedSegments) {
|
5047
5041
|
newDetails.startCC = newDetails.fragments[0].cc;
|
5042
|
+
newDetails.endCC = newFragments[newFragments.length - 1].cc;
|
5048
5043
|
}
|
5049
5044
|
|
5050
5045
|
// Merge parts
|
@@ -5128,7 +5123,7 @@
|
|
5128
5123
|
_newFrag = newDetails.fragments[i] = _oldFrag;
|
5129
5124
|
}
|
5130
5125
|
if (_oldFrag && _newFrag) {
|
5131
|
-
intersectionFn(_oldFrag, _newFrag);
|
5126
|
+
intersectionFn(_oldFrag, _newFrag, i, newFrags);
|
5132
5127
|
}
|
5133
5128
|
}
|
5134
5129
|
}
|
@@ -7503,6 +7498,7 @@
|
|
7503
7498
|
_this2.resetBuffer(type);
|
7504
7499
|
});
|
7505
7500
|
this._initSourceBuffer();
|
7501
|
+
this.hls.resumeBuffering();
|
7506
7502
|
};
|
7507
7503
|
_proto.resetBuffer = function resetBuffer(type) {
|
7508
7504
|
var sb = this.sourceBuffer[type];
|
@@ -9145,47 +9141,51 @@
|
|
9145
9141
|
xhr.onprogress = null;
|
9146
9142
|
var _status = xhr.status;
|
9147
9143
|
// http status between 200 to 299 are all successful
|
9148
|
-
var
|
9149
|
-
if (_status >= 200 && _status < 300
|
9150
|
-
|
9151
|
-
|
9152
|
-
|
9153
|
-
|
9154
|
-
|
9155
|
-
|
9156
|
-
|
9157
|
-
|
9158
|
-
|
9159
|
-
|
9160
|
-
onProgress
|
9161
|
-
|
9162
|
-
|
9144
|
+
var useResponseText = xhr.responseType === 'text' ? xhr.responseText : null;
|
9145
|
+
if (_status >= 200 && _status < 300) {
|
9146
|
+
var data = useResponseText != null ? useResponseText : xhr.response;
|
9147
|
+
if (data != null) {
|
9148
|
+
stats.loading.end = Math.max(self.performance.now(), stats.loading.first);
|
9149
|
+
var len = xhr.responseType === 'arraybuffer' ? data.byteLength : data.length;
|
9150
|
+
stats.loaded = stats.total = len;
|
9151
|
+
stats.bwEstimate = stats.total * 8000 / (stats.loading.end - stats.loading.first);
|
9152
|
+
if (!this.callbacks) {
|
9153
|
+
return;
|
9154
|
+
}
|
9155
|
+
var onProgress = this.callbacks.onProgress;
|
9156
|
+
if (onProgress) {
|
9157
|
+
onProgress(stats, context, data, xhr);
|
9158
|
+
}
|
9159
|
+
if (!this.callbacks) {
|
9160
|
+
return;
|
9161
|
+
}
|
9162
|
+
var _response = {
|
9163
|
+
url: xhr.responseURL,
|
9164
|
+
data: data,
|
9165
|
+
code: _status
|
9166
|
+
};
|
9167
|
+
this.callbacks.onSuccess(_response, stats, context, xhr);
|
9163
9168
|
return;
|
9164
9169
|
}
|
9165
|
-
|
9166
|
-
|
9167
|
-
|
9168
|
-
|
9169
|
-
|
9170
|
-
|
9170
|
+
}
|
9171
|
+
|
9172
|
+
// Handle bad status or nullish response
|
9173
|
+
var retryConfig = config.loadPolicy.errorRetry;
|
9174
|
+
var retryCount = stats.retry;
|
9175
|
+
// if max nb of retries reached or if http status between 400 and 499 (such error cannot be recovered, retrying is useless), return error
|
9176
|
+
var response = {
|
9177
|
+
url: context.url,
|
9178
|
+
data: undefined,
|
9179
|
+
code: _status
|
9180
|
+
};
|
9181
|
+
if (shouldRetry(retryConfig, retryCount, false, response)) {
|
9182
|
+
this.retry(retryConfig);
|
9171
9183
|
} else {
|
9172
|
-
|
9173
|
-
|
9174
|
-
|
9175
|
-
|
9176
|
-
|
9177
|
-
data: undefined,
|
9178
|
-
code: _status
|
9179
|
-
};
|
9180
|
-
if (shouldRetry(retryConfig, retryCount, false, _response)) {
|
9181
|
-
this.retry(retryConfig);
|
9182
|
-
} else {
|
9183
|
-
logger.error(_status + " while loading " + context.url);
|
9184
|
-
this.callbacks.onError({
|
9185
|
-
code: _status,
|
9186
|
-
text: xhr.statusText
|
9187
|
-
}, context, xhr, stats);
|
9188
|
-
}
|
9184
|
+
logger.error(_status + " while loading " + context.url);
|
9185
|
+
this.callbacks.onError({
|
9186
|
+
code: _status,
|
9187
|
+
text: xhr.statusText
|
9188
|
+
}, context, xhr, stats);
|
9189
9189
|
}
|
9190
9190
|
}
|
9191
9191
|
}
|
@@ -11261,7 +11261,7 @@
|
|
11261
11261
|
};
|
11262
11262
|
_proto.load = function load(frag) {
|
11263
11263
|
var _this2 = this;
|
11264
|
-
if (!frag.decryptdata && frag.encrypted && this.emeController) {
|
11264
|
+
if (!frag.decryptdata && frag.encrypted && this.emeController && this.config.emeEnabled) {
|
11265
11265
|
// Multiple keys, but none selected, resolve in eme-controller
|
11266
11266
|
return this.emeController.selectKeySystemFormat(frag).then(function (keySystemFormat) {
|
11267
11267
|
return _this2.loadInternal(frag, keySystemFormat);
|
@@ -12238,6 +12238,7 @@
|
|
12238
12238
|
_this.startFragRequested = false;
|
12239
12239
|
_this.decrypter = void 0;
|
12240
12240
|
_this.initPTS = [];
|
12241
|
+
_this.buffering = true;
|
12241
12242
|
_this.onvseeking = null;
|
12242
12243
|
_this.onvended = null;
|
12243
12244
|
_this.logPrefix = '';
|
@@ -12280,6 +12281,12 @@
|
|
12280
12281
|
this.clearNextTick();
|
12281
12282
|
this.state = State.STOPPED;
|
12282
12283
|
};
|
12284
|
+
_proto.pauseBuffering = function pauseBuffering() {
|
12285
|
+
this.buffering = false;
|
12286
|
+
};
|
12287
|
+
_proto.resumeBuffering = function resumeBuffering() {
|
12288
|
+
this.buffering = true;
|
12289
|
+
};
|
12283
12290
|
_proto._streamEnded = function _streamEnded(bufferInfo, levelDetails) {
|
12284
12291
|
// If playlist is live, there is another buffered range after the current range, nothing buffered, media is detached,
|
12285
12292
|
// of nothing loading/loaded return false
|
@@ -16548,19 +16555,23 @@
|
|
16548
16555
|
this.videoTrackConfig = undefined;
|
16549
16556
|
};
|
16550
16557
|
_proto.getVideoStartPts = function getVideoStartPts(videoSamples) {
|
16558
|
+
// Get the minimum PTS value relative to the first sample's PTS, normalized for 33-bit wrapping
|
16551
16559
|
var rolloverDetected = false;
|
16560
|
+
var firstPts = videoSamples[0].pts;
|
16552
16561
|
var startPTS = videoSamples.reduce(function (minPTS, sample) {
|
16553
|
-
var
|
16562
|
+
var pts = sample.pts;
|
16563
|
+
var delta = pts - minPTS;
|
16554
16564
|
if (delta < -4294967296) {
|
16555
16565
|
// 2^32, see PTSNormalize for reasoning, but we're hitting a rollover here, and we don't want that to impact the timeOffset calculation
|
16556
16566
|
rolloverDetected = true;
|
16557
|
-
|
16558
|
-
|
16567
|
+
pts = normalizePts(pts, firstPts);
|
16568
|
+
delta = pts - minPTS;
|
16569
|
+
}
|
16570
|
+
if (delta > 0) {
|
16559
16571
|
return minPTS;
|
16560
|
-
} else {
|
16561
|
-
return sample.pts;
|
16562
16572
|
}
|
16563
|
-
|
16573
|
+
return pts;
|
16574
|
+
}, firstPts);
|
16564
16575
|
if (rolloverDetected) {
|
16565
16576
|
logger.debug('PTS rollover detected');
|
16566
16577
|
}
|
@@ -19241,7 +19252,7 @@
|
|
19241
19252
|
if (this.altAudio && this.audioOnly) {
|
19242
19253
|
return;
|
19243
19254
|
}
|
19244
|
-
var level = hls.nextLoadLevel;
|
19255
|
+
var level = this.buffering ? hls.nextLoadLevel : hls.loadLevel;
|
19245
19256
|
if (!(levels != null && levels[level])) {
|
19246
19257
|
return;
|
19247
19258
|
}
|
@@ -19263,6 +19274,9 @@
|
|
19263
19274
|
this.state = State.ENDED;
|
19264
19275
|
return;
|
19265
19276
|
}
|
19277
|
+
if (!this.buffering) {
|
19278
|
+
return;
|
19279
|
+
}
|
19266
19280
|
|
19267
19281
|
// set next load level : this will trigger a playlist load if needed
|
19268
19282
|
if (hls.loadLevel !== level && hls.manualLevel === -1) {
|
@@ -20471,9 +20485,13 @@
|
|
20471
20485
|
}
|
20472
20486
|
logger.log("startLoad(" + startPosition + ")");
|
20473
20487
|
this.started = true;
|
20474
|
-
this.
|
20475
|
-
|
20476
|
-
|
20488
|
+
this.resumeBuffering();
|
20489
|
+
for (var i = 0; i < this.networkControllers.length; i++) {
|
20490
|
+
this.networkControllers[i].startLoad(startPosition);
|
20491
|
+
if (!this.started || !this.networkControllers) {
|
20492
|
+
break;
|
20493
|
+
}
|
20494
|
+
}
|
20477
20495
|
}
|
20478
20496
|
|
20479
20497
|
/**
|
@@ -20482,32 +20500,35 @@
|
|
20482
20500
|
_proto.stopLoad = function stopLoad() {
|
20483
20501
|
logger.log('stopLoad');
|
20484
20502
|
this.started = false;
|
20485
|
-
this.networkControllers.
|
20486
|
-
|
20487
|
-
|
20503
|
+
for (var i = 0; i < this.networkControllers.length; i++) {
|
20504
|
+
this.networkControllers[i].stopLoad();
|
20505
|
+
if (this.started || !this.networkControllers) {
|
20506
|
+
break;
|
20507
|
+
}
|
20508
|
+
}
|
20488
20509
|
}
|
20489
20510
|
|
20490
20511
|
/**
|
20491
|
-
* Resumes stream controller segment loading
|
20512
|
+
* Resumes stream controller segment loading after `pauseBuffering` has been called.
|
20492
20513
|
*/;
|
20493
20514
|
_proto.resumeBuffering = function resumeBuffering() {
|
20494
|
-
|
20495
|
-
|
20496
|
-
|
20497
|
-
|
20498
|
-
|
20499
|
-
|
20500
|
-
}
|
20515
|
+
logger.log("resume buffering");
|
20516
|
+
this.networkControllers.forEach(function (controller) {
|
20517
|
+
if (controller.resumeBuffering) {
|
20518
|
+
controller.resumeBuffering();
|
20519
|
+
}
|
20520
|
+
});
|
20501
20521
|
}
|
20502
20522
|
|
20503
20523
|
/**
|
20504
|
-
*
|
20524
|
+
* Prevents stream controller from loading new segments until `resumeBuffering` is called.
|
20505
20525
|
* This allows for media buffering to be paused without interupting playlist loading.
|
20506
20526
|
*/;
|
20507
20527
|
_proto.pauseBuffering = function pauseBuffering() {
|
20528
|
+
logger.log("pause buffering");
|
20508
20529
|
this.networkControllers.forEach(function (controller) {
|
20509
|
-
if (
|
20510
|
-
controller.
|
20530
|
+
if (controller.pauseBuffering) {
|
20531
|
+
controller.pauseBuffering();
|
20511
20532
|
}
|
20512
20533
|
});
|
20513
20534
|
}
|
@@ -21064,7 +21085,7 @@
|
|
21064
21085
|
* Get the video-dev/hls.js package version.
|
21065
21086
|
*/
|
21066
21087
|
function get() {
|
21067
|
-
return "1.5.
|
21088
|
+
return "1.5.19";
|
21068
21089
|
}
|
21069
21090
|
}, {
|
21070
21091
|
key: "Events",
|