hls.js 1.6.0-beta.1.0.canary.10743 → 1.6.0-beta.1.0.canary.10746
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 +36 -10
- package/dist/hls.d.ts +36 -10
- package/dist/hls.js +172 -87
- package/dist/hls.js.d.ts +36 -10
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +171 -86
- 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 +160 -89
- 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 +161 -90
- 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 +2 -2
- package/src/controller/latency-controller.ts +1 -1
- package/src/controller/stream-controller.ts +1 -1
- package/src/loader/date-range.ts +2 -2
- package/src/loader/fragment.ts +116 -23
- package/src/loader/interstitial-event.ts +8 -5
- package/src/loader/m3u8-parser.ts +49 -56
- package/src/utils/level-helper.ts +22 -15
package/dist/hls.mjs
CHANGED
@@ -397,7 +397,7 @@ function enableLogs(debugConfig, context, id) {
|
|
397
397
|
// Some browsers don't allow to use bind on console object anyway
|
398
398
|
// fallback to default if needed
|
399
399
|
try {
|
400
|
-
newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.
|
400
|
+
newLogger.log(`Debug logs enabled for "${context}" in hls.js version ${"1.6.0-beta.1.0.canary.10746"}`);
|
401
401
|
} catch (e) {
|
402
402
|
/* log fn threw an exception. All logger methods are no-ops. */
|
403
403
|
return createLogger();
|
@@ -3634,20 +3634,21 @@ var ElementaryStreamTypes = {
|
|
3634
3634
|
AUDIOVIDEO: "audiovideo"
|
3635
3635
|
};
|
3636
3636
|
class BaseSegment {
|
3637
|
-
constructor(
|
3637
|
+
constructor(base) {
|
3638
3638
|
this._byteRange = null;
|
3639
3639
|
this._url = null;
|
3640
|
+
this._stats = null;
|
3641
|
+
this._streams = null;
|
3640
3642
|
// baseurl is the URL to the playlist
|
3641
|
-
this.
|
3643
|
+
this.base = void 0;
|
3642
3644
|
// relurl is the portion of the URL that comes from inside the playlist.
|
3643
3645
|
this.relurl = void 0;
|
3644
|
-
|
3645
|
-
|
3646
|
-
|
3647
|
-
|
3648
|
-
|
3649
|
-
|
3650
|
-
this.baseurl = baseurl;
|
3646
|
+
if (typeof base === 'string') {
|
3647
|
+
base = {
|
3648
|
+
url: base
|
3649
|
+
};
|
3650
|
+
}
|
3651
|
+
this.base = base;
|
3651
3652
|
}
|
3652
3653
|
|
3653
3654
|
// setByteRange converts a EXT-X-BYTERANGE attribute into a two element array
|
@@ -3661,8 +3662,11 @@ class BaseSegment {
|
|
3661
3662
|
}
|
3662
3663
|
this._byteRange = [start, parseInt(params[0]) + start];
|
3663
3664
|
}
|
3665
|
+
get baseurl() {
|
3666
|
+
return this.base.url;
|
3667
|
+
}
|
3664
3668
|
get byteRange() {
|
3665
|
-
if (
|
3669
|
+
if (this._byteRange === null) {
|
3666
3670
|
return [];
|
3667
3671
|
}
|
3668
3672
|
return this._byteRange;
|
@@ -3673,6 +3677,34 @@ class BaseSegment {
|
|
3673
3677
|
get byteRangeEndOffset() {
|
3674
3678
|
return this.byteRange[1];
|
3675
3679
|
}
|
3680
|
+
get elementaryStreams() {
|
3681
|
+
if (this._streams === null) {
|
3682
|
+
this._streams = {
|
3683
|
+
[ElementaryStreamTypes.AUDIO]: null,
|
3684
|
+
[ElementaryStreamTypes.VIDEO]: null,
|
3685
|
+
[ElementaryStreamTypes.AUDIOVIDEO]: null
|
3686
|
+
};
|
3687
|
+
}
|
3688
|
+
return this._streams;
|
3689
|
+
}
|
3690
|
+
set elementaryStreams(value) {
|
3691
|
+
this._streams = value;
|
3692
|
+
}
|
3693
|
+
get hasStats() {
|
3694
|
+
return this._stats !== null;
|
3695
|
+
}
|
3696
|
+
get hasStreams() {
|
3697
|
+
return this._streams !== null;
|
3698
|
+
}
|
3699
|
+
get stats() {
|
3700
|
+
if (this._stats === null) {
|
3701
|
+
this._stats = new LoadStats();
|
3702
|
+
}
|
3703
|
+
return this._stats;
|
3704
|
+
}
|
3705
|
+
set stats(value) {
|
3706
|
+
this._stats = value;
|
3707
|
+
}
|
3676
3708
|
get url() {
|
3677
3709
|
if (!this._url && this.baseurl && this.relurl) {
|
3678
3710
|
this._url = urlToolkitExports.buildAbsoluteURL(this.baseurl, this.relurl, {
|
@@ -3697,11 +3729,12 @@ class BaseSegment {
|
|
3697
3729
|
* Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.
|
3698
3730
|
*/
|
3699
3731
|
class Fragment extends BaseSegment {
|
3700
|
-
constructor(type,
|
3701
|
-
super(
|
3732
|
+
constructor(type, base) {
|
3733
|
+
super(base);
|
3702
3734
|
this._decryptdata = null;
|
3735
|
+
this._programDateTime = null;
|
3736
|
+
this._ref = null;
|
3703
3737
|
this.rawProgramDateTime = null;
|
3704
|
-
this.programDateTime = null;
|
3705
3738
|
this.tagList = [];
|
3706
3739
|
// EXTINF has to be present for a m3u8 to be considered valid
|
3707
3740
|
this.duration = 0;
|
@@ -3739,8 +3772,6 @@ class Fragment extends BaseSegment {
|
|
3739
3772
|
this.maxStartPTS = void 0;
|
3740
3773
|
// The minimum ending Presentation Time Stamp (audio/video PTS) of the fragment. Set after transmux complete.
|
3741
3774
|
this.minEndPTS = void 0;
|
3742
|
-
// Load/parse timing information
|
3743
|
-
this.stats = new LoadStats();
|
3744
3775
|
// Init Segment bytes (unset for media segments)
|
3745
3776
|
this.data = void 0;
|
3746
3777
|
// A flag indicating whether the segment was downloaded in order to test bitrate, and was not buffered
|
@@ -3784,9 +3815,6 @@ class Fragment extends BaseSegment {
|
|
3784
3815
|
if (this.programDateTime === null) {
|
3785
3816
|
return null;
|
3786
3817
|
}
|
3787
|
-
if (!isFiniteNumber(this.programDateTime)) {
|
3788
|
-
return null;
|
3789
|
-
}
|
3790
3818
|
const duration = !isFiniteNumber(this.duration) ? 0 : this.duration;
|
3791
3819
|
return this.programDateTime + duration * 1000;
|
3792
3820
|
}
|
@@ -3806,6 +3834,49 @@ class Fragment extends BaseSegment {
|
|
3806
3834
|
}
|
3807
3835
|
return false;
|
3808
3836
|
}
|
3837
|
+
get programDateTime() {
|
3838
|
+
if (this._programDateTime === null && this.rawProgramDateTime) {
|
3839
|
+
this.programDateTime = Date.parse(this.rawProgramDateTime);
|
3840
|
+
}
|
3841
|
+
return this._programDateTime;
|
3842
|
+
}
|
3843
|
+
set programDateTime(value) {
|
3844
|
+
if (!isFiniteNumber(value)) {
|
3845
|
+
this._programDateTime = this.rawProgramDateTime = null;
|
3846
|
+
return;
|
3847
|
+
}
|
3848
|
+
this._programDateTime = value;
|
3849
|
+
}
|
3850
|
+
get ref() {
|
3851
|
+
if (this.sn === 'initSegment') {
|
3852
|
+
return null;
|
3853
|
+
}
|
3854
|
+
if (!this._ref) {
|
3855
|
+
this._ref = {
|
3856
|
+
base: this.base,
|
3857
|
+
start: this.start,
|
3858
|
+
duration: this.duration,
|
3859
|
+
sn: this.sn,
|
3860
|
+
programDateTime: this.programDateTime
|
3861
|
+
};
|
3862
|
+
}
|
3863
|
+
return this._ref;
|
3864
|
+
}
|
3865
|
+
addStart(value) {
|
3866
|
+
this.setStart(this.start + value);
|
3867
|
+
}
|
3868
|
+
setStart(value) {
|
3869
|
+
this.start = value;
|
3870
|
+
if (this._ref) {
|
3871
|
+
this._ref.start = value;
|
3872
|
+
}
|
3873
|
+
}
|
3874
|
+
setDuration(value) {
|
3875
|
+
this.duration = value;
|
3876
|
+
if (this._ref) {
|
3877
|
+
this._ref.duration = value;
|
3878
|
+
}
|
3879
|
+
}
|
3809
3880
|
setKeyFormat(keyFormat) {
|
3810
3881
|
if (this.levelkeys) {
|
3811
3882
|
const key = this.levelkeys[keyFormat];
|
@@ -3845,8 +3916,8 @@ class Fragment extends BaseSegment {
|
|
3845
3916
|
* Object representing parsed data from an HLS Partial Segment. Found in {@link hls.js#LevelDetails.partList}.
|
3846
3917
|
*/
|
3847
3918
|
class Part extends BaseSegment {
|
3848
|
-
constructor(partAttrs, frag,
|
3849
|
-
super(
|
3919
|
+
constructor(partAttrs, frag, base, index, previous) {
|
3920
|
+
super(base);
|
3850
3921
|
this.fragOffset = 0;
|
3851
3922
|
this.duration = 0;
|
3852
3923
|
this.gap = false;
|
@@ -3854,7 +3925,6 @@ class Part extends BaseSegment {
|
|
3854
3925
|
this.relurl = void 0;
|
3855
3926
|
this.fragment = void 0;
|
3856
3927
|
this.index = void 0;
|
3857
|
-
this.stats = new LoadStats();
|
3858
3928
|
this.duration = partAttrs.decimalFloatingPoint('DURATION');
|
3859
3929
|
this.gap = partAttrs.bool('GAP');
|
3860
3930
|
this.independent = partAttrs.bool('INDEPENDENT');
|
@@ -6641,13 +6711,9 @@ const LEVEL_PLAYLIST_REGEX_FAST = new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*
|
|
6641
6711
|
// duration (#EXTINF:<duration>,<title>), group 1 => duration, group 2 => title
|
6642
6712
|
/(?!#) *(\S[^\r\n]*)/.source,
|
6643
6713
|
// segment URI, group 3 => the URI (note newline is not eaten)
|
6644
|
-
/#EXT-X-BYTERANGE:*(.+)/.source,
|
6645
|
-
// next segment's byterange, group 4 => range spec (x@y)
|
6646
|
-
/#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,
|
6647
|
-
// next segment's program date/time group 5 => the datetime spec
|
6648
6714
|
/#.*/.source // All other non-segment oriented tags will match with all groups empty
|
6649
6715
|
].join('|'), 'g');
|
6650
|
-
const LEVEL_PLAYLIST_REGEX_SLOW = new RegExp([/#(EXTM3U)/.source, /#EXT-X-(DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/.source, /#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\d+)/.source, /#EXT-X-(DISCONTINUITY|ENDLIST|GAP|INDEPENDENT-SEGMENTS)/.source, /(#)([^:]*):(.*)/.source, /(#)(.*)(?:.*)\r?\n?/.source].join('|'));
|
6716
|
+
const LEVEL_PLAYLIST_REGEX_SLOW = new RegExp([/#(EXTM3U)/.source, /#EXT-X-(PROGRAM-DATE-TIME|BYTERANGE|DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/.source, /#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\d+)/.source, /#EXT-X-(DISCONTINUITY|ENDLIST|GAP|INDEPENDENT-SEGMENTS)/.source, /(#)([^:]*):(.*)/.source, /(#)(.*)(?:.*)\r?\n?/.source].join('|'));
|
6651
6717
|
class M3U8Parser {
|
6652
6718
|
static findGroup(groups, mediaGroupId) {
|
6653
6719
|
for (let i = 0; i < groups.length; i++) {
|
@@ -6837,6 +6903,9 @@ class M3U8Parser {
|
|
6837
6903
|
return results;
|
6838
6904
|
}
|
6839
6905
|
static parseLevelPlaylist(string, baseurl, id, type, levelUrlId, multivariantVariableList) {
|
6906
|
+
const base = {
|
6907
|
+
url: baseurl
|
6908
|
+
};
|
6840
6909
|
const level = new LevelDetails(baseurl);
|
6841
6910
|
const fragments = level.fragments;
|
6842
6911
|
const programDateTimes = [];
|
@@ -6847,7 +6916,7 @@ class M3U8Parser {
|
|
6847
6916
|
let totalduration = 0;
|
6848
6917
|
let discontinuityCounter = 0;
|
6849
6918
|
let prevFrag = null;
|
6850
|
-
let frag = new Fragment(type,
|
6919
|
+
let frag = new Fragment(type, base);
|
6851
6920
|
let result;
|
6852
6921
|
let i;
|
6853
6922
|
let levelkeys;
|
@@ -6860,7 +6929,7 @@ class M3U8Parser {
|
|
6860
6929
|
while ((result = LEVEL_PLAYLIST_REGEX_FAST.exec(string)) !== null) {
|
6861
6930
|
if (createNextFrag) {
|
6862
6931
|
createNextFrag = false;
|
6863
|
-
frag = new Fragment(type,
|
6932
|
+
frag = new Fragment(type, base);
|
6864
6933
|
// setup the next fragment for part loading
|
6865
6934
|
frag.playlistOffset = totalduration;
|
6866
6935
|
frag.start = totalduration;
|
@@ -6869,8 +6938,10 @@ class M3U8Parser {
|
|
6869
6938
|
frag.level = id;
|
6870
6939
|
if (currentInitSegment) {
|
6871
6940
|
frag.initSegment = currentInitSegment;
|
6872
|
-
|
6873
|
-
|
6941
|
+
if (currentInitSegment.rawProgramDateTime) {
|
6942
|
+
frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;
|
6943
|
+
currentInitSegment.rawProgramDateTime = null;
|
6944
|
+
}
|
6874
6945
|
if (nextByteRange) {
|
6875
6946
|
frag.setByteRange(nextByteRange);
|
6876
6947
|
nextByteRange = null;
|
@@ -6907,22 +6978,6 @@ class M3U8Parser {
|
|
6907
6978
|
currentPart = 0;
|
6908
6979
|
createNextFrag = true;
|
6909
6980
|
}
|
6910
|
-
} else if (result[4]) {
|
6911
|
-
// X-BYTERANGE
|
6912
|
-
const data = (' ' + result[4]).slice(1);
|
6913
|
-
if (prevFrag) {
|
6914
|
-
frag.setByteRange(data, prevFrag);
|
6915
|
-
} else {
|
6916
|
-
frag.setByteRange(data);
|
6917
|
-
}
|
6918
|
-
} else if (result[5]) {
|
6919
|
-
// PROGRAM-DATE-TIME
|
6920
|
-
// avoid sliced strings https://github.com/video-dev/hls.js/issues/939
|
6921
|
-
frag.rawProgramDateTime = (' ' + result[5]).slice(1);
|
6922
|
-
frag.tagList.push(['PROGRAM-DATE-TIME', frag.rawProgramDateTime]);
|
6923
|
-
if (firstPdtIndex === -1) {
|
6924
|
-
firstPdtIndex = fragments.length;
|
6925
|
-
}
|
6926
6981
|
} else {
|
6927
6982
|
result = result[0].match(LEVEL_PLAYLIST_REGEX_SLOW);
|
6928
6983
|
if (!result) {
|
@@ -6930,7 +6985,7 @@ class M3U8Parser {
|
|
6930
6985
|
continue;
|
6931
6986
|
}
|
6932
6987
|
for (i = 1; i < result.length; i++) {
|
6933
|
-
if (
|
6988
|
+
if (result[i] !== undefined) {
|
6934
6989
|
break;
|
6935
6990
|
}
|
6936
6991
|
}
|
@@ -6938,8 +6993,23 @@ class M3U8Parser {
|
|
6938
6993
|
// avoid sliced strings https://github.com/video-dev/hls.js/issues/939
|
6939
6994
|
const tag = (' ' + result[i]).slice(1);
|
6940
6995
|
const value1 = (' ' + result[i + 1]).slice(1);
|
6941
|
-
const value2 = result[i + 2] ? (' ' + result[i + 2]).slice(1) :
|
6996
|
+
const value2 = result[i + 2] ? (' ' + result[i + 2]).slice(1) : null;
|
6942
6997
|
switch (tag) {
|
6998
|
+
case 'BYTERANGE':
|
6999
|
+
if (prevFrag) {
|
7000
|
+
frag.setByteRange(value1, prevFrag);
|
7001
|
+
} else {
|
7002
|
+
frag.setByteRange(value1);
|
7003
|
+
}
|
7004
|
+
break;
|
7005
|
+
case 'PROGRAM-DATE-TIME':
|
7006
|
+
// avoid sliced strings https://github.com/video-dev/hls.js/issues/939
|
7007
|
+
frag.rawProgramDateTime = value1;
|
7008
|
+
frag.tagList.push(['PROGRAM-DATE-TIME', value1]);
|
7009
|
+
if (firstPdtIndex === -1) {
|
7010
|
+
firstPdtIndex = fragments.length;
|
7011
|
+
}
|
7012
|
+
break;
|
6943
7013
|
case 'PLAYLIST-TYPE':
|
6944
7014
|
level.type = value1.toUpperCase();
|
6945
7015
|
break;
|
@@ -7054,7 +7124,7 @@ class M3U8Parser {
|
|
7054
7124
|
// Initial segment tag is after segment duration tag.
|
7055
7125
|
// #EXTINF: 6.0
|
7056
7126
|
// #EXT-X-MAP:URI="init.mp4
|
7057
|
-
const init = new Fragment(type,
|
7127
|
+
const init = new Fragment(type, base);
|
7058
7128
|
setInitSegment(init, mapAttrs, id, levelkeys);
|
7059
7129
|
currentInitSegment = init;
|
7060
7130
|
frag.initSegment = currentInitSegment;
|
@@ -7103,7 +7173,7 @@ class M3U8Parser {
|
|
7103
7173
|
const previousFragmentPart = currentPart > 0 ? partList[partList.length - 1] : undefined;
|
7104
7174
|
const index = currentPart++;
|
7105
7175
|
const partAttrs = new AttrList(value1, level);
|
7106
|
-
const part = new Part(partAttrs, frag,
|
7176
|
+
const part = new Part(partAttrs, frag, base, index, previousFragmentPart);
|
7107
7177
|
partList.push(part);
|
7108
7178
|
frag.duration += part.duration;
|
7109
7179
|
break;
|
@@ -7194,11 +7264,11 @@ function mapDateRanges(programDateTimes, details) {
|
|
7194
7264
|
for (let i = dateRangeIds.length; i--;) {
|
7195
7265
|
const dateRange = details.dateRanges[dateRangeIds[i]];
|
7196
7266
|
const startDateTime = dateRange.startDate.getTime();
|
7197
|
-
dateRange.tagAnchor = lastProgramDateTime;
|
7267
|
+
dateRange.tagAnchor = lastProgramDateTime.ref;
|
7198
7268
|
for (let j = programDateTimeCount; j--;) {
|
7199
7269
|
const fragIndex = findFragmentWithStartDate(details, startDateTime, programDateTimes, j, playlistEnd);
|
7200
7270
|
if (fragIndex !== -1) {
|
7201
|
-
dateRange.tagAnchor = details.fragments[fragIndex];
|
7271
|
+
dateRange.tagAnchor = details.fragments[fragIndex].ref;
|
7202
7272
|
break;
|
7203
7273
|
}
|
7204
7274
|
}
|
@@ -7207,25 +7277,27 @@ function mapDateRanges(programDateTimes, details) {
|
|
7207
7277
|
function findFragmentWithStartDate(details, startDateTime, programDateTimes, index, endTime) {
|
7208
7278
|
const pdtFragment = programDateTimes[index];
|
7209
7279
|
if (pdtFragment) {
|
7210
|
-
var _programDateTimes;
|
7211
7280
|
// find matching range between PDT tags
|
7212
|
-
const durationBetweenPdt = (((_programDateTimes = programDateTimes[index + 1]) == null ? void 0 : _programDateTimes.start) || endTime) - pdtFragment.start;
|
7213
7281
|
const pdtStart = pdtFragment.programDateTime;
|
7214
|
-
if (
|
7215
|
-
|
7216
|
-
const
|
7217
|
-
|
7218
|
-
|
7219
|
-
const
|
7220
|
-
const
|
7221
|
-
|
7222
|
-
const
|
7223
|
-
|
7224
|
-
|
7282
|
+
if (startDateTime >= pdtStart || index === 0) {
|
7283
|
+
var _programDateTimes;
|
7284
|
+
const durationBetweenPdt = (((_programDateTimes = programDateTimes[index + 1]) == null ? void 0 : _programDateTimes.start) || endTime) - pdtFragment.start;
|
7285
|
+
if (startDateTime <= pdtStart + durationBetweenPdt * 1000) {
|
7286
|
+
// map to fragment with date-time range
|
7287
|
+
const startIndex = programDateTimes[index].sn - details.startSN;
|
7288
|
+
const fragments = details.fragments;
|
7289
|
+
if (fragments.length > programDateTimes.length) {
|
7290
|
+
const endSegment = programDateTimes[index + 1] || fragments[fragments.length - 1];
|
7291
|
+
const endIndex = endSegment.sn - details.startSN;
|
7292
|
+
for (let i = endIndex; i > startIndex; i--) {
|
7293
|
+
const fragStartDateTime = fragments[i].programDateTime;
|
7294
|
+
if (startDateTime >= fragStartDateTime && startDateTime < fragStartDateTime + fragments[i].duration * 1000) {
|
7295
|
+
return i;
|
7296
|
+
}
|
7225
7297
|
}
|
7226
7298
|
}
|
7299
|
+
return startIndex;
|
7227
7300
|
}
|
7228
|
-
return startIndex;
|
7229
7301
|
}
|
7230
7302
|
}
|
7231
7303
|
return -1;
|
@@ -7290,12 +7362,6 @@ function backfillProgramDateTimes(fragments, firstPdtIndex) {
|
|
7290
7362
|
}
|
7291
7363
|
function assignProgramDateTime(frag, prevFrag, programDateTimes) {
|
7292
7364
|
if (frag.rawProgramDateTime) {
|
7293
|
-
frag.programDateTime = Date.parse(frag.rawProgramDateTime);
|
7294
|
-
if (!isFiniteNumber(frag.programDateTime)) {
|
7295
|
-
frag.programDateTime = null;
|
7296
|
-
frag.rawProgramDateTime = null;
|
7297
|
-
return;
|
7298
|
-
}
|
7299
7365
|
programDateTimes.push(frag);
|
7300
7366
|
} else if (prevFrag != null && prevFrag.programDateTime) {
|
7301
7367
|
frag.programDateTime = prevFrag.endProgramDateTime;
|
@@ -7339,19 +7405,19 @@ function updateFromToPTS(fragFrom, fragTo) {
|
|
7339
7405
|
frag = fragTo;
|
7340
7406
|
}
|
7341
7407
|
if (frag.duration !== duration) {
|
7342
|
-
frag.duration
|
7408
|
+
frag.setDuration(duration);
|
7343
7409
|
}
|
7344
7410
|
// we dont know startPTS[toIdx]
|
7345
7411
|
} else if (fragTo.sn > fragFrom.sn) {
|
7346
7412
|
const contiguous = fragFrom.cc === fragTo.cc;
|
7347
7413
|
// TODO: With part-loading end/durations we need to confirm the whole fragment is loaded before using (or setting) minEndPTS
|
7348
7414
|
if (contiguous && fragFrom.minEndPTS) {
|
7349
|
-
fragTo.
|
7415
|
+
fragTo.setStart(fragFrom.start + (fragFrom.minEndPTS - fragFrom.start));
|
7350
7416
|
} else {
|
7351
|
-
fragTo.
|
7417
|
+
fragTo.setStart(fragFrom.start + fragFrom.duration);
|
7352
7418
|
}
|
7353
7419
|
} else {
|
7354
|
-
fragTo.
|
7420
|
+
fragTo.setStart(Math.max(fragFrom.start - fragTo.duration, 0));
|
7355
7421
|
}
|
7356
7422
|
}
|
7357
7423
|
function updateFragPTSDTS(details, frag, startPTS, endPTS, startDTS, endDTS) {
|
@@ -7382,9 +7448,9 @@ function updateFragPTSDTS(details, frag, startPTS, endPTS, startDTS, endDTS) {
|
|
7382
7448
|
}
|
7383
7449
|
const drift = startPTS - frag.start;
|
7384
7450
|
if (frag.start !== 0) {
|
7385
|
-
frag.
|
7451
|
+
frag.setStart(startPTS);
|
7386
7452
|
}
|
7387
|
-
frag.
|
7453
|
+
frag.setDuration(endPTS - frag.start);
|
7388
7454
|
frag.startPTS = startPTS;
|
7389
7455
|
frag.maxStartPTS = maxStartPTS;
|
7390
7456
|
frag.startDTS = startDTS;
|
@@ -7447,13 +7513,13 @@ function mergeDetails(oldDetails, newDetails) {
|
|
7447
7513
|
ccOffset = oldFrag.cc - newFrag.cc;
|
7448
7514
|
}
|
7449
7515
|
if (isFiniteNumber(oldFrag.startPTS) && isFiniteNumber(oldFrag.endPTS)) {
|
7450
|
-
newFrag.
|
7516
|
+
newFrag.setStart(newFrag.startPTS = oldFrag.startPTS);
|
7451
7517
|
newFrag.startDTS = oldFrag.startDTS;
|
7452
7518
|
newFrag.maxStartPTS = oldFrag.maxStartPTS;
|
7453
7519
|
newFrag.endPTS = oldFrag.endPTS;
|
7454
7520
|
newFrag.endDTS = oldFrag.endDTS;
|
7455
7521
|
newFrag.minEndPTS = oldFrag.minEndPTS;
|
7456
|
-
newFrag.
|
7522
|
+
newFrag.setDuration(oldFrag.endPTS - oldFrag.startPTS);
|
7457
7523
|
if (newFrag.duration) {
|
7458
7524
|
PTSFrag = newFrag;
|
7459
7525
|
}
|
@@ -7461,9 +7527,13 @@ function mergeDetails(oldDetails, newDetails) {
|
|
7461
7527
|
// PTS is known when any segment has startPTS and endPTS
|
7462
7528
|
newDetails.PTSKnown = newDetails.alignedSliding = true;
|
7463
7529
|
}
|
7464
|
-
|
7530
|
+
if (oldFrag.hasStreams) {
|
7531
|
+
newFrag.elementaryStreams = oldFrag.elementaryStreams;
|
7532
|
+
}
|
7465
7533
|
newFrag.loader = oldFrag.loader;
|
7466
|
-
|
7534
|
+
if (oldFrag.hasStats) {
|
7535
|
+
newFrag.stats = oldFrag.stats;
|
7536
|
+
}
|
7467
7537
|
if (oldFrag.initSegment) {
|
7468
7538
|
newFrag.initSegment = oldFrag.initSegment;
|
7469
7539
|
currentInitSegment = oldFrag.initSegment;
|
@@ -7629,14 +7699,14 @@ function adjustSliding(oldDetails, newDetails, matchingStableVariantOrRendition
|
|
7629
7699
|
}
|
7630
7700
|
addSliding(newDetails, sliding);
|
7631
7701
|
}
|
7632
|
-
function addSliding(details,
|
7633
|
-
if (
|
7702
|
+
function addSliding(details, sliding) {
|
7703
|
+
if (sliding) {
|
7634
7704
|
const fragments = details.fragments;
|
7635
7705
|
for (let i = details.skippedSegments; i < fragments.length; i++) {
|
7636
|
-
fragments[i].
|
7706
|
+
fragments[i].addStart(sliding);
|
7637
7707
|
}
|
7638
7708
|
if (details.fragmentHint) {
|
7639
|
-
details.fragmentHint.
|
7709
|
+
details.fragmentHint.addStart(sliding);
|
7640
7710
|
}
|
7641
7711
|
}
|
7642
7712
|
}
|
@@ -9656,7 +9726,7 @@ var eventemitter3 = {exports: {}};
|
|
9656
9726
|
var eventemitter3Exports = eventemitter3.exports;
|
9657
9727
|
var EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
|
9658
9728
|
|
9659
|
-
const version = "1.6.0-beta.1.0.canary.
|
9729
|
+
const version = "1.6.0-beta.1.0.canary.10746";
|
9660
9730
|
|
9661
9731
|
// ensure the worker ends up in the bundle
|
9662
9732
|
// If the worker should not be included this gets aliased to empty.js
|
@@ -22535,7 +22605,7 @@ class InterstitialEvent {
|
|
22535
22605
|
}
|
22536
22606
|
}
|
22537
22607
|
function getSnapToFragmentTime(time, frag) {
|
22538
|
-
return time - frag.start < frag.duration / 2 && !(Math.abs(time - frag.
|
22608
|
+
return time - frag.start < frag.duration / 2 && !(Math.abs(time - (frag.start + frag.duration)) < ALIGNED_END_THRESHOLD_SECONDS) ? frag.start : frag.start + frag.duration;
|
22539
22609
|
}
|
22540
22610
|
function getInterstitialUrl(uri, sessionId, baseUrl) {
|
22541
22611
|
const url = new self.URL(uri, baseUrl);
|
@@ -29709,13 +29779,14 @@ class LatencyController {
|
|
29709
29779
|
return this._latency || 0;
|
29710
29780
|
}
|
29711
29781
|
get maxLatency() {
|
29782
|
+
var _this$hls;
|
29712
29783
|
const {
|
29713
29784
|
config
|
29714
29785
|
} = this;
|
29715
29786
|
if (config.liveMaxLatencyDuration !== undefined) {
|
29716
29787
|
return config.liveMaxLatencyDuration;
|
29717
29788
|
}
|
29718
|
-
const levelDetails = this.hls.latestLevelDetails;
|
29789
|
+
const levelDetails = (_this$hls = this.hls) == null ? void 0 : _this$hls.latestLevelDetails;
|
29719
29790
|
return levelDetails ? config.liveMaxLatencyDurationCount * levelDetails.targetduration : 0;
|
29720
29791
|
}
|
29721
29792
|
get targetLatency() {
|