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.light.js
CHANGED
@@ -493,7 +493,7 @@
|
|
493
493
|
// Some browsers don't allow to use bind on console object anyway
|
494
494
|
// fallback to default if needed
|
495
495
|
try {
|
496
|
-
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.14-0.canary.
|
496
|
+
newLogger.log("Debug logs enabled for \"" + context + "\" in hls.js version " + "1.5.14-0.canary.10432");
|
497
497
|
} catch (e) {
|
498
498
|
/* log fn threw an exception. All logger methods are no-ops. */
|
499
499
|
return createLogger();
|
@@ -12154,30 +12154,14 @@
|
|
12154
12154
|
}
|
12155
12155
|
return null;
|
12156
12156
|
}
|
12157
|
-
function shouldAlignOnDiscontinuities(
|
12158
|
-
if (
|
12159
|
-
if (details.
|
12157
|
+
function shouldAlignOnDiscontinuities(refDetails, details) {
|
12158
|
+
if (refDetails) {
|
12159
|
+
if (details.startCC < refDetails.endCC && details.endCC > refDetails.startCC) {
|
12160
12160
|
return true;
|
12161
12161
|
}
|
12162
12162
|
}
|
12163
12163
|
return false;
|
12164
12164
|
}
|
12165
|
-
|
12166
|
-
// Find the first frag in the previous level which matches the CC of the first frag of the new level
|
12167
|
-
function findDiscontinuousReferenceFrag(prevDetails, curDetails) {
|
12168
|
-
var prevFrags = prevDetails.fragments;
|
12169
|
-
var curFrags = curDetails.fragments;
|
12170
|
-
if (!curFrags.length || !prevFrags.length) {
|
12171
|
-
logger.log('No fragments to align');
|
12172
|
-
return;
|
12173
|
-
}
|
12174
|
-
var prevStartFrag = findFirstFragWithCC(prevFrags, curFrags[0].cc);
|
12175
|
-
if (!prevStartFrag || prevStartFrag && !prevStartFrag.startPTS) {
|
12176
|
-
logger.log('No frag in previous level to align on');
|
12177
|
-
return;
|
12178
|
-
}
|
12179
|
-
return prevStartFrag;
|
12180
|
-
}
|
12181
12165
|
function adjustFragmentStart(frag, sliding) {
|
12182
12166
|
if (frag) {
|
12183
12167
|
var start = frag.start + sliding;
|
@@ -12212,7 +12196,7 @@
|
|
12212
12196
|
if (!switchDetails) {
|
12213
12197
|
return;
|
12214
12198
|
}
|
12215
|
-
alignDiscontinuities(
|
12199
|
+
alignDiscontinuities(details, switchDetails);
|
12216
12200
|
if (!details.alignedSliding && switchDetails) {
|
12217
12201
|
// If the PTS wasn't figured out via discontinuity sequence that means there was no CC increase within the level.
|
12218
12202
|
// Aligning via Program Date Time should therefore be reliable, since PDT should be the same within the same
|
@@ -12228,20 +12212,24 @@
|
|
12228
12212
|
}
|
12229
12213
|
|
12230
12214
|
/**
|
12231
|
-
*
|
12232
|
-
* discontinuity sequence.
|
12233
|
-
* @param lastFrag - The last Fragment which shares the same discontinuity sequence
|
12215
|
+
* Ajust the start of fragments in `details` by the difference in time between fragments of the latest
|
12216
|
+
* shared discontinuity sequence change.
|
12234
12217
|
* @param lastLevel - The details of the last loaded level
|
12235
12218
|
* @param details - The details of the new level
|
12236
12219
|
*/
|
12237
|
-
function alignDiscontinuities(
|
12238
|
-
if (shouldAlignOnDiscontinuities(
|
12239
|
-
|
12240
|
-
if (referenceFrag && isFiniteNumber(referenceFrag.start)) {
|
12241
|
-
logger.log("Adjusting PTS using last level due to CC increase within current level " + details.url);
|
12242
|
-
adjustSlidingStart(referenceFrag.start, details);
|
12243
|
-
}
|
12220
|
+
function alignDiscontinuities(details, refDetails) {
|
12221
|
+
if (!shouldAlignOnDiscontinuities(refDetails, details)) {
|
12222
|
+
return;
|
12244
12223
|
}
|
12224
|
+
var targetCC = Math.min(refDetails.endCC, details.endCC);
|
12225
|
+
var refFrag = findFirstFragWithCC(refDetails.fragments, targetCC);
|
12226
|
+
var frag = findFirstFragWithCC(details.fragments, targetCC);
|
12227
|
+
if (!refFrag || !frag) {
|
12228
|
+
return;
|
12229
|
+
}
|
12230
|
+
logger.log("Aligning playlist at start of dicontinuity sequence " + targetCC);
|
12231
|
+
var delta = refFrag.start - frag.start;
|
12232
|
+
adjustSlidingStart(delta, details);
|
12245
12233
|
}
|
12246
12234
|
|
12247
12235
|
/**
|
@@ -13022,6 +13010,10 @@
|
|
13022
13010
|
};
|
13023
13011
|
_proto.onHandlerDestroying = function onHandlerDestroying() {
|
13024
13012
|
this.stopLoad();
|
13013
|
+
if (this.transmuxer) {
|
13014
|
+
this.transmuxer.destroy();
|
13015
|
+
this.transmuxer = null;
|
13016
|
+
}
|
13025
13017
|
_TaskLoop.prototype.onHandlerDestroying.call(this);
|
13026
13018
|
// @ts-ignore
|
13027
13019
|
this.hls = this.onMediaSeeking = this.onMediaEnded = null;
|
@@ -13069,7 +13061,7 @@
|
|
13069
13061
|
return;
|
13070
13062
|
}
|
13071
13063
|
if ('payload' in data) {
|
13072
|
-
_this3.log("Loaded
|
13064
|
+
_this3.log("Loaded " + frag.type + " sn: " + frag.sn + " of " + _this3.playlistLabel() + " " + frag.level);
|
13073
13065
|
_this3.hls.trigger(Events.FRAG_LOADED, data);
|
13074
13066
|
}
|
13075
13067
|
|
@@ -13213,9 +13205,9 @@
|
|
13213
13205
|
return !frag || !fragCurrent || frag.sn !== fragCurrent.sn || frag.level !== fragCurrent.level;
|
13214
13206
|
};
|
13215
13207
|
_proto.fragBufferedComplete = function fragBufferedComplete(frag, part) {
|
13216
|
-
var
|
13208
|
+
var _this$fragCurrent, _this$fragPrevious;
|
13217
13209
|
var media = this.mediaBuffer ? this.mediaBuffer : this.media;
|
13218
|
-
this.log("Buffered " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " +
|
13210
|
+
this.log("Buffered " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag) + " > buffer:" + (media ? TimeRanges.toString(BufferHelper.getBuffered(media)) : '(detached)') + ")");
|
13219
13211
|
if (frag.sn !== 'initSegment') {
|
13220
13212
|
var _this$levels;
|
13221
13213
|
if (frag.type !== PlaylistLevelType.SUBTITLE) {
|
@@ -13277,7 +13269,7 @@
|
|
13277
13269
|
}
|
13278
13270
|
var keyLoadingPromise = null;
|
13279
13271
|
if (frag.encrypted && !((_frag$decryptdata = frag.decryptdata) != null && _frag$decryptdata.key)) {
|
13280
|
-
this.log("Loading key for " + frag.sn + " of [" + details.startSN + "-" + details.endSN + "], " +
|
13272
|
+
this.log("Loading key for " + frag.sn + " of [" + details.startSN + "-" + details.endSN + "], " + this.playlistLabel() + " " + frag.level);
|
13281
13273
|
this.state = State.KEY_LOADING;
|
13282
13274
|
this.fragCurrent = frag;
|
13283
13275
|
keyLoadingPromise = this.keyLoader.load(frag).then(function (keyLoadedData) {
|
@@ -13316,7 +13308,7 @@
|
|
13316
13308
|
var partIndex = this.getNextPart(partList, frag, targetBufferTime);
|
13317
13309
|
if (partIndex > -1) {
|
13318
13310
|
var part = partList[partIndex];
|
13319
|
-
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) + "] " +
|
13311
|
+
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)));
|
13320
13312
|
this.nextLoadPosition = part.start + part.duration;
|
13321
13313
|
this.state = State.FRAG_LOADING;
|
13322
13314
|
var _result;
|
@@ -13356,7 +13348,7 @@
|
|
13356
13348
|
// Selected fragment hint for part but not loading parts
|
13357
13349
|
return Promise.resolve(null);
|
13358
13350
|
}
|
13359
|
-
this.log("Loading
|
13351
|
+
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)));
|
13360
13352
|
// Don't update nextLoadPosition for fragments which are not buffered
|
13361
13353
|
if (isFiniteNumber(frag.sn) && !this.bitrateTest) {
|
13362
13354
|
this.nextLoadPosition = frag.start + frag.duration;
|
@@ -14120,16 +14112,25 @@
|
|
14120
14112
|
// For this error fallthrough. Marking parsed will allow advancing to next fragment.
|
14121
14113
|
}
|
14122
14114
|
this.state = State.PARSED;
|
14115
|
+
this.log("Parsed " + frag.type + " sn: " + frag.sn + (part ? ' part: ' + part.index : '') + " of " + this.fragInfo(frag) + ")");
|
14123
14116
|
this.hls.trigger(Events.FRAG_PARSED, {
|
14124
14117
|
frag: frag,
|
14125
14118
|
part: part
|
14126
14119
|
});
|
14127
14120
|
};
|
14128
|
-
_proto.
|
14129
|
-
|
14130
|
-
|
14131
|
-
|
14121
|
+
_proto.playlistLabel = function playlistLabel() {
|
14122
|
+
return this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track';
|
14123
|
+
};
|
14124
|
+
_proto.fragInfo = function fragInfo(frag, pts) {
|
14125
|
+
var _ref3, _ref4;
|
14126
|
+
if (pts === void 0) {
|
14127
|
+
pts = true;
|
14132
14128
|
}
|
14129
|
+
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) + "]";
|
14130
|
+
};
|
14131
|
+
_proto.resetTransmuxer = function resetTransmuxer() {
|
14132
|
+
var _this$transmuxer2;
|
14133
|
+
(_this$transmuxer2 = this.transmuxer) == null ? void 0 : _this$transmuxer2.reset();
|
14133
14134
|
};
|
14134
14135
|
_proto.recoverWorkerError = function recoverWorkerError(data) {
|
14135
14136
|
if (data.event === 'demuxerWorker') {
|
@@ -14867,7 +14868,7 @@
|
|
14867
14868
|
|
14868
14869
|
// Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS
|
14869
14870
|
;
|
14870
|
-
AACDemuxer.probe = function probe$2(data) {
|
14871
|
+
AACDemuxer.probe = function probe$2(data, logger) {
|
14871
14872
|
if (!data) {
|
14872
14873
|
return false;
|
14873
14874
|
}
|
@@ -15816,7 +15817,8 @@
|
|
15816
15817
|
|
15817
15818
|
var PACKET_LENGTH = 188;
|
15818
15819
|
var TSDemuxer = /*#__PURE__*/function () {
|
15819
|
-
function TSDemuxer(observer, config, typeSupported) {
|
15820
|
+
function TSDemuxer(observer, config, typeSupported, logger) {
|
15821
|
+
this.logger = void 0;
|
15820
15822
|
this.observer = void 0;
|
15821
15823
|
this.config = void 0;
|
15822
15824
|
this.typeSupported = void 0;
|
@@ -15836,9 +15838,10 @@
|
|
15836
15838
|
this.observer = observer;
|
15837
15839
|
this.config = config;
|
15838
15840
|
this.typeSupported = typeSupported;
|
15841
|
+
this.logger = logger;
|
15839
15842
|
this.videoParser = null;
|
15840
15843
|
}
|
15841
|
-
TSDemuxer.probe = function probe(data) {
|
15844
|
+
TSDemuxer.probe = function probe(data, logger) {
|
15842
15845
|
var syncOffset = TSDemuxer.syncOffset(data);
|
15843
15846
|
if (syncOffset > 0) {
|
15844
15847
|
logger.warn("MPEG2-TS detected but first sync word found @ offset " + syncOffset);
|
@@ -16005,7 +16008,7 @@
|
|
16005
16008
|
switch (pid) {
|
16006
16009
|
case videoPid:
|
16007
16010
|
if (stt) {
|
16008
|
-
if (videoData && (pes = parsePES(videoData))) {
|
16011
|
+
if (videoData && (pes = parsePES(videoData, this.logger))) {
|
16009
16012
|
if (this.videoParser === null) {
|
16010
16013
|
switch (videoTrack.segmentCodec) {
|
16011
16014
|
case 'avc':
|
@@ -16029,7 +16032,7 @@
|
|
16029
16032
|
break;
|
16030
16033
|
case audioPid:
|
16031
16034
|
if (stt) {
|
16032
|
-
if (audioData && (pes = parsePES(audioData))) {
|
16035
|
+
if (audioData && (pes = parsePES(audioData, this.logger))) {
|
16033
16036
|
switch (audioTrack.segmentCodec) {
|
16034
16037
|
case 'aac':
|
16035
16038
|
this.parseAACPES(audioTrack, pes);
|
@@ -16051,7 +16054,7 @@
|
|
16051
16054
|
break;
|
16052
16055
|
case id3Pid:
|
16053
16056
|
if (stt) {
|
16054
|
-
if (id3Data && (pes = parsePES(id3Data))) {
|
16057
|
+
if (id3Data && (pes = parsePES(id3Data, this.logger))) {
|
16055
16058
|
this.parseID3PES(id3Track, pes);
|
16056
16059
|
}
|
16057
16060
|
id3Data = {
|
@@ -16069,14 +16072,14 @@
|
|
16069
16072
|
offset += data[offset] + 1;
|
16070
16073
|
}
|
16071
16074
|
pmtId = this._pmtId = parsePAT(data, offset);
|
16072
|
-
// logger.log('PMT PID:' + this._pmtId);
|
16075
|
+
// this.logger.log('PMT PID:' + this._pmtId);
|
16073
16076
|
break;
|
16074
16077
|
case pmtId:
|
16075
16078
|
{
|
16076
16079
|
if (stt) {
|
16077
16080
|
offset += data[offset] + 1;
|
16078
16081
|
}
|
16079
|
-
var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer);
|
16082
|
+
var parsedPIDs = parsePMT(data, offset, this.typeSupported, isSampleAes, this.observer, this.logger);
|
16080
16083
|
|
16081
16084
|
// only update track id if track PID found while parsing PMT
|
16082
16085
|
// this is to avoid resetting the PID to -1 in case
|
@@ -16099,7 +16102,7 @@
|
|
16099
16102
|
id3Track.pid = id3Pid;
|
16100
16103
|
}
|
16101
16104
|
if (unknownPID !== null && !pmtParsed) {
|
16102
|
-
logger.warn("MPEG-TS PMT found at " + start + " after unknown PID '" + unknownPID + "'. Backtracking to sync byte @" + syncOffset + " to parse all TS packets.");
|
16105
|
+
this.logger.warn("MPEG-TS PMT found at " + start + " after unknown PID '" + unknownPID + "'. Backtracking to sync byte @" + syncOffset + " to parse all TS packets.");
|
16103
16106
|
unknownPID = null;
|
16104
16107
|
// we set it to -188, the += 188 in the for loop will reset start to 0
|
16105
16108
|
start = syncOffset - 188;
|
@@ -16119,7 +16122,7 @@
|
|
16119
16122
|
}
|
16120
16123
|
}
|
16121
16124
|
if (tsPacketErrors > 0) {
|
16122
|
-
emitParsingError(this.observer, new Error("Found " + tsPacketErrors + " TS packet/s that do not start with 0x47"));
|
16125
|
+
emitParsingError(this.observer, new Error("Found " + tsPacketErrors + " TS packet/s that do not start with 0x47"), undefined, this.logger);
|
16123
16126
|
}
|
16124
16127
|
videoTrack.pesData = videoData;
|
16125
16128
|
audioTrack.pesData = audioData;
|
@@ -16165,7 +16168,7 @@
|
|
16165
16168
|
var id3Data = id3Track.pesData;
|
16166
16169
|
// try to parse last PES packets
|
16167
16170
|
var pes;
|
16168
|
-
if (videoData && (pes = parsePES(videoData))) {
|
16171
|
+
if (videoData && (pes = parsePES(videoData, this.logger))) {
|
16169
16172
|
if (this.videoParser === null) {
|
16170
16173
|
switch (videoTrack.segmentCodec) {
|
16171
16174
|
case 'avc':
|
@@ -16181,7 +16184,7 @@
|
|
16181
16184
|
// either avcData null or PES truncated, keep it for next frag parsing
|
16182
16185
|
videoTrack.pesData = videoData;
|
16183
16186
|
}
|
16184
|
-
if (audioData && (pes = parsePES(audioData))) {
|
16187
|
+
if (audioData && (pes = parsePES(audioData, this.logger))) {
|
16185
16188
|
switch (audioTrack.segmentCodec) {
|
16186
16189
|
case 'aac':
|
16187
16190
|
this.parseAACPES(audioTrack, pes);
|
@@ -16193,13 +16196,13 @@
|
|
16193
16196
|
audioTrack.pesData = null;
|
16194
16197
|
} else {
|
16195
16198
|
if (audioData != null && audioData.size) {
|
16196
|
-
logger.log('last AAC PES packet truncated,might overlap between fragments');
|
16199
|
+
this.logger.log('last AAC PES packet truncated,might overlap between fragments');
|
16197
16200
|
}
|
16198
16201
|
|
16199
16202
|
// either audioData null or PES truncated, keep it for next frag parsing
|
16200
16203
|
audioTrack.pesData = audioData;
|
16201
16204
|
}
|
16202
|
-
if (id3Data && (pes = parsePES(id3Data))) {
|
16205
|
+
if (id3Data && (pes = parsePES(id3Data, this.logger))) {
|
16203
16206
|
this.parseID3PES(id3Track, pes);
|
16204
16207
|
id3Track.pesData = null;
|
16205
16208
|
} else {
|
@@ -16271,7 +16274,7 @@
|
|
16271
16274
|
} else {
|
16272
16275
|
reason = 'No ADTS header found in AAC PES';
|
16273
16276
|
}
|
16274
|
-
emitParsingError(this.observer, new Error(reason), recoverable);
|
16277
|
+
emitParsingError(this.observer, new Error(reason), recoverable, this.logger);
|
16275
16278
|
if (!recoverable) {
|
16276
16279
|
return;
|
16277
16280
|
}
|
@@ -16286,7 +16289,7 @@
|
|
16286
16289
|
var frameDuration = getFrameDuration(track.samplerate);
|
16287
16290
|
pts = aacOverFlow.sample.pts + frameDuration;
|
16288
16291
|
} else {
|
16289
|
-
logger.warn('[tsdemuxer]: AAC PES unknown PTS');
|
16292
|
+
this.logger.warn('[tsdemuxer]: AAC PES unknown PTS');
|
16290
16293
|
return;
|
16291
16294
|
}
|
16292
16295
|
|
@@ -16316,7 +16319,7 @@
|
|
16316
16319
|
var offset = 0;
|
16317
16320
|
var pts = pes.pts;
|
16318
16321
|
if (pts === undefined) {
|
16319
|
-
logger.warn('[tsdemuxer]: MPEG PES unknown PTS');
|
16322
|
+
this.logger.warn('[tsdemuxer]: MPEG PES unknown PTS');
|
16320
16323
|
return;
|
16321
16324
|
}
|
16322
16325
|
while (offset < length) {
|
@@ -16339,7 +16342,7 @@
|
|
16339
16342
|
};
|
16340
16343
|
_proto.parseID3PES = function parseID3PES(id3Track, pes) {
|
16341
16344
|
if (pes.pts === undefined) {
|
16342
|
-
logger.warn('[tsdemuxer]: ID3 PES unknown PTS');
|
16345
|
+
this.logger.warn('[tsdemuxer]: ID3 PES unknown PTS');
|
16343
16346
|
return;
|
16344
16347
|
}
|
16345
16348
|
var id3Sample = _extends({}, pes, {
|
@@ -16358,7 +16361,7 @@
|
|
16358
16361
|
// skip the PSI header and parse the first PMT entry
|
16359
16362
|
return (data[offset + 10] & 0x1f) << 8 | data[offset + 11];
|
16360
16363
|
}
|
16361
|
-
function parsePMT(data, offset, typeSupported, isSampleAes, observer) {
|
16364
|
+
function parsePMT(data, offset, typeSupported, isSampleAes, observer, logger) {
|
16362
16365
|
var result = {
|
16363
16366
|
audioPid: -1,
|
16364
16367
|
videoPid: -1,
|
@@ -16380,7 +16383,7 @@
|
|
16380
16383
|
case 0xcf:
|
16381
16384
|
// SAMPLE-AES AAC
|
16382
16385
|
if (!isSampleAes) {
|
16383
|
-
logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC');
|
16386
|
+
logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC', this.logger);
|
16384
16387
|
break;
|
16385
16388
|
}
|
16386
16389
|
/* falls through */
|
@@ -16402,7 +16405,7 @@
|
|
16402
16405
|
case 0xdb:
|
16403
16406
|
// SAMPLE-AES AVC
|
16404
16407
|
if (!isSampleAes) {
|
16405
|
-
logEncryptedSamplesFoundInUnencryptedStream('H.264');
|
16408
|
+
logEncryptedSamplesFoundInUnencryptedStream('H.264', this.logger);
|
16406
16409
|
break;
|
16407
16410
|
}
|
16408
16411
|
/* falls through */
|
@@ -16430,7 +16433,7 @@
|
|
16430
16433
|
case 0xc1:
|
16431
16434
|
// SAMPLE-AES AC3
|
16432
16435
|
if (!isSampleAes) {
|
16433
|
-
logEncryptedSamplesFoundInUnencryptedStream('AC-3');
|
16436
|
+
logEncryptedSamplesFoundInUnencryptedStream('AC-3', this.logger);
|
16434
16437
|
break;
|
16435
16438
|
}
|
16436
16439
|
/* falls through */
|
@@ -16466,12 +16469,12 @@
|
|
16466
16469
|
case 0xc2: // SAMPLE-AES EC3
|
16467
16470
|
/* falls through */
|
16468
16471
|
case 0x87:
|
16469
|
-
emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'));
|
16472
|
+
emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'), undefined, this.logger);
|
16470
16473
|
return result;
|
16471
16474
|
case 0x24:
|
16472
16475
|
// ITU-T Rec. H.265 and ISO/IEC 23008-2 (HEVC)
|
16473
16476
|
{
|
16474
|
-
emitParsingError(observer, new Error('Unsupported HEVC in M2TS found'));
|
16477
|
+
emitParsingError(observer, new Error('Unsupported HEVC in M2TS found'), undefined, this.logger);
|
16475
16478
|
return result;
|
16476
16479
|
}
|
16477
16480
|
}
|
@@ -16481,7 +16484,7 @@
|
|
16481
16484
|
}
|
16482
16485
|
return result;
|
16483
16486
|
}
|
16484
|
-
function emitParsingError(observer, error, levelRetry) {
|
16487
|
+
function emitParsingError(observer, error, levelRetry, logger) {
|
16485
16488
|
logger.warn("parsing error: " + error.message);
|
16486
16489
|
observer.emit(Events.ERROR, Events.ERROR, {
|
16487
16490
|
type: ErrorTypes.MEDIA_ERROR,
|
@@ -16492,10 +16495,10 @@
|
|
16492
16495
|
reason: error.message
|
16493
16496
|
});
|
16494
16497
|
}
|
16495
|
-
function logEncryptedSamplesFoundInUnencryptedStream(type) {
|
16498
|
+
function logEncryptedSamplesFoundInUnencryptedStream(type, logger) {
|
16496
16499
|
logger.log(type + " with AES-128-CBC encryption found in unencrypted stream");
|
16497
16500
|
}
|
16498
|
-
function parsePES(stream) {
|
16501
|
+
function parsePES(stream, logger) {
|
16499
16502
|
var i = 0;
|
16500
16503
|
var frag;
|
16501
16504
|
var pesLen;
|
@@ -17392,7 +17395,8 @@
|
|
17392
17395
|
var chromeVersion = null;
|
17393
17396
|
var safariWebkitVersion = null;
|
17394
17397
|
var MP4Remuxer = /*#__PURE__*/function () {
|
17395
|
-
function MP4Remuxer(observer, config, typeSupported,
|
17398
|
+
function MP4Remuxer(observer, config, typeSupported, logger) {
|
17399
|
+
this.logger = void 0;
|
17396
17400
|
this.observer = void 0;
|
17397
17401
|
this.config = void 0;
|
17398
17402
|
this.typeSupported = void 0;
|
@@ -17408,6 +17412,7 @@
|
|
17408
17412
|
this.observer = observer;
|
17409
17413
|
this.config = config;
|
17410
17414
|
this.typeSupported = typeSupported;
|
17415
|
+
this.logger = logger;
|
17411
17416
|
this.ISGenerated = false;
|
17412
17417
|
if (chromeVersion === null) {
|
17413
17418
|
var userAgent = navigator.userAgent || '';
|
@@ -17425,16 +17430,16 @@
|
|
17425
17430
|
this.config = this.videoTrackConfig = this._initPTS = this._initDTS = null;
|
17426
17431
|
};
|
17427
17432
|
_proto.resetTimeStamp = function resetTimeStamp(defaultTimeStamp) {
|
17428
|
-
logger.log('[mp4-remuxer]: initPTS & initDTS reset');
|
17433
|
+
this.logger.log('[mp4-remuxer]: initPTS & initDTS reset');
|
17429
17434
|
this._initPTS = this._initDTS = defaultTimeStamp;
|
17430
17435
|
};
|
17431
17436
|
_proto.resetNextTimestamp = function resetNextTimestamp() {
|
17432
|
-
logger.log('[mp4-remuxer]: reset next timestamp');
|
17437
|
+
this.logger.log('[mp4-remuxer]: reset next timestamp');
|
17433
17438
|
this.isVideoContiguous = false;
|
17434
17439
|
this.isAudioContiguous = false;
|
17435
17440
|
};
|
17436
17441
|
_proto.resetInitSegment = function resetInitSegment() {
|
17437
|
-
logger.log('[mp4-remuxer]: ISGenerated flag reset');
|
17442
|
+
this.logger.log('[mp4-remuxer]: ISGenerated flag reset');
|
17438
17443
|
this.ISGenerated = false;
|
17439
17444
|
this.videoTrackConfig = undefined;
|
17440
17445
|
};
|
@@ -17453,7 +17458,7 @@
|
|
17453
17458
|
}
|
17454
17459
|
}, videoSamples[0].pts);
|
17455
17460
|
if (rolloverDetected) {
|
17456
|
-
logger.debug('PTS rollover detected');
|
17461
|
+
this.logger.debug('PTS rollover detected');
|
17457
17462
|
}
|
17458
17463
|
return startPTS;
|
17459
17464
|
};
|
@@ -17497,14 +17502,14 @@
|
|
17497
17502
|
if (!isVideoContiguous && this.config.forceKeyFrameOnDiscontinuity) {
|
17498
17503
|
independent = true;
|
17499
17504
|
if (firstKeyFrameIndex > 0) {
|
17500
|
-
logger.warn("[mp4-remuxer]: Dropped " + firstKeyFrameIndex + " out of " + length + " video samples due to a missing keyframe");
|
17505
|
+
this.logger.warn("[mp4-remuxer]: Dropped " + firstKeyFrameIndex + " out of " + length + " video samples due to a missing keyframe");
|
17501
17506
|
var startPTS = this.getVideoStartPts(videoTrack.samples);
|
17502
17507
|
videoTrack.samples = videoTrack.samples.slice(firstKeyFrameIndex);
|
17503
17508
|
videoTrack.dropped += firstKeyFrameIndex;
|
17504
17509
|
videoTimeOffset += (videoTrack.samples[0].pts - startPTS) / videoTrack.inputTimeScale;
|
17505
17510
|
firstKeyFramePTS = videoTimeOffset;
|
17506
17511
|
} else if (firstKeyFrameIndex === -1) {
|
17507
|
-
logger.warn("[mp4-remuxer]: No keyframe found out of " + length + " video samples");
|
17512
|
+
this.logger.warn("[mp4-remuxer]: No keyframe found out of " + length + " video samples");
|
17508
17513
|
independent = false;
|
17509
17514
|
}
|
17510
17515
|
}
|
@@ -17526,7 +17531,7 @@
|
|
17526
17531
|
if (enoughAudioSamples) {
|
17527
17532
|
// if initSegment was generated without audio samples, regenerate it again
|
17528
17533
|
if (!audioTrack.samplerate) {
|
17529
|
-
logger.warn('[mp4-remuxer]: regenerate InitSegment as audio detected');
|
17534
|
+
this.logger.warn('[mp4-remuxer]: regenerate InitSegment as audio detected');
|
17530
17535
|
initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);
|
17531
17536
|
}
|
17532
17537
|
audio = this.remuxAudio(audioTrack, audioTimeOffset, this.isAudioContiguous, accurateTimeOffset, hasVideo || enoughVideoSamples || playlistType === PlaylistLevelType.AUDIO ? videoTimeOffset : undefined);
|
@@ -17534,7 +17539,7 @@
|
|
17534
17539
|
var audioTrackLength = audio ? audio.endPTS - audio.startPTS : 0;
|
17535
17540
|
// if initSegment was generated without video samples, regenerate it again
|
17536
17541
|
if (!videoTrack.inputTimeScale) {
|
17537
|
-
logger.warn('[mp4-remuxer]: regenerate InitSegment as video detected');
|
17542
|
+
this.logger.warn('[mp4-remuxer]: regenerate InitSegment as video detected');
|
17538
17543
|
initSegment = this.generateIS(audioTrack, videoTrack, timeOffset, accurateTimeOffset);
|
17539
17544
|
}
|
17540
17545
|
video = this.remuxVideo(videoTrack, videoTimeOffset, isVideoContiguous, audioTrackLength);
|
@@ -17740,9 +17745,9 @@
|
|
17740
17745
|
var foundOverlap = delta < -1;
|
17741
17746
|
if (foundHole || foundOverlap) {
|
17742
17747
|
if (foundHole) {
|
17743
|
-
logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(delta, true) + " ms (" + delta + "dts) hole between fragments detected at " + timeOffset.toFixed(3));
|
17748
|
+
this.logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(delta, true) + " ms (" + delta + "dts) hole between fragments detected at " + timeOffset.toFixed(3));
|
17744
17749
|
} else {
|
17745
|
-
logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(-delta, true) + " ms (" + delta + "dts) overlapping between fragments detected at " + timeOffset.toFixed(3));
|
17750
|
+
this.logger.warn((track.segmentCodec || '').toUpperCase() + ": " + toMsFromMpegTsClock(-delta, true) + " ms (" + delta + "dts) overlapping between fragments detected at " + timeOffset.toFixed(3));
|
17746
17751
|
}
|
17747
17752
|
if (!foundOverlap || nextAvcDts >= inputSamples[0].pts || chromeVersion) {
|
17748
17753
|
firstDTS = nextAvcDts;
|
@@ -17771,7 +17776,7 @@
|
|
17771
17776
|
}
|
17772
17777
|
}
|
17773
17778
|
}
|
17774
|
-
logger.log("Video: Initial PTS/DTS adjusted: " + toMsFromMpegTsClock(firstPTS, true) + "/" + toMsFromMpegTsClock(firstDTS, true) + ", delta: " + toMsFromMpegTsClock(delta, true) + " ms");
|
17779
|
+
this.logger.log("Video: Initial PTS/DTS adjusted: " + toMsFromMpegTsClock(firstPTS, true) + "/" + toMsFromMpegTsClock(firstDTS, true) + ", delta: " + toMsFromMpegTsClock(delta, true) + " ms");
|
17775
17780
|
}
|
17776
17781
|
}
|
17777
17782
|
}
|
@@ -17871,7 +17876,7 @@
|
|
17871
17876
|
} else {
|
17872
17877
|
stretchedLastFrame = true;
|
17873
17878
|
}
|
17874
|
-
logger.log("[mp4-remuxer]: It is approximately " + deltaToFrameEnd / 90 + " ms to the next segment; using duration " + mp4SampleDuration / 90 + " ms for the last video frame.");
|
17879
|
+
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.");
|
17875
17880
|
} else {
|
17876
17881
|
mp4SampleDuration = lastFrameDuration;
|
17877
17882
|
}
|
@@ -17899,7 +17904,7 @@
|
|
17899
17904
|
// Fix for "CNN special report, with CC" in test-streams (Safari browser only)
|
17900
17905
|
// Ignore DTS when frame durations are irregular. Safari MSE does not handle this leading to gaps.
|
17901
17906
|
if (maxPtsDelta - minPtsDelta < maxDtsDelta - minDtsDelta && averageSampleDuration / maxDtsDelta < 0.025 && outputSamples[0].cts === 0) {
|
17902
|
-
logger.warn('Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.');
|
17907
|
+
this.logger.warn('Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.');
|
17903
17908
|
var dts = firstDTS;
|
17904
17909
|
for (var _i4 = 0, len = outputSamples.length; _i4 < len; _i4++) {
|
17905
17910
|
var nextDts = dts + outputSamples[_i4].duration;
|
@@ -18026,7 +18031,7 @@
|
|
18026
18031
|
// When remuxing with video, if we're overlapping by more than a duration, drop this sample to stay in sync
|
18027
18032
|
if (delta <= -maxAudioFramesDrift * inputSampleDuration && alignedWithVideo) {
|
18028
18033
|
if (i === 0) {
|
18029
|
-
logger.warn("Audio frame @ " + (pts / inputTimeScale).toFixed(3) + "s overlaps nextAudioPts by " + Math.round(1000 * delta / inputTimeScale) + " ms.");
|
18034
|
+
this.logger.warn("Audio frame @ " + (pts / inputTimeScale).toFixed(3) + "s overlaps nextAudioPts by " + Math.round(1000 * delta / inputTimeScale) + " ms.");
|
18030
18035
|
this.nextAudioPts = nextAudioPts = nextPts = pts;
|
18031
18036
|
}
|
18032
18037
|
} // eslint-disable-line brace-style
|
@@ -18048,12 +18053,12 @@
|
|
18048
18053
|
if (i === 0) {
|
18049
18054
|
this.nextAudioPts = nextAudioPts = nextPts;
|
18050
18055
|
}
|
18051
|
-
logger.warn("[mp4-remuxer]: Injecting " + missing + " audio frame @ " + (nextPts / inputTimeScale).toFixed(3) + "s due to " + Math.round(1000 * delta / inputTimeScale) + " ms gap.");
|
18056
|
+
this.logger.warn("[mp4-remuxer]: Injecting " + missing + " audio frame @ " + (nextPts / inputTimeScale).toFixed(3) + "s due to " + Math.round(1000 * delta / inputTimeScale) + " ms gap.");
|
18052
18057
|
for (var j = 0; j < missing; j++) {
|
18053
18058
|
var newStamp = Math.max(nextPts, 0);
|
18054
18059
|
var fillFrame = AAC.getSilentFrame(track.parsedCodec || track.manifestCodec || track.codec, track.channelCount);
|
18055
18060
|
if (!fillFrame) {
|
18056
|
-
logger.log('[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.');
|
18061
|
+
this.logger.log('[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.');
|
18057
18062
|
fillFrame = sample.unit.subarray();
|
18058
18063
|
}
|
18059
18064
|
inputSamples.splice(i, 0, {
|
@@ -18253,7 +18258,8 @@
|
|
18253
18258
|
};
|
18254
18259
|
|
18255
18260
|
var PassThroughRemuxer = /*#__PURE__*/function () {
|
18256
|
-
function PassThroughRemuxer() {
|
18261
|
+
function PassThroughRemuxer(observer, config, typeSupported, logger) {
|
18262
|
+
this.logger = void 0;
|
18257
18263
|
this.emitInitSegment = false;
|
18258
18264
|
this.audioCodec = void 0;
|
18259
18265
|
this.videoCodec = void 0;
|
@@ -18261,6 +18267,7 @@
|
|
18261
18267
|
this.initPTS = null;
|
18262
18268
|
this.initTracks = void 0;
|
18263
18269
|
this.lastEndTime = null;
|
18270
|
+
this.logger = logger;
|
18264
18271
|
}
|
18265
18272
|
var _proto = PassThroughRemuxer.prototype;
|
18266
18273
|
_proto.destroy = function destroy() {};
|
@@ -18317,7 +18324,7 @@
|
|
18317
18324
|
id: 'main'
|
18318
18325
|
};
|
18319
18326
|
} else {
|
18320
|
-
logger.warn('[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.');
|
18327
|
+
this.logger.warn('[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.');
|
18321
18328
|
}
|
18322
18329
|
this.initTracks = tracks;
|
18323
18330
|
};
|
@@ -18357,7 +18364,7 @@
|
|
18357
18364
|
}
|
18358
18365
|
if (!((_initData2 = initData) != null && _initData2.length)) {
|
18359
18366
|
// We can't remux if the initSegment could not be generated
|
18360
|
-
logger.warn('[passthrough-remuxer.ts]: Failed to generate initSegment.');
|
18367
|
+
this.logger.warn('[passthrough-remuxer.ts]: Failed to generate initSegment.');
|
18361
18368
|
return result;
|
18362
18369
|
}
|
18363
18370
|
if (this.emitInitSegment) {
|
@@ -18370,7 +18377,7 @@
|
|
18370
18377
|
if (isInvalidInitPts(initPTS, decodeTime, timeOffset, duration) || initSegment.timescale !== initPTS.timescale && accurateTimeOffset) {
|
18371
18378
|
initSegment.initPTS = decodeTime - timeOffset;
|
18372
18379
|
if (initPTS && initPTS.timescale === 1) {
|
18373
|
-
logger.warn("Adjusting initPTS @" + timeOffset + " from " + initPTS.baseTime / initPTS.timescale + " to " + initSegment.initPTS);
|
18380
|
+
this.logger.warn("Adjusting initPTS @" + timeOffset + " from " + initPTS.baseTime / initPTS.timescale + " to " + initSegment.initPTS);
|
18374
18381
|
}
|
18375
18382
|
this.initPTS = initPTS = {
|
18376
18383
|
baseTime: initSegment.initPTS,
|
@@ -18383,7 +18390,7 @@
|
|
18383
18390
|
if (duration > 0) {
|
18384
18391
|
this.lastEndTime = endTime;
|
18385
18392
|
} else {
|
18386
|
-
logger.warn('Duration parsed from mp4 should be greater than zero');
|
18393
|
+
this.logger.warn('Duration parsed from mp4 should be greater than zero');
|
18387
18394
|
this.resetNextTimestamp();
|
18388
18395
|
}
|
18389
18396
|
var hasAudio = !!initData.audio;
|
@@ -18442,12 +18449,12 @@
|
|
18442
18449
|
return getCodecCompatibleName(parsedCodec, preferManagedMediaSource);
|
18443
18450
|
}
|
18444
18451
|
var result = 'mp4a.40.5';
|
18445
|
-
logger.info("Parsed audio codec \"" + parsedCodec + "\" or audio object type not handled. Using \"" + result + "\"");
|
18452
|
+
this.logger.info("Parsed audio codec \"" + parsedCodec + "\" or audio object type not handled. Using \"" + result + "\"");
|
18446
18453
|
return result;
|
18447
18454
|
}
|
18448
18455
|
// Provide defaults based on codec type
|
18449
18456
|
// This allows for some playback of some fmp4 playlists without CODECS defined in manifest
|
18450
|
-
logger.warn("Unhandled video codec \"" + parsedCodec + "\"");
|
18457
|
+
this.logger.warn("Unhandled video codec \"" + parsedCodec + "\"");
|
18451
18458
|
if (parsedCodec === 'hvc1' || parsedCodec === 'hev1') {
|
18452
18459
|
return 'hvc1.1.6.L120.90';
|
18453
18460
|
}
|
@@ -18457,16 +18464,12 @@
|
|
18457
18464
|
return 'avc1.42e01e';
|
18458
18465
|
}
|
18459
18466
|
|
18460
|
-
/** returns `undefined` is `self` is missing, e.g. in node */
|
18461
|
-
var optionalSelf = typeof self !== 'undefined' ? self : undefined;
|
18462
|
-
|
18463
18467
|
var now;
|
18464
18468
|
// performance.now() not available on WebWorker, at least on Safari Desktop
|
18465
18469
|
try {
|
18466
18470
|
now = self.performance.now.bind(self.performance);
|
18467
18471
|
} catch (err) {
|
18468
|
-
|
18469
|
-
now = optionalSelf == null ? void 0 : optionalSelf.Date.now;
|
18472
|
+
now = Date.now;
|
18470
18473
|
}
|
18471
18474
|
var muxConfig = [{
|
18472
18475
|
demux: MP4Demuxer,
|
@@ -18482,8 +18485,9 @@
|
|
18482
18485
|
remux: MP4Remuxer
|
18483
18486
|
}];
|
18484
18487
|
var Transmuxer = /*#__PURE__*/function () {
|
18485
|
-
function Transmuxer(observer, typeSupported, config, vendor, id) {
|
18486
|
-
this.
|
18488
|
+
function Transmuxer(observer, typeSupported, config, vendor, id, logger) {
|
18489
|
+
this.asyncResult = false;
|
18490
|
+
this.logger = void 0;
|
18487
18491
|
this.observer = void 0;
|
18488
18492
|
this.typeSupported = void 0;
|
18489
18493
|
this.config = void 0;
|
@@ -18501,6 +18505,7 @@
|
|
18501
18505
|
this.config = config;
|
18502
18506
|
this.vendor = vendor;
|
18503
18507
|
this.id = id;
|
18508
|
+
this.logger = logger;
|
18504
18509
|
}
|
18505
18510
|
var _proto = Transmuxer.prototype;
|
18506
18511
|
_proto.configure = function configure(transmuxConfig) {
|
@@ -18552,6 +18557,7 @@
|
|
18552
18557
|
}
|
18553
18558
|
uintData = new Uint8Array(decryptedData);
|
18554
18559
|
} else {
|
18560
|
+
this.asyncResult = true;
|
18555
18561
|
this.decryptionPromise = decrypter.webCryptoDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer, aesMode).then(function (decryptedData) {
|
18556
18562
|
// Calling push here is important; if flush() is called while this is still resolving, this ensures that
|
18557
18563
|
// the decrypted data has been transmuxed
|
@@ -18566,7 +18572,7 @@
|
|
18566
18572
|
if (resetMuxers) {
|
18567
18573
|
var error = this.configureTransmuxer(uintData);
|
18568
18574
|
if (error) {
|
18569
|
-
logger.warn("[transmuxer] " + error.message);
|
18575
|
+
this.logger.warn("[transmuxer] " + error.message);
|
18570
18576
|
this.observer.emit(Events.ERROR, Events.ERROR, {
|
18571
18577
|
type: ErrorTypes.MEDIA_ERROR,
|
18572
18578
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
@@ -18588,6 +18594,7 @@
|
|
18588
18594
|
this.resetContiguity();
|
18589
18595
|
}
|
18590
18596
|
var result = this.transmux(uintData, keyData, timeOffset, accurateTimeOffset, chunkMeta);
|
18597
|
+
this.asyncResult = isPromise(result);
|
18591
18598
|
var currentState = this.currentTransmuxState;
|
18592
18599
|
currentState.contiguous = true;
|
18593
18600
|
currentState.discontinuity = false;
|
@@ -18606,6 +18613,7 @@
|
|
18606
18613
|
currentTransmuxState = this.currentTransmuxState,
|
18607
18614
|
decryptionPromise = this.decryptionPromise;
|
18608
18615
|
if (decryptionPromise) {
|
18616
|
+
this.asyncResult = true;
|
18609
18617
|
// Upon resolution, the decryption promise calls push() and returns its TransmuxerResult up the stack. Therefore
|
18610
18618
|
// only flushing is required for async decryption
|
18611
18619
|
return decryptionPromise.then(function () {
|
@@ -18629,10 +18637,15 @@
|
|
18629
18637
|
if (!demuxer || !remuxer) {
|
18630
18638
|
// If probing failed, then Hls.js has been given content its not able to handle
|
18631
18639
|
stats.executeEnd = now();
|
18632
|
-
|
18640
|
+
var emptyResults = [emptyResult(chunkMeta)];
|
18641
|
+
if (this.asyncResult) {
|
18642
|
+
return Promise.resolve(emptyResults);
|
18643
|
+
}
|
18644
|
+
return emptyResults;
|
18633
18645
|
}
|
18634
18646
|
var demuxResultOrPromise = demuxer.flush(timeOffset);
|
18635
18647
|
if (isPromise(demuxResultOrPromise)) {
|
18648
|
+
this.asyncResult = true;
|
18636
18649
|
// Decrypt final SAMPLE-AES samples
|
18637
18650
|
return demuxResultOrPromise.then(function (demuxResult) {
|
18638
18651
|
_this2.flushRemux(transmuxResults, demuxResult, chunkMeta);
|
@@ -18640,6 +18653,9 @@
|
|
18640
18653
|
});
|
18641
18654
|
}
|
18642
18655
|
this.flushRemux(transmuxResults, demuxResultOrPromise, chunkMeta);
|
18656
|
+
if (this.asyncResult) {
|
18657
|
+
return Promise.resolve(transmuxResults);
|
18658
|
+
}
|
18643
18659
|
return transmuxResults;
|
18644
18660
|
};
|
18645
18661
|
_proto.flushRemux = function flushRemux(transmuxResults, demuxResult, chunkMeta) {
|
@@ -18650,7 +18666,7 @@
|
|
18650
18666
|
var _this$currentTransmux = this.currentTransmuxState,
|
18651
18667
|
accurateTimeOffset = _this$currentTransmux.accurateTimeOffset,
|
18652
18668
|
timeOffset = _this$currentTransmux.timeOffset;
|
18653
|
-
logger.log("[transmuxer.ts]: Flushed
|
18669
|
+
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);
|
18654
18670
|
var remuxResult = this.remuxer.remux(audioTrack, videoTrack, id3Track, textTrack, timeOffset, accurateTimeOffset, true, this.id);
|
18655
18671
|
transmuxResults.push({
|
18656
18672
|
remuxResult: remuxResult,
|
@@ -18729,13 +18745,13 @@
|
|
18729
18745
|
_proto.configureTransmuxer = function configureTransmuxer(data) {
|
18730
18746
|
var config = this.config,
|
18731
18747
|
observer = this.observer,
|
18732
|
-
typeSupported = this.typeSupported
|
18733
|
-
|
18748
|
+
typeSupported = this.typeSupported;
|
18749
|
+
this.vendor;
|
18734
18750
|
// probe for content type
|
18735
18751
|
var mux;
|
18736
18752
|
for (var i = 0, len = muxConfig.length; i < len; i++) {
|
18737
18753
|
var _muxConfig$i$demux;
|
18738
|
-
if ((_muxConfig$i$demux = muxConfig[i].demux) != null && _muxConfig$i$demux.probe(data)) {
|
18754
|
+
if ((_muxConfig$i$demux = muxConfig[i].demux) != null && _muxConfig$i$demux.probe(data, this.logger)) {
|
18739
18755
|
mux = muxConfig[i];
|
18740
18756
|
break;
|
18741
18757
|
}
|
@@ -18749,10 +18765,10 @@
|
|
18749
18765
|
var Remuxer = mux.remux;
|
18750
18766
|
var Demuxer = mux.demux;
|
18751
18767
|
if (!remuxer || !(remuxer instanceof Remuxer)) {
|
18752
|
-
this.remuxer = new Remuxer(observer, config, typeSupported,
|
18768
|
+
this.remuxer = new Remuxer(observer, config, typeSupported, this.logger);
|
18753
18769
|
}
|
18754
18770
|
if (!demuxer || !(demuxer instanceof Demuxer)) {
|
18755
|
-
this.demuxer = new Demuxer(observer, config, typeSupported);
|
18771
|
+
this.demuxer = new Demuxer(observer, config, typeSupported, this.logger);
|
18756
18772
|
this.probe = Demuxer.probe;
|
18757
18773
|
}
|
18758
18774
|
};
|
@@ -19156,63 +19172,54 @@
|
|
19156
19172
|
var eventemitter3Exports = eventemitter3.exports;
|
19157
19173
|
var EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
|
19158
19174
|
|
19175
|
+
var transmuxers = [];
|
19159
19176
|
if (typeof __IN_WORKER__ !== 'undefined' && __IN_WORKER__) {
|
19160
|
-
startWorker(
|
19177
|
+
startWorker();
|
19161
19178
|
}
|
19162
|
-
function startWorker(
|
19163
|
-
var observer = new EventEmitter();
|
19164
|
-
var forwardMessage = function forwardMessage(ev, data) {
|
19165
|
-
self.postMessage({
|
19166
|
-
event: ev,
|
19167
|
-
data: data
|
19168
|
-
});
|
19169
|
-
};
|
19170
|
-
|
19171
|
-
// forward events to main thread
|
19172
|
-
observer.on(Events.FRAG_DECRYPTED, forwardMessage);
|
19173
|
-
observer.on(Events.ERROR, forwardMessage);
|
19174
|
-
|
19175
|
-
// forward logger events to main thread
|
19176
|
-
var forwardWorkerLogs = function forwardWorkerLogs(logger) {
|
19177
|
-
var _loop = function _loop(logFn) {
|
19178
|
-
var func = function func(message) {
|
19179
|
-
forwardMessage('workerLog', {
|
19180
|
-
logType: logFn,
|
19181
|
-
message: message
|
19182
|
-
});
|
19183
|
-
};
|
19184
|
-
logger[logFn] = func;
|
19185
|
-
};
|
19186
|
-
for (var logFn in logger) {
|
19187
|
-
_loop(logFn);
|
19188
|
-
}
|
19189
|
-
};
|
19179
|
+
function startWorker() {
|
19190
19180
|
self.addEventListener('message', function (ev) {
|
19191
19181
|
var data = ev.data;
|
19182
|
+
var instanceNo = data.instanceNo;
|
19183
|
+
if (instanceNo === undefined) {
|
19184
|
+
return;
|
19185
|
+
}
|
19186
|
+
var transmuxer = transmuxers[instanceNo];
|
19187
|
+
if (data.cmd === 'reset') {
|
19188
|
+
delete transmuxers[data.resetNo];
|
19189
|
+
if (transmuxer) {
|
19190
|
+
transmuxer.destroy();
|
19191
|
+
}
|
19192
|
+
data.cmd = 'init';
|
19193
|
+
}
|
19194
|
+
if (data.cmd === 'init') {
|
19195
|
+
var config = JSON.parse(data.config);
|
19196
|
+
var observer = new EventEmitter();
|
19197
|
+
observer.on(Events.FRAG_DECRYPTED, forwardMessage);
|
19198
|
+
observer.on(Events.ERROR, forwardMessage);
|
19199
|
+
var logger = enableLogs(config.debug, data.id);
|
19200
|
+
forwardWorkerLogs(logger, instanceNo);
|
19201
|
+
transmuxers[instanceNo] = new Transmuxer(observer, data.typeSupported, config, '', data.id, logger);
|
19202
|
+
forwardMessage('init', null, instanceNo);
|
19203
|
+
return;
|
19204
|
+
}
|
19205
|
+
if (!transmuxer) {
|
19206
|
+
return;
|
19207
|
+
}
|
19192
19208
|
switch (data.cmd) {
|
19193
|
-
case 'init':
|
19194
|
-
{
|
19195
|
-
var config = JSON.parse(data.config);
|
19196
|
-
self.transmuxer = new Transmuxer(observer, data.typeSupported, config, '', data.id);
|
19197
|
-
var logger = enableLogs(config.debug, data.id);
|
19198
|
-
forwardWorkerLogs(logger);
|
19199
|
-
forwardMessage('init', null);
|
19200
|
-
break;
|
19201
|
-
}
|
19202
19209
|
case 'configure':
|
19203
19210
|
{
|
19204
|
-
|
19211
|
+
transmuxer.configure(data.config);
|
19205
19212
|
break;
|
19206
19213
|
}
|
19207
19214
|
case 'demux':
|
19208
19215
|
{
|
19209
|
-
var transmuxResult =
|
19216
|
+
var transmuxResult = transmuxer.push(data.data, data.decryptdata, data.chunkMeta, data.state);
|
19210
19217
|
if (isPromise(transmuxResult)) {
|
19211
|
-
self.transmuxer.async = true;
|
19212
19218
|
transmuxResult.then(function (data) {
|
19213
|
-
emitTransmuxComplete(self, data);
|
19219
|
+
emitTransmuxComplete(self, data, instanceNo);
|
19214
19220
|
}).catch(function (error) {
|
19215
19221
|
forwardMessage(Events.ERROR, {
|
19222
|
+
instanceNo: instanceNo,
|
19216
19223
|
type: ErrorTypes.MEDIA_ERROR,
|
19217
19224
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
19218
19225
|
chunkMeta: data.chunkMeta,
|
@@ -19220,25 +19227,20 @@
|
|
19220
19227
|
error: error,
|
19221
19228
|
err: error,
|
19222
19229
|
reason: "transmuxer-worker push error"
|
19223
|
-
});
|
19230
|
+
}, instanceNo);
|
19224
19231
|
});
|
19225
19232
|
} else {
|
19226
|
-
self
|
19227
|
-
emitTransmuxComplete(self, transmuxResult);
|
19233
|
+
emitTransmuxComplete(self, transmuxResult, instanceNo);
|
19228
19234
|
}
|
19229
19235
|
break;
|
19230
19236
|
}
|
19231
19237
|
case 'flush':
|
19232
19238
|
{
|
19233
|
-
var
|
19234
|
-
var _transmuxResult =
|
19235
|
-
|
19236
|
-
if (asyncFlush || self.transmuxer.async) {
|
19237
|
-
if (!isPromise(_transmuxResult)) {
|
19238
|
-
_transmuxResult = Promise.resolve(_transmuxResult);
|
19239
|
-
}
|
19239
|
+
var chunkMeta = data.chunkMeta;
|
19240
|
+
var _transmuxResult = transmuxer.flush(chunkMeta);
|
19241
|
+
if (isPromise(_transmuxResult)) {
|
19240
19242
|
_transmuxResult.then(function (results) {
|
19241
|
-
handleFlushResult(self, results,
|
19243
|
+
handleFlushResult(self, results, chunkMeta, instanceNo);
|
19242
19244
|
}).catch(function (error) {
|
19243
19245
|
forwardMessage(Events.ERROR, {
|
19244
19246
|
type: ErrorTypes.MEDIA_ERROR,
|
@@ -19248,17 +19250,17 @@
|
|
19248
19250
|
error: error,
|
19249
19251
|
err: error,
|
19250
19252
|
reason: "transmuxer-worker flush error"
|
19251
|
-
});
|
19253
|
+
}, instanceNo);
|
19252
19254
|
});
|
19253
19255
|
} else {
|
19254
|
-
handleFlushResult(self, _transmuxResult,
|
19256
|
+
handleFlushResult(self, _transmuxResult, chunkMeta, instanceNo);
|
19255
19257
|
}
|
19256
19258
|
break;
|
19257
19259
|
}
|
19258
19260
|
}
|
19259
19261
|
});
|
19260
19262
|
}
|
19261
|
-
function emitTransmuxComplete(self, transmuxResult) {
|
19263
|
+
function emitTransmuxComplete(self, transmuxResult, instanceNo) {
|
19262
19264
|
if (isEmptyResult(transmuxResult.remuxResult)) {
|
19263
19265
|
return false;
|
19264
19266
|
}
|
@@ -19274,7 +19276,8 @@
|
|
19274
19276
|
}
|
19275
19277
|
self.postMessage({
|
19276
19278
|
event: 'transmuxComplete',
|
19277
|
-
data: transmuxResult
|
19279
|
+
data: transmuxResult,
|
19280
|
+
instanceNo: instanceNo
|
19278
19281
|
}, transferable);
|
19279
19282
|
return true;
|
19280
19283
|
}
|
@@ -19289,77 +19292,200 @@
|
|
19289
19292
|
transferable.push(track.data2.buffer);
|
19290
19293
|
}
|
19291
19294
|
}
|
19292
|
-
function handleFlushResult(self, results, chunkMeta) {
|
19295
|
+
function handleFlushResult(self, results, chunkMeta, instanceNo) {
|
19293
19296
|
var parsed = results.reduce(function (parsed, result) {
|
19294
|
-
return emitTransmuxComplete(self, result) || parsed;
|
19297
|
+
return emitTransmuxComplete(self, result, instanceNo) || parsed;
|
19295
19298
|
}, false);
|
19296
19299
|
if (!parsed) {
|
19297
19300
|
// Emit at least one "transmuxComplete" message even if media is not found to update stream-controller state to PARSING
|
19298
19301
|
self.postMessage({
|
19299
19302
|
event: 'transmuxComplete',
|
19300
|
-
data: results[0]
|
19303
|
+
data: results[0],
|
19304
|
+
instanceNo: instanceNo
|
19301
19305
|
});
|
19302
19306
|
}
|
19303
19307
|
self.postMessage({
|
19304
19308
|
event: 'flush',
|
19305
|
-
data: chunkMeta
|
19309
|
+
data: chunkMeta,
|
19310
|
+
instanceNo: instanceNo
|
19306
19311
|
});
|
19307
19312
|
}
|
19313
|
+
function forwardMessage(event, data, instanceNo) {
|
19314
|
+
self.postMessage({
|
19315
|
+
event: event,
|
19316
|
+
data: data,
|
19317
|
+
instanceNo: instanceNo
|
19318
|
+
});
|
19319
|
+
}
|
19320
|
+
function forwardWorkerLogs(logger, instanceNo) {
|
19321
|
+
var _loop = function _loop(logFn) {
|
19322
|
+
var func = function func(message) {
|
19323
|
+
forwardMessage('workerLog', {
|
19324
|
+
logType: logFn,
|
19325
|
+
message: message
|
19326
|
+
}, instanceNo);
|
19327
|
+
};
|
19328
|
+
logger[logFn] = func;
|
19329
|
+
};
|
19330
|
+
for (var logFn in logger) {
|
19331
|
+
_loop(logFn);
|
19332
|
+
}
|
19333
|
+
}
|
19308
19334
|
function isEmptyResult(remuxResult) {
|
19309
19335
|
return !remuxResult.audio && !remuxResult.video && !remuxResult.text && !remuxResult.id3 && !remuxResult.initSegment;
|
19310
19336
|
}
|
19311
19337
|
|
19338
|
+
var version = "1.5.14-0.canary.10432";
|
19339
|
+
|
19312
19340
|
// ensure the worker ends up in the bundle
|
19313
19341
|
// If the worker should not be included this gets aliased to empty.js
|
19342
|
+
var workerStore = {};
|
19314
19343
|
function hasUMDWorker() {
|
19315
19344
|
return typeof __HLS_WORKER_BUNDLE__ === 'function';
|
19316
19345
|
}
|
19317
19346
|
function injectWorker() {
|
19347
|
+
var workerContext = workerStore[version];
|
19348
|
+
if (workerContext) {
|
19349
|
+
workerContext.clientCount++;
|
19350
|
+
return workerContext;
|
19351
|
+
}
|
19318
19352
|
var blob = new self.Blob(["var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(" + __HLS_WORKER_BUNDLE__.toString() + ")(true);"], {
|
19319
19353
|
type: 'text/javascript'
|
19320
19354
|
});
|
19321
19355
|
var objectURL = self.URL.createObjectURL(blob);
|
19322
19356
|
var worker = new self.Worker(objectURL);
|
19323
|
-
|
19357
|
+
var result = {
|
19324
19358
|
worker: worker,
|
19325
|
-
objectURL: objectURL
|
19359
|
+
objectURL: objectURL,
|
19360
|
+
clientCount: 1
|
19326
19361
|
};
|
19362
|
+
workerStore[version] = result;
|
19363
|
+
return result;
|
19327
19364
|
}
|
19328
19365
|
function loadWorker(path) {
|
19366
|
+
var workerContext = workerStore[path];
|
19367
|
+
if (workerContext) {
|
19368
|
+
workerContext.clientCount++;
|
19369
|
+
return workerContext;
|
19370
|
+
}
|
19329
19371
|
var scriptURL = new self.URL(path, self.location.href).href;
|
19330
19372
|
var worker = new self.Worker(scriptURL);
|
19331
|
-
|
19373
|
+
var result = {
|
19332
19374
|
worker: worker,
|
19333
|
-
scriptURL: scriptURL
|
19375
|
+
scriptURL: scriptURL,
|
19376
|
+
clientCount: 1
|
19334
19377
|
};
|
19378
|
+
workerStore[path] = result;
|
19379
|
+
return result;
|
19380
|
+
}
|
19381
|
+
function removeWorkerFromStore(path) {
|
19382
|
+
var workerContext = workerStore[path || version];
|
19383
|
+
if (workerContext) {
|
19384
|
+
var clientCount = workerContext.clientCount--;
|
19385
|
+
if (clientCount === 1) {
|
19386
|
+
var worker = workerContext.worker,
|
19387
|
+
objectURL = workerContext.objectURL;
|
19388
|
+
delete workerStore[path || version];
|
19389
|
+
if (objectURL) {
|
19390
|
+
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
19391
|
+
self.URL.revokeObjectURL(objectURL);
|
19392
|
+
}
|
19393
|
+
worker.terminate();
|
19394
|
+
}
|
19395
|
+
}
|
19335
19396
|
}
|
19336
19397
|
|
19398
|
+
var transmuxerInstanceCount = 0;
|
19337
19399
|
var TransmuxerInterface = /*#__PURE__*/function () {
|
19338
|
-
function TransmuxerInterface(
|
19400
|
+
function TransmuxerInterface(_hls, id, onTransmuxComplete, onFlush) {
|
19339
19401
|
var _this = this;
|
19340
19402
|
this.error = null;
|
19341
19403
|
this.hls = void 0;
|
19342
19404
|
this.id = void 0;
|
19405
|
+
this.instanceNo = transmuxerInstanceCount++;
|
19343
19406
|
this.observer = void 0;
|
19344
19407
|
this.frag = null;
|
19345
19408
|
this.part = null;
|
19346
19409
|
this.useWorker = void 0;
|
19347
19410
|
this.workerContext = null;
|
19348
|
-
this.onwmsg = void 0;
|
19349
19411
|
this.transmuxer = null;
|
19350
19412
|
this.onTransmuxComplete = void 0;
|
19351
19413
|
this.onFlush = void 0;
|
19352
|
-
|
19353
|
-
|
19414
|
+
this.onWorkerMessage = function (event) {
|
19415
|
+
var data = event.data;
|
19416
|
+
var hls = _this.hls;
|
19417
|
+
if (!hls || !(data != null && data.event) || data.instanceNo !== _this.instanceNo) {
|
19418
|
+
return;
|
19419
|
+
}
|
19420
|
+
switch (data.event) {
|
19421
|
+
case 'init':
|
19422
|
+
{
|
19423
|
+
var _this$workerContext;
|
19424
|
+
var objectURL = (_this$workerContext = _this.workerContext) == null ? void 0 : _this$workerContext.objectURL;
|
19425
|
+
if (objectURL) {
|
19426
|
+
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
19427
|
+
self.URL.revokeObjectURL(objectURL);
|
19428
|
+
}
|
19429
|
+
break;
|
19430
|
+
}
|
19431
|
+
case 'transmuxComplete':
|
19432
|
+
{
|
19433
|
+
_this.handleTransmuxComplete(data.data);
|
19434
|
+
break;
|
19435
|
+
}
|
19436
|
+
case 'flush':
|
19437
|
+
{
|
19438
|
+
_this.onFlush(data.data);
|
19439
|
+
break;
|
19440
|
+
}
|
19441
|
+
|
19442
|
+
// pass logs from the worker thread to the main logger
|
19443
|
+
case 'workerLog':
|
19444
|
+
{
|
19445
|
+
if (hls.logger[data.data.logType]) {
|
19446
|
+
hls.logger[data.data.logType](data.data.message);
|
19447
|
+
}
|
19448
|
+
break;
|
19449
|
+
}
|
19450
|
+
default:
|
19451
|
+
{
|
19452
|
+
data.data = data.data || {};
|
19453
|
+
data.data.frag = _this.frag;
|
19454
|
+
data.data.part = _this.part;
|
19455
|
+
data.data.id = _this.id;
|
19456
|
+
hls.trigger(data.event, data.data);
|
19457
|
+
break;
|
19458
|
+
}
|
19459
|
+
}
|
19460
|
+
};
|
19461
|
+
this.onWorkerError = function (event) {
|
19462
|
+
if (!_this.hls) {
|
19463
|
+
return;
|
19464
|
+
}
|
19465
|
+
var error = new Error(event.message + " (" + event.filename + ":" + event.lineno + ")");
|
19466
|
+
_this.hls.config.enableWorker = false;
|
19467
|
+
_this.hls.logger.warn("Error in \"" + _this.id + "\" Web Worker, fallback to inline");
|
19468
|
+
_this.hls.trigger(Events.ERROR, {
|
19469
|
+
type: ErrorTypes.OTHER_ERROR,
|
19470
|
+
details: ErrorDetails.INTERNAL_EXCEPTION,
|
19471
|
+
fatal: false,
|
19472
|
+
event: 'demuxerWorker',
|
19473
|
+
error: error
|
19474
|
+
});
|
19475
|
+
};
|
19476
|
+
var config = _hls.config;
|
19477
|
+
this.hls = _hls;
|
19354
19478
|
this.id = id;
|
19355
19479
|
this.useWorker = !!config.enableWorker;
|
19356
19480
|
this.onTransmuxComplete = onTransmuxComplete;
|
19357
19481
|
this.onFlush = onFlush;
|
19358
19482
|
var forwardMessage = function forwardMessage(ev, data) {
|
19359
19483
|
data = data || {};
|
19360
|
-
data.frag = _this.frag;
|
19361
|
-
data.id = _this.id;
|
19484
|
+
data.frag = _this.frag || undefined;
|
19362
19485
|
if (ev === Events.ERROR) {
|
19486
|
+
data = data;
|
19487
|
+
data.parent = _this.id;
|
19488
|
+
data.part = _this.part;
|
19363
19489
|
_this.error = data.error;
|
19364
19490
|
}
|
19365
19491
|
_this.hls.trigger(ev, data);
|
@@ -19371,6 +19497,7 @@
|
|
19371
19497
|
this.observer.on(Events.ERROR, forwardMessage);
|
19372
19498
|
var m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);
|
19373
19499
|
if (this.useWorker && typeof Worker !== 'undefined') {
|
19500
|
+
var logger = this.hls.logger;
|
19374
19501
|
var canCreateWorker = config.workerPath || hasUMDWorker();
|
19375
19502
|
if (canCreateWorker) {
|
19376
19503
|
try {
|
@@ -19381,61 +19508,60 @@
|
|
19381
19508
|
logger.log("injecting Web Worker for \"" + id + "\"");
|
19382
19509
|
this.workerContext = injectWorker();
|
19383
19510
|
}
|
19384
|
-
this.onwmsg = function (event) {
|
19385
|
-
return _this.onWorkerMessage(event);
|
19386
|
-
};
|
19387
19511
|
var worker = this.workerContext.worker;
|
19388
|
-
worker.addEventListener('message', this.
|
19389
|
-
worker.
|
19390
|
-
var error = new Error(event.message + " (" + event.filename + ":" + event.lineno + ")");
|
19391
|
-
config.enableWorker = false;
|
19392
|
-
logger.warn("Error in \"" + id + "\" Web Worker, fallback to inline");
|
19393
|
-
_this.hls.trigger(Events.ERROR, {
|
19394
|
-
type: ErrorTypes.OTHER_ERROR,
|
19395
|
-
details: ErrorDetails.INTERNAL_EXCEPTION,
|
19396
|
-
fatal: false,
|
19397
|
-
event: 'demuxerWorker',
|
19398
|
-
error: error
|
19399
|
-
});
|
19400
|
-
};
|
19512
|
+
worker.addEventListener('message', this.onWorkerMessage);
|
19513
|
+
worker.addEventListener('error', this.onWorkerError);
|
19401
19514
|
worker.postMessage({
|
19515
|
+
instanceNo: this.instanceNo,
|
19402
19516
|
cmd: 'init',
|
19403
19517
|
typeSupported: m2tsTypeSupported,
|
19404
|
-
vendor: '',
|
19405
19518
|
id: id,
|
19406
19519
|
config: JSON.stringify(config)
|
19407
19520
|
});
|
19408
19521
|
} catch (err) {
|
19409
19522
|
logger.warn("Error setting up \"" + id + "\" Web Worker, fallback to inline", err);
|
19410
|
-
this.
|
19523
|
+
this.terminateWorker();
|
19411
19524
|
this.error = null;
|
19412
|
-
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
|
19525
|
+
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id, _hls.logger);
|
19413
19526
|
}
|
19414
19527
|
return;
|
19415
19528
|
}
|
19416
19529
|
}
|
19417
|
-
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id);
|
19530
|
+
this.transmuxer = new Transmuxer(this.observer, m2tsTypeSupported, config, '', id, _hls.logger);
|
19418
19531
|
}
|
19419
19532
|
var _proto = TransmuxerInterface.prototype;
|
19420
|
-
_proto.
|
19533
|
+
_proto.reset = function reset() {
|
19534
|
+
this.frag = null;
|
19535
|
+
this.part = null;
|
19421
19536
|
if (this.workerContext) {
|
19422
|
-
var
|
19423
|
-
|
19424
|
-
|
19425
|
-
|
19426
|
-
|
19427
|
-
|
19428
|
-
|
19429
|
-
|
19430
|
-
|
19431
|
-
|
19537
|
+
var instanceNo = this.instanceNo;
|
19538
|
+
this.instanceNo = transmuxerInstanceCount++;
|
19539
|
+
var config = this.hls.config;
|
19540
|
+
var m2tsTypeSupported = getM2TSSupportedAudioTypes(config.preferManagedMediaSource);
|
19541
|
+
this.workerContext.worker.postMessage({
|
19542
|
+
instanceNo: this.instanceNo,
|
19543
|
+
cmd: 'reset',
|
19544
|
+
resetNo: instanceNo,
|
19545
|
+
typeSupported: m2tsTypeSupported,
|
19546
|
+
id: this.id,
|
19547
|
+
config: JSON.stringify(config)
|
19548
|
+
});
|
19549
|
+
}
|
19550
|
+
};
|
19551
|
+
_proto.terminateWorker = function terminateWorker() {
|
19552
|
+
if (this.workerContext) {
|
19553
|
+
var worker = this.workerContext.worker;
|
19432
19554
|
this.workerContext = null;
|
19555
|
+
worker.removeEventListener('message', this.onWorkerMessage);
|
19556
|
+
worker.removeEventListener('error', this.onWorkerError);
|
19557
|
+
removeWorkerFromStore(this.hls.config.workerPath);
|
19433
19558
|
}
|
19434
19559
|
};
|
19435
19560
|
_proto.destroy = function destroy() {
|
19436
19561
|
if (this.workerContext) {
|
19437
|
-
this.
|
19438
|
-
|
19562
|
+
this.terminateWorker();
|
19563
|
+
// @ts-ignore
|
19564
|
+
this.onWorkerMessage = this.onWorkerError = null;
|
19439
19565
|
} else {
|
19440
19566
|
var transmuxer = this.transmuxer;
|
19441
19567
|
if (transmuxer) {
|
@@ -19448,6 +19574,7 @@
|
|
19448
19574
|
observer.removeAllListeners();
|
19449
19575
|
}
|
19450
19576
|
this.frag = null;
|
19577
|
+
this.part = null;
|
19451
19578
|
// @ts-ignore
|
19452
19579
|
this.observer = null;
|
19453
19580
|
// @ts-ignore
|
@@ -19458,7 +19585,8 @@
|
|
19458
19585
|
_lastFrag$initSegment,
|
19459
19586
|
_this2 = this;
|
19460
19587
|
chunkMeta.transmuxing.start = self.performance.now();
|
19461
|
-
var
|
19588
|
+
var instanceNo = this.instanceNo,
|
19589
|
+
transmuxer = this.transmuxer;
|
19462
19590
|
var timeOffset = part ? part.start : frag.start;
|
19463
19591
|
// TODO: push "clear-lead" decrypt data for unencrypted fragments in streams with encrypted ones
|
19464
19592
|
var decryptdata = frag.decryptdata;
|
@@ -19479,7 +19607,7 @@
|
|
19479
19607
|
var initSegmentChange = !(lastFrag && ((_frag$initSegment = frag.initSegment) == null ? void 0 : _frag$initSegment.url) === ((_lastFrag$initSegment = lastFrag.initSegment) == null ? void 0 : _lastFrag$initSegment.url));
|
19480
19608
|
var state = new TransmuxState(discontinuity, contiguous, accurateTimeOffset, trackSwitch, timeOffset, initSegmentChange);
|
19481
19609
|
if (!contiguous || discontinuity || initSegmentChange) {
|
19482
|
-
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);
|
19610
|
+
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);
|
19483
19611
|
var config = new TransmuxConfig(audioCodec, videoCodec, initSegmentData, duration, defaultInitPTS);
|
19484
19612
|
this.configureTransmuxer(config);
|
19485
19613
|
}
|
@@ -19490,6 +19618,7 @@
|
|
19490
19618
|
if (this.workerContext) {
|
19491
19619
|
// post fragment payload as transferable objects for ArrayBuffer (no copy)
|
19492
19620
|
this.workerContext.worker.postMessage({
|
19621
|
+
instanceNo: instanceNo,
|
19493
19622
|
cmd: 'demux',
|
19494
19623
|
data: data,
|
19495
19624
|
decryptdata: decryptdata,
|
@@ -19499,14 +19628,12 @@
|
|
19499
19628
|
} else if (transmuxer) {
|
19500
19629
|
var transmuxResult = transmuxer.push(data, decryptdata, chunkMeta, state);
|
19501
19630
|
if (isPromise(transmuxResult)) {
|
19502
|
-
transmuxer.async = true;
|
19503
19631
|
transmuxResult.then(function (data) {
|
19504
19632
|
_this2.handleTransmuxComplete(data);
|
19505
19633
|
}).catch(function (error) {
|
19506
19634
|
_this2.transmuxerError(error, chunkMeta, 'transmuxer-interface push error');
|
19507
19635
|
});
|
19508
19636
|
} else {
|
19509
|
-
transmuxer.async = false;
|
19510
19637
|
this.handleTransmuxComplete(transmuxResult);
|
19511
19638
|
}
|
19512
19639
|
}
|
@@ -19514,19 +19641,17 @@
|
|
19514
19641
|
_proto.flush = function flush(chunkMeta) {
|
19515
19642
|
var _this3 = this;
|
19516
19643
|
chunkMeta.transmuxing.start = self.performance.now();
|
19517
|
-
var
|
19644
|
+
var instanceNo = this.instanceNo,
|
19645
|
+
transmuxer = this.transmuxer;
|
19518
19646
|
if (this.workerContext) {
|
19519
19647
|
this.workerContext.worker.postMessage({
|
19648
|
+
instanceNo: instanceNo,
|
19520
19649
|
cmd: 'flush',
|
19521
19650
|
chunkMeta: chunkMeta
|
19522
19651
|
});
|
19523
19652
|
} else if (transmuxer) {
|
19524
19653
|
var transmuxResult = transmuxer.flush(chunkMeta);
|
19525
|
-
|
19526
|
-
if (asyncFlush || transmuxer.async) {
|
19527
|
-
if (!isPromise(transmuxResult)) {
|
19528
|
-
transmuxResult = Promise.resolve(transmuxResult);
|
19529
|
-
}
|
19654
|
+
if (isPromise(transmuxResult)) {
|
19530
19655
|
transmuxResult.then(function (data) {
|
19531
19656
|
_this3.handleFlushResult(data, chunkMeta);
|
19532
19657
|
}).catch(function (error) {
|
@@ -19547,6 +19672,7 @@
|
|
19547
19672
|
details: ErrorDetails.FRAG_PARSING_ERROR,
|
19548
19673
|
chunkMeta: chunkMeta,
|
19549
19674
|
frag: this.frag || undefined,
|
19675
|
+
part: this.part || undefined,
|
19550
19676
|
fatal: false,
|
19551
19677
|
error: error,
|
19552
19678
|
err: error,
|
@@ -19560,58 +19686,12 @@
|
|
19560
19686
|
});
|
19561
19687
|
this.onFlush(chunkMeta);
|
19562
19688
|
};
|
19563
|
-
_proto.onWorkerMessage = function onWorkerMessage(event) {
|
19564
|
-
var data = event.data;
|
19565
|
-
if (!(data != null && data.event)) {
|
19566
|
-
logger.warn("worker message received with no " + (data ? 'event name' : 'data'));
|
19567
|
-
return;
|
19568
|
-
}
|
19569
|
-
var hls = this.hls;
|
19570
|
-
if (!this.hls) {
|
19571
|
-
return;
|
19572
|
-
}
|
19573
|
-
switch (data.event) {
|
19574
|
-
case 'init':
|
19575
|
-
{
|
19576
|
-
var _this$workerContext2;
|
19577
|
-
var objectURL = (_this$workerContext2 = this.workerContext) == null ? void 0 : _this$workerContext2.objectURL;
|
19578
|
-
if (objectURL) {
|
19579
|
-
// revoke the Object URL that was used to create transmuxer worker, so as not to leak it
|
19580
|
-
self.URL.revokeObjectURL(objectURL);
|
19581
|
-
}
|
19582
|
-
break;
|
19583
|
-
}
|
19584
|
-
case 'transmuxComplete':
|
19585
|
-
{
|
19586
|
-
this.handleTransmuxComplete(data.data);
|
19587
|
-
break;
|
19588
|
-
}
|
19589
|
-
case 'flush':
|
19590
|
-
{
|
19591
|
-
this.onFlush(data.data);
|
19592
|
-
break;
|
19593
|
-
}
|
19594
|
-
|
19595
|
-
// pass logs from the worker thread to the main logger
|
19596
|
-
case 'workerLog':
|
19597
|
-
if (logger[data.data.logType]) {
|
19598
|
-
logger[data.data.logType](data.data.message);
|
19599
|
-
}
|
19600
|
-
break;
|
19601
|
-
default:
|
19602
|
-
{
|
19603
|
-
data.data = data.data || {};
|
19604
|
-
data.data.frag = this.frag;
|
19605
|
-
data.data.id = this.id;
|
19606
|
-
hls.trigger(data.event, data.data);
|
19607
|
-
break;
|
19608
|
-
}
|
19609
|
-
}
|
19610
|
-
};
|
19611
19689
|
_proto.configureTransmuxer = function configureTransmuxer(config) {
|
19612
|
-
var
|
19690
|
+
var instanceNo = this.instanceNo,
|
19691
|
+
transmuxer = this.transmuxer;
|
19613
19692
|
if (this.workerContext) {
|
19614
19693
|
this.workerContext.worker.postMessage({
|
19694
|
+
instanceNo: instanceNo,
|
19615
19695
|
cmd: 'configure',
|
19616
19696
|
config: config
|
19617
19697
|
});
|
@@ -21987,7 +22067,7 @@
|
|
21987
22067
|
* Get the video-dev/hls.js package version.
|
21988
22068
|
*/
|
21989
22069
|
function get() {
|
21990
|
-
return
|
22070
|
+
return version;
|
21991
22071
|
}
|
21992
22072
|
}, {
|
21993
22073
|
key: "Events",
|