hls.js 1.5.10-0.canary.10320 → 1.5.10-0.canary.10326
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 +61 -47
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +63 -48
- 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 +60 -46
- 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 +58 -45
- 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/base-stream-controller.ts +4 -3
- package/src/controller/fragment-finders.ts +34 -3
- package/src/controller/stream-controller.ts +7 -1
- package/src/demux/transmuxer-interface.ts +26 -16
- package/src/demux/transmuxer-worker.ts +1 -1
- package/src/demux/tsdemuxer.ts +31 -21
- package/src/utils/xhr-loader.ts +5 -5
package/dist/hls.light.js
CHANGED
@@ -580,7 +580,7 @@
|
|
580
580
|
// Some browsers don't allow to use bind on console object anyway
|
581
581
|
// fallback to default if needed
|
582
582
|
try {
|
583
|
-
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.10-0.canary.
|
583
|
+
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.10-0.canary.10326");
|
584
584
|
} catch (e) {
|
585
585
|
/* log fn threw an exception. All logger methods are no-ops. */
|
586
586
|
return createLogger();
|
@@ -5475,13 +5475,16 @@
|
|
5475
5475
|
* @param maxFragLookUpTolerance - The amount of time that a fragment's start/end can be within in order to be considered contiguous
|
5476
5476
|
* @returns a matching fragment or null
|
5477
5477
|
*/
|
5478
|
-
function findFragmentByPTS(fragPrevious, fragments, bufferEnd, maxFragLookUpTolerance) {
|
5478
|
+
function findFragmentByPTS(fragPrevious, fragments, bufferEnd, maxFragLookUpTolerance, nextFragLookupTolerance) {
|
5479
5479
|
if (bufferEnd === void 0) {
|
5480
5480
|
bufferEnd = 0;
|
5481
5481
|
}
|
5482
5482
|
if (maxFragLookUpTolerance === void 0) {
|
5483
5483
|
maxFragLookUpTolerance = 0;
|
5484
5484
|
}
|
5485
|
+
if (nextFragLookupTolerance === void 0) {
|
5486
|
+
nextFragLookupTolerance = 0.005;
|
5487
|
+
}
|
5485
5488
|
var fragNext = null;
|
5486
5489
|
if (fragPrevious) {
|
5487
5490
|
fragNext = fragments[fragPrevious.sn - fragments[0].sn + 1] || null;
|
@@ -5494,7 +5497,7 @@
|
|
5494
5497
|
fragNext = fragments[0];
|
5495
5498
|
}
|
5496
5499
|
// Prefer the next fragment if it's within tolerance
|
5497
|
-
if (fragNext && (!fragPrevious || fragPrevious.level === fragNext.level) && fragmentWithinToleranceTest(bufferEnd, maxFragLookUpTolerance, fragNext) === 0) {
|
5500
|
+
if (fragNext && ((!fragPrevious || fragPrevious.level === fragNext.level) && fragmentWithinToleranceTest(bufferEnd, maxFragLookUpTolerance, fragNext) === 0 || fragmentWithinFastStartSwitch(fragNext, fragPrevious, Math.min(nextFragLookupTolerance, maxFragLookUpTolerance)))) {
|
5498
5501
|
return fragNext;
|
5499
5502
|
}
|
5500
5503
|
// We might be seeking past the tolerance so find the best match
|
@@ -5505,6 +5508,18 @@
|
|
5505
5508
|
// If no match was found return the next fragment after fragPrevious, or null
|
5506
5509
|
return fragNext;
|
5507
5510
|
}
|
5511
|
+
function fragmentWithinFastStartSwitch(fragNext, fragPrevious, nextFragLookupTolerance) {
|
5512
|
+
if (fragPrevious && fragPrevious.start === 0 && fragPrevious.level < fragNext.level && (fragPrevious.endPTS || 0) > 0) {
|
5513
|
+
var firstDuration = fragPrevious.tagList.reduce(function (duration, tag) {
|
5514
|
+
if (tag[0] === 'INF') {
|
5515
|
+
duration += parseFloat(tag[1]);
|
5516
|
+
}
|
5517
|
+
return duration;
|
5518
|
+
}, nextFragLookupTolerance);
|
5519
|
+
return fragNext.start <= firstDuration;
|
5520
|
+
}
|
5521
|
+
return false;
|
5522
|
+
}
|
5508
5523
|
|
5509
5524
|
/**
|
5510
5525
|
* The test function used by the findFragmentBySn's BinarySearch to look for the best match to the current buffer conditions.
|
@@ -9271,8 +9286,6 @@
|
|
9271
9286
|
this.config = null;
|
9272
9287
|
this.context = null;
|
9273
9288
|
this.xhrSetup = null;
|
9274
|
-
// @ts-ignore
|
9275
|
-
this.stats = null;
|
9276
9289
|
};
|
9277
9290
|
_proto.abortInternal = function abortInternal() {
|
9278
9291
|
var loader = this.loader;
|
@@ -9319,13 +9332,14 @@
|
|
9319
9332
|
var xhrSetup = this.xhrSetup;
|
9320
9333
|
if (xhrSetup) {
|
9321
9334
|
Promise.resolve().then(function () {
|
9322
|
-
if (_this.stats.aborted) return;
|
9335
|
+
if (_this.loader !== xhr || _this.stats.aborted) return;
|
9323
9336
|
return xhrSetup(xhr, context.url);
|
9324
9337
|
}).catch(function (error) {
|
9338
|
+
if (_this.loader !== xhr || _this.stats.aborted) return;
|
9325
9339
|
xhr.open('GET', context.url, true);
|
9326
9340
|
return xhrSetup(xhr, context.url);
|
9327
9341
|
}).then(function () {
|
9328
|
-
if (_this.stats.aborted) return;
|
9342
|
+
if (_this.loader !== xhr || _this.stats.aborted) return;
|
9329
9343
|
_this.openAndSendXhr(xhr, context, config);
|
9330
9344
|
}).catch(function (error) {
|
9331
9345
|
// IE11 throws an exception on xhr.open if attempting to access an HTTP resource over HTTPS
|
@@ -9442,8 +9456,8 @@
|
|
9442
9456
|
}
|
9443
9457
|
};
|
9444
9458
|
_proto.loadtimeout = function loadtimeout() {
|
9445
|
-
|
9446
|
-
var retryConfig =
|
9459
|
+
if (!this.config) return;
|
9460
|
+
var retryConfig = this.config.loadPolicy.timeoutRetry;
|
9447
9461
|
var retryCount = this.stats.retry;
|
9448
9462
|
if (shouldRetry(retryConfig, retryCount, true)) {
|
9449
9463
|
this.retry(retryConfig);
|
@@ -12791,7 +12805,7 @@
|
|
12791
12805
|
if (_this3.state === State.STOPPED || _this3.state === State.ERROR) {
|
12792
12806
|
return;
|
12793
12807
|
}
|
12794
|
-
_this3.warn(reason);
|
12808
|
+
_this3.warn("Frag error: " + ((reason == null ? void 0 : reason.message) || reason));
|
12795
12809
|
_this3.resetFragmentLoading(frag);
|
12796
12810
|
});
|
12797
12811
|
};
|
@@ -13473,7 +13487,7 @@
|
|
13473
13487
|
var fragments = levelDetails.fragments,
|
13474
13488
|
endSN = levelDetails.endSN;
|
13475
13489
|
var fragmentHint = levelDetails.fragmentHint;
|
13476
|
-
var
|
13490
|
+
var maxFragLookUpTolerance = config.maxFragLookUpTolerance;
|
13477
13491
|
var partList = levelDetails.partList;
|
13478
13492
|
var loadingParts = !!(this.loadingParts && partList != null && partList.length && fragmentHint);
|
13479
13493
|
if (loadingParts && fragmentHint && !this.bitrateTest) {
|
@@ -13483,7 +13497,7 @@
|
|
13483
13497
|
}
|
13484
13498
|
var frag;
|
13485
13499
|
if (bufferEnd < end) {
|
13486
|
-
var lookupTolerance = bufferEnd > end -
|
13500
|
+
var lookupTolerance = bufferEnd > end - maxFragLookUpTolerance ? 0 : maxFragLookUpTolerance;
|
13487
13501
|
// Remove the tolerance if it would put the bufferEnd past the actual end of stream
|
13488
13502
|
// Uses buffer and sequence number to calculate switch segment (required if using EXT-X-DISCONTINUITY-SEQUENCE)
|
13489
13503
|
frag = findFragmentByPTS(fragPrevious, fragments, bufferEnd, lookupTolerance);
|
@@ -15774,7 +15788,7 @@
|
|
15774
15788
|
if (stt) {
|
15775
15789
|
offset += data[offset] + 1;
|
15776
15790
|
}
|
15777
|
-
var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes);
|
15791
|
+
var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer);
|
15778
15792
|
|
15779
15793
|
// only update track id if track PID found while parsing PMT
|
15780
15794
|
// this is to avoid resetting the PID to -1 in case
|
@@ -15817,14 +15831,7 @@
|
|
15817
15831
|
}
|
15818
15832
|
}
|
15819
15833
|
if (tsPacketErrors > 0) {
|
15820
|
-
|
15821
|
-
this.observer.emit(Events.ERROR, Events.ERROR, {
|
15822
|
-
type: ErrorTypes.MEDIA_ERROR,
|
15823
|
-
details: ErrorDetails.FRAG_PARSING_ERROR,
|
15824
|
-
fatal: false,
|
15825
|
-
error: error,
|
15826
|
-
reason: error.message
|
15827
|
-
});
|
15834
|
+
emitParsingError(this.observer, new Error("Found " + tsPacketErrors + " TS packet/s that do not start with 0x47"));
|
15828
15835
|
}
|
15829
15836
|
videoTrack.pesData = videoData;
|
15830
15837
|
audioTrack.pesData = audioData;
|
@@ -15976,16 +15983,7 @@
|
|
15976
15983
|
} else {
|
15977
15984
|
reason = 'No ADTS header found in AAC PES';
|
15978
15985
|
}
|
15979
|
-
|
15980
|
-
logger.warn("parsing error: " + reason);
|
15981
|
-
this.observer.emit(Events.ERROR, Events.ERROR, {
|
15982
|
-
type: ErrorTypes.MEDIA_ERROR,
|
15983
|
-
details: ErrorDetails.FRAG_PARSING_ERROR,
|
15984
|
-
fatal: false,
|
15985
|
-
levelRetry: recoverable,
|
15986
|
-
error: error,
|
15987
|
-
reason: reason
|
15988
|
-
});
|
15986
|
+
emitParsingError(this.observer, new Error(reason), recoverable);
|
15989
15987
|
if (!recoverable) {
|
15990
15988
|
return;
|
15991
15989
|
}
|
@@ -16072,7 +16070,7 @@
|
|
16072
16070
|
// skip the PSI header and parse the first PMT entry
|
16073
16071
|
return (data[offset + 10] & 0x1f) << 8 | data[offset + 11];
|
16074
16072
|
}
|
16075
|
-
function parsePMT(data, offset, typeSupported, isSampleAes) {
|
16073
|
+
function parsePMT(data, offset, typeSupported, isSampleAes, observer) {
|
16076
16074
|
var result = {
|
16077
16075
|
audioPid: -1,
|
16078
16076
|
videoPid: -1,
|
@@ -16180,11 +16178,13 @@
|
|
16180
16178
|
case 0xc2: // SAMPLE-AES EC3
|
16181
16179
|
/* falls through */
|
16182
16180
|
case 0x87:
|
16183
|
-
|
16181
|
+
emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'));
|
16182
|
+
return result;
|
16184
16183
|
case 0x24:
|
16185
16184
|
// ITU-T Rec. H.265 and ISO/IEC 23008-2 (HEVC)
|
16186
16185
|
{
|
16187
|
-
|
16186
|
+
emitParsingError(observer, new Error('Unsupported HEVC in M2TS found'));
|
16187
|
+
return result;
|
16188
16188
|
}
|
16189
16189
|
}
|
16190
16190
|
// move to the next table entry
|
@@ -16193,6 +16193,17 @@
|
|
16193
16193
|
}
|
16194
16194
|
return result;
|
16195
16195
|
}
|
16196
|
+
function emitParsingError(observer, error, levelRetry) {
|
16197
|
+
logger.warn("parsing error: " + error.message);
|
16198
|
+
observer.emit(Events.ERROR, Events.ERROR, {
|
16199
|
+
type: ErrorTypes.MEDIA_ERROR,
|
16200
|
+
details: ErrorDetails.FRAG_PARSING_ERROR,
|
16201
|
+
fatal: false,
|
16202
|
+
levelRetry: levelRetry,
|
16203
|
+
error: error,
|
16204
|
+
reason: error.message
|
16205
|
+
});
|
16206
|
+
}
|
16196
16207
|
function logEncryptedSamplesFoundInUnencryptedStream(type) {
|
16197
16208
|
logger.log(type + " with AES-128-CBC encryption found in unencrypted stream");
|
16198
16209
|
}
|
@@ -18927,7 +18938,7 @@
|
|
18927
18938
|
case 'init':
|
18928
18939
|
{
|
18929
18940
|
var config = JSON.parse(data.config);
|
18930
|
-
self.transmuxer = new Transmuxer(observer, data.typeSupported, config,
|
18941
|
+
self.transmuxer = new Transmuxer(observer, data.typeSupported, config, '', data.id);
|
18931
18942
|
var logger = enableLogs(config.debug, data.id);
|
18932
18943
|
forwardWorkerLogs(logger);
|
18933
18944
|
forwardMessage('init', null);
|
@@ -19104,10 +19115,6 @@
|
|
19104
19115
|
this.observer.on(Events.FRAG_DECRYPTED, forwardMessage);
|
19105
19116
|
this.observer.on(Events.ERROR, forwardMessage);
|
19106
19117
|
var m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);
|
19107
|
-
|
19108
|
-
// navigator.vendor is not always available in Web Worker
|
19109
|
-
// refer to https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/navigator
|
19110
|
-
var vendor = navigator.vendor;
|
19111
19118
|
if (this.useWorker && typeof Worker !== 'undefined') {
|
19112
19119
|
var canCreateWorker = config.workerPath || hasUMDWorker();
|
19113
19120
|
if (canCreateWorker) {
|
@@ -19119,8 +19126,8 @@
|
|
19119
19126
|
logger.log("injecting Web Worker for \"" + id + "\"");
|
19120
19127
|
this.workerContext = injectWorker();
|
19121
19128
|
}
|
19122
|
-
this.onwmsg = function (
|
19123
|
-
return _this.onWorkerMessage(
|
19129
|
+
this.onwmsg = function (event) {
|
19130
|
+
return _this.onWorkerMessage(event);
|
19124
19131
|
};
|
19125
19132
|
var worker = this.workerContext.worker;
|
19126
19133
|
worker.addEventListener('message', this.onwmsg);
|
@@ -19139,7 +19146,7 @@
|
|
19139
19146
|
worker.postMessage({
|
19140
19147
|
cmd: 'init',
|
19141
19148
|
typeSupported: m2tsTypeSupported,
|
19142
|
-
vendor:
|
19149
|
+
vendor: '',
|
19143
19150
|
id: id,
|
19144
19151
|
config: JSON.stringify(config)
|
19145
19152
|
});
|
@@ -19147,12 +19154,12 @@
|
|
19147
19154
|
logger.warn("Error setting up \"" + id + "\" Web Worker, fallback to inline", err);
|
19148
19155
|
this.resetWorker();
|
19149
19156
|
this.error = null;
|
19150
|
-
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config,
|
19157
|
+
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
|
19151
19158
|
}
|
19152
19159
|
return;
|
19153
19160
|
}
|
19154
19161
|
}
|
19155
|
-
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config,
|
19162
|
+
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
|
19156
19163
|
}
|
19157
19164
|
var _proto = TransmuxerInterface.prototype;
|
19158
19165
|
_proto.resetWorker = function resetWorker() {
|
@@ -19298,9 +19305,16 @@
|
|
19298
19305
|
});
|
19299
19306
|
this.onFlush(chunkMeta);
|
19300
19307
|
};
|
19301
|
-
_proto.onWorkerMessage = function onWorkerMessage(
|
19302
|
-
var data =
|
19308
|
+
_proto.onWorkerMessage = function onWorkerMessage(event) {
|
19309
|
+
var data = event.data;
|
19310
|
+
if (!(data != null && data.event)) {
|
19311
|
+
logger.warn("worker message received with no " + (data ? 'event name' : 'data'));
|
19312
|
+
return;
|
19313
|
+
}
|
19303
19314
|
var hls = this.hls;
|
19315
|
+
if (!this.hls) {
|
19316
|
+
return;
|
19317
|
+
}
|
19304
19318
|
switch (data.event) {
|
19305
19319
|
case 'init':
|
19306
19320
|
{
|
@@ -20643,7 +20657,8 @@
|
|
20643
20657
|
// In the case that AAC and HE-AAC audio codecs are signalled in manifest,
|
20644
20658
|
// force HE-AAC, as it seems that most browsers prefers it.
|
20645
20659
|
// don't force HE-AAC if mono stream, or in Firefox
|
20646
|
-
|
20660
|
+
var audioMetadata = audio.metadata;
|
20661
|
+
if (audioMetadata && 'channelCount' in audioMetadata && (audioMetadata.channelCount || 1) !== 1 && ua.indexOf('firefox') === -1) {
|
20647
20662
|
audioCodec = 'mp4a.40.5';
|
20648
20663
|
}
|
20649
20664
|
}
|
@@ -21694,7 +21709,7 @@
|
|
21694
21709
|
* Get the video-dev/hls.js package version.
|
21695
21710
|
*/
|
21696
21711
|
function get() {
|
21697
|
-
return "1.5.10-0.canary.
|
21712
|
+
return "1.5.10-0.canary.10326";
|
21698
21713
|
}
|
21699
21714
|
}, {
|
21700
21715
|
key: "Events",
|