hls.js 1.5.14-0.canary.10429 → 1.5.14-0.canary.10432
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 +351 -268
- package/dist/hls.js.d.ts +6 -2
- package/dist/hls.js.map +1 -1
- package/dist/hls.light.js +351 -271
- 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 +276 -204
- 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 +276 -201
- 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 +28 -20
- package/src/demux/audio/aacdemuxer.ts +3 -3
- package/src/demux/audio/ac3-demuxer.ts +1 -1
- package/src/demux/inject-worker.ts +38 -4
- package/src/demux/transmuxer-interface.ts +98 -67
- package/src/demux/transmuxer-worker.ts +110 -76
- package/src/demux/transmuxer.ts +29 -16
- package/src/demux/tsdemuxer.ts +47 -24
- package/src/hls.ts +2 -1
- package/src/remux/mp4-remuxer.ts +24 -23
- package/src/remux/passthrough-remuxer.ts +22 -7
- package/src/utils/discontinuities.ts +21 -47
- package/src/version.ts +1 -0
package/dist/hls.js
CHANGED
@@ -522,7 +522,7 @@
|
|
522
522
|
// Some browsers don't allow to use bind on console object anyway
|
523
523
|
// fallback to default if needed
|
524
524
|
try {
|
525
|
-
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.14-0.canary.
|
525
|
+
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.14-0.canary.10432");
|
526
526
|
} catch (e) {
|
527
527
|
/* log fn threw an exception. All logger methods are no-ops. */
|
528
528
|
return createLogger();
|
@@ -9004,30 +9004,14 @@
|
|
9004
9004
|
}
|
9005
9005
|
return null;
|
9006
9006
|
}
|
9007
|
-
function shouldAlignOnDiscontinuities(
|
9008
|
-
if (
|
9009
|
-
if (details.
|
9007
|
+
function shouldAlignOnDiscontinuities(refDetails, details) {
|
9008
|
+
if (refDetails) {
|
9009
|
+
if (details.startCC < refDetails.endCC && details.endCC > refDetails.startCC) {
|
9010
9010
|
return true;
|
9011
9011
|
}
|
9012
9012
|
}
|
9013
9013
|
return false;
|
9014
9014
|
}
|
9015
|
-
|
9016
|
-
// Find the first frag in the previous level which matches the CC of the first frag of the new level
|
9017
|
-
function findDiscontinuousReferenceFrag(prevDetails, curDetails) {
|
9018
|
-
var prevFrags = prevDetails.fragments;
|
9019
|
-
var curFrags = curDetails.fragments;
|
9020
|
-
if (!curFrags.length || !prevFrags.length) {
|
9021
|
-
logger.log('No fragments to align');
|
9022
|
-
return;
|
9023
|
-
}
|
9024
|
-
var prevStartFrag = findFirstFragWithCC(prevFrags, curFrags[0].cc);
|
9025
|
-
if (!prevStartFrag || prevStartFrag && !prevStartFrag.startPTS) {
|
9026
|
-
logger.log('No frag in previous level to align on');
|
9027
|
-
return;
|
9028
|
-
}
|
9029
|
-
return prevStartFrag;
|
9030
|
-
}
|
9031
9015
|
function adjustFragmentStart(frag, sliding) {
|
9032
9016
|
if (frag) {
|
9033
9017
|
var start = frag.start + sliding;
|
@@ -9062,7 +9046,7 @@
|
|
9062
9046
|
if (!switchDetails) {
|
9063
9047
|
return;
|
9064
9048
|
}
|
9065
|
-
alignDiscontinuities(
|
9049
|
+
alignDiscontinuities(details, switchDetails);
|
9066
9050
|
if (!details.alignedSliding && switchDetails) {
|
9067
9051
|
// If the PTS wasn't figured out via discontinuity sequence that means there was no CC increase within the level.
|
9068
9052
|
// Aligning via Program Date Time should therefore be reliable, since PDT should be the same within the same
|
@@ -9078,20 +9062,24 @@
|
|
9078
9062
|
}
|
9079
9063
|
|
9080
9064
|
/**
|
9081
|
-
*
|
9082
|
-
* discontinuity sequence.
|
9083
|
-
* @param lastFrag - The last Fragment which shares the same discontinuity sequence
|
9065
|
+
* Ajust the start of fragments in `details` by the difference in time between fragments of the latest
|
9066
|
+
* shared discontinuity sequence change.
|
9084
9067
|
* @param lastLevel - The details of the last loaded level
|
9085
9068
|
* @param details - The details of the new level
|
9086
9069
|
*/
|
9087
|
-
function alignDiscontinuities(
|
9088
|
-
if (shouldAlignOnDiscontinuities(
|
9089
|
-
|
9090
|
-
if (referenceFrag && isFiniteNumber(referenceFrag.start)) {
|
9091
|
-
logger.log("Adjusting PTS using last level due to CC increase within current level " + details.url);
|
9092
|
-
adjustSlidingStart(referenceFrag.start, details);
|
9093
|
-
}
|
9070
|
+
function alignDiscontinuities(details, refDetails) {
|
9071
|
+
if (!shouldAlignOnDiscontinuities(refDetails, details)) {
|
9072
|
+
return;
|
9094
9073
|
}
|
9074
|
+
var targetCC = Math.min(refDetails.endCC, details.endCC);
|
9075
|
+
var refFrag = findFirstFragWithCC(refDetails.fragments, targetCC);
|
9076
|
+
var frag = findFirstFragWithCC(details.fragments, targetCC);
|
9077
|
+
if (!refFrag || !frag) {
|
9078
|
+
return;
|
9079
|
+
}
|
9080
|
+
logger.log("Aligning playlist at start of dicontinuity sequence " + targetCC);
|
9081
|
+
var delta = refFrag.start - frag.start;
|
9082
|
+
adjustSlidingStart(delta, details);
|
9095
9083
|
}
|
9096
9084
|
|
9097
9085
|
/**
|
@@ -10200,6 +10188,10 @@
|
|
10200
10188
|
};
|
10201
10189
|
_proto.onHandlerDestroying = function onHandlerDestroying() {
|
10202
10190
|
this.stopLoad();
|
10191
|
+
if (this.transmuxer) {
|
10192
|
+
this.transmuxer.destroy();
|
10193
|
+
this.transmuxer = null;
|
10194
|
+
}
|
10203
10195
|
_TaskLoop.prototype.onHandlerDestroying.call(this);
|
10204
10196
|
// @ts-ignore
|
10205
10197
|
this.hls = this.onMediaSeeking = this.onMediaEnded = null;
|
@@ -10247,7 +10239,7 @@
|
|
10247
10239
|
return;
|
10248
10240
|
}
|
10249
10241
|
if ('payload' in data) {
|
10250
|
-
_this3.log("Loaded
|
10242
|
+
_this3.log("Loaded " + frag.type + " sn: " + frag.sn + " of " + _this3.playlistLabel() + " " + frag.level);
|
10251
10243
|
_this3.hls.trigger(Events.FRAG_LOADED, data);
|
10252
10244
|
}
|
10253
10245
|
|
@@ -10391,9 +10383,9 @@
|
|
10391
10383
|
return !frag || !fragCurrent || frag.sn !== fragCurrent.sn || frag.level !== fragCurrent.level;
|
10392
10384
|
};
|
10393
10385
|
_proto.fragBufferedComplete = function fragBufferedComplete(frag, part) {
|
10394
|
-
var
|
10386
|
+
var _this$fragCurrent, _this$fragPrevious;
|
10395
10387
|
var media = this.mediaBuffer ? this.mediaBuffer : this.media;
|
10396
|
-
this.log("Buffered " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " +
|
10388
|
+
this.log("Buffered " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag) + " > buffer:" + (media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : '(detached)') + ")");
|
10397
10389
|
if (frag.sn !== 'initSegment') {
|
10398
10390
|
var _this$levels;
|
10399
10391
|
if (frag.type !== PlaylistLevelType.SUBTITLE) {
|
@@ -10455,7 +10447,7 @@
|
|
10455
10447
|
}
|
10456
10448
|
var keyLoadingPromise = null;
|
10457
10449
|
if (frag.encrypted && !((_frag$decryptdata = frag.decryptdata) != null && _frag$decryptdata.key)) {
|
10458
|
-
this.log("Loading key for " + frag.sn + " of [" + details.startSN + "-" + details.endSN + "], " +
|
10450
|
+
this.log("Loading key for " + frag.sn + " of [" + details.startSN + "-" + details.endSN + "], " + this.playlistLabel() + " " + frag.level);
|
10459
10451
|
this.state = State.KEY_LOADING;
|
10460
10452
|
this.fragCurrent = frag;
|
10461
10453
|
keyLoadingPromise = this.keyLoader.load(frag).then(function (keyLoadedData) {
|
@@ -10494,7 +10486,7 @@
|
|
10494
10486
|
var partIndex = this.getNextPart(partList, frag, targetBufferTime);
|
10495
10487
|
if (partIndex > -1) {
|
10496
10488
|
var part = partList[partIndex];
|
10497
|
-
this.log("Loading part sn: " + frag.sn + " p: " + part.index + " cc: " + frag.cc + " of playlist [" + details.startSN + "-" + details.endSN + "] parts [0-" + partIndex + "-" + (partList.length - 1) + "] " +
|
10489
|
+
this.log("Loading part sn: " + frag.sn + " p: " + part.index + " cc: " + frag.cc + " of playlist [" + details.startSN + "-" + details.endSN + "] parts [0-" + partIndex + "-" + (partList.length - 1) + "] " + this.playlistLabel() + ": " + frag.level + ", target: " + parseFloat(targetBufferTime.toFixed(3)));
|
10498
10490
|
this.nextLoadPosition = part.start + part.duration;
|
10499
10491
|
this.state = State.FRAG_LOADING;
|
10500
10492
|
var _result;
|
@@ -10534,7 +10526,7 @@
|
|
10534
10526
|
// Selected fragment hint for part but not loading parts
|
10535
10527
|
return Promise.resolve(null);
|
10536
10528
|
}
|
10537
|
-
this.log("Loading
|
10529
|
+
this.log("Loading " + frag.type + " sn: " + frag.sn + " of " + this.fragInfo(frag, false) + ") cc: " + frag.cc + " " + (details ? '[' + details.startSN + '-' + details.endSN + ']' : '') + ", target: " + parseFloat(targetBufferTime.toFixed(3)));
|
10538
10530
|
// Don't update nextLoadPosition for fragments which are not buffered
|
10539
10531
|
if (isFiniteNumber(frag.sn) && !this.bitrateTest) {
|
10540
10532
|
this.nextLoadPosition = frag.start + frag.duration;
|
@@ -11298,16 +11290,25 @@
|
|
11298
11290
|
// For this error fallthrough. Marking parsed will allow advancing to next fragment.
|
11299
11291
|
}
|
11300
11292
|
this.state = State.PARSED;
|
11293
|
+
this.log("Parsed " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag) + ")");
|
11301
11294
|
this.hls.trigger(Events.FRAG_PARSED, {
|
11302
11295
|
frag: frag,
|
11303
11296
|
part: part
|
11304
11297
|
});
|
11305
11298
|
};
|
11306
|
-
_proto.
|
11307
|
-
|
11308
|
-
|
11309
|
-
|
11299
|
+
_proto.playlistLabel = function playlistLabel() {
|
11300
|
+
return this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track';
|
11301
|
+
};
|
11302
|
+
_proto.fragInfo = function fragInfo(frag, pts) {
|
11303
|
+
var _ref3, _ref4;
|
11304
|
+
if (pts === void 0) {
|
11305
|
+
pts = true;
|
11310
11306
|
}
|
11307
|
+
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) + "]";
|
11308
|
+
};
|
11309
|
+
_proto.resetTransmuxer = function resetTransmuxer() {
|
11310
|
+
var _this$transmuxer2;
|
11311
|
+
(_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
|
11311
11312
|
};
|
11312
11313
|
_proto.recoverWorkerError = function recoverWorkerError(data) {
|
11313
11314
|
if (data.event === 'demuxerWorker') {
|
@@ -12055,7 +12056,7 @@
|
|
12055
12056
|
|
12056
12057
|
// Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS
|
12057
12058
|
;
|
12058
|
-
AACDemuxer.probe = function probe$2(data) {
|
12059
|
+
AACDemuxer.probe = function probe$2(data, logger) {
|
12059
12060
|
if (!data) {
|
12060
12061
|
return false;
|
12061
12062
|
}
|
@@ -13724,7 +13725,8 @@
|
|
13724
13725
|
|
13725
13726
|
var PACKET_LENGTH = 188;
|
13726
13727
|
var TSDemuxer = /*#__PURE__*/function () {
|
13727
|
-
function TSDemuxer(observer, config, typeSupported) {
|
13728
|
+
function TSDemuxer(observer, config, typeSupported, logger) {
|
13729
|
+
this.logger = void 0;
|
13728
13730
|
this.observer = void 0;
|
13729
13731
|
this.config = void 0;
|
13730
13732
|
this.typeSupported = void 0;
|
@@ -13744,9 +13746,10 @@
|
|
13744
13746
|
this.observer = observer;
|
13745
13747
|
this.config = config;
|
13746
13748
|
this.typeSupported = typeSupported;
|
13749
|
+
this.logger = logger;
|
13747
13750
|
this.videoParser = null;
|
13748
13751
|
}
|
13749
|
-
TSDemuxer.probe = function probe(data) {
|
13752
|
+
TSDemuxer.probe = function probe(data, logger) {
|
13750
13753
|
var syncOffset = TSDemuxer.syncOffset(data);
|
13751
13754
|
if (syncOffset > 0) {
|
13752
13755
|
logger.warn("MPEG2-TS detected but first sync word found @ offset " + syncOffset);
|
@@ -13913,7 +13916,7 @@
|
|
13913
13916
|
switch (pid) {
|
13914
13917
|
case videoPid:
|
13915
13918
|
if (stt) {
|
13916
|
-
if (videoData && (pes = parsePES(videoData))) {
|
13919
|
+
if (videoData && (pes = parsePES(videoData, this.logger))) {
|
13917
13920
|
if (this.videoParser === null) {
|
13918
13921
|
switch (videoTrack.segmentCodec) {
|
13919
13922
|
case 'avc':
|
@@ -13942,7 +13945,7 @@
|
|
13942
13945
|
break;
|
13943
13946
|
case audioPid:
|
13944
13947
|
if (stt) {
|
13945
|
-
if (audioData && (pes = parsePES(audioData))) {
|
13948
|
+
if (audioData && (pes = parsePES(audioData, this.logger))) {
|
13946
13949
|
switch (audioTrack.segmentCodec) {
|
13947
13950
|
case 'aac':
|
13948
13951
|
this.parseAACPES(audioTrack, pes);
|
@@ -13969,7 +13972,7 @@
|
|
13969
13972
|
break;
|
13970
13973
|
case id3Pid:
|
13971
13974
|
if (stt) {
|
13972
|
-
if (id3Data && (pes = parsePES(id3Data))) {
|
13975
|
+
if (id3Data && (pes = parsePES(id3Data, this.logger))) {
|
13973
13976
|
this.parseID3PES(id3Track, pes);
|
13974
13977
|
}
|
13975
13978
|
id3Data = {
|
@@ -13987,14 +13990,14 @@
|
|
13987
13990
|
offset += data[offset] + 1;
|
13988
13991
|
}
|
13989
13992
|
pmtId = this._pmtId = parsePAT(data, offset);
|
13990
|
-
// logger.log('PMT PID:' + this._pmtId);
|
13993
|
+
// this.logger.log('PMT PID:' + this._pmtId);
|
13991
13994
|
break;
|
13992
13995
|
case pmtId:
|
13993
13996
|
{
|
13994
13997
|
if (stt) {
|
13995
13998
|
offset += data[offset] + 1;
|
13996
13999
|
}
|
13997
|
-
var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer);
|
14000
|
+
var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer, this.logger);
|
13998
14001
|
|
13999
14002
|
// only update track id if track PID found while parsing PMT
|
14000
14003
|
// this is to avoid resetting the PID to -1 in case
|
@@ -14017,7 +14020,7 @@
|
|
14017
14020
|
id3Track.pid = id3Pid;
|
14018
14021
|
}
|
14019
14022
|
if (unknownPID !== null && !pmtParsed) {
|
14020
|
-
logger.warn("MPEG-TS PMT found at " + start + " after unknown PID '" + unknownPID + "'. Backtracking to sync byte @" + syncOffset + " to parse all TS packets.");
|
14023
|
+
this.logger.warn("MPEG-TS PMT found at " + start + " after unknown PID '" + unknownPID + "'. Backtracking to sync byte @" + syncOffset + " to parse all TS packets.");
|
14021
14024
|
unknownPID = null;
|
14022
14025
|
// we set it to -188, the += 188 in the for loop will reset start to 0
|
14023
14026
|
start = syncOffset - 188;
|
@@ -14037,7 +14040,7 @@
|
|
14037
14040
|
}
|
14038
14041
|
}
|
14039
14042
|
if (tsPacketErrors > 0) {
|
14040
|
-
emitParsingError(this.observer, new Error("Found " + tsPacketErrors + " TS packet/s that do not start with 0x47"));
|
14043
|
+
emitParsingError(this.observer, new Error("Found " + tsPacketErrors + " TS packet/s that do not start with 0x47"), undefined, this.logger);
|
14041
14044
|
}
|
14042
14045
|
videoTrack.pesData = videoData;
|
14043
14046
|
audioTrack.pesData = audioData;
|
@@ -14083,7 +14086,7 @@
|
|
14083
14086
|
var id3Data = id3Track.pesData;
|
14084
14087
|
// try to parse last PES packets
|
14085
14088
|
var pes;
|
14086
|
-
if (videoData && (pes = parsePES(videoData))) {
|
14089
|
+
if (videoData && (pes = parsePES(videoData, this.logger))) {
|
14087
14090
|
if (this.videoParser === null) {
|
14088
14091
|
switch (videoTrack.segmentCodec) {
|
14089
14092
|
case 'avc':
|
@@ -14104,7 +14107,7 @@
|
|
14104
14107
|
// either avcData null or PES truncated, keep it for next frag parsing
|
14105
14108
|
videoTrack.pesData = videoData;
|
14106
14109
|
}
|
14107
|
-
if (audioData && (pes = parsePES(audioData))) {
|
14110
|
+
if (audioData && (pes = parsePES(audioData, this.logger))) {
|
14108
14111
|
switch (audioTrack.segmentCodec) {
|
14109
14112
|
case 'aac':
|
14110
14113
|
this.parseAACPES(audioTrack, pes);
|
@@ -14121,13 +14124,13 @@
|
|
14121
14124
|
audioTrack.pesData = null;
|
14122
14125
|
} else {
|
14123
14126
|
if (audioData != null && audioData.size) {
|
14124
|
-
logger.log('last AAC PES packet truncated,might overlap between fragments');
|
14127
|
+
this.logger.log('last AAC PES packet truncated,might overlap between fragments');
|
14125
14128
|
}
|
14126
14129
|
|
14127
14130
|
// either audioData null or PES truncated, keep it for next frag parsing
|
14128
14131
|
audioTrack.pesData = audioData;
|
14129
14132
|
}
|
14130
|
-
if (id3Data && (pes = parsePES(id3Data))) {
|
14133
|
+
if (id3Data && (pes = parsePES(id3Data, this.logger))) {
|
14131
14134
|
this.parseID3PES(id3Track, pes);
|
14132
14135
|
id3Track.pesData = null;
|
14133
14136
|
} else {
|
@@ -14199,7 +14202,7 @@
|
|
14199
14202
|
} else {
|
14200
14203
|
reason = 'No ADTS header found in AAC PES';
|
14201
14204
|
}
|
14202
|
-
emitParsingError(this.observer, new Error(reason), recoverable);
|
14205
|
+
emitParsingError(this.observer, new Error(reason), recoverable, this.logger);
|
14203
14206
|
if (!recoverable) {
|
14204
14207
|
return;
|
14205
14208
|
}
|
@@ -14214,7 +14217,7 @@
|
|
14214
14217
|
var frameDuration = getFrameDuration(track.samplerate);
|
14215
14218
|
pts = aacOverFlow.sample.pts + frameDuration;
|
14216
14219
|
} else {
|
14217
|
-
logger.warn('[tsdemuxer]: AAC PES unknown PTS');
|
14220
|
+
this.logger.warn('[tsdemuxer]: AAC PES unknown PTS');
|
14218
14221
|
return;
|
14219
14222
|
}
|
14220
14223
|
|
@@ -14244,7 +14247,7 @@
|
|
14244
14247
|
var offset = 0;
|
14245
14248
|
var pts = pes.pts;
|
14246
14249
|
if (pts === undefined) {
|
14247
|
-
logger.warn('[tsdemuxer]: MPEG PES unknown PTS');
|
14250
|
+
this.logger.warn('[tsdemuxer]: MPEG PES unknown PTS');
|
14248
14251
|
return;
|
14249
14252
|
}
|
14250
14253
|
while (offset < length) {
|
@@ -14268,7 +14271,7 @@
|
|
14268
14271
|
var data = pes.data;
|
14269
14272
|
var pts = pes.pts;
|
14270
14273
|
if (pts === undefined) {
|
14271
|
-
logger.warn('[tsdemuxer]: AC3 PES unknown PTS');
|
14274
|
+
this.logger.warn('[tsdemuxer]: AC3 PES unknown PTS');
|
14272
14275
|
return;
|
14273
14276
|
}
|
14274
14277
|
var length = data.length;
|
@@ -14282,7 +14285,7 @@
|
|
14282
14285
|
};
|
14283
14286
|
_proto.parseID3PES = function parseID3PES(id3Track, pes) {
|
14284
14287
|
if (pes.pts === undefined) {
|
14285
|
-
logger.warn('[tsdemuxer]: ID3 PES unknown PTS');
|
14288
|
+
this.logger.warn('[tsdemuxer]: ID3 PES unknown PTS');
|
14286
14289
|
return;
|
14287
14290
|
}
|
14288
14291
|
var id3Sample = _extends({}, pes, {
|
@@ -14301,7 +14304,7 @@
|
|
14301
14304
|
// skip the PSI header and parse the first PMT entry
|
14302
14305
|
return (data[offset + 10] & 0x1f) << 8 | data[offset + 11];
|
14303
14306
|
}
|
14304
|
-
function parsePMT(data, offset, typeSupported, isSampleAes, observer) {
|
14307
|
+
function parsePMT(data, offset, typeSupported, isSampleAes, observer, logger) {
|
14305
14308
|
var result = {
|
14306
14309
|
audioPid: -1,
|
14307
14310
|
videoPid: -1,
|
@@ -14323,7 +14326,7 @@
|
|
14323
14326
|
case 0xcf:
|
14324
14327
|
// SAMPLE-AES AAC
|
14325
14328
|
if (!isSampleAes) {
|
14326
|
-
logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC');
|
14329
|
+
logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC', this.logger);
|
14327
14330
|
break;
|
14328
14331
|
}
|
14329
14332
|
/* falls through */
|
@@ -14345,7 +14348,7 @@
|
|
14345
14348
|
case 0xdb:
|
14346
14349
|
// SAMPLE-AES AVC
|
14347
14350
|
if (!isSampleAes) {
|
14348
|
-
logEncryptedSamplesFoundInUnencryptedStream('H.264');
|
14351
|
+
logEncryptedSamplesFoundInUnencryptedStream('H.264', this.logger);
|
14349
14352
|
break;
|
14350
14353
|
}
|
14351
14354
|
/* falls through */
|
@@ -14373,7 +14376,7 @@
|
|
14373
14376
|
case 0xc1:
|
14374
14377
|
// SAMPLE-AES AC3
|
14375
14378
|
if (!isSampleAes) {
|
14376
|
-
logEncryptedSamplesFoundInUnencryptedStream('AC-3');
|
14379
|
+
logEncryptedSamplesFoundInUnencryptedStream('AC-3', this.logger);
|
14377
14380
|
break;
|
14378
14381
|
}
|
14379
14382
|
/* falls through */
|
@@ -14419,7 +14422,7 @@
|
|
14419
14422
|
case 0xc2: // SAMPLE-AES EC3
|
14420
14423
|
/* falls through */
|
14421
14424
|
case 0x87:
|
14422
|
-
emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'));
|
14425
|
+
emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'), undefined, this.logger);
|
14423
14426
|
return result;
|
14424
14427
|
case 0x24:
|
14425
14428
|
// ITU-T Rec. H.265 and ISO/IEC 23008-2 (HEVC)
|
@@ -14438,7 +14441,7 @@
|
|
14438
14441
|
}
|
14439
14442
|
return result;
|
14440
14443
|
}
|
14441
|
-
function emitParsingError(observer, error, levelRetry) {
|
14444
|
+
function emitParsingError(observer, error, levelRetry, logger) {
|
14442
14445
|
logger.warn("parsing error: " + error.message);
|
14443
14446
|
observer.emit(Events.ERROR, Events.ERROR, {
|
14444
14447
|
type: ErrorTypes.MEDIA_ERROR,
|
@@ -14449,10 +14452,10 @@
|
|
14449
14452
|
reason: error.message
|
14450
14453
|
});
|
14451
14454
|
}
|
14452
|
-
function logEncryptedSamplesFoundInUnencryptedStream(type) {
|
14455
|
+
function logEncryptedSamplesFoundInUnencryptedStream(type, logger) {
|
14453
14456
|
logger.log(type + " with AES-128-CBC encryption found in unencrypted stream");
|
14454
14457
|
}
|
14455
|
-
function parsePES(stream) {
|
14458
|
+
function parsePES(stream, logger) {
|
14456
14459
|
var i = 0;
|
14457
14460
|
var frag;
|
14458
14461
|
var pesLen;
|
@@ -15367,7 +15370,8 @@
|
|
15367
15370
|
var chromeVersion = null;
|
15368
15371
|
var safariWebkitVersion = null;
|
15369
15372
|
var MP4Remuxer = /*#__PURE__*/function () {
|
15370
|
-
function MP4Remuxer(observer, config, typeSupported,
|
15373
|
+
function MP4Remuxer(observer, config, typeSupported, logger) {
|
15374
|
+
this.logger = void 0;
|
15371
15375
|
this.observer = void 0;
|
15372
15376
|
this.config = void 0;
|
15373
15377
|
this.typeSupported = void 0;
|
@@ -15383,6 +15387,7 @@
|
|
15383
15387
|
this.observer = observer;
|
15384
15388
|
this.config = config;
|
15385
15389
|
this.typeSupported = typeSupported;
|
15390
|
+
this.logger = logger;
|
15386
15391
|
this.ISGenerated = false;
|
15387
15392
|
if (chromeVersion === null) {
|
15388
15393
|
var userAgent = navigator.userAgent || '';
|
@@ -15400,16 +15405,16 @@
|
|
15400
15405
|
this.config = this.videoTrackConfig = this._initPTS = this._initDTS = null;
|
15401
15406
|
};
|
15402
15407
|
_proto.resetTimeStamp = function resetTimeStamp(defaultTimeStamp) {
|
15403
|
-
logger.log('[mp4-remuxer]: initPTS & initDTS reset');
|
15408
|
+
this.logger.log('[mp4-remuxer]: initPTS & initDTS reset');
|
15404
15409
|
this._initPTS = this._initDTS = defaultTimeStamp;
|
15405
15410
|
};
|
15406
15411
|
_proto.resetNextTimestamp = function resetNextTimestamp() {
|
15407
|
-
logger.log('[mp4-remuxer]: reset next timestamp');
|
15412
|
+
this.logger.log('[mp4-remuxer]: reset next timestamp');
|
15408
15413
|
this.isVideoContiguous = false;
|
15409
15414
|
this.isAudioContiguous = false;
|
15410
15415
|
};
|
15411
15416
|
_proto.resetInitSegment = function resetInitSegment() {
|
15412
|
-
logger.log('[mp4-remuxer]: ISGenerated flag reset');
|
15417
|
+
this.logger.log('[mp4-remuxer]: ISGenerated flag reset');
|
15413
15418
|
this.ISGenerated = false;
|
15414
15419
|
this.videoTrackConfig = undefined;
|
15415
15420
|
};
|
@@ -15428,7 +15433,7 @@
|
|
15428
15433
|
}
|
15429
15434
|
}, videoSamples[0].pts);
|
15430
15435
|
if (rolloverDetected) {
|
15431
|
-
logger.debug('PTS rollover detected');
|
15436
|
+
this.logger.debug('PTS rollover detected');
|
15432
15437
|
}
|
15433
15438
|
return startPTS;
|
15434
15439
|
};
|
@@ -15472,14 +15477,14 @@
|
|
15472
15477
|
if (!isVideoContiguous && this.config.forceKeyFrameOnDiscontinuity) {
|
15473
15478
|
independent = true;
|
15474
15479
|
if (firstKeyFrameIndex > 0) {
|
15475
|
-
logger.warn("[mp4-remuxer]: Dropped " + firstKeyFrameIndex + " out of " + length + " video samples due to a missing keyframe");
|
15480
|
+
this.logger.warn("[mp4-remuxer]: Dropped " + firstKeyFrameIndex + " out of " + length + " video samples due to a missing keyframe");
|
15476
15481
|
var startPTS = this.getVideoStartPts(videoTrack.samples);
|
15477
15482
|
videoTrack.samples = videoTrack.samples.slice(firstKeyFrameIndex);
|
15478
15483
|
videoTrack.dropped += firstKeyFrameIndex;
|
15479
15484
|
videoTimeOffset += (videoTrack.samples[0].pts - startPTS) / videoTrack.inputTimeScale;
|
15480
15485
|
firstKeyFramePTS = videoTimeOffset;
|
15481
15486
|
} else if (firstKeyFrameIndex === -1) {
|
15482
|
-
logger.warn("[mp4-remuxer]: No keyframe found out of " + length + " video samples");
|
15487
|
+
this.logger.warn("[mp4-remuxer]: No keyframe found out of " + length + " video samples");
|
15483
15488
|
independent = false;
|
15484
15489
|
}
|
15485
15490
|
}
|
@@ -15501,7 +15506,7 @@
|
|
15501
15506
|
if (enoughAudioSamples) {
|
15502
15507
|
// if initSegment was generated without audio samples, regenerate it again
|
15503
15508
|
if (!audioTrack.samplerate) {
|
15504
|
-
logger.warn('[mp4-remuxer]: regenerate InitSegment as audio detected');
|
15509
|
+
this.logger.warn('[mp4-remuxer]: regenerate InitSegment as audio detected');
|
15505
15510
|
initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);
|
15506
15511
|
}
|
15507
15512
|
audio = this.remuxAudio(audioTrack, audioTimeOffset, this.isAudioContiguous, accurateTimeOffset, hasVideo || enoughVideoSamples || playlistType === PlaylistLevelType.AUDIO ? videoTimeOffset : undefined);
|
@@ -15509,7 +15514,7 @@
|
|
15509
15514
|
var audioTrackLength = audio ? audio.endPTS - audio.startPTS : 0;
|
15510
15515
|
// if initSegment was generated without video samples, regenerate it again
|
15511
15516
|
if (!videoTrack.inputTimeScale) {
|
15512
|
-
logger.warn('[mp4-remuxer]: regenerate InitSegment as video detected');
|
15517
|
+
this.logger.warn('[mp4-remuxer]: regenerate InitSegment as video detected');
|
15513
15518
|
initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);
|
15514
15519
|
}
|
15515
15520
|
video = this.remuxVideo(videoTrack, videoTimeOffset, isVideoContiguous, audioTrackLength);
|
@@ -15715,9 +15720,9 @@
|
|
15715
15720
|
var foundOverlap = delta < -1;
|
15716
15721
|
if (foundHole || foundOverlap) {
|
15717
15722
|
if (foundHole) {
|
15718
|
-
logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(delta, true) + " ms (" + delta + "dts) hole between fragments detected at " + timeOffset.toFixed(3));
|
15723
|
+
this.logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(delta, true) + " ms (" + delta + "dts) hole between fragments detected at " + timeOffset.toFixed(3));
|
15719
15724
|
} else {
|
15720
|
-
logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(-delta, true) + " ms (" + delta + "dts) overlapping between fragments detected at " + timeOffset.toFixed(3));
|
15725
|
+
this.logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(-delta, true) + " ms (" + delta + "dts) overlapping between fragments detected at " + timeOffset.toFixed(3));
|
15721
15726
|
}
|
15722
15727
|
if (!foundOverlap || nextAvcDts >= inputSamples[0].pts || chromeVersion) {
|
15723
15728
|
firstDTS = nextAvcDts;
|
@@ -15746,7 +15751,7 @@
|
|
15746
15751
|
}
|
15747
15752
|
}
|
15748
15753
|
}
|
15749
|
-
logger.log("Video: Initial PTS/DTS adjusted: " + toMsFromMpegTsClock(firstPTS, true) + "/" + toMsFromMpegTsClock(firstDTS, true) + ", delta: " + toMsFromMpegTsClock(delta, true) + " ms");
|
15754
|
+
this.logger.log("Video: Initial PTS/DTS adjusted: " + toMsFromMpegTsClock(firstPTS, true) + "/" + toMsFromMpegTsClock(firstDTS, true) + ", delta: " + toMsFromMpegTsClock(delta, true) + " ms");
|
15750
15755
|
}
|
15751
15756
|
}
|
15752
15757
|
}
|
@@ -15846,7 +15851,7 @@
|
|
15846
15851
|
} else {
|
15847
15852
|
stretchedLastFrame = true;
|
15848
15853
|
}
|
15849
|
-
logger.log("[mp4-remuxer]: It is approximately " + deltaToFrameEnd / 90 + " ms to the next segment; using duration " + mp4SampleDuration / 90 + " ms for the last video frame.");
|
15854
|
+
this.logger.log("[mp4-remuxer]: It is approximately " + deltaToFrameEnd / 90 + " ms to the next segment; using duration " + mp4SampleDuration / 90 + " ms for the last video frame.");
|
15850
15855
|
} else {
|
15851
15856
|
mp4SampleDuration = lastFrameDuration;
|
15852
15857
|
}
|
@@ -15874,7 +15879,7 @@
|
|
15874
15879
|
// Fix for "CNN special report, with CC" in test-streams (Safari browser only)
|
15875
15880
|
// Ignore DTS when frame durations are irregular. Safari MSE does not handle this leading to gaps.
|
15876
15881
|
if (maxPtsDelta - minPtsDelta < maxDtsDelta - minDtsDelta && averageSampleDuration / maxDtsDelta < 0.025 && outputSamples[0].cts === 0) {
|
15877
|
-
logger.warn('Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.');
|
15882
|
+
this.logger.warn('Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.');
|
15878
15883
|
var dts = firstDTS;
|
15879
15884
|
for (var _i4 = 0, len = outputSamples.length; _i4 < len; _i4++) {
|
15880
15885
|
var nextDts = dts + outputSamples[_i4].duration;
|
@@ -16001,7 +16006,7 @@
|
|
16001
16006
|
// When remuxing with video, if we're overlapping by more than a duration, drop this sample to stay in sync
|
16002
16007
|
if (delta <= -maxAudioFramesDrift * inputSampleDuration && alignedWithVideo) {
|
16003
16008
|
if (i === 0) {
|
16004
|
-
logger.warn("Audio frame @ " + (pts / inputTimeScale).toFixed(3) + "s overlaps nextAudioPts by " + Math.round(1000 * delta / inputTimeScale) + " ms.");
|
16009
|
+
this.logger.warn("Audio frame @ " + (pts / inputTimeScale).toFixed(3) + "s overlaps nextAudioPts by " + Math.round(1000 * delta / inputTimeScale) + " ms.");
|
16005
16010
|
this.nextAudioPts = nextAudioPts = nextPts = pts;
|
16006
16011
|
}
|
16007
16012
|
} // eslint-disable-line brace-style
|
@@ -16023,12 +16028,12 @@
|
|
16023
16028
|
if (i === 0) {
|
16024
16029
|
this.nextAudioPts = nextAudioPts = nextPts;
|
16025
16030
|
}
|
16026
|
-
logger.warn("[mp4-remuxer]: Injecting " + missing + " audio frame @ " + (nextPts / inputTimeScale).toFixed(3) + "s due to " + Math.round(1000 * delta / inputTimeScale) + " ms gap.");
|
16031
|
+
this.logger.warn("[mp4-remuxer]: Injecting " + missing + " audio frame @ " + (nextPts / inputTimeScale).toFixed(3) + "s due to " + Math.round(1000 * delta / inputTimeScale) + " ms gap.");
|
16027
16032
|
for (var j = 0; j < missing; j++) {
|
16028
16033
|
var newStamp = Math.max(nextPts, 0);
|
16029
16034
|
var fillFrame = AAC.getSilentFrame(track.parsedCodec || track.manifestCodec || track.codec, track.channelCount);
|
16030
16035
|
if (!fillFrame) {
|
16031
|
-
logger.log('[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.');
|
16036
|
+
this.logger.log('[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.');
|
16032
16037
|
fillFrame = sample.unit.subarray();
|
16033
16038
|
}
|
16034
16039
|
inputSamples.splice(i, 0, {
|
@@ -16228,7 +16233,8 @@
|
|
16228
16233
|
};
|
16229
16234
|
|
16230
16235
|
var PassThroughRemuxer = /*#__PURE__*/function () {
|
16231
|
-
function PassThroughRemuxer() {
|
16236
|
+
function PassThroughRemuxer(observer, config, typeSupported, logger) {
|
16237
|
+
this.logger = void 0;
|
16232
16238
|
this.emitInitSegment = false;
|
16233
16239
|
this.audioCodec = void 0;
|
16234
16240
|
this.videoCodec = void 0;
|
@@ -16236,6 +16242,7 @@
|
|
16236
16242
|
this.initPTS = null;
|
16237
16243
|
this.initTracks = void 0;
|
16238
16244
|
this.lastEndTime = null;
|
16245
|
+
this.logger = logger;
|
16239
16246
|
}
|
16240
16247
|
var _proto = PassThroughRemuxer.prototype;
|
16241
16248
|
_proto.destroy = function destroy() {};
|
@@ -16292,7 +16299,7 @@
|
|
16292
16299
|
id: 'main'
|
16293
16300
|
};
|
16294
16301
|
} else {
|
16295
|
-
logger.warn('[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.');
|
16302
|
+
this.logger.warn('[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.');
|
16296
16303
|
}
|
16297
16304
|
this.initTracks = tracks;
|
16298
16305
|
};
|
@@ -16332,7 +16339,7 @@
|
|
16332
16339
|
}
|
16333
16340
|
if (!((_initData2 = initData) != null && _initData2.length)) {
|
16334
16341
|
// We can't remux if the initSegment could not be generated
|
16335
|
-
logger.warn('[passthrough-remuxer.ts]: Failed to generate initSegment.');
|
16342
|
+
this.logger.warn('[passthrough-remuxer.ts]: Failed to generate initSegment.');
|
16336
16343
|
return result;
|
16337
16344
|
}
|
16338
16345
|
if (this.emitInitSegment) {
|
@@ -16345,7 +16352,7 @@
|
|
16345
16352
|
if (isInvalidInitPts(initPTS, decodeTime, timeOffset, duration) || initSegment.timescale !== initPTS.timescale && accurateTimeOffset) {
|
16346
16353
|
initSegment.initPTS = decodeTime - timeOffset;
|
16347
16354
|
if (initPTS && initPTS.timescale === 1) {
|
16348
|
-
logger.warn("Adjusting initPTS @" + timeOffset + " from " + initPTS.baseTime / initPTS.timescale + " to " + initSegment.initPTS);
|
16355
|
+
this.logger.warn("Adjusting initPTS @" + timeOffset + " from " + initPTS.baseTime / initPTS.timescale + " to " + initSegment.initPTS);
|
16349
16356
|
}
|
16350
16357
|
this.initPTS = initPTS = {
|
16351
16358
|
baseTime: initSegment.initPTS,
|
@@ -16358,7 +16365,7 @@
|
|
16358
16365
|
if (duration > 0) {
|
16359
16366
|
this.lastEndTime = endTime;
|
16360
16367
|
} else {
|
16361
|
-
logger.warn('Duration parsed from mp4 should be greater than zero');
|
16368
|
+
this.logger.warn('Duration parsed from mp4 should be greater than zero');
|
16362
16369
|
this.resetNextTimestamp();
|
16363
16370
|
}
|
16364
16371
|
var hasAudio = !!initData.audio;
|
@@ -16417,12 +16424,12 @@
|
|
16417
16424
|
return getCodecCompatibleName(parsedCodec, preferManagedMediaSource);
|
16418
16425
|
}
|
16419
16426
|
var result = 'mp4a.40.5';
|
16420
|
-
logger.info("Parsed audio codec \"" + parsedCodec + "\" or audio object type not handled. Using \"" + result + "\"");
|
16427
|
+
this.logger.info("Parsed audio codec \"" + parsedCodec + "\" or audio object type not handled. Using \"" + result + "\"");
|
16421
16428
|
return result;
|
16422
16429
|
}
|
16423
16430
|
// Provide defaults based on codec type
|
16424
16431
|
// This allows for some playback of some fmp4 playlists without CODECS defined in manifest
|
16425
|
-
logger.warn("Unhandled video codec \"" + parsedCodec + "\"");
|
16432
|
+
this.logger.warn("Unhandled video codec \"" + parsedCodec + "\"");
|
16426
16433
|
if (parsedCodec === 'hvc1' || parsedCodec === 'hev1') {
|
16427
16434
|
return 'hvc1.1.6.L120.90';
|
16428
16435
|
}
|
@@ -16437,8 +16444,7 @@
|
|
16437
16444
|
try {
|
16438
16445
|
now = self.performance.now.bind(self.performance);
|
16439
16446
|
} catch (err) {
|
16440
|
-
|
16441
|
-
now = optionalSelf == null ? void 0 : optionalSelf.Date.now;
|
16447
|
+
now = Date.now;
|
16442
16448
|
}
|
16443
16449
|
var muxConfig = [{
|
16444
16450
|
demux: MP4Demuxer,
|
@@ -16460,8 +16466,9 @@
|
|
16460
16466
|
});
|
16461
16467
|
}
|
16462
16468
|
var Transmuxer = /*#__PURE__*/function () {
|
16463
|
-
function Transmuxer(observer, typeSupported, config, vendor, id) {
|
16464
|
-
this.
|
16469
|
+
function Transmuxer(observer, typeSupported, config, vendor, id, logger) {
|
16470
|
+
this.asyncResult = false;
|
16471
|
+
this.logger = void 0;
|
16465
16472
|
this.observer = void 0;
|
16466
16473
|
this.typeSupported = void 0;
|
16467
16474
|
this.config = void 0;
|
@@ -16479,6 +16486,7 @@
|
|
16479
16486
|
this.config = config;
|
16480
16487
|
this.vendor = vendor;
|
16481
16488
|
this.id = id;
|
16489
|
+
this.logger = logger;
|
16482
16490
|
}
|
16483
16491
|
var _proto = Transmuxer.prototype;
|
16484
16492
|
_proto.configure = function configure(transmuxConfig) {
|
@@ -16530,6 +16538,7 @@
|
|
16530
16538
|
}
|
16531
16539
|
uintData = new Uint8Array(decryptedData);
|
16532
16540
|
} else {
|
16541
|
+
this.asyncResult = true;
|
16533
16542
|
this.decryptionPromise = decrypter.webCryptoDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer, aesMode).then(function (decryptedData) {
|
16534
16543
|
// Calling push here is important; if flush() is called while this is still resolving, this ensures that
|
16535
16544
|
// the decrypted data has been transmuxed
|
@@ -16544,7 +16553,7 @@
|
|
16544
16553
|
if (resetMuxers) {
|
16545
16554
|
var error = this.configureTransmuxer(uintData);
|
16546
16555
|
if (error) {
|
16547
|
-
logger.warn("[transmuxer] " + error.message);
|
16556
|
+
this.logger.warn("[transmuxer] " + error.message);
|
16548
16557
|
this.observer.emit(Events.ERROR, Events.ERROR, {
|
16549
16558
|
type: ErrorTypes.MEDIA_ERROR,
|
16550
16559
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
@@ -16566,6 +16575,7 @@
|
|
16566
16575
|
this.resetContiguity();
|
16567
16576
|
}
|
16568
16577
|
var result = this.transmux(uintData, keyData, timeOffset, accurateTimeOffset, chunkMeta);
|
16578
|
+
this.asyncResult = isPromise(result);
|
16569
16579
|
var currentState = this.currentTransmuxState;
|
16570
16580
|
currentState.contiguous = true;
|
16571
16581
|
currentState.discontinuity = false;
|
@@ -16584,6 +16594,7 @@
|
|
16584
16594
|
currentTransmuxState = this.currentTransmuxState,
|
16585
16595
|
decryptionPromise = this.decryptionPromise;
|
16586
16596
|
if (decryptionPromise) {
|
16597
|
+
this.asyncResult = true;
|
16587
16598
|
// Upon resolution, the decryption promise calls push() and returns its TransmuxerResult up the stack. Therefore
|
16588
16599
|
// only flushing is required for async decryption
|
16589
16600
|
return decryptionPromise.then(function () {
|
@@ -16607,10 +16618,15 @@
|
|
16607
16618
|
if (!demuxer || !remuxer) {
|
16608
16619
|
// If probing failed, then Hls.js has been given content its not able to handle
|
16609
16620
|
stats.executeEnd = now();
|
16610
|
-
|
16621
|
+
var emptyResults = [emptyResult(chunkMeta)];
|
16622
|
+
if (this.asyncResult) {
|
16623
|
+
return Promise.resolve(emptyResults);
|
16624
|
+
}
|
16625
|
+
return emptyResults;
|
16611
16626
|
}
|
16612
16627
|
var demuxResultOrPromise = demuxer.flush(timeOffset);
|
16613
16628
|
if (isPromise(demuxResultOrPromise)) {
|
16629
|
+
this.asyncResult = true;
|
16614
16630
|
// Decrypt final SAMPLE-AES samples
|
16615
16631
|
return demuxResultOrPromise.then(function (demuxResult) {
|
16616
16632
|
_this2.flushRemux(transmuxResults, demuxResult, chunkMeta);
|
@@ -16618,6 +16634,9 @@
|
|
16618
16634
|
});
|
16619
16635
|
}
|
16620
16636
|
this.flushRemux(transmuxResults, demuxResultOrPromise, chunkMeta);
|
16637
|
+
if (this.asyncResult) {
|
16638
|
+
return Promise.resolve(transmuxResults);
|
16639
|
+
}
|
16621
16640
|
return transmuxResults;
|
16622
16641
|
};
|
16623
16642
|
_proto.flushRemux = function flushRemux(transmuxResults, demuxResult, chunkMeta) {
|
@@ -16628,7 +16647,7 @@
|
|
16628
16647
|
var _this$currentTransmux = this.currentTransmuxState,
|
16629
16648
|
accurateTimeOffset = _this$currentTransmux.accurateTimeOffset,
|
16630
16649
|
timeOffset = _this$currentTransmux.timeOffset;
|
16631
|
-
logger.log("[transmuxer.ts]: Flushed
|
16650
|
+
this.logger.log("[transmuxer.ts]: Flushed " + this.id + " sn: " + chunkMeta.sn + (chunkMeta.part > -1 ? ' p: ' + chunkMeta.part : '') + " of " + (this.id === PlaylistLevelType.MAIN ? 'level' : 'track') + " " + chunkMeta.level);
|
16632
16651
|
var remuxResult = this.remuxer.remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, true, this.id);
|
16633
16652
|
transmuxResults.push({
|
16634
16653
|
remuxResult: remuxResult,
|
@@ -16707,13 +16726,13 @@
|
|
16707
16726
|
_proto.configureTransmuxer = function configureTransmuxer(data) {
|
16708
16727
|
var config = this.config,
|
16709
16728
|
observer = this.observer,
|
16710
|
-
typeSupported = this.typeSupported
|
16711
|
-
|
16729
|
+
typeSupported = this.typeSupported;
|
16730
|
+
this.vendor;
|
16712
16731
|
// probe for content type
|
16713
16732
|
var mux;
|
16714
16733
|
for (var i = 0, len = muxConfig.length; i < len; i++) {
|
16715
16734
|
var _muxConfig$i$demux;
|
16716
|
-
if ((_muxConfig$i$demux = muxConfig[i].demux) != null && _muxConfig$i$demux.probe(data)) {
|
16735
|
+
if ((_muxConfig$i$demux = muxConfig[i].demux) != null && _muxConfig$i$demux.probe(data, this.logger)) {
|
16717
16736
|
mux = muxConfig[i];
|
16718
16737
|
break;
|
16719
16738
|
}
|
@@ -16727,10 +16746,10 @@
|
|
16727
16746
|
var Remuxer = mux.remux;
|
16728
16747
|
var Demuxer = mux.demux;
|
16729
16748
|
if (!remuxer || !(remuxer instanceof Remuxer)) {
|
16730
|
-
this.remuxer = new Remuxer(observer, config, typeSupported,
|
16749
|
+
this.remuxer = new Remuxer(observer, config, typeSupported, this.logger);
|
16731
16750
|
}
|
16732
16751
|
if (!demuxer || !(demuxer instanceof Demuxer)) {
|
16733
|
-
this.demuxer = new Demuxer(observer, config, typeSupported);
|
16752
|
+
this.demuxer = new Demuxer(observer, config, typeSupported, this.logger);
|
16734
16753
|
this.probe = Demuxer.probe;
|
16735
16754
|
}
|
16736
16755
|
};
|
@@ -17134,63 +17153,54 @@
|
|
17134
17153
|
var eventemitter3Exports = eventemitter3.exports;
|
17135
17154
|
var EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
|
17136
17155
|
|
17156
|
+
var transmuxers = [];
|
17137
17157
|
if (typeof __IN_WORKER__ !== 'undefined' && __IN_WORKER__) {
|
17138
|
-
startWorker(
|
17158
|
+
startWorker();
|
17139
17159
|
}
|
17140
|
-
function startWorker(
|
17141
|
-
var observer = new EventEmitter();
|
17142
|
-
var forwardMessage = function forwardMessage(ev, data) {
|
17143
|
-
self.postMessage({
|
17144
|
-
event: ev,
|
17145
|
-
data: data
|
17146
|
-
});
|
17147
|
-
};
|
17148
|
-
|
17149
|
-
// forward events to main thread
|
17150
|
-
observer.on(Events.FRAG_DECRYPTED, forwardMessage);
|
17151
|
-
observer.on(Events.ERROR, forwardMessage);
|
17152
|
-
|
17153
|
-
// forward logger events to main thread
|
17154
|
-
var forwardWorkerLogs = function forwardWorkerLogs(logger) {
|
17155
|
-
var _loop = function _loop(logFn) {
|
17156
|
-
var func = function func(message) {
|
17157
|
-
forwardMessage('workerLog', {
|
17158
|
-
logType: logFn,
|
17159
|
-
message: message
|
17160
|
-
});
|
17161
|
-
};
|
17162
|
-
logger[logFn] = func;
|
17163
|
-
};
|
17164
|
-
for (var logFn in logger) {
|
17165
|
-
_loop(logFn);
|
17166
|
-
}
|
17167
|
-
};
|
17160
|
+
function startWorker() {
|
17168
17161
|
self.addEventListener('message', function (ev) {
|
17169
17162
|
var data = ev.data;
|
17163
|
+
var instanceNo = data.instanceNo;
|
17164
|
+
if (instanceNo === undefined) {
|
17165
|
+
return;
|
17166
|
+
}
|
17167
|
+
var transmuxer = transmuxers[instanceNo];
|
17168
|
+
if (data.cmd === 'reset') {
|
17169
|
+
delete transmuxers[data.resetNo];
|
17170
|
+
if (transmuxer) {
|
17171
|
+
transmuxer.destroy();
|
17172
|
+
}
|
17173
|
+
data.cmd = 'init';
|
17174
|
+
}
|
17175
|
+
if (data.cmd === 'init') {
|
17176
|
+
var config = JSON.parse(data.config);
|
17177
|
+
var observer = new EventEmitter();
|
17178
|
+
observer.on(Events.FRAG_DECRYPTED, forwardMessage);
|
17179
|
+
observer.on(Events.ERROR, forwardMessage);
|
17180
|
+
var logger = enableLogs(config.debug, data.id);
|
17181
|
+
forwardWorkerLogs(logger, instanceNo);
|
17182
|
+
transmuxers[instanceNo] = new Transmuxer(observer, data.typeSupported, config, '', data.id, logger);
|
17183
|
+
forwardMessage('init', null, instanceNo);
|
17184
|
+
return;
|
17185
|
+
}
|
17186
|
+
if (!transmuxer) {
|
17187
|
+
return;
|
17188
|
+
}
|
17170
17189
|
switch (data.cmd) {
|
17171
|
-
case 'init':
|
17172
|
-
{
|
17173
|
-
var config = JSON.parse(data.config);
|
17174
|
-
self.transmuxer = new Transmuxer(observer, data.typeSupported, config, '', data.id);
|
17175
|
-
var logger = enableLogs(config.debug, data.id);
|
17176
|
-
forwardWorkerLogs(logger);
|
17177
|
-
forwardMessage('init', null);
|
17178
|
-
break;
|
17179
|
-
}
|
17180
17190
|
case 'configure':
|
17181
17191
|
{
|
17182
|
-
|
17192
|
+
transmuxer.configure(data.config);
|
17183
17193
|
break;
|
17184
17194
|
}
|
17185
17195
|
case 'demux':
|
17186
17196
|
{
|
17187
|
-
var transmuxResult =
|
17197
|
+
var transmuxResult = transmuxer.push(data.data, data.decryptdata, data.chunkMeta, data.state);
|
17188
17198
|
if (isPromise(transmuxResult)) {
|
17189
|
-
self.transmuxer.async = true;
|
17190
17199
|
transmuxResult.then(function (data) {
|
17191
|
-
emitTransmuxComplete(self, data);
|
17200
|
+
emitTransmuxComplete(self, data, instanceNo);
|
17192
17201
|
}).catch(function (error) {
|
17193
17202
|
forwardMessage(Events.ERROR, {
|
17203
|
+
instanceNo: instanceNo,
|
17194
17204
|
type: ErrorTypes.MEDIA_ERROR,
|
17195
17205
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
17196
17206
|
chunkMeta: data.chunkMeta,
|
@@ -17198,25 +17208,20 @@
|
|
17198
17208
|
error: error,
|
17199
17209
|
err: error,
|
17200
17210
|
reason: "transmuxer-worker push error"
|
17201
|
-
});
|
17211
|
+
}, instanceNo);
|
17202
17212
|
});
|
17203
17213
|
} else {
|
17204
|
-
self
|
17205
|
-
emitTransmuxComplete(self, transmuxResult);
|
17214
|
+
emitTransmuxComplete(self, transmuxResult, instanceNo);
|
17206
17215
|
}
|
17207
17216
|
break;
|
17208
17217
|
}
|
17209
17218
|
case 'flush':
|
17210
17219
|
{
|
17211
|
-
var
|
17212
|
-
var _transmuxResult =
|
17213
|
-
|
17214
|
-
if (asyncFlush || self.transmuxer.async) {
|
17215
|
-
if (!isPromise(_transmuxResult)) {
|
17216
|
-
_transmuxResult = Promise.resolve(_transmuxResult);
|
17217
|
-
}
|
17220
|
+
var chunkMeta = data.chunkMeta;
|
17221
|
+
var _transmuxResult = transmuxer.flush(chunkMeta);
|
17222
|
+
if (isPromise(_transmuxResult)) {
|
17218
17223
|
_transmuxResult.then(function (results) {
|
17219
|
-
handleFlushResult(self, results,
|
17224
|
+
handleFlushResult(self, results, chunkMeta, instanceNo);
|
17220
17225
|
}).catch(function (error) {
|
17221
17226
|
forwardMessage(Events.ERROR, {
|
17222
17227
|
type: ErrorTypes.MEDIA_ERROR,
|
@@ -17226,17 +17231,17 @@
|
|
17226
17231
|
error: error,
|
17227
17232
|
err: error,
|
17228
17233
|
reason: "transmuxer-worker flush error"
|
17229
|
-
});
|
17234
|
+
}, instanceNo);
|
17230
17235
|
});
|
17231
17236
|
} else {
|
17232
|
-
handleFlushResult(self, _transmuxResult,
|
17237
|
+
handleFlushResult(self, _transmuxResult, chunkMeta, instanceNo);
|
17233
17238
|
}
|
17234
17239
|
break;
|
17235
17240
|
}
|
17236
17241
|
}
|
17237
17242
|
});
|
17238
17243
|
}
|
17239
|
-
function emitTransmuxComplete(self, transmuxResult) {
|
17244
|
+
function emitTransmuxComplete(self, transmuxResult, instanceNo) {
|
17240
17245
|
if (isEmptyResult(transmuxResult.remuxResult)) {
|
17241
17246
|
return false;
|
17242
17247
|
}
|
@@ -17252,7 +17257,8 @@
|
|
17252
17257
|
}
|
17253
17258
|
self.postMessage({
|
17254
17259
|
event: 'transmuxComplete',
|
17255
|
-
data: transmuxResult
|
17260
|
+
data: transmuxResult,
|
17261
|
+
instanceNo: instanceNo
|
17256
17262
|
}, transferable);
|
17257
17263
|
return true;
|
17258
17264
|
}
|
@@ -17267,77 +17273,200 @@
|
|
17267
17273
|
transferable.push(track.data2.buffer);
|
17268
17274
|
}
|
17269
17275
|
}
|
17270
|
-
function handleFlushResult(self, results, chunkMeta) {
|
17276
|
+
function handleFlushResult(self, results, chunkMeta, instanceNo) {
|
17271
17277
|
var parsed = results.reduce(function (parsed, result) {
|
17272
|
-
return emitTransmuxComplete(self, result) || parsed;
|
17278
|
+
return emitTransmuxComplete(self, result, instanceNo) || parsed;
|
17273
17279
|
}, false);
|
17274
17280
|
if (!parsed) {
|
17275
17281
|
// Emit at least one "transmuxComplete" message even if media is not found to update stream-controller state to PARSING
|
17276
17282
|
self.postMessage({
|
17277
17283
|
event: 'transmuxComplete',
|
17278
|
-
data: results[0]
|
17284
|
+
data: results[0],
|
17285
|
+
instanceNo: instanceNo
|
17279
17286
|
});
|
17280
17287
|
}
|
17281
17288
|
self.postMessage({
|
17282
17289
|
event: 'flush',
|
17283
|
-
data: chunkMeta
|
17290
|
+
data: chunkMeta,
|
17291
|
+
instanceNo: instanceNo
|
17292
|
+
});
|
17293
|
+
}
|
17294
|
+
function forwardMessage(event, data, instanceNo) {
|
17295
|
+
self.postMessage({
|
17296
|
+
event: event,
|
17297
|
+
data: data,
|
17298
|
+
instanceNo: instanceNo
|
17284
17299
|
});
|
17285
17300
|
}
|
17301
|
+
function forwardWorkerLogs(logger, instanceNo) {
|
17302
|
+
var _loop = function _loop(logFn) {
|
17303
|
+
var func = function func(message) {
|
17304
|
+
forwardMessage('workerLog', {
|
17305
|
+
logType: logFn,
|
17306
|
+
message: message
|
17307
|
+
}, instanceNo);
|
17308
|
+
};
|
17309
|
+
logger[logFn] = func;
|
17310
|
+
};
|
17311
|
+
for (var logFn in logger) {
|
17312
|
+
_loop(logFn);
|
17313
|
+
}
|
17314
|
+
}
|
17286
17315
|
function isEmptyResult(remuxResult) {
|
17287
17316
|
return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
|
17288
17317
|
}
|
17289
17318
|
|
17319
|
+
var version = "1.5.14-0.canary.10432";
|
17320
|
+
|
17290
17321
|
// ensure the worker ends up in the bundle
|
17291
17322
|
// If the worker should not be included this gets aliased to empty.js
|
17323
|
+
var workerStore = {};
|
17292
17324
|
function hasUMDWorker() {
|
17293
17325
|
return typeof __HLS_WORKER_BUNDLE__ === 'function';
|
17294
17326
|
}
|
17295
17327
|
function injectWorker() {
|
17328
|
+
var workerContext = workerStore[version];
|
17329
|
+
if (workerContext) {
|
17330
|
+
workerContext.clientCount++;
|
17331
|
+
return workerContext;
|
17332
|
+
}
|
17296
17333
|
var blob = new self.Blob(["var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(" + __HLS_WORKER_BUNDLE__.toString() + ")(true);"], {
|
17297
17334
|
type: 'text/javascript'
|
17298
17335
|
});
|
17299
17336
|
var objectURL = self.URL.createObjectURL(blob);
|
17300
17337
|
var worker = new self.Worker(objectURL);
|
17301
|
-
|
17338
|
+
var result = {
|
17302
17339
|
worker: worker,
|
17303
|
-
objectURL: objectURL
|
17340
|
+
objectURL: objectURL,
|
17341
|
+
clientCount: 1
|
17304
17342
|
};
|
17343
|
+
workerStore[version] = result;
|
17344
|
+
return result;
|
17305
17345
|
}
|
17306
17346
|
function loadWorker(path) {
|
17347
|
+
var workerContext = workerStore[path];
|
17348
|
+
if (workerContext) {
|
17349
|
+
workerContext.clientCount++;
|
17350
|
+
return workerContext;
|
17351
|
+
}
|
17307
17352
|
var scriptURL = new self.URL(path, self.location.href).href;
|
17308
17353
|
var worker = new self.Worker(scriptURL);
|
17309
|
-
|
17354
|
+
var result = {
|
17310
17355
|
worker: worker,
|
17311
|
-
scriptURL: scriptURL
|
17356
|
+
scriptURL: scriptURL,
|
17357
|
+
clientCount: 1
|
17312
17358
|
};
|
17359
|
+
workerStore[path] = result;
|
17360
|
+
return result;
|
17361
|
+
}
|
17362
|
+
function removeWorkerFromStore(path) {
|
17363
|
+
var workerContext = workerStore[path || version];
|
17364
|
+
if (workerContext) {
|
17365
|
+
var clientCount = workerContext.clientCount--;
|
17366
|
+
if (clientCount === 1) {
|
17367
|
+
var worker = workerContext.worker,
|
17368
|
+
objectURL = workerContext.objectURL;
|
17369
|
+
delete workerStore[path || version];
|
17370
|
+
if (objectURL) {
|
17371
|
+
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
17372
|
+
self.URL.revokeObjectURL(objectURL);
|
17373
|
+
}
|
17374
|
+
worker.terminate();
|
17375
|
+
}
|
17376
|
+
}
|
17313
17377
|
}
|
17314
17378
|
|
17379
|
+
var transmuxerInstanceCount = 0;
|
17315
17380
|
var TransmuxerInterface = /*#__PURE__*/function () {
|
17316
|
-
function TransmuxerInterface(
|
17381
|
+
function TransmuxerInterface(_hls, id, onTransmuxComplete, onFlush) {
|
17317
17382
|
var _this = this;
|
17318
17383
|
this.error = null;
|
17319
17384
|
this.hls = void 0;
|
17320
17385
|
this.id = void 0;
|
17386
|
+
this.instanceNo = transmuxerInstanceCount++;
|
17321
17387
|
this.observer = void 0;
|
17322
17388
|
this.frag = null;
|
17323
17389
|
this.part = null;
|
17324
17390
|
this.useWorker = void 0;
|
17325
17391
|
this.workerContext = null;
|
17326
|
-
this.onwmsg = void 0;
|
17327
17392
|
this.transmuxer = null;
|
17328
17393
|
this.onTransmuxComplete = void 0;
|
17329
17394
|
this.onFlush = void 0;
|
17330
|
-
|
17331
|
-
|
17395
|
+
this.onWorkerMessage = function (event) {
|
17396
|
+
var data = event.data;
|
17397
|
+
var hls = _this.hls;
|
17398
|
+
if (!hls || !(data != null && data.event) || data.instanceNo !== _this.instanceNo) {
|
17399
|
+
return;
|
17400
|
+
}
|
17401
|
+
switch (data.event) {
|
17402
|
+
case 'init':
|
17403
|
+
{
|
17404
|
+
var _this$workerContext;
|
17405
|
+
var objectURL = (_this$workerContext = _this.workerContext) == null ? void 0 : _this$workerContext.objectURL;
|
17406
|
+
if (objectURL) {
|
17407
|
+
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
17408
|
+
self.URL.revokeObjectURL(objectURL);
|
17409
|
+
}
|
17410
|
+
break;
|
17411
|
+
}
|
17412
|
+
case 'transmuxComplete':
|
17413
|
+
{
|
17414
|
+
_this.handleTransmuxComplete(data.data);
|
17415
|
+
break;
|
17416
|
+
}
|
17417
|
+
case 'flush':
|
17418
|
+
{
|
17419
|
+
_this.onFlush(data.data);
|
17420
|
+
break;
|
17421
|
+
}
|
17422
|
+
|
17423
|
+
// pass logs from the worker thread to the main logger
|
17424
|
+
case 'workerLog':
|
17425
|
+
{
|
17426
|
+
if (hls.logger[data.data.logType]) {
|
17427
|
+
hls.logger[data.data.logType](data.data.message);
|
17428
|
+
}
|
17429
|
+
break;
|
17430
|
+
}
|
17431
|
+
default:
|
17432
|
+
{
|
17433
|
+
data.data = data.data || {};
|
17434
|
+
data.data.frag = _this.frag;
|
17435
|
+
data.data.part = _this.part;
|
17436
|
+
data.data.id = _this.id;
|
17437
|
+
hls.trigger(data.event, data.data);
|
17438
|
+
break;
|
17439
|
+
}
|
17440
|
+
}
|
17441
|
+
};
|
17442
|
+
this.onWorkerError = function (event) {
|
17443
|
+
if (!_this.hls) {
|
17444
|
+
return;
|
17445
|
+
}
|
17446
|
+
var error = new Error(event.message + " (" + event.filename + ":" + event.lineno + ")");
|
17447
|
+
_this.hls.config.enableWorker = false;
|
17448
|
+
_this.hls.logger.warn("Error in \"" + _this.id + "\" Web Worker, fallback to inline");
|
17449
|
+
_this.hls.trigger(Events.ERROR, {
|
17450
|
+
type: ErrorTypes.OTHER_ERROR,
|
17451
|
+
details: ErrorDetails.INTERNAL_EXCEPTION,
|
17452
|
+
fatal: false,
|
17453
|
+
event: 'demuxerWorker',
|
17454
|
+
error: error
|
17455
|
+
});
|
17456
|
+
};
|
17457
|
+
var config = _hls.config;
|
17458
|
+
this.hls = _hls;
|
17332
17459
|
this.id = id;
|
17333
17460
|
this.useWorker = !!config.enableWorker;
|
17334
17461
|
this.onTransmuxComplete = onTransmuxComplete;
|
17335
17462
|
this.onFlush = onFlush;
|
17336
17463
|
var forwardMessage = function forwardMessage(ev, data) {
|
17337
17464
|
data = data || {};
|
17338
|
-
data.frag = _this.frag;
|
17339
|
-
data.id = _this.id;
|
17465
|
+
data.frag = _this.frag || undefined;
|
17340
17466
|
if (ev === Events.ERROR) {
|
17467
|
+
data = data;
|
17468
|
+
data.parent = _this.id;
|
17469
|
+
data.part = _this.part;
|
17341
17470
|
_this.error = data.error;
|
17342
17471
|
}
|
17343
17472
|
_this.hls.trigger(ev, data);
|
@@ -17349,6 +17478,7 @@
|
|
17349
17478
|
this.observer.on(Events.ERROR, forwardMessage);
|
17350
17479
|
var m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);
|
17351
17480
|
if (this.useWorker && typeof Worker !== 'undefined') {
|
17481
|
+
var logger = this.hls.logger;
|
17352
17482
|
var canCreateWorker = config.workerPath || hasUMDWorker();
|
17353
17483
|
if (canCreateWorker) {
|
17354
17484
|
try {
|
@@ -17359,61 +17489,60 @@
|
|
17359
17489
|
logger.log("injecting Web Worker for \"" + id + "\"");
|
17360
17490
|
this.workerContext = injectWorker();
|
17361
17491
|
}
|
17362
|
-
this.onwmsg = function (event) {
|
17363
|
-
return _this.onWorkerMessage(event);
|
17364
|
-
};
|
17365
17492
|
var worker = this.workerContext.worker;
|
17366
|
-
worker.addEventListener('message', this.
|
17367
|
-
worker.
|
17368
|
-
var error = new Error(event.message + " (" + event.filename + ":" + event.lineno + ")");
|
17369
|
-
config.enableWorker = false;
|
17370
|
-
logger.warn("Error in \"" + id + "\" Web Worker, fallback to inline");
|
17371
|
-
_this.hls.trigger(Events.ERROR, {
|
17372
|
-
type: ErrorTypes.OTHER_ERROR,
|
17373
|
-
details: ErrorDetails.INTERNAL_EXCEPTION,
|
17374
|
-
fatal: false,
|
17375
|
-
event: 'demuxerWorker',
|
17376
|
-
error: error
|
17377
|
-
});
|
17378
|
-
};
|
17493
|
+
worker.addEventListener('message', this.onWorkerMessage);
|
17494
|
+
worker.addEventListener('error', this.onWorkerError);
|
17379
17495
|
worker.postMessage({
|
17496
|
+
instanceNo: this.instanceNo,
|
17380
17497
|
cmd: 'init',
|
17381
17498
|
typeSupported: m2tsTypeSupported,
|
17382
|
-
vendor: '',
|
17383
17499
|
id: id,
|
17384
17500
|
config: JSON.stringify(config)
|
17385
17501
|
});
|
17386
17502
|
} catch (err) {
|
17387
17503
|
logger.warn("Error setting up \"" + id + "\" Web Worker, fallback to inline", err);
|
17388
|
-
this.
|
17504
|
+
this.terminateWorker();
|
17389
17505
|
this.error = null;
|
17390
|
-
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
|
17506
|
+
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id, _hls.logger);
|
17391
17507
|
}
|
17392
17508
|
return;
|
17393
17509
|
}
|
17394
17510
|
}
|
17395
|
-
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
|
17511
|
+
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id, _hls.logger);
|
17396
17512
|
}
|
17397
17513
|
var _proto = TransmuxerInterface.prototype;
|
17398
|
-
_proto.
|
17514
|
+
_proto.reset = function reset() {
|
17515
|
+
this.frag = null;
|
17516
|
+
this.part = null;
|
17399
17517
|
if (this.workerContext) {
|
17400
|
-
var
|
17401
|
-
|
17402
|
-
|
17403
|
-
|
17404
|
-
|
17405
|
-
|
17406
|
-
|
17407
|
-
|
17408
|
-
|
17409
|
-
|
17518
|
+
var instanceNo = this.instanceNo;
|
17519
|
+
this.instanceNo = transmuxerInstanceCount++;
|
17520
|
+
var config = this.hls.config;
|
17521
|
+
var m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);
|
17522
|
+
this.workerContext.worker.postMessage({
|
17523
|
+
instanceNo: this.instanceNo,
|
17524
|
+
cmd: 'reset',
|
17525
|
+
resetNo: instanceNo,
|
17526
|
+
typeSupported: m2tsTypeSupported,
|
17527
|
+
id: this.id,
|
17528
|
+
config: JSON.stringify(config)
|
17529
|
+
});
|
17530
|
+
}
|
17531
|
+
};
|
17532
|
+
_proto.terminateWorker = function terminateWorker() {
|
17533
|
+
if (this.workerContext) {
|
17534
|
+
var worker = this.workerContext.worker;
|
17410
17535
|
this.workerContext = null;
|
17536
|
+
worker.removeEventListener('message', this.onWorkerMessage);
|
17537
|
+
worker.removeEventListener('error', this.onWorkerError);
|
17538
|
+
removeWorkerFromStore(this.hls.config.workerPath);
|
17411
17539
|
}
|
17412
17540
|
};
|
17413
17541
|
_proto.destroy = function destroy() {
|
17414
17542
|
if (this.workerContext) {
|
17415
|
-
this.
|
17416
|
-
|
17543
|
+
this.terminateWorker();
|
17544
|
+
// @ts-ignore
|
17545
|
+
this.onWorkerMessage = this.onWorkerError = null;
|
17417
17546
|
} else {
|
17418
17547
|
var transmuxer = this.transmuxer;
|
17419
17548
|
if (transmuxer) {
|
@@ -17426,6 +17555,7 @@
|
|
17426
17555
|
observer.removeAllListeners();
|
17427
17556
|
}
|
17428
17557
|
this.frag = null;
|
17558
|
+
this.part = null;
|
17429
17559
|
// @ts-ignore
|
17430
17560
|
this.observer = null;
|
17431
17561
|
// @ts-ignore
|
@@ -17436,7 +17566,8 @@
|
|
17436
17566
|
_lastFrag$initSegment,
|
17437
17567
|
_this2 = this;
|
17438
17568
|
chunkMeta.transmuxing.start = self.performance.now();
|
17439
|
-
var
|
17569
|
+
var instanceNo = this.instanceNo,
|
17570
|
+
transmuxer = this.transmuxer;
|
17440
17571
|
var timeOffset = part ? part.start : frag.start;
|
17441
17572
|
// TODO: push "clear-lead" decrypt data for unencrypted fragments in streams with encrypted ones
|
17442
17573
|
var decryptdata = frag.decryptdata;
|
@@ -17457,7 +17588,7 @@
|
|
17457
17588
|
var initSegmentChange = !(lastFrag && ((_frag$initSegment = frag.initSegment) == null ? void 0 : _frag$initSegment.url) === ((_lastFrag$initSegment = lastFrag.initSegment) == null ? void 0 : _lastFrag$initSegment.url));
|
17458
17589
|
var state = new TransmuxState(discontinuity, contiguous, accurateTimeOffset, trackSwitch, timeOffset, initSegmentChange);
|
17459
17590
|
if (!contiguous || discontinuity || initSegmentChange) {
|
17460
|
-
logger.log("[transmuxer-interface, " + frag.type + "]: Starting new transmux session for sn: " + chunkMeta.sn + " p: " + chunkMeta.part + " level: " + chunkMeta.level + " id: " + chunkMeta.id + "\n discontinuity: " + discontinuity + "\n trackSwitch: " + trackSwitch + "\n contiguous: " + contiguous + "\n accurateTimeOffset: " + accurateTimeOffset + "\n timeOffset: " + timeOffset + "\n initSegmentChange: " + initSegmentChange);
|
17591
|
+
this.hls.logger.log("[transmuxer-interface, " + frag.type + "]: Starting new transmux session for sn: " + chunkMeta.sn + " p: " + chunkMeta.part + " level: " + chunkMeta.level + " id: " + chunkMeta.id + "\n discontinuity: " + discontinuity + "\n trackSwitch: " + trackSwitch + "\n contiguous: " + contiguous + "\n accurateTimeOffset: " + accurateTimeOffset + "\n timeOffset: " + timeOffset + "\n initSegmentChange: " + initSegmentChange);
|
17461
17592
|
var config = new TransmuxConfig(audioCodec, videoCodec, initSegmentData, duration, defaultInitPTS);
|
17462
17593
|
this.configureTransmuxer(config);
|
17463
17594
|
}
|
@@ -17468,6 +17599,7 @@
|
|
17468
17599
|
if (this.workerContext) {
|
17469
17600
|
// post fragment payload as transferable objects for ArrayBuffer (no copy)
|
17470
17601
|
this.workerContext.worker.postMessage({
|
17602
|
+
instanceNo: instanceNo,
|
17471
17603
|
cmd: 'demux',
|
17472
17604
|
data: data,
|
17473
17605
|
decryptdata: decryptdata,
|
@@ -17477,14 +17609,12 @@
|
|
17477
17609
|
} else if (transmuxer) {
|
17478
17610
|
var transmuxResult = transmuxer.push(data, decryptdata, chunkMeta, state);
|
17479
17611
|
if (isPromise(transmuxResult)) {
|
17480
|
-
transmuxer.async = true;
|
17481
17612
|
transmuxResult.then(function (data) {
|
17482
17613
|
_this2.handleTransmuxComplete(data);
|
17483
17614
|
}).catch(function (error) {
|
17484
17615
|
_this2.transmuxerError(error, chunkMeta, 'transmuxer-interface push error');
|
17485
17616
|
});
|
17486
17617
|
} else {
|
17487
|
-
transmuxer.async = false;
|
17488
17618
|
this.handleTransmuxComplete(transmuxResult);
|
17489
17619
|
}
|
17490
17620
|
}
|
@@ -17492,19 +17622,17 @@
|
|
17492
17622
|
_proto.flush = function flush(chunkMeta) {
|
17493
17623
|
var _this3 = this;
|
17494
17624
|
chunkMeta.transmuxing.start = self.performance.now();
|
17495
|
-
var
|
17625
|
+
var instanceNo = this.instanceNo,
|
17626
|
+
transmuxer = this.transmuxer;
|
17496
17627
|
if (this.workerContext) {
|
17497
17628
|
this.workerContext.worker.postMessage({
|
17629
|
+
instanceNo: instanceNo,
|
17498
17630
|
cmd: 'flush',
|
17499
17631
|
chunkMeta: chunkMeta
|
17500
17632
|
});
|
17501
17633
|
} else if (transmuxer) {
|
17502
17634
|
var transmuxResult = transmuxer.flush(chunkMeta);
|
17503
|
-
|
17504
|
-
if (asyncFlush || transmuxer.async) {
|
17505
|
-
if (!isPromise(transmuxResult)) {
|
17506
|
-
transmuxResult = Promise.resolve(transmuxResult);
|
17507
|
-
}
|
17635
|
+
if (isPromise(transmuxResult)) {
|
17508
17636
|
transmuxResult.then(function (data) {
|
17509
17637
|
_this3.handleFlushResult(data, chunkMeta);
|
17510
17638
|
}).catch(function (error) {
|
@@ -17525,6 +17653,7 @@
|
|
17525
17653
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
17526
17654
|
chunkMeta: chunkMeta,
|
17527
17655
|
frag: this.frag || undefined,
|
17656
|
+
part: this.part || undefined,
|
17528
17657
|
fatal: false,
|
17529
17658
|
error: error,
|
17530
17659
|
err: error,
|
@@ -17538,58 +17667,12 @@
|
|
17538
17667
|
});
|
17539
17668
|
this.onFlush(chunkMeta);
|
17540
17669
|
};
|
17541
|
-
_proto.onWorkerMessage = function onWorkerMessage(event) {
|
17542
|
-
var data = event.data;
|
17543
|
-
if (!(data != null && data.event)) {
|
17544
|
-
logger.warn("worker message received with no " + (data ? 'event name' : 'data'));
|
17545
|
-
return;
|
17546
|
-
}
|
17547
|
-
var hls = this.hls;
|
17548
|
-
if (!this.hls) {
|
17549
|
-
return;
|
17550
|
-
}
|
17551
|
-
switch (data.event) {
|
17552
|
-
case 'init':
|
17553
|
-
{
|
17554
|
-
var _this$workerContext2;
|
17555
|
-
var objectURL = (_this$workerContext2 = this.workerContext) == null ? void 0 : _this$workerContext2.objectURL;
|
17556
|
-
if (objectURL) {
|
17557
|
-
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
17558
|
-
self.URL.revokeObjectURL(objectURL);
|
17559
|
-
}
|
17560
|
-
break;
|
17561
|
-
}
|
17562
|
-
case 'transmuxComplete':
|
17563
|
-
{
|
17564
|
-
this.handleTransmuxComplete(data.data);
|
17565
|
-
break;
|
17566
|
-
}
|
17567
|
-
case 'flush':
|
17568
|
-
{
|
17569
|
-
this.onFlush(data.data);
|
17570
|
-
break;
|
17571
|
-
}
|
17572
|
-
|
17573
|
-
// pass logs from the worker thread to the main logger
|
17574
|
-
case 'workerLog':
|
17575
|
-
if (logger[data.data.logType]) {
|
17576
|
-
logger[data.data.logType](data.data.message);
|
17577
|
-
}
|
17578
|
-
break;
|
17579
|
-
default:
|
17580
|
-
{
|
17581
|
-
data.data = data.data || {};
|
17582
|
-
data.data.frag = this.frag;
|
17583
|
-
data.data.id = this.id;
|
17584
|
-
hls.trigger(data.event, data.data);
|
17585
|
-
break;
|
17586
|
-
}
|
17587
|
-
}
|
17588
|
-
};
|
17589
17670
|
_proto.configureTransmuxer = function configureTransmuxer(config) {
|
17590
|
-
var
|
17671
|
+
var instanceNo = this.instanceNo,
|
17672
|
+
transmuxer = this.transmuxer;
|
17591
17673
|
if (this.workerContext) {
|
17592
17674
|
this.workerContext.worker.postMessage({
|
17675
|
+
instanceNo: instanceNo,
|
17593
17676
|
cmd: 'configure',
|
17594
17677
|
config: config
|
17595
17678
|
});
|
@@ -30788,7 +30871,7 @@
|
|
30788
30871
|
* Get the video-dev/hls.js package version.
|
30789
30872
|
*/
|
30790
30873
|
function get() {
|
30791
|
-
return
|
30874
|
+
return version;
|
30792
30875
|
}
|
30793
30876
|
}, {
|
30794
30877
|
key: "Events",
|