hls.js 1.6.0-beta.1.0.canary.10750 → 1.6.0-beta.1.0.canary.10752
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/README.md +6 -11
- package/dist/hls.d.mts +5 -1
- package/dist/hls.d.ts +5 -1
- package/dist/hls.js +74 -24
- package/dist/hls.js.d.ts +5 -1
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +74 -24
- 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 +69 -23
- 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 +69 -23
- 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 -5
- package/src/controller/base-stream-controller.ts +29 -21
- package/src/controller/stream-controller.ts +5 -4
- package/src/demux/transmuxer-interface.ts +4 -2
- package/src/demux/transmuxer.ts +1 -1
- package/src/loader/fragment-loader.ts +1 -1
- package/src/loader/fragment.ts +33 -0
- package/src/loader/m3u8-parser.ts +10 -0
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.10752");
|
1032
1032
|
} catch (e) {
|
1033
1033
|
/* log fn threw an exception. All logger methods are no-ops. */
|
1034
1034
|
return createLogger();
|
@@ -1817,7 +1817,7 @@
|
|
1817
1817
|
var bwEstimate = _this.getBwEstimate();
|
1818
1818
|
var levels = hls.levels;
|
1819
1819
|
var level = levels[frag.level];
|
1820
|
-
var expectedLen =
|
1820
|
+
var expectedLen = Math.max(stats.loaded, Math.round(duration * (frag.bitrate || level.averageBitrate) / 8));
|
1821
1821
|
var timeStreaming = loadedFirstByte ? timeLoading - ttfb : timeLoading;
|
1822
1822
|
if (timeStreaming < 1 && loadedFirstByte) {
|
1823
1823
|
timeStreaming = Math.min(timeLoading, stats.loaded * 8 / bwEstimate);
|
@@ -2272,7 +2272,7 @@
|
|
2272
2272
|
}
|
2273
2273
|
|
2274
2274
|
// Use average bitrate when starvation delay (buffer length) is gt or eq two segment durations and rebuffering is not expected (maxStarvationDelay > 0)
|
2275
|
-
var bitrate = currentFragDuration && bufferStarvationDelay >= currentFragDuration * 2 && maxStarvationDelay === 0 ?
|
2275
|
+
var bitrate = currentFragDuration && bufferStarvationDelay >= currentFragDuration * 2 && maxStarvationDelay === 0 ? levelInfo.averageBitrate : levelInfo.maxBitrate;
|
2276
2276
|
var fetchDuration = _this3.getTimeToLoadFrag(ttfbEstimateSec, adjustedbw, bitrate * avgDuration, levelDetails === undefined);
|
2277
2277
|
var canSwitchWithinTolerance =
|
2278
2278
|
// if adjusted bw is greater than level bitrate AND
|
@@ -3286,6 +3286,8 @@
|
|
3286
3286
|
_this._decryptdata = null;
|
3287
3287
|
_this._programDateTime = null;
|
3288
3288
|
_this._ref = null;
|
3289
|
+
// Approximate bit rate of the fragment expressed in bits per second (bps) as indicated by the last EXT-X-BITRATE (kbps) tag
|
3290
|
+
_this._bitrate = void 0;
|
3289
3291
|
_this.rawProgramDateTime = null;
|
3290
3292
|
_this.tagList = [];
|
3291
3293
|
// EXTINF has to be present for a m3u8 to be considered valid
|
@@ -3393,6 +3395,38 @@
|
|
3393
3395
|
info.endDTS = Math.max(info.endDTS, endDTS);
|
3394
3396
|
};
|
3395
3397
|
return _createClass(Fragment, [{
|
3398
|
+
key: "byteLength",
|
3399
|
+
get: function get() {
|
3400
|
+
if (this.hasStats) {
|
3401
|
+
var total = this.stats.total;
|
3402
|
+
if (total) {
|
3403
|
+
return total;
|
3404
|
+
}
|
3405
|
+
}
|
3406
|
+
if (this.byteRange) {
|
3407
|
+
var start = this.byteRange[0];
|
3408
|
+
var end = this.byteRange[1];
|
3409
|
+
if (isFiniteNumber(start) && isFiniteNumber(end)) {
|
3410
|
+
return end - start;
|
3411
|
+
}
|
3412
|
+
}
|
3413
|
+
return null;
|
3414
|
+
}
|
3415
|
+
}, {
|
3416
|
+
key: "bitrate",
|
3417
|
+
get: function get() {
|
3418
|
+
if (this.byteLength) {
|
3419
|
+
return this.byteLength * 8 / this.duration;
|
3420
|
+
}
|
3421
|
+
if (this._bitrate) {
|
3422
|
+
return this._bitrate;
|
3423
|
+
}
|
3424
|
+
return null;
|
3425
|
+
},
|
3426
|
+
set: function set(value) {
|
3427
|
+
this._bitrate = value;
|
3428
|
+
}
|
3429
|
+
}, {
|
3396
3430
|
key: "decryptdata",
|
3397
3431
|
get: function get() {
|
3398
3432
|
var levelkeys = this.levelkeys;
|
@@ -7346,6 +7380,7 @@
|
|
7346
7380
|
var currentPart = 0;
|
7347
7381
|
var totalduration = 0;
|
7348
7382
|
var discontinuityCounter = 0;
|
7383
|
+
var currentBitrate = 0;
|
7349
7384
|
var prevFrag = null;
|
7350
7385
|
var frag = new Fragment(type, base);
|
7351
7386
|
var result;
|
@@ -7366,6 +7401,9 @@
|
|
7366
7401
|
frag.start = totalduration;
|
7367
7402
|
frag.sn = currentSN;
|
7368
7403
|
frag.cc = discontinuityCounter;
|
7404
|
+
if (currentBitrate) {
|
7405
|
+
frag.bitrate = currentBitrate;
|
7406
|
+
}
|
7369
7407
|
frag.level = id;
|
7370
7408
|
if (currentInitSegment) {
|
7371
7409
|
frag.initSegment = currentInitSegment;
|
@@ -7495,6 +7533,12 @@
|
|
7495
7533
|
break;
|
7496
7534
|
case 'BITRATE':
|
7497
7535
|
frag.tagList.push([tag, value1]);
|
7536
|
+
currentBitrate = parseInt(value1) * 1000;
|
7537
|
+
if (isFiniteNumber(currentBitrate)) {
|
7538
|
+
frag.bitrate = currentBitrate;
|
7539
|
+
} else {
|
7540
|
+
currentBitrate = 0;
|
7541
|
+
}
|
7498
7542
|
break;
|
7499
7543
|
case 'DATERANGE':
|
7500
7544
|
{
|
@@ -14129,7 +14173,7 @@
|
|
14129
14173
|
var _this$currentTransmux = this.currentTransmuxState,
|
14130
14174
|
accurateTimeOffset = _this$currentTransmux.accurateTimeOffset,
|
14131
14175
|
timeOffset = _this$currentTransmux.timeOffset;
|
14132
|
-
this.logger.log("[transmuxer.ts]: Flushed " + this.id + " sn: " + chunkMeta.sn + (chunkMeta.part > -1 ? '
|
14176
|
+
this.logger.log("[transmuxer.ts]: Flushed " + this.id + " sn: " + chunkMeta.sn + (chunkMeta.part > -1 ? ' part: ' + chunkMeta.part : '') + " of " + (this.id === PlaylistLevelType.MAIN ? 'level' : 'track') + " " + chunkMeta.level);
|
14133
14177
|
var remuxResult = this.remuxer.remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, true, this.id);
|
14134
14178
|
transmuxResults.push({
|
14135
14179
|
remuxResult: remuxResult,
|
@@ -18034,23 +18078,25 @@
|
|
18034
18078
|
this.startFragRequested = true;
|
18035
18079
|
this._loadFragForPlayback(frag, level, targetBufferTime);
|
18036
18080
|
};
|
18037
|
-
_proto._loadFragForPlayback = function _loadFragForPlayback(
|
18081
|
+
_proto._loadFragForPlayback = function _loadFragForPlayback(fragment, level, targetBufferTime) {
|
18038
18082
|
var _this3 = this;
|
18039
18083
|
var progressCallback = function progressCallback(data) {
|
18084
|
+
var frag = data.frag;
|
18040
18085
|
if (_this3.fragContextChanged(frag)) {
|
18041
|
-
_this3.warn("
|
18086
|
+
_this3.warn(frag.type + " sn: " + frag.sn + (data.part ? ' part: ' + data.part.index : '') + " of " + _this3.fragInfo(frag, false, data.part) + ") was dropped during download.");
|
18042
18087
|
_this3.fragmentTracker.removeFragment(frag);
|
18043
18088
|
return;
|
18044
18089
|
}
|
18045
18090
|
frag.stats.chunkCount++;
|
18046
18091
|
_this3._handleFragmentLoadProgress(data);
|
18047
18092
|
};
|
18048
|
-
this._doFragLoad(
|
18093
|
+
this._doFragLoad(fragment, level, targetBufferTime, progressCallback).then(function (data) {
|
18049
18094
|
if (!data) {
|
18050
18095
|
// if we're here we probably needed to backtrack or are waiting for more parts
|
18051
18096
|
return;
|
18052
18097
|
}
|
18053
18098
|
var state = _this3.state;
|
18099
|
+
var frag = data.frag;
|
18054
18100
|
if (_this3.fragContextChanged(frag)) {
|
18055
18101
|
if (state === State.FRAG_LOADING || !_this3.fragCurrent && state === State.PARSING) {
|
18056
18102
|
_this3.fragmentTracker.removeFragment(frag);
|
@@ -18070,7 +18116,7 @@
|
|
18070
18116
|
return;
|
18071
18117
|
}
|
18072
18118
|
_this3.warn("Frag error: " + ((reason == null ? void 0 : reason.message) || reason));
|
18073
|
-
_this3.resetFragmentLoading(
|
18119
|
+
_this3.resetFragmentLoading(fragment);
|
18074
18120
|
});
|
18075
18121
|
};
|
18076
18122
|
_proto.clearTrackerIfNeeded = function clearTrackerIfNeeded(frag) {
|
@@ -18135,16 +18181,18 @@
|
|
18135
18181
|
};
|
18136
18182
|
this.hls.trigger(Events.BUFFER_FLUSHING, flushScope);
|
18137
18183
|
};
|
18138
|
-
_proto._loadInitSegment = function _loadInitSegment(
|
18184
|
+
_proto._loadInitSegment = function _loadInitSegment(fragment, level) {
|
18139
18185
|
var _this4 = this;
|
18140
|
-
this._doFragLoad(
|
18141
|
-
|
18186
|
+
this._doFragLoad(fragment, level).then(function (data) {
|
18187
|
+
var frag = data == null ? void 0 : data.frag;
|
18188
|
+
if (!frag || _this4.fragContextChanged(frag) || !_this4.levels) {
|
18142
18189
|
throw new Error('init load aborted');
|
18143
18190
|
}
|
18144
18191
|
return data;
|
18145
18192
|
}).then(function (data) {
|
18146
18193
|
var hls = _this4.hls;
|
18147
|
-
var
|
18194
|
+
var frag = data.frag,
|
18195
|
+
payload = data.payload;
|
18148
18196
|
var decryptData = frag.decryptdata;
|
18149
18197
|
|
18150
18198
|
// check to see if the payload needs to be decrypted
|
@@ -18181,7 +18229,7 @@
|
|
18181
18229
|
return;
|
18182
18230
|
}
|
18183
18231
|
_this4.warn(reason);
|
18184
|
-
_this4.resetFragmentLoading(
|
18232
|
+
_this4.resetFragmentLoading(fragment);
|
18185
18233
|
});
|
18186
18234
|
};
|
18187
18235
|
_proto.completeInitSegmentLoad = function completeInitSegmentLoad(data) {
|
@@ -18204,7 +18252,7 @@
|
|
18204
18252
|
};
|
18205
18253
|
_proto.fragBufferedComplete = function fragBufferedComplete(frag, part) {
|
18206
18254
|
var media = this.mediaBuffer ? this.mediaBuffer : this.media;
|
18207
|
-
this.log("Buffered " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag) + " > buffer:" + (media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : '(detached)') + ")");
|
18255
|
+
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)') + ")");
|
18208
18256
|
if (frag.sn !== 'initSegment') {
|
18209
18257
|
var _this$levels;
|
18210
18258
|
if (frag.type !== PlaylistLevelType.SUBTITLE) {
|
@@ -18296,7 +18344,8 @@
|
|
18296
18344
|
var partIndex = this.getNextPart(partList, frag, targetBufferTime);
|
18297
18345
|
if (partIndex > -1) {
|
18298
18346
|
var part = partList[partIndex];
|
18299
|
-
|
18347
|
+
frag = this.fragCurrent = part.fragment;
|
18348
|
+
this.log("Loading " + frag.type + " sn: " + frag.sn + " part: " + part.index + " (" + partIndex + "/" + (partList.length - 1) + ") of " + this.fragInfo(frag, false, part) + ") cc: " + frag.cc + " [" + details.startSN + "-" + details.endSN + "], target: " + parseFloat(targetBufferTime.toFixed(3)));
|
18300
18349
|
this.nextLoadPosition = part.start + part.duration;
|
18301
18350
|
this.state = State.FRAG_LOADING;
|
18302
18351
|
var _result;
|
@@ -19084,7 +19133,7 @@
|
|
19084
19133
|
// For this error fallthrough. Marking parsed will allow advancing to next fragment.
|
19085
19134
|
}
|
19086
19135
|
this.state = State.PARSED;
|
19087
|
-
this.log("Parsed " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag) + ")");
|
19136
|
+
this.log("Parsed " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag, false, part) + ")");
|
19088
19137
|
this.hls.trigger(Events.FRAG_PARSED, {
|
19089
19138
|
frag: frag,
|
19090
19139
|
part: part
|
@@ -19093,12 +19142,12 @@
|
|
19093
19142
|
_proto.playlistLabel = function playlistLabel() {
|
19094
19143
|
return this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track';
|
19095
19144
|
};
|
19096
|
-
_proto.fragInfo = function fragInfo(frag, pts) {
|
19145
|
+
_proto.fragInfo = function fragInfo(frag, pts, part) {
|
19097
19146
|
var _ref3, _ref4;
|
19098
19147
|
if (pts === void 0) {
|
19099
19148
|
pts = true;
|
19100
19149
|
}
|
19101
|
-
return this.playlistLabel() + " " + frag.level + " (frag:[" + ((_ref3 = pts ? frag.startPTS : frag.start) != null ? _ref3 : NaN).toFixed(3) + "-" + ((_ref4 = pts ? frag.endPTS : frag.end) != null ? _ref4 : NaN).toFixed(3) + "]";
|
19150
|
+
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') : '');
|
19102
19151
|
};
|
19103
19152
|
_proto.resetTransmuxer = function resetTransmuxer() {
|
19104
19153
|
var _this$transmuxer2;
|
@@ -19644,7 +19693,7 @@
|
|
19644
19693
|
return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
|
19645
19694
|
}
|
19646
19695
|
|
19647
|
-
var version = "1.6.0-beta.1.0.canary.
|
19696
|
+
var version = "1.6.0-beta.1.0.canary.10752";
|
19648
19697
|
|
19649
19698
|
// ensure the worker ends up in the bundle
|
19650
19699
|
// If the worker should not be included this gets aliased to empty.js
|
@@ -19916,7 +19965,7 @@
|
|
19916
19965
|
var initSegmentChange = !(lastFrag && ((_frag$initSegment = frag.initSegment) == null ? void 0 : _frag$initSegment.url) === ((_lastFrag$initSegment = lastFrag.initSegment) == null ? void 0 : _lastFrag$initSegment.url));
|
19917
19966
|
var state = new TransmuxState(discontinuity, contiguous, accurateTimeOffset, trackSwitch, timeOffset, initSegmentChange);
|
19918
19967
|
if (!contiguous || discontinuity || initSegmentChange) {
|
19919
|
-
this.hls.logger.log("[transmuxer-interface
|
19968
|
+
this.hls.logger.log("[transmuxer-interface]: Starting new transmux session for " + frag.type + " sn: " + chunkMeta.sn + (chunkMeta.part > -1 ? ' part: ' + chunkMeta.part : '') + " " + (this.id === PlaylistLevelType.MAIN ? 'level' : 'track') + ": " + chunkMeta.level + " id: " + chunkMeta.id + "\n discontinuity: " + discontinuity + "\n trackSwitch: " + trackSwitch + "\n contiguous: " + contiguous + "\n accurateTimeOffset: " + accurateTimeOffset + "\n timeOffset: " + timeOffset + "\n initSegmentChange: " + initSegmentChange);
|
19920
19969
|
var config = new TransmuxConfig(audioCodec, videoCodec, initSegmentData, duration, defaultInitPTS);
|
19921
19970
|
this.configureTransmuxer(config);
|
19922
19971
|
}
|
@@ -20889,12 +20938,13 @@
|
|
20889
20938
|
}
|
20890
20939
|
return audioCodec;
|
20891
20940
|
};
|
20892
|
-
_proto._loadBitrateTestFrag = function _loadBitrateTestFrag(
|
20941
|
+
_proto._loadBitrateTestFrag = function _loadBitrateTestFrag(fragment, level) {
|
20893
20942
|
var _this2 = this;
|
20894
|
-
|
20895
|
-
this._doFragLoad(
|
20943
|
+
fragment.bitrateTest = true;
|
20944
|
+
this._doFragLoad(fragment, level).then(function (data) {
|
20896
20945
|
var hls = _this2.hls;
|
20897
|
-
|
20946
|
+
var frag = data == null ? void 0 : data.frag;
|
20947
|
+
if (!frag || _this2.fragContextChanged(frag)) {
|
20898
20948
|
return;
|
20899
20949
|
}
|
20900
20950
|
level.fragmentError = 0;
|