hls.js 1.6.0-beta.1.0.canary.10765 → 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 +1 -0
- package/dist/hls.d.ts +1 -0
- package/dist/hls.js +41 -24
- package/dist/hls.js.d.ts +1 -0
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +34 -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 +34 -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 +41 -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/loader/fragment.ts +5 -1
package/dist/hls.light.mjs
CHANGED
@@ -400,7 +400,7 @@ function enableLogs(debugConfig, context, id) {
|
|
400
400
|
// Some browsers don't allow to use bind on console object anyway
|
401
401
|
// fallback to default if needed
|
402
402
|
try {
|
403
|
-
newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.
|
403
|
+
newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.10766"}`);
|
404
404
|
} catch (e) {
|
405
405
|
/* log fn threw an exception. All logger methods are no-ops. */
|
406
406
|
return createLogger();
|
@@ -2856,6 +2856,10 @@ class BaseSegment {
|
|
2856
2856
|
elementaryStreams[ElementaryStreamTypes.AUDIOVIDEO] = null;
|
2857
2857
|
}
|
2858
2858
|
}
|
2859
|
+
function isMediaFragment(frag) {
|
2860
|
+
return frag.sn !== 'initSegment';
|
2861
|
+
}
|
2862
|
+
|
2859
2863
|
/**
|
2860
2864
|
* Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.
|
2861
2865
|
*/
|
@@ -3009,7 +3013,7 @@ class Fragment extends BaseSegment {
|
|
3009
3013
|
this._programDateTime = value;
|
3010
3014
|
}
|
3011
3015
|
get ref() {
|
3012
|
-
if (this
|
3016
|
+
if (!isMediaFragment(this)) {
|
3013
3017
|
return null;
|
3014
3018
|
}
|
3015
3019
|
if (!this._ref) {
|
@@ -7924,7 +7928,7 @@ class BaseStreamController extends TaskLoop {
|
|
7924
7928
|
fragBufferedComplete(frag, part) {
|
7925
7929
|
const media = this.mediaBuffer ? this.mediaBuffer : this.media;
|
7926
7930
|
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)'})`);
|
7927
|
-
if (frag
|
7931
|
+
if (isMediaFragment(frag)) {
|
7928
7932
|
var _this$levels;
|
7929
7933
|
if (frag.type !== PlaylistLevelType.SUBTITLE) {
|
7930
7934
|
const el = frag.elementaryStreams;
|
@@ -7993,7 +7997,7 @@ class BaseStreamController extends TaskLoop {
|
|
7993
7997
|
this.keyLoader.loadClear(frag, details.encryptedFragments);
|
7994
7998
|
}
|
7995
7999
|
const fragPrevious = this.fragPrevious;
|
7996
|
-
if (frag
|
8000
|
+
if (isMediaFragment(frag) && (!fragPrevious || frag.sn !== fragPrevious.sn)) {
|
7997
8001
|
const shouldLoadParts = this.shouldLoadParts(level.details, frag.end);
|
7998
8002
|
if (shouldLoadParts !== this.loadingParts) {
|
7999
8003
|
this.log(`LL-Part loading ${shouldLoadParts ? 'ON' : 'OFF'} loading sn ${fragPrevious == null ? void 0 : fragPrevious.sn}->${frag.sn}`);
|
@@ -8001,7 +8005,7 @@ class BaseStreamController extends TaskLoop {
|
|
8001
8005
|
}
|
8002
8006
|
}
|
8003
8007
|
targetBufferTime = Math.max(frag.start, targetBufferTime || 0);
|
8004
|
-
if (this.loadingParts && frag
|
8008
|
+
if (this.loadingParts && isMediaFragment(frag)) {
|
8005
8009
|
const partList = details.partList;
|
8006
8010
|
if (partList && progressCallback) {
|
8007
8011
|
if (targetBufferTime > frag.end && details.fragmentHint) {
|
@@ -8040,7 +8044,7 @@ class BaseStreamController extends TaskLoop {
|
|
8040
8044
|
}
|
8041
8045
|
}
|
8042
8046
|
}
|
8043
|
-
if (frag
|
8047
|
+
if (isMediaFragment(frag) && this.loadingParts) {
|
8044
8048
|
this.log(`LL-Part loading OFF after next part miss @${targetBufferTime.toFixed(2)}`);
|
8045
8049
|
this.loadingParts = false;
|
8046
8050
|
} else if (!frag.url) {
|
@@ -8599,7 +8603,7 @@ class BaseStreamController extends TaskLoop {
|
|
8599
8603
|
return pos;
|
8600
8604
|
}
|
8601
8605
|
handleFragLoadAborted(frag, part) {
|
8602
|
-
if (this.transmuxer && frag
|
8606
|
+
if (this.transmuxer && isMediaFragment(frag) && frag.stats.aborted) {
|
8603
8607
|
this.warn(`Fragment ${frag.sn}${part ? ' part ' + part.index : ''} of level ${frag.level} was aborted`);
|
8604
8608
|
this.resetFragmentLoading(frag);
|
8605
8609
|
}
|
@@ -8634,10 +8638,18 @@ class BaseStreamController extends TaskLoop {
|
|
8634
8638
|
const errorAction = data.errorAction;
|
8635
8639
|
const {
|
8636
8640
|
action,
|
8641
|
+
flags,
|
8637
8642
|
retryCount = 0,
|
8638
8643
|
retryConfig
|
8639
8644
|
} = errorAction || {};
|
8640
|
-
|
8645
|
+
const couldRetry = !!errorAction && !!retryConfig;
|
8646
|
+
const retry = couldRetry && action === NetworkErrorAction.RetryRequest;
|
8647
|
+
const noAlternate = couldRetry && !errorAction.resolved && flags === ErrorActionFlags.MoveAllAlternatesMatchingHost;
|
8648
|
+
if (!retry && noAlternate && isMediaFragment(frag) && !frag.endList) {
|
8649
|
+
this.resetFragmentErrors(filterType);
|
8650
|
+
this.treatAsGap(frag);
|
8651
|
+
errorAction.resolved = true;
|
8652
|
+
} else if ((retry || noAlternate) && retryCount < retryConfig.maxNumRetry) {
|
8641
8653
|
this.resetStartWhenNotLoaded(this.levelLastLoaded);
|
8642
8654
|
const delay = getRetryDelay(retryConfig, retryCount);
|
8643
8655
|
this.warn(`Fragment ${frag.sn} of ${filterType} ${frag.level} errored with ${data.details}, retrying loading ${retryCount + 1}/${retryConfig.maxNumRetry} in ${delay}ms`);
|
@@ -8655,7 +8667,7 @@ class BaseStreamController extends TaskLoop {
|
|
8655
8667
|
this.warn(`${data.details} reached or exceeded max retry (${retryCount})`);
|
8656
8668
|
return;
|
8657
8669
|
}
|
8658
|
-
} else if (
|
8670
|
+
} else if (action === NetworkErrorAction.SendAlternateToPenaltyBox) {
|
8659
8671
|
this.state = State.WAITING_LEVEL;
|
8660
8672
|
} else {
|
8661
8673
|
this.state = State.ERROR;
|
@@ -8787,10 +8799,7 @@ class BaseStreamController extends TaskLoop {
|
|
8787
8799
|
const error = new Error(`Found no media in fragment ${frag.sn} of level ${frag.level} resetting transmuxer to fallback to playlist timing`);
|
8788
8800
|
if (level.fragmentError === 0) {
|
8789
8801
|
// Mark and track the odd empty segment as a gap to avoid reloading
|
8790
|
-
level
|
8791
|
-
frag.gap = true;
|
8792
|
-
this.fragmentTracker.removeFragment(frag);
|
8793
|
-
this.fragmentTracker.fragBuffered(frag, true);
|
8802
|
+
this.treatAsGap(frag, level);
|
8794
8803
|
}
|
8795
8804
|
this.warn(error.message);
|
8796
8805
|
this.hls.trigger(Events.ERROR, {
|
@@ -8821,6 +8830,14 @@ class BaseStreamController extends TaskLoop {
|
|
8821
8830
|
var _ref, _ref2;
|
8822
8831
|
return `${this.playlistLabel()} ${frag.level} (${part ? 'part' : 'frag'}:[${((_ref = pts && !part ? frag.startPTS : (part || frag).start) != null ? _ref : NaN).toFixed(3)}-${((_ref2 = pts && !part ? frag.endPTS : (part || frag).end) != null ? _ref2 : NaN).toFixed(3)}]${part && frag.type === 'main' ? 'INDEPENDENT=' + (part.independent ? 'YES' : 'NO') : ''}`;
|
8823
8832
|
}
|
8833
|
+
treatAsGap(frag, level) {
|
8834
|
+
if (level) {
|
8835
|
+
level.fragmentError++;
|
8836
|
+
}
|
8837
|
+
frag.gap = true;
|
8838
|
+
this.fragmentTracker.removeFragment(frag);
|
8839
|
+
this.fragmentTracker.fragBuffered(frag, true);
|
8840
|
+
}
|
8824
8841
|
resetTransmuxer() {
|
8825
8842
|
var _this$transmuxer2;
|
8826
8843
|
(_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
|
@@ -19082,7 +19099,7 @@ class GapController extends Logger {
|
|
19082
19099
|
}
|
19083
19100
|
}
|
19084
19101
|
|
19085
|
-
const version = "1.6.0-beta.1.0.canary.
|
19102
|
+
const version = "1.6.0-beta.1.0.canary.10766";
|
19086
19103
|
|
19087
19104
|
// ensure the worker ends up in the bundle
|
19088
19105
|
// If the worker should not be included this gets aliased to empty.js
|
@@ -19742,7 +19759,7 @@ class StreamController extends BaseStreamController {
|
|
19742
19759
|
const targetBufferTime = this.backtrackFragment ? this.backtrackFragment.start : bufferInfo.end;
|
19743
19760
|
let frag = this.getNextFragment(targetBufferTime, levelDetails);
|
19744
19761
|
// Avoid backtracking by loading an earlier segment in streams with segments that do not start with a key frame (flagged by `couldBacktrack`)
|
19745
|
-
if (this.couldBacktrack && !this.fragPrevious && frag && frag
|
19762
|
+
if (this.couldBacktrack && !this.fragPrevious && frag && isMediaFragment(frag) && this.fragmentTracker.getState(frag) !== FragmentState.OK) {
|
19746
19763
|
var _this$backtrackFragme;
|
19747
19764
|
const backtrackSn = ((_this$backtrackFragme = this.backtrackFragment) != null ? _this$backtrackFragme : frag).sn;
|
19748
19765
|
const fragIdx = backtrackSn - levelDetails.startSN;
|
@@ -19779,7 +19796,7 @@ class StreamController extends BaseStreamController {
|
|
19779
19796
|
// Check if fragment is not loaded
|
19780
19797
|
const fragState = this.fragmentTracker.getState(frag);
|
19781
19798
|
if (fragState === FragmentState.NOT_LOADED || fragState === FragmentState.PARTIAL) {
|
19782
|
-
if (frag
|
19799
|
+
if (!isMediaFragment(frag)) {
|
19783
19800
|
this._loadInitSegment(frag, level);
|
19784
19801
|
} else if (this.bitrateTest) {
|
19785
19802
|
this.log(`Fragment ${frag.sn} of level ${frag.level} is being downloaded to test bitrate and will not be buffered`);
|
@@ -20205,7 +20222,7 @@ class StreamController extends BaseStreamController {
|
|
20205
20222
|
}
|
20206
20223
|
const stats = part ? part.stats : frag.stats;
|
20207
20224
|
this.fragLastKbps = Math.round(8 * stats.total / (stats.buffering.end - stats.loading.first));
|
20208
|
-
if (frag
|
20225
|
+
if (isMediaFragment(frag)) {
|
20209
20226
|
this.fragPrevious = frag;
|
20210
20227
|
}
|
20211
20228
|
this.fragBufferedComplete(frag, part);
|