hls.js 1.6.0-beta.1.0.canary.10765 → 1.6.0-beta.1.0.canary.10767
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 +1 -0
- package/dist/hls.d.ts +1 -0
- package/dist/hls.js +45 -24
- package/dist/hls.js.d.ts +1 -0
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +38 -17
- 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 +38 -17
- 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 +45 -24
- 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 +7 -7
- package/src/controller/base-stream-controller.ts +35 -20
- package/src/controller/stream-controller.ts +5 -5
- package/src/controller/subtitle-stream-controller.ts +9 -5
- package/src/hls.ts +4 -0
- package/src/loader/fragment.ts +5 -1
package/dist/hls.d.mts
CHANGED
@@ -376,6 +376,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
|
|
376
376
|
private updateLevelTiming;
|
377
377
|
private playlistLabel;
|
378
378
|
private fragInfo;
|
379
|
+
private treatAsGap;
|
379
380
|
protected resetTransmuxer(): void;
|
380
381
|
protected recoverWorkerError(data: ErrorData): void;
|
381
382
|
set state(nextState: string);
|
package/dist/hls.d.ts
CHANGED
@@ -376,6 +376,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
|
|
376
376
|
private updateLevelTiming;
|
377
377
|
private playlistLabel;
|
378
378
|
private fragInfo;
|
379
|
+
private treatAsGap;
|
379
380
|
protected resetTransmuxer(): void;
|
380
381
|
protected recoverWorkerError(data: ErrorData): void;
|
381
382
|
set state(nextState: string);
|
package/dist/hls.js
CHANGED
@@ -1057,7 +1057,7 @@
|
|
1057
1057
|
// Some browsers don't allow to use bind on console object anyway
|
1058
1058
|
// fallback to default if needed
|
1059
1059
|
try {
|
1060
|
-
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.
|
1060
|
+
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.6.0-beta.1.0.canary.10767");
|
1061
1061
|
} catch (e) {
|
1062
1062
|
/* log fn threw an exception. All logger methods are no-ops. */
|
1063
1063
|
return createLogger();
|
@@ -4321,6 +4321,10 @@
|
|
4321
4321
|
}
|
4322
4322
|
}]);
|
4323
4323
|
}();
|
4324
|
+
function isMediaFragment(frag) {
|
4325
|
+
return frag.sn !== 'initSegment';
|
4326
|
+
}
|
4327
|
+
|
4324
4328
|
/**
|
4325
4329
|
* Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.
|
4326
4330
|
*/
|
@@ -4541,7 +4545,7 @@
|
|
4541
4545
|
}, {
|
4542
4546
|
key: "ref",
|
4543
4547
|
get: function get() {
|
4544
|
-
if (this
|
4548
|
+
if (!isMediaFragment(this)) {
|
4545
4549
|
return null;
|
4546
4550
|
}
|
4547
4551
|
if (!this._ref) {
|
@@ -9196,7 +9200,7 @@
|
|
9196
9200
|
_proto.fragBufferedComplete = function fragBufferedComplete(frag, part) {
|
9197
9201
|
var media = this.mediaBuffer ? this.mediaBuffer : this.media;
|
9198
9202
|
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)') + ")");
|
9199
|
-
if (frag
|
9203
|
+
if (isMediaFragment(frag)) {
|
9200
9204
|
var _this$levels;
|
9201
9205
|
if (frag.type !== PlaylistLevelType.SUBTITLE) {
|
9202
9206
|
var el = frag.elementaryStreams;
|
@@ -9270,7 +9274,7 @@
|
|
9270
9274
|
this.keyLoader.loadClear(frag, details.encryptedFragments);
|
9271
9275
|
}
|
9272
9276
|
var fragPrevious = this.fragPrevious;
|
9273
|
-
if (frag
|
9277
|
+
if (isMediaFragment(frag) && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
|
9274
9278
|
var shouldLoadParts = this.shouldLoadParts(level.details, frag.end);
|
9275
9279
|
if (shouldLoadParts !== this.loadingParts) {
|
9276
9280
|
this.log("LL-Part loading " + (shouldLoadParts ? 'ON' : 'OFF') + " loading sn " + (fragPrevious == null ? void 0 : fragPrevious.sn) + "->" + frag.sn);
|
@@ -9278,7 +9282,7 @@
|
|
9278
9282
|
}
|
9279
9283
|
}
|
9280
9284
|
targetBufferTime = Math.max(frag.start, targetBufferTime || 0);
|
9281
|
-
if (this.loadingParts && frag
|
9285
|
+
if (this.loadingParts && isMediaFragment(frag)) {
|
9282
9286
|
var partList = details.partList;
|
9283
9287
|
if (partList && progressCallback) {
|
9284
9288
|
if (targetBufferTime > frag.end && details.fragmentHint) {
|
@@ -9321,7 +9325,7 @@
|
|
9321
9325
|
}
|
9322
9326
|
}
|
9323
9327
|
}
|
9324
|
-
if (frag
|
9328
|
+
if (isMediaFragment(frag) && this.loadingParts) {
|
9325
9329
|
this.log("LL-Part loading OFF after next part miss @" + targetBufferTime.toFixed(2));
|
9326
9330
|
this.loadingParts = false;
|
9327
9331
|
} else if (!frag.url) {
|
@@ -9863,7 +9867,7 @@
|
|
9863
9867
|
return pos;
|
9864
9868
|
};
|
9865
9869
|
_proto.handleFragLoadAborted = function handleFragLoadAborted(frag, part) {
|
9866
|
-
if (this.transmuxer && frag
|
9870
|
+
if (this.transmuxer && isMediaFragment(frag) && frag.stats.aborted) {
|
9867
9871
|
this.warn("Fragment " + frag.sn + (part ? ' part ' + part.index : '') + " of level " + frag.level + " was aborted");
|
9868
9872
|
this.resetFragmentLoading(frag);
|
9869
9873
|
}
|
@@ -9898,10 +9902,18 @@
|
|
9898
9902
|
var errorAction = data.errorAction;
|
9899
9903
|
var _ref2 = errorAction || {},
|
9900
9904
|
action = _ref2.action,
|
9905
|
+
flags = _ref2.flags,
|
9901
9906
|
_ref2$retryCount = _ref2.retryCount,
|
9902
9907
|
retryCount = _ref2$retryCount === void 0 ? 0 : _ref2$retryCount,
|
9903
9908
|
retryConfig = _ref2.retryConfig;
|
9904
|
-
|
9909
|
+
var couldRetry = !!errorAction && !!retryConfig;
|
9910
|
+
var retry = couldRetry && action === NetworkErrorAction.RetryRequest;
|
9911
|
+
var noAlternate = couldRetry && !errorAction.resolved && flags === ErrorActionFlags.MoveAllAlternatesMatchingHost;
|
9912
|
+
if (!retry && noAlternate && isMediaFragment(frag) && !frag.endList) {
|
9913
|
+
this.resetFragmentErrors(filterType);
|
9914
|
+
this.treatAsGap(frag);
|
9915
|
+
errorAction.resolved = true;
|
9916
|
+
} else if ((retry || noAlternate) && retryCount < retryConfig.maxNumRetry) {
|
9905
9917
|
this.resetStartWhenNotLoaded(this.levelLastLoaded);
|
9906
9918
|
var delay = getRetryDelay(retryConfig, retryCount);
|
9907
9919
|
this.warn("Fragment " + frag.sn + " of " + filterType + " " + frag.level + " errored with " + data.details + ", retrying loading " + (retryCount + 1) + "/" + retryConfig.maxNumRetry + " in " + delay + "ms");
|
@@ -9919,7 +9931,7 @@
|
|
9919
9931
|
this.warn(data.details + " reached or exceeded max retry (" + retryCount + ")");
|
9920
9932
|
return;
|
9921
9933
|
}
|
9922
|
-
} else if (
|
9934
|
+
} else if (action === NetworkErrorAction.SendAlternateToPenaltyBox) {
|
9923
9935
|
this.state = State.WAITING_LEVEL;
|
9924
9936
|
} else {
|
9925
9937
|
this.state = State.ERROR;
|
@@ -10055,10 +10067,7 @@
|
|
10055
10067
|
var error = new Error("Found no media in fragment " + frag.sn + " of level " + frag.level + " resetting transmuxer to fallback to playlist timing");
|
10056
10068
|
if (level.fragmentError === 0) {
|
10057
10069
|
// Mark and track the odd empty segment as a gap to avoid reloading
|
10058
|
-
level
|
10059
|
-
frag.gap = true;
|
10060
|
-
this.fragmentTracker.removeFragment(frag);
|
10061
|
-
this.fragmentTracker.fragBuffered(frag, true);
|
10070
|
+
this.treatAsGap(frag, level);
|
10062
10071
|
}
|
10063
10072
|
this.warn(error.message);
|
10064
10073
|
this.hls.trigger(Events.ERROR, {
|
@@ -10092,6 +10101,14 @@
|
|
10092
10101
|
}
|
10093
10102
|
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') : '');
|
10094
10103
|
};
|
10104
|
+
_proto.treatAsGap = function treatAsGap(frag, level) {
|
10105
|
+
if (level) {
|
10106
|
+
level.fragmentError++;
|
10107
|
+
}
|
10108
|
+
frag.gap = true;
|
10109
|
+
this.fragmentTracker.removeFragment(frag);
|
10110
|
+
this.fragmentTracker.fragBuffered(frag, true);
|
10111
|
+
};
|
10095
10112
|
_proto.resetTransmuxer = function resetTransmuxer() {
|
10096
10113
|
var _this$transmuxer2;
|
10097
10114
|
(_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
|
@@ -16222,7 +16239,7 @@
|
|
16222
16239
|
return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
|
16223
16240
|
}
|
16224
16241
|
|
16225
|
-
var version = "1.6.0-beta.1.0.canary.
|
16242
|
+
var version = "1.6.0-beta.1.0.canary.10767";
|
16226
16243
|
|
16227
16244
|
// ensure the worker ends up in the bundle
|
16228
16245
|
// If the worker should not be included this gets aliased to empty.js
|
@@ -16915,7 +16932,7 @@
|
|
16915
16932
|
|
16916
16933
|
// Request audio segments up to one fragment ahead of main stream-controller
|
16917
16934
|
var mainFragLoading = (_this$mainFragLoading = this.mainFragLoading) == null ? void 0 : _this$mainFragLoading.frag;
|
16918
|
-
if (this.startFragRequested && mainFragLoading && mainFragLoading
|
16935
|
+
if (this.startFragRequested && mainFragLoading && isMediaFragment(mainFragLoading) && isMediaFragment(frag) && !frag.endList && (!trackDetails.live || !this.loadingParts && targetBufferTime < this.hls.liveSyncPosition)) {
|
16919
16936
|
var mainFrag = mainFragLoading;
|
16920
16937
|
if (frag.start > mainFrag.end) {
|
16921
16938
|
// Get buffered frag at target position from tracker (loaded out of sequence)
|
@@ -17117,7 +17134,7 @@
|
|
17117
17134
|
}
|
17118
17135
|
};
|
17119
17136
|
_proto.onFragLoading = function onFragLoading(event, data) {
|
17120
|
-
if (data.frag.type === PlaylistLevelType.MAIN && data.frag
|
17137
|
+
if (data.frag.type === PlaylistLevelType.MAIN && isMediaFragment(data.frag)) {
|
17121
17138
|
this.mainFragLoading = data;
|
17122
17139
|
if (this.state === State.IDLE) {
|
17123
17140
|
this.tick();
|
@@ -17136,7 +17153,7 @@
|
|
17136
17153
|
this.warn("Fragment " + frag.sn + (part ? ' p: ' + part.index : '') + " of level " + frag.level + " finished buffering, but was aborted. state: " + this.state + ", audioSwitch: " + (this.switchingTrack ? this.switchingTrack.name : 'false'));
|
17137
17154
|
return;
|
17138
17155
|
}
|
17139
|
-
if (frag
|
17156
|
+
if (isMediaFragment(frag)) {
|
17140
17157
|
this.fragPrevious = frag;
|
17141
17158
|
var track = this.switchingTrack;
|
17142
17159
|
if (track) {
|
@@ -17334,7 +17351,7 @@
|
|
17334
17351
|
// we force a frag loading in audio switch as fragment tracker might not have evicted previous frags in case of quick audio switch
|
17335
17352
|
if (this.switchingTrack || fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {
|
17336
17353
|
var _track$details2;
|
17337
|
-
if (frag
|
17354
|
+
if (!isMediaFragment(frag)) {
|
17338
17355
|
this._loadInitSegment(frag, track);
|
17339
17356
|
} else if ((_track$details2 = track.details) != null && _track$details2.live && !this.initPTS[frag.cc]) {
|
17340
17357
|
this.log("Waiting for video PTS in continuity counter " + frag.cc + " of live stream before loading audio fragment " + frag.sn + " of level " + this.trackId);
|
@@ -25510,7 +25527,7 @@
|
|
25510
25527
|
_proto.onSubtitleFragProcessed = function onSubtitleFragProcessed(event, data) {
|
25511
25528
|
var frag = data.frag,
|
25512
25529
|
success = data.success;
|
25513
|
-
if (frag
|
25530
|
+
if (isMediaFragment(frag)) {
|
25514
25531
|
this.fragPrevious = frag;
|
25515
25532
|
}
|
25516
25533
|
this.state = State.IDLE;
|
@@ -25779,7 +25796,7 @@
|
|
25779
25796
|
return;
|
25780
25797
|
}
|
25781
25798
|
foundFrag = this.mapToInitFragWhenRequired(foundFrag);
|
25782
|
-
if (foundFrag
|
25799
|
+
if (isMediaFragment(foundFrag)) {
|
25783
25800
|
// Load earlier fragment in same discontinuity to make up for misaligned playlists and cues that extend beyond end of segment
|
25784
25801
|
var curSNIdx = foundFrag.sn - trackDetails.startSN;
|
25785
25802
|
var prevFrag = fragments[curSNIdx - 1];
|
@@ -25794,7 +25811,7 @@
|
|
25794
25811
|
}
|
25795
25812
|
};
|
25796
25813
|
_proto.loadFragment = function loadFragment(frag, level, targetBufferTime) {
|
25797
|
-
if (frag
|
25814
|
+
if (!isMediaFragment(frag)) {
|
25798
25815
|
this._loadInitSegment(frag, level);
|
25799
25816
|
} else {
|
25800
25817
|
_BaseStreamController.prototype.loadFragment.call(this, frag, level, targetBufferTime);
|
@@ -32156,7 +32173,7 @@
|
|
32156
32173
|
var targetBufferTime = this.backtrackFragment ? this.backtrackFragment.start : bufferInfo.end;
|
32157
32174
|
var frag = this.getNextFragment(targetBufferTime, levelDetails);
|
32158
32175
|
// Avoid backtracking by loading an earlier segment in streams with segments that do not start with a key frame (flagged by `couldBacktrack`)
|
32159
|
-
if (this.couldBacktrack && !this.fragPrevious && frag && frag
|
32176
|
+
if (this.couldBacktrack && !this.fragPrevious && frag && isMediaFragment(frag) && this.fragmentTracker.getState(frag) !== FragmentState.OK) {
|
32160
32177
|
var _this$backtrackFragme;
|
32161
32178
|
var backtrackSn = ((_this$backtrackFragme = this.backtrackFragment) != null ? _this$backtrackFragme : frag).sn;
|
32162
32179
|
var fragIdx = backtrackSn - levelDetails.startSN;
|
@@ -32193,7 +32210,7 @@
|
|
32193
32210
|
// Check if fragment is not loaded
|
32194
32211
|
var fragState = this.fragmentTracker.getState(frag);
|
32195
32212
|
if (fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {
|
32196
|
-
if (frag
|
32213
|
+
if (!isMediaFragment(frag)) {
|
32197
32214
|
this._loadInitSegment(frag, level);
|
32198
32215
|
} else if (this.bitrateTest) {
|
32199
32216
|
this.log("Fragment " + frag.sn + " of level " + frag.level + " is being downloaded to test bitrate and will not be buffered");
|
@@ -32603,7 +32620,7 @@
|
|
32603
32620
|
}
|
32604
32621
|
var stats = part ? part.stats : frag.stats;
|
32605
32622
|
this.fragLastKbps = Math.round(8 * stats.total / (stats.buffering.end - stats.loading.first));
|
32606
|
-
if (frag
|
32623
|
+
if (isMediaFragment(frag)) {
|
32607
32624
|
this.fragPrevious = frag;
|
32608
32625
|
}
|
32609
32626
|
this.fragBufferedComplete(frag, part);
|
@@ -34198,6 +34215,10 @@
|
|
34198
34215
|
return;
|
34199
34216
|
}
|
34200
34217
|
this.logger.log("attachMedia");
|
34218
|
+
if (this._media) {
|
34219
|
+
this.logger.warn("media must be detached before attaching");
|
34220
|
+
this.detachMedia();
|
34221
|
+
}
|
34201
34222
|
var attachMediaSource = 'media' in data;
|
34202
34223
|
var media = attachMediaSource ? data.media : data;
|
34203
34224
|
var attachingData = attachMediaSource ? data : {
|
package/dist/hls.js.d.ts
CHANGED
@@ -376,6 +376,7 @@ export declare class BaseStreamController extends TaskLoop implements NetworkCom
|
|
376
376
|
private updateLevelTiming;
|
377
377
|
private playlistLabel;
|
378
378
|
private fragInfo;
|
379
|
+
private treatAsGap;
|
379
380
|
protected resetTransmuxer(): void;
|
380
381
|
protected recoverWorkerError(data: ErrorData): void;
|
381
382
|
set state(nextState: string);
|