@volcengine/veplayer-plugin 2.5.0-rc.0 → 2.5.0

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.
Files changed (43) hide show
  1. package/esm/index.d.ts +0 -1
  2. package/esm/index.development.css +0 -7
  3. package/esm/index.development.js +47254 -53339
  4. package/esm/index.production.css +1 -1
  5. package/esm/index.production.js +4 -13
  6. package/esm/veplayer.plugin.abr.development.js +12 -0
  7. package/esm/veplayer.plugin.abr.production.js +1 -1
  8. package/esm/veplayer.plugin.drm.development.js +12 -0
  9. package/esm/veplayer.plugin.drm.production.js +1 -1
  10. package/esm/veplayer.plugin.flv.development.js +670 -193
  11. package/esm/veplayer.plugin.flv.production.js +1 -1
  12. package/esm/veplayer.plugin.hls.development.js +1155 -371
  13. package/esm/veplayer.plugin.hls.production.js +1 -1
  14. package/esm/veplayer.plugin.mp4.development.js +13 -1
  15. package/esm/veplayer.plugin.mp4.production.js +1 -1
  16. package/esm/veplayer.plugin.rtm.development.js +154 -45
  17. package/esm/veplayer.plugin.rtm.production.js +1 -1
  18. package/esm/veplayer.plugin.shaka.development.js +12 -0
  19. package/esm/veplayer.plugin.shaka.production.js +1 -1
  20. package/package.json +1 -1
  21. package/umd/index.d.ts +0 -1
  22. package/umd/veplayer.plugin.abr.development.js +12 -0
  23. package/umd/veplayer.plugin.abr.production.js +1 -1
  24. package/umd/veplayer.plugin.drm.development.js +12 -0
  25. package/umd/veplayer.plugin.drm.production.js +1 -1
  26. package/umd/veplayer.plugin.flv.development.js +670 -193
  27. package/umd/veplayer.plugin.flv.production.js +1 -1
  28. package/umd/veplayer.plugin.hls.development.js +1122 -338
  29. package/umd/veplayer.plugin.hls.production.js +1 -1
  30. package/umd/veplayer.plugin.mp4.development.js +13 -1
  31. package/umd/veplayer.plugin.mp4.production.js +1 -1
  32. package/umd/veplayer.plugin.rtm.development.js +154 -45
  33. package/umd/veplayer.plugin.rtm.production.js +1 -1
  34. package/umd/veplayer.plugin.shaka.development.js +12 -0
  35. package/umd/veplayer.plugin.shaka.production.js +1 -1
  36. package/esm/veplayer.plugin.ad.development.css +0 -7
  37. package/esm/veplayer.plugin.ad.development.js +0 -9042
  38. package/esm/veplayer.plugin.ad.production.css +0 -1
  39. package/esm/veplayer.plugin.ad.production.js +0 -4
  40. package/umd/veplayer.plugin.ad.development.css +0 -7
  41. package/umd/veplayer.plugin.ad.development.js +0 -9045
  42. package/umd/veplayer.plugin.ad.production.css +0 -1
  43. package/umd/veplayer.plugin.ad.production.js +0 -1
@@ -1644,7 +1644,7 @@
1644
1644
  }
1645
1645
  return offsetTime;
1646
1646
  };
1647
- var version = "3.0.20-alpha.4";
1647
+ var version = "3.0.21-rc.2";
1648
1648
  var ERROR_MAP = {
1649
1649
  1: 5101,
1650
1650
  2: 5102,
@@ -2112,6 +2112,18 @@
2112
2112
  }
2113
2113
  }
2114
2114
  }
2115
+ }, {
2116
+ key: "defineMethod",
2117
+ value: function defineMethod(Obj, map) {
2118
+ for (var key in map) {
2119
+ if (Object.prototype.hasOwnProperty.call(map, key) && typeof map[key] === "function") {
2120
+ Object.defineProperty(Obj, key, {
2121
+ configurable: true,
2122
+ value: map[key]
2123
+ });
2124
+ }
2125
+ }
2126
+ }
2115
2127
  }, {
2116
2128
  key: "defaultConfig",
2117
2129
  get: function get() {
@@ -2734,7 +2746,7 @@
2734
2746
  arr2[i] = arr[i];
2735
2747
  return arr2;
2736
2748
  }
2737
- function _createForOfIteratorHelper(o, allowArrayLike) {
2749
+ function _createForOfIteratorHelper$1(o, allowArrayLike) {
2738
2750
  var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
2739
2751
  if (!it) {
2740
2752
  if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") {
@@ -3089,7 +3101,7 @@
3089
3101
  this.logCache.apply(this, [LogCacheLevel.DEBUG].concat(args));
3090
3102
  if (Logger2.disabled)
3091
3103
  return;
3092
- (_console = console).debug.apply(_console, [this._prefix, nowTime$1()].concat(args));
3104
+ (_console = console).debug.apply(_console, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
3093
3105
  }
3094
3106
  }, {
3095
3107
  key: "log",
@@ -3101,7 +3113,7 @@
3101
3113
  this.logCache.apply(this, [LogCacheLevel.LOG].concat(args));
3102
3114
  if (Logger2.disabled)
3103
3115
  return;
3104
- (_console2 = console).log.apply(_console2, [this._prefix, nowTime$1()].concat(args));
3116
+ (_console2 = console).log.apply(_console2, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
3105
3117
  }
3106
3118
  }, {
3107
3119
  key: "warn",
@@ -3113,7 +3125,7 @@
3113
3125
  this.logCache.apply(this, [LogCacheLevel.WARN].concat(args));
3114
3126
  if (Logger2.disabled)
3115
3127
  return;
3116
- (_console3 = console).warn.apply(_console3, [this._prefix, nowTime$1()].concat(args));
3128
+ (_console3 = console).warn.apply(_console3, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
3117
3129
  }
3118
3130
  }, {
3119
3131
  key: "error",
@@ -3125,7 +3137,7 @@
3125
3137
  this.logCache.apply(this, [LogCacheLevel.ERROR].concat(args));
3126
3138
  if (Logger2.disabled)
3127
3139
  return;
3128
- (_console4 = console).error.apply(_console4, [this._prefix, nowTime$1()].concat(args));
3140
+ (_console4 = console).error.apply(_console4, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
3129
3141
  }
3130
3142
  }, {
3131
3143
  key: "logCache",
@@ -3140,7 +3152,7 @@
3140
3152
  var finLogText = logText.map(function(item) {
3141
3153
  return logable(item);
3142
3154
  });
3143
- text = this._prefix + nowTime$1() + JSON.stringify(finLogText);
3155
+ text = "[".concat(nowTime$1(), "]") + this._prefix + JSON.stringify(finLogText);
3144
3156
  } catch (e) {
3145
3157
  return;
3146
3158
  }
@@ -4056,8 +4068,8 @@
4056
4068
  response
4057
4069
  };
4058
4070
  }
4059
- function calculateSpeed(byteLen, millisec) {
4060
- return Math.round(byteLen * 8 * 1e3 / millisec / 1024);
4071
+ function calculateSpeed(byteLen, milliSecond) {
4072
+ return Math.round(byteLen * 8 * 1e3 / milliSecond / 1024);
4061
4073
  }
4062
4074
  var EVENT = {
4063
4075
  ERROR: "error",
@@ -4069,6 +4081,7 @@
4069
4081
  SOURCEBUFFER_CREATED: "core.sourcebuffercreated",
4070
4082
  MEDIASOURCE_OPENED: "core.mediasourceopened",
4071
4083
  ANALYZE_DURATION_EXCEEDED: "core.analyzedurationexceeded",
4084
+ APPEND_BUFFER: "core.appendbuffer",
4072
4085
  REMOVE_BUFFER: "core.removebuffer",
4073
4086
  BUFFEREOS: "core.buffereos",
4074
4087
  KEYFRAME: "core.keyframe",
@@ -4841,7 +4854,7 @@
4841
4854
  value: function _getHeaders(xhr) {
4842
4855
  var headerLines = xhr.getAllResponseHeaders().trim().split("\r\n");
4843
4856
  var headers = {};
4844
- var _iterator = _createForOfIteratorHelper(headerLines), _step;
4857
+ var _iterator = _createForOfIteratorHelper$1(headerLines), _step;
4845
4858
  try {
4846
4859
  for (_iterator.s(); !(_step = _iterator.n()).done; ) {
4847
4860
  var header = _step.value;
@@ -4863,7 +4876,7 @@
4863
4876
  }]);
4864
4877
  return XhrLoader2;
4865
4878
  }(EventEmitter);
4866
- var _excluded$1 = ["retry", "retryDelay", "onRetryError", "transformError"];
4879
+ var _excluded$2 = ["retry", "retryDelay", "onRetryError", "transformError"];
4867
4880
  var Task = /* @__PURE__ */ function() {
4868
4881
  function Task2(type, config) {
4869
4882
  _classCallCheck$1(this, Task2);
@@ -4883,7 +4896,7 @@
4883
4896
  key: "exec",
4884
4897
  value: function exec() {
4885
4898
  var _this = this;
4886
- var _this$_config = this._config, retry = _this$_config.retry, retryDelay = _this$_config.retryDelay, onRetryError = _this$_config.onRetryError, transformError = _this$_config.transformError, rest = _objectWithoutProperties(_this$_config, _excluded$1);
4899
+ var _this$_config = this._config, retry = _this$_config.retry, retryDelay = _this$_config.retryDelay, onRetryError = _this$_config.onRetryError, transformError = _this$_config.transformError, rest = _objectWithoutProperties(_this$_config, _excluded$2);
4887
4900
  var request = /* @__PURE__ */ function() {
4888
4901
  var _ref = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee() {
4889
4902
  var response, error, isRetry;
@@ -5679,6 +5692,60 @@
5679
5692
  function _nonIterableRest() {
5680
5693
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
5681
5694
  }
5695
+ function _createForOfIteratorHelper(o, allowArrayLike) {
5696
+ var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
5697
+ if (!it) {
5698
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
5699
+ if (it)
5700
+ o = it;
5701
+ var i = 0;
5702
+ var F = function() {
5703
+ };
5704
+ return {
5705
+ s: F,
5706
+ n: function() {
5707
+ if (i >= o.length)
5708
+ return {
5709
+ done: true
5710
+ };
5711
+ return {
5712
+ done: false,
5713
+ value: o[i++]
5714
+ };
5715
+ },
5716
+ e: function(e) {
5717
+ throw e;
5718
+ },
5719
+ f: F
5720
+ };
5721
+ }
5722
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
5723
+ }
5724
+ var normalCompletion = true, didErr = false, err;
5725
+ return {
5726
+ s: function() {
5727
+ it = it.call(o);
5728
+ },
5729
+ n: function() {
5730
+ var step = it.next();
5731
+ normalCompletion = step.done;
5732
+ return step;
5733
+ },
5734
+ e: function(e) {
5735
+ didErr = true;
5736
+ err = e;
5737
+ },
5738
+ f: function() {
5739
+ try {
5740
+ if (!normalCompletion && it.return != null)
5741
+ it.return();
5742
+ } finally {
5743
+ if (didErr)
5744
+ throw err;
5745
+ }
5746
+ }
5747
+ };
5748
+ }
5682
5749
  function _toPrimitive(input, hint) {
5683
5750
  if (typeof input !== "object" || input === null)
5684
5751
  return input;
@@ -5701,13 +5768,16 @@
5701
5768
  METADATA: "metadata"
5702
5769
  };
5703
5770
  var VideoCodecType = {
5771
+ AV1: "av1",
5704
5772
  AVC: "avc",
5705
5773
  HEVC: "hevc"
5706
5774
  };
5707
5775
  var AudioCodecType = {
5708
5776
  AAC: "aac",
5709
5777
  G711PCMA: "g7110a",
5710
- G711PCMU: "g7110m"
5778
+ G711PCMU: "g7110m",
5779
+ OPUS: "opus",
5780
+ MP3: "mp3"
5711
5781
  };
5712
5782
  var WarningType = {
5713
5783
  LARGE_AV_SHIFT: "LARGE_AV_SHIFT",
@@ -5747,6 +5817,7 @@
5747
5817
  _defineProperty(this, "isVideoEncryption", false);
5748
5818
  _defineProperty(this, "isAudioEncryption", false);
5749
5819
  _defineProperty(this, "isVideo", true);
5820
+ _defineProperty(this, "lastKeyFrameDts", 0);
5750
5821
  _defineProperty(this, "kid", null);
5751
5822
  _defineProperty(this, "pssh", null);
5752
5823
  _defineProperty(this, "ext", void 0);
@@ -5789,6 +5860,9 @@
5789
5860
  }, {
5790
5861
  key: "exist",
5791
5862
  value: function exist() {
5863
+ if (/av01/.test(this.codec)) {
5864
+ return true;
5865
+ }
5792
5866
  return !!(this.pps.length && this.sps.length && this.codec);
5793
5867
  }
5794
5868
  }, {
@@ -5812,6 +5886,7 @@
5812
5886
  _defineProperty(this, "codecType", AudioCodecType.AAC);
5813
5887
  _defineProperty(this, "pid", -1);
5814
5888
  _defineProperty(this, "codec", "");
5889
+ _defineProperty(this, "container", "");
5815
5890
  _defineProperty(this, "sequenceNumber", 0);
5816
5891
  _defineProperty(this, "sampleDuration", 0);
5817
5892
  _defineProperty(this, "timescale", 0);
@@ -5852,7 +5927,7 @@
5852
5927
  }, {
5853
5928
  key: "exist",
5854
5929
  value: function exist() {
5855
- return !!(this.sampleRate && this.channelCount && this.codec && this.codecType === AudioCodecType.AAC);
5930
+ return !!(this.sampleRate && this.channelCount && (this.codec || this.container) && (this.codecType === AudioCodecType.AAC || this.codecType === AudioCodecType.G711PCMA || this.codecType === AudioCodecType.G711PCMU || this.codecType === AudioCodecType.OPUS || this.codecType === AudioCodecType.MP3));
5856
5931
  }
5857
5932
  }, {
5858
5933
  key: "hasSample",
@@ -7240,6 +7315,115 @@
7240
7315
  }]);
7241
7316
  return TsFixer2;
7242
7317
  }();
7318
+ var BitratesMap = [32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160];
7319
+ var FREQ = [44100, 48e3, 32e3, 22050, 24e3, 16e3, 11025, 12e3, 8e3];
7320
+ var SamplesCoefficients = [
7321
+ [
7322
+ 0,
7323
+ 72,
7324
+ 144,
7325
+ 12
7326
+ ],
7327
+ [
7328
+ 0,
7329
+ 0,
7330
+ 0,
7331
+ 0
7332
+ ],
7333
+ [
7334
+ 0,
7335
+ 72,
7336
+ 144,
7337
+ 12
7338
+ ],
7339
+ [
7340
+ 0,
7341
+ 144,
7342
+ 144,
7343
+ 12
7344
+ ]
7345
+ ];
7346
+ var BytesInSlot = [
7347
+ 0,
7348
+ 1,
7349
+ 1,
7350
+ 4
7351
+ ];
7352
+ var chromeVersion = null;
7353
+ var MPEG = /* @__PURE__ */ function() {
7354
+ function MPEG2() {
7355
+ _classCallCheck(this, MPEG2);
7356
+ }
7357
+ _createClass(MPEG2, null, [{
7358
+ key: "isHeader",
7359
+ value: function isHeader(data, offset) {
7360
+ return offset + 1 < data.length && data[offset] === 255 && (data[offset + 1] & 224) === 224 && (data[offset + 1] & 6) !== 0;
7361
+ }
7362
+ }, {
7363
+ key: "appendFrame",
7364
+ value: function appendFrame(track, data, offset, pts, frameIndex) {
7365
+ if (offset + 24 > data.length) {
7366
+ return;
7367
+ }
7368
+ var header = MPEG2.parseHeader(data, offset);
7369
+ if (header && offset + header.frameLength <= data.length) {
7370
+ var frameDuration = header.samplesPerFrame * 9e4 / header.sampleRate;
7371
+ var stamp = pts + frameIndex * frameDuration;
7372
+ var sample = {
7373
+ data: data.subarray(offset, offset + header.frameLength),
7374
+ pts: stamp,
7375
+ dts: stamp
7376
+ };
7377
+ sample.size = sample.data.byteLength;
7378
+ track.config = [];
7379
+ track.channelCount = header.channelCount;
7380
+ track.sampleRate = header.sampleRate;
7381
+ track.container = "audio/mpeg";
7382
+ track.samples.push(sample);
7383
+ return {
7384
+ length: header.frameLength
7385
+ };
7386
+ }
7387
+ }
7388
+ }, {
7389
+ key: "parseHeader",
7390
+ value: function parseHeader(data, offset) {
7391
+ var mpegVersion = data[offset + 1] >> 3 & 3;
7392
+ var mpegLayer = data[offset + 1] >> 1 & 3;
7393
+ var bitRateIndex = data[offset + 2] >> 4 & 15;
7394
+ var sampleRateIndex = data[offset + 2] >> 2 & 3;
7395
+ if (mpegVersion !== 1 && bitRateIndex !== 0 && bitRateIndex !== 15 && sampleRateIndex !== 3) {
7396
+ var paddingBit = data[offset + 2] >> 1 & 1;
7397
+ var channelMode = data[offset + 3] >> 6;
7398
+ var columnInBitrates = mpegVersion === 3 ? 3 - mpegLayer : mpegLayer === 3 ? 3 : 4;
7399
+ var bitRate = BitratesMap[columnInBitrates * 14 + bitRateIndex - 1] * 1e3;
7400
+ var columnInSampleRates = mpegVersion === 3 ? 0 : mpegVersion === 2 ? 1 : 2;
7401
+ var sampleRate = FREQ[columnInSampleRates * 3 + sampleRateIndex];
7402
+ var channelCount = channelMode === 3 ? 1 : 2;
7403
+ var sampleCoefficient = SamplesCoefficients[mpegVersion][mpegLayer];
7404
+ var bytesInSlot = BytesInSlot[mpegLayer];
7405
+ var samplesPerFrame = sampleCoefficient * 8 * bytesInSlot;
7406
+ var frameLength = Math.floor(sampleCoefficient * bitRate / sampleRate + paddingBit) * bytesInSlot;
7407
+ if (chromeVersion === null) {
7408
+ var userAgent = navigator.userAgent || "";
7409
+ var result = userAgent.match(/Chrome\/(\d+)/i);
7410
+ chromeVersion = result ? parseInt(result[1]) : 0;
7411
+ }
7412
+ var needChromeFix = !!chromeVersion && chromeVersion <= 87;
7413
+ if (needChromeFix && mpegLayer === 2 && bitRate >= 224e3 && channelMode === 0) {
7414
+ data[offset + 3] = data[offset + 3] | 128;
7415
+ }
7416
+ return {
7417
+ sampleRate,
7418
+ channelCount,
7419
+ frameLength,
7420
+ samplesPerFrame
7421
+ };
7422
+ }
7423
+ }
7424
+ }]);
7425
+ return MPEG2;
7426
+ }();
7243
7427
  var logger$4 = new Logger$1("TsDemuxer");
7244
7428
  var TsDemuxer = /* @__PURE__ */ function() {
7245
7429
  function TsDemuxer2(videoTrack, audioTrack, metadataTrack) {
@@ -7323,6 +7507,11 @@
7323
7507
  case 15:
7324
7508
  audioTrack.pid = audioPid = esPid;
7325
7509
  break;
7510
+ case 3:
7511
+ case 4:
7512
+ audioTrack.pid = audioPid = esPid;
7513
+ audioTrack.codecType = AudioCodecType.MP3;
7514
+ break;
7326
7515
  case 27:
7327
7516
  if (videoPid !== -1)
7328
7517
  break;
@@ -7522,7 +7711,14 @@
7522
7711
  logger$4.warn("Cannot parse audio pes", this._audioPesData);
7523
7712
  return;
7524
7713
  }
7525
- this._parseAacData(pes);
7714
+ switch (this.audioTrack.codecType) {
7715
+ case AudioCodecType.AAC:
7716
+ this._parseAacData(pes);
7717
+ break;
7718
+ case AudioCodecType.MP3:
7719
+ this._parseMPEG(pes);
7720
+ break;
7721
+ }
7526
7722
  this._audioPesData = [];
7527
7723
  }
7528
7724
  }, {
@@ -7559,6 +7755,32 @@
7559
7755
  logger$4.warn("Cannot parse aac adts", pes);
7560
7756
  }
7561
7757
  }
7758
+ }, {
7759
+ key: "_parseMPEG",
7760
+ value: function _parseMPEG(pes) {
7761
+ var data = pes.data;
7762
+ var length = data.length;
7763
+ var frameIndex = 0;
7764
+ var offset = 0;
7765
+ var pts = pes.pts;
7766
+ if (pts === void 0) {
7767
+ logger$4.warn("[tsdemuxer]: MPEG PES unknown PTS");
7768
+ return;
7769
+ }
7770
+ while (offset < length) {
7771
+ if (MPEG.isHeader(data, offset)) {
7772
+ var frame = MPEG.appendFrame(this.audioTrack, data, offset, pts, frameIndex);
7773
+ if (frame) {
7774
+ offset += frame.length;
7775
+ frameIndex++;
7776
+ } else {
7777
+ break;
7778
+ }
7779
+ } else {
7780
+ offset++;
7781
+ }
7782
+ }
7783
+ }
7562
7784
  }], [{
7563
7785
  key: "probe",
7564
7786
  value: function probe(data) {
@@ -7605,7 +7827,7 @@
7605
7827
  _classCallCheck(this, ByteReader2);
7606
7828
  this.dv = new DataView(buf);
7607
7829
  this.start = this.offset = offset || this.dv.byteOffset;
7608
- this.end = len ? this.start + len : this.dv.byteLength;
7830
+ this.end = len ? this.start + len : this.start + this.dv.byteLength;
7609
7831
  }
7610
7832
  _createClass(ByteReader2, [{
7611
7833
  key: "buffer",
@@ -7707,7 +7929,7 @@
7707
7929
  value: function readToBuffer(len) {
7708
7930
  var buffer;
7709
7931
  if (this.offset || len) {
7710
- buffer = this.dv.buffer.slice(this.offset, len ? this.offset + len : void 0);
7932
+ buffer = this.dv.buffer.slice(this.offset, len ? this.offset + len : this.end);
7711
7933
  } else {
7712
7934
  buffer = this.dv.buffer;
7713
7935
  }
@@ -7760,6 +7982,47 @@
7760
7982
  }]);
7761
7983
  return ByteReader2;
7762
7984
  }();
7985
+ var BitReader = /* @__PURE__ */ function() {
7986
+ function BitReader2(val, size) {
7987
+ _classCallCheck(this, BitReader2);
7988
+ this.offset = 0;
7989
+ this.val = val;
7990
+ this.size = size;
7991
+ }
7992
+ _createClass(BitReader2, [{
7993
+ key: "skip",
7994
+ value: function skip(len) {
7995
+ this.offset += len;
7996
+ }
7997
+ }, {
7998
+ key: "read",
7999
+ value: function read(len) {
8000
+ var unreadLength = this.size - this.offset - len;
8001
+ if (unreadLength >= 0) {
8002
+ var bits = 0, i = 0;
8003
+ this.offset += len;
8004
+ if (this.size > 31) {
8005
+ for (; i < len; i++) {
8006
+ bits += Math.pow(2, i);
8007
+ }
8008
+ return this.val / Math.pow(2, unreadLength) & bits;
8009
+ } else {
8010
+ for (; i < len; i++) {
8011
+ bits += 1 << i;
8012
+ }
8013
+ return this.val >>> unreadLength & bits;
8014
+ }
8015
+ }
8016
+ throw new Error("the number of the read operation exceeds the total length limit of bits");
8017
+ }
8018
+ }], [{
8019
+ key: "fromByte",
8020
+ value: function fromByte(byte, len) {
8021
+ return new BitReader2(byte.read(len), len << 3);
8022
+ }
8023
+ }]);
8024
+ return BitReader2;
8025
+ }();
7763
8026
  var MP4Parser = /* @__PURE__ */ function() {
7764
8027
  function MP4Parser2() {
7765
8028
  _classCallCheck(this, MP4Parser2);
@@ -8099,6 +8362,8 @@
8099
8362
  ret.entryCount = readBig32(data);
8100
8363
  ret.entries = MP4Parser2.findBox(data.subarray(4), [], start + 4).map(function(b) {
8101
8364
  switch (b.type) {
8365
+ case "av01":
8366
+ return MP4Parser2.av01(b);
8102
8367
  case "avc1":
8103
8368
  case "avc2":
8104
8369
  case "avc3":
@@ -8178,6 +8443,69 @@
8178
8443
  }
8179
8444
  });
8180
8445
  }
8446
+ }, {
8447
+ key: "colr",
8448
+ value: function colr(box) {
8449
+ return parseBox(box, false, function(ret, data) {
8450
+ var byte = ByteReader.fromUint8(data);
8451
+ ret.data = box.data;
8452
+ ret.colorType = byte.readString(4);
8453
+ if (ret.colorType === "nclx") {
8454
+ ret.colorPrimaries = byte.read(2);
8455
+ ret.transferCharacteristics = byte.read(2);
8456
+ ret.matrixCoefficients = byte.read(2);
8457
+ ret.fullRangeFlag = byte.read(1) >> 7;
8458
+ } else if (ret.colorType === "rICC" || ret.colorType === "prof") {
8459
+ ret.iccProfile = data.readToUint8();
8460
+ }
8461
+ });
8462
+ }
8463
+ }, {
8464
+ key: "av01",
8465
+ value: function av01(box) {
8466
+ return parseBox(box, false, function(ret, data, start) {
8467
+ var bodyStart = parseVisualSampleEntry(ret, data);
8468
+ var bodyData = data.subarray(bodyStart);
8469
+ start += bodyStart;
8470
+ ret.av1C = MP4Parser2.av1C(MP4Parser2.findBox(bodyData, ["av1C"], start)[0]);
8471
+ ret.colr = MP4Parser2.colr(MP4Parser2.findBox(bodyData, ["colr"], start)[0]);
8472
+ });
8473
+ }
8474
+ }, {
8475
+ key: "av1C",
8476
+ value: function av1C(box) {
8477
+ return parseBox(box, false, function(ret, data) {
8478
+ ret.data = box.data;
8479
+ var byte = ByteReader.fromUint8(data);
8480
+ var bit = BitReader.fromByte(byte, 4);
8481
+ ret.marker = bit.read(1);
8482
+ ret.version = bit.read(7);
8483
+ ret.seqProfile = bit.read(3);
8484
+ ret.seqLevelIdx0 = bit.read(5);
8485
+ ret.seqTier0 = bit.read(1);
8486
+ ret.highBitdepth = bit.read(1);
8487
+ ret.twelveBit = bit.read(1);
8488
+ ret.monochrome = bit.read(1);
8489
+ ret.chromaSubsamplingX = bit.read(1);
8490
+ ret.chromaSubsamplingY = bit.read(1);
8491
+ ret.chromaSamplePosition = bit.read(2);
8492
+ ret.reserved = bit.read(3);
8493
+ ret.initialPresentationDelayPresent = bit.read(1);
8494
+ if (ret.initialPresentationDelayPresent) {
8495
+ ret.initialPresentationDelayMinusOne = bit.read(4);
8496
+ } else {
8497
+ ret.initialPresentationDelayMinusOne = 0;
8498
+ }
8499
+ ret.configOBUs = byte.readToUint8();
8500
+ var bitdepth;
8501
+ if (ret.seqLevelIdx0 === 2 && ret.highBitdepth === 1) {
8502
+ bitdepth = ret.twelveBit === 1 ? "12" : "10";
8503
+ } else if (ret.seqProfile <= 2) {
8504
+ bitdepth = ret.highBitdepth === 1 ? "10" : "08";
8505
+ }
8506
+ ret.codec = ["av01", ret.seqProfile, (ret.seqLevelIdx0 < 10 ? "0" + ret.seqLevelIdx0 : ret.seqLevelIdx0) + (ret.seqTier0 ? "H" : "M"), bitdepth].join(".");
8507
+ });
8508
+ }
8181
8509
  }, {
8182
8510
  key: "avc1",
8183
8511
  value: function avc1(box) {
@@ -8611,7 +8939,12 @@
8611
8939
  if (e1.pasp) {
8612
8940
  v.sarRatio = [e1.pasp.hSpacing, e1.pasp.vSpacing];
8613
8941
  }
8614
- if (e1.hvcC) {
8942
+ if (e1.av1C) {
8943
+ v.codecType = VideoCodecType.AV1;
8944
+ v.codec = e1.av1C.codec;
8945
+ v.av1C = e1.av1C.data;
8946
+ v.colr = e1.colr.data;
8947
+ } else if (e1.hvcC) {
8615
8948
  v.codecType = VideoCodecType.HEVC;
8616
8949
  v.codec = e1.hvcC.codec;
8617
8950
  v.vps = e1.hvcC.vps;
@@ -8930,8 +9263,9 @@
8930
9263
  function parseBox(box, isFullBox, parse2) {
8931
9264
  if (!box)
8932
9265
  return;
8933
- if (box.size !== box.data.length)
9266
+ if (box.size !== box.data.length) {
8934
9267
  throw new Error("box ".concat(box.type, " size !== data.length"));
9268
+ }
8935
9269
  var ret = {
8936
9270
  start: box.start,
8937
9271
  size: box.size,
@@ -8970,11 +9304,167 @@
8970
9304
  var FMP4Demuxer = /* @__PURE__ */ function() {
8971
9305
  function FMP4Demuxer2(videoTrack, audioTrack, metadataTrack) {
8972
9306
  _classCallCheck(this, FMP4Demuxer2);
9307
+ _defineProperty(this, "__loadedMoofWraps", []);
9308
+ _defineProperty(this, "__lastRemainData", null);
9309
+ _defineProperty(this, "__lastRemainDataStart", 0);
9310
+ _defineProperty(this, "__nextMoofStart", -1);
8973
9311
  this.videoTrack = videoTrack || new VideoTrack();
8974
9312
  this.audioTrack = audioTrack || new AudioTrack();
8975
9313
  this.metadataTrack = metadataTrack || new MetadataTrack();
8976
9314
  }
8977
9315
  _createClass(FMP4Demuxer2, [{
9316
+ key: "demuxPart",
9317
+ value: function demuxPart(partData, partDataStart, moov) {
9318
+ var _this = this;
9319
+ var videoTrack = this.videoTrack, audioTrack = this.audioTrack;
9320
+ var videoExist = videoTrack.exist();
9321
+ var audioExist = audioTrack.exist();
9322
+ var isAV01 = /av01/.test(videoTrack.codec);
9323
+ videoTrack.samples = [];
9324
+ audioTrack.samples = [];
9325
+ var data = partData;
9326
+ var dataStart = partDataStart;
9327
+ if (this.__lastRemainData) {
9328
+ var lastRemainDataEnd = this.__lastRemainDataStart + this.__lastRemainData.byteLength;
9329
+ var continuous = partDataStart <= lastRemainDataEnd && partDataStart > this.__lastRemainDataStart && partDataStart + partData.byteLength > lastRemainDataEnd;
9330
+ if (continuous) {
9331
+ var noDuplicateData = partData.subarray(this.__lastRemainData.byteLength + this.__lastRemainDataStart - partDataStart);
9332
+ data = concatUint8Array(this.__lastRemainData, noDuplicateData);
9333
+ dataStart = this.__lastRemainDataStart;
9334
+ this.__lastRemainData = null;
9335
+ } else {
9336
+ this.__lastRemainData = null;
9337
+ this.__lastRemainDataStart = 0;
9338
+ this.__nextMoofStart = -1;
9339
+ }
9340
+ }
9341
+ if (!moov) {
9342
+ var moovBox = MP4Parser.findBox(data, ["moov"])[0];
9343
+ if (!moovBox)
9344
+ throw new Error("cannot found moov box");
9345
+ moov = MP4Parser.moov(moovBox);
9346
+ }
9347
+ if (data) {
9348
+ var dataEnd = dataStart + data.byteLength;
9349
+ if (!videoExist && !audioExist) {
9350
+ MP4Parser.moovToTrack(moov, videoTrack, audioTrack);
9351
+ }
9352
+ var moofBoxes = [];
9353
+ if (this.__nextMoofStart < 0) {
9354
+ MP4Parser.findBox(data, ["moof"], dataStart).forEach(function(v) {
9355
+ return moofBoxes.push(v);
9356
+ });
9357
+ } else if (this.__nextMoofStart >= dataStart && this.__nextMoofStart <= dataEnd - 8) {
9358
+ MP4Parser.findBox(data.subarray(this.__nextMoofStart - dataStart), ["moof"], this.__nextMoofStart).forEach(function(v) {
9359
+ return moofBoxes.push(v);
9360
+ });
9361
+ }
9362
+ moofBoxes.filter(function(moofBox) {
9363
+ return moofBox.size <= moofBox.data.length;
9364
+ }).forEach(function(moofBox) {
9365
+ var moof = MP4Parser.moof(moofBox);
9366
+ _this.__nextMoofStart = moof.start + Math.max.apply(Math, _toConsumableArray(moof.traf.map(function(v) {
9367
+ return v.trun.samples.reduce(function(ret, w) {
9368
+ return ret + w.size;
9369
+ }, v.trun.dataOffset || 0);
9370
+ })));
9371
+ _this.__loadedMoofWraps.push({
9372
+ start: moof.start,
9373
+ nextMoofStart: _this.__nextMoofStart,
9374
+ moof
9375
+ });
9376
+ _this.__loadedMoofWraps.sort(function(p, n) {
9377
+ return p.start - n.start;
9378
+ });
9379
+ });
9380
+ var _iterator = _createForOfIteratorHelper(this.__loadedMoofWraps), _step;
9381
+ try {
9382
+ var _loop = function _loop2() {
9383
+ var moofWrap = _step.value;
9384
+ if (moofWrap.start > dataEnd || moofWrap.nextMoofStart < dataStart) {
9385
+ return "continue";
9386
+ }
9387
+ var moofStart = moofWrap.start;
9388
+ var tracks = MP4Parser.moofToSamples(moofWrap.moof, videoTrack, audioTrack);
9389
+ var videoBaseMediaDecodeTime = videoTrack.baseMediaDecodeTime;
9390
+ var audioBaseMediaDecodeTime = audioTrack.baseMediaDecodeTime;
9391
+ var nalSize;
9392
+ Object.keys(tracks).forEach(function(k) {
9393
+ if (videoTrack.id == k) {
9394
+ tracks[k].some(function(x) {
9395
+ var xStart = x.offset += moofStart;
9396
+ if (xStart < dataStart) {
9397
+ return;
9398
+ }
9399
+ if (xStart + x.size > dataEnd) {
9400
+ return true;
9401
+ }
9402
+ var sample = new VideoSample((x.pts || x.dts) + videoBaseMediaDecodeTime, x.dts + videoBaseMediaDecodeTime);
9403
+ sample.duration = x.duration;
9404
+ sample.gopId = x.gopId;
9405
+ if (x.keyframe)
9406
+ sample.setToKeyframe();
9407
+ var sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size);
9408
+ sample.data = sampleData;
9409
+ if (!isAV01) {
9410
+ var start = 0;
9411
+ var len = sampleData.length - 1;
9412
+ while (start < len) {
9413
+ nalSize = readBig32(sampleData, start);
9414
+ start += 4;
9415
+ sample.units.push(sampleData.subarray(start, start + nalSize));
9416
+ start += nalSize;
9417
+ }
9418
+ }
9419
+ _this.__lastRemainDataStart = xStart + x.size;
9420
+ videoTrack.samples.push(sample);
9421
+ });
9422
+ } else if (audioTrack.id == k) {
9423
+ tracks[k].some(function(x) {
9424
+ var xStart = x.offset + moofStart;
9425
+ if (xStart < dataStart) {
9426
+ return;
9427
+ }
9428
+ if (xStart + x.size > dataEnd) {
9429
+ return true;
9430
+ }
9431
+ var sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size);
9432
+ audioTrack.samples.push(new AudioSample(x.dts + audioBaseMediaDecodeTime, sampleData, x.duration));
9433
+ _this.__lastRemainDataStart = xStart + x.size;
9434
+ });
9435
+ }
9436
+ });
9437
+ };
9438
+ for (_iterator.s(); !(_step = _iterator.n()).done; ) {
9439
+ var _ret = _loop();
9440
+ if (_ret === "continue")
9441
+ continue;
9442
+ }
9443
+ } catch (err) {
9444
+ _iterator.e(err);
9445
+ } finally {
9446
+ _iterator.f();
9447
+ }
9448
+ }
9449
+ if (this.__lastRemainDataStart > dataStart && this.__lastRemainDataStart < data.byteLength + dataStart) {
9450
+ this.__lastRemainData = data.subarray(this.__lastRemainDataStart - dataStart);
9451
+ } else {
9452
+ this.__lastRemainData = data;
9453
+ this.__lastRemainDataStart = dataStart;
9454
+ }
9455
+ if (videoTrack.samples.length) {
9456
+ videoTrack.baseMediaDecodeTime = videoTrack.samples[0].pts;
9457
+ }
9458
+ if (audioTrack.samples.length) {
9459
+ audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts;
9460
+ }
9461
+ return {
9462
+ videoTrack,
9463
+ audioTrack,
9464
+ metadataTrack: this.metadataTrack
9465
+ };
9466
+ }
9467
+ }, {
8978
9468
  key: "demux",
8979
9469
  value: function demux(videoData, audioData) {
8980
9470
  var videoTrack = this.videoTrack, audioTrack = this.audioTrack;
@@ -9466,10 +9956,16 @@
9466
9956
  if (track.useEME && track.enca) {
9467
9957
  content = MP42.enca(track);
9468
9958
  } else {
9469
- content = MP42.mp4a(track);
9959
+ if (track.codecType === AudioCodecType.OPUS) {
9960
+ content = MP42.opus(track);
9961
+ } else {
9962
+ content = MP42.mp4a(track);
9963
+ }
9470
9964
  }
9471
9965
  } else if (track.useEME && track.encv) {
9472
9966
  content = MP42.encv(track);
9967
+ } else if (track.av1C) {
9968
+ content = MP42.av01(track);
9473
9969
  } else {
9474
9970
  content = MP42.avc1hev1(track);
9475
9971
  }
@@ -9683,12 +10179,9 @@
9683
10179
  return MP42.box(MP42.types.sinf, content, MP42.box(MP42.types.frma, frma), MP42.box(MP42.types.schm, schm), schi);
9684
10180
  }
9685
10181
  }, {
9686
- key: "avc1hev1",
9687
- value: function avc1hev1(track) {
9688
- var isHevc = track.codecType === VideoCodecType.HEVC;
9689
- var typ = isHevc ? MP42.types.hvc1 : MP42.types.avc1;
9690
- var config = isHevc ? MP42.hvcC(track) : MP42.avcC(track);
9691
- var boxes = [new Uint8Array([
10182
+ key: "av01",
10183
+ value: function av01(track) {
10184
+ return MP42.box(MP42.types.av01, new Uint8Array([
9692
10185
  0,
9693
10186
  0,
9694
10187
  0,
@@ -9767,50 +10260,137 @@
9767
10260
  24,
9768
10261
  17,
9769
10262
  17
9770
- ]), config];
9771
- if (isHevc) {
9772
- boxes.push(MP42.box(MP42.types.fiel, new Uint8Array([1, 0])));
9773
- } else if (track.sarRatio && track.sarRatio.length > 1) {
9774
- boxes.push(MP42.pasp(track.sarRatio));
9775
- }
9776
- return MP42.box.apply(MP42, [typ].concat(boxes));
10263
+ ]), track.av1C, track.colr);
9777
10264
  }
9778
10265
  }, {
9779
- key: "avcC",
9780
- value: function avcC(track) {
9781
- var _concat$concat2, _ref2;
9782
- var sps = [];
9783
- var pps = [];
9784
- var len;
9785
- track.sps.forEach(function(s) {
9786
- len = s.byteLength;
9787
- sps.push(len >>> 8 & 255);
9788
- sps.push(len & 255);
9789
- sps.push.apply(sps, _toConsumableArray(s));
9790
- });
9791
- track.pps.forEach(function(p) {
9792
- len = p.byteLength;
9793
- pps.push(len >>> 8 & 255);
9794
- pps.push(len & 255);
9795
- pps.push.apply(pps, _toConsumableArray(p));
9796
- });
9797
- return MP42.box(MP42.types.avcC, new Uint8Array((_concat$concat2 = (_ref2 = [
10266
+ key: "avc1hev1",
10267
+ value: function avc1hev1(track) {
10268
+ var isHevc = track.codecType === VideoCodecType.HEVC;
10269
+ var typ = isHevc ? MP42.types.hvc1 : MP42.types.avc1;
10270
+ var config = isHevc ? MP42.hvcC(track) : MP42.avcC(track);
10271
+ var boxes = [new Uint8Array([
10272
+ 0,
10273
+ 0,
10274
+ 0,
10275
+ 0,
10276
+ 0,
10277
+ 0,
10278
+ 0,
9798
10279
  1,
9799
- sps[3],
9800
- sps[4],
9801
- sps[5],
9802
- 252 | 3,
9803
- 224 | track.sps.length
9804
- ]).concat.apply(_ref2, sps).concat([track.pps.length])).concat.apply(_concat$concat2, pps)));
9805
- }
9806
- }, {
9807
- key: "hvcC",
9808
- value: function hvcC(track) {
9809
- var hvcC2 = track.hvcC;
9810
- if (hvcC2 instanceof ArrayBuffer || hvcC2 instanceof Uint8Array)
9811
- return hvcC2;
9812
- var vps = track.vps, sps = track.sps, pps = track.pps;
9813
- var data;
10280
+ 0,
10281
+ 0,
10282
+ 0,
10283
+ 0,
10284
+ 0,
10285
+ 0,
10286
+ 0,
10287
+ 0,
10288
+ 0,
10289
+ 0,
10290
+ 0,
10291
+ 0,
10292
+ 0,
10293
+ 0,
10294
+ 0,
10295
+ 0,
10296
+ track.width >> 8 & 255,
10297
+ track.width & 255,
10298
+ track.height >> 8 & 255,
10299
+ track.height & 255,
10300
+ 0,
10301
+ 72,
10302
+ 0,
10303
+ 0,
10304
+ 0,
10305
+ 72,
10306
+ 0,
10307
+ 0,
10308
+ 0,
10309
+ 0,
10310
+ 0,
10311
+ 0,
10312
+ 0,
10313
+ 1,
10314
+ 0,
10315
+ 0,
10316
+ 0,
10317
+ 0,
10318
+ 0,
10319
+ 0,
10320
+ 0,
10321
+ 0,
10322
+ 0,
10323
+ 0,
10324
+ 0,
10325
+ 0,
10326
+ 0,
10327
+ 0,
10328
+ 0,
10329
+ 0,
10330
+ 0,
10331
+ 0,
10332
+ 0,
10333
+ 0,
10334
+ 0,
10335
+ 0,
10336
+ 0,
10337
+ 0,
10338
+ 0,
10339
+ 0,
10340
+ 0,
10341
+ 0,
10342
+ 0,
10343
+ 0,
10344
+ 0,
10345
+ 0,
10346
+ 0,
10347
+ 24,
10348
+ 17,
10349
+ 17
10350
+ ]), config];
10351
+ if (isHevc) {
10352
+ boxes.push(MP42.box(MP42.types.fiel, new Uint8Array([1, 0])));
10353
+ } else if (track.sarRatio && track.sarRatio.length > 1) {
10354
+ boxes.push(MP42.pasp(track.sarRatio));
10355
+ }
10356
+ return MP42.box.apply(MP42, [typ].concat(boxes));
10357
+ }
10358
+ }, {
10359
+ key: "avcC",
10360
+ value: function avcC(track) {
10361
+ var _concat$concat2, _ref2;
10362
+ var sps = [];
10363
+ var pps = [];
10364
+ var len;
10365
+ track.sps.forEach(function(s) {
10366
+ len = s.byteLength;
10367
+ sps.push(len >>> 8 & 255);
10368
+ sps.push(len & 255);
10369
+ sps.push.apply(sps, _toConsumableArray(s));
10370
+ });
10371
+ track.pps.forEach(function(p) {
10372
+ len = p.byteLength;
10373
+ pps.push(len >>> 8 & 255);
10374
+ pps.push(len & 255);
10375
+ pps.push.apply(pps, _toConsumableArray(p));
10376
+ });
10377
+ return MP42.box(MP42.types.avcC, new Uint8Array((_concat$concat2 = (_ref2 = [
10378
+ 1,
10379
+ sps[3],
10380
+ sps[4],
10381
+ sps[5],
10382
+ 252 | 3,
10383
+ 224 | track.sps.length
10384
+ ]).concat.apply(_ref2, sps).concat([track.pps.length])).concat.apply(_concat$concat2, pps)));
10385
+ }
10386
+ }, {
10387
+ key: "hvcC",
10388
+ value: function hvcC(track) {
10389
+ var hvcC2 = track.hvcC;
10390
+ if (hvcC2 instanceof ArrayBuffer || hvcC2 instanceof Uint8Array)
10391
+ return hvcC2;
10392
+ var vps = track.vps, sps = track.sps, pps = track.pps;
10393
+ var data;
9814
10394
  if (hvcC2) {
9815
10395
  var pcf = hvcC2.generalProfileCompatibilityFlags;
9816
10396
  var cif = hvcC2.generalConstraintIndicatorFlags;
@@ -10052,6 +10632,53 @@
10052
10632
  )));
10053
10633
  return esds2;
10054
10634
  }
10635
+ }, {
10636
+ key: "opus",
10637
+ value: function opus(track) {
10638
+ var opusAudioDescription = new Uint8Array([
10639
+ 0,
10640
+ 0,
10641
+ 0,
10642
+ 0,
10643
+ 0,
10644
+ 0,
10645
+ 0,
10646
+ 1,
10647
+ 0,
10648
+ 0,
10649
+ 0,
10650
+ 0,
10651
+ 0,
10652
+ 0,
10653
+ 0,
10654
+ 0,
10655
+ 0,
10656
+ track.channelCount,
10657
+ 0,
10658
+ 16,
10659
+ 0,
10660
+ 0,
10661
+ 0,
10662
+ 0,
10663
+ track.sampleRate >> 8 & 255,
10664
+ track.sampleRate & 255,
10665
+ 0,
10666
+ 0
10667
+ ]);
10668
+ var opusSpecificConfig = track.config.length ? MP42.dOps(track) : [];
10669
+ return MP42.box(MP42.types.Opus, opusAudioDescription, opusSpecificConfig);
10670
+ }
10671
+ }, {
10672
+ key: "dOps",
10673
+ value: function dOps(track) {
10674
+ if (track.config) {
10675
+ track.config[4] = track.sampleRate >>> 24 & 255;
10676
+ track.config[5] = track.sampleRate >>> 16 & 255;
10677
+ track.config[6] = track.sampleRate >>> 8 & 255;
10678
+ track.config[7] = track.sampleRate & 255;
10679
+ return MP42.box(MP42.types.dOps, track.config);
10680
+ }
10681
+ }
10055
10682
  }, {
10056
10683
  key: "mvex",
10057
10684
  value: function mvex(tracks) {
@@ -10654,7 +11281,7 @@
10654
11281
  }]);
10655
11282
  return MP42;
10656
11283
  }();
10657
- _defineProperty(MP4, "types", ["avc1", "avcC", "hvc1", "hvcC", "dinf", "dref", "esds", "ftyp", "hdlr", "mdat", "mdhd", "mdia", "mfhd", "minf", "moof", "moov", "mp4a", "mvex", "mvhd", "pasp", "stbl", "stco", "stsc", "stsd", "stsz", "stts", "tfdt", "tfhd", "traf", "trak", "trex", "tkhd", "vmhd", "smhd", "ctts", "stss", "styp", "pssh", "sidx", "sbgp", "saiz", "saio", "senc", "trun", "encv", "enca", "sinf", "btrt", "frma", "tenc", "schm", "schi", "mehd", "fiel", "sdtp"].reduce(function(p, c) {
11284
+ _defineProperty(MP4, "types", ["Opus", "dOps", "av01", "av1C", "avc1", "avcC", "hvc1", "hvcC", "dinf", "dref", "esds", "ftyp", "hdlr", "mdat", "mdhd", "mdia", "mfhd", "minf", "moof", "moov", "mp4a", "mvex", "mvhd", "pasp", "stbl", "stco", "stsc", "stsd", "stsz", "stts", "tfdt", "tfhd", "traf", "trak", "trex", "tkhd", "vmhd", "smhd", "ctts", "stss", "styp", "pssh", "sidx", "sbgp", "saiz", "saio", "senc", "trun", "encv", "enca", "sinf", "btrt", "frma", "tenc", "schm", "schi", "mehd", "fiel", "sdtp"].reduce(function(p, c) {
10658
11285
  p[c] = [c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2), c.charCodeAt(3)];
10659
11286
  return p;
10660
11287
  }, /* @__PURE__ */ Object.create(null)));
@@ -10989,30 +11616,46 @@
10989
11616
  };
10990
11617
  }
10991
11618
  var samples = track.samples;
11619
+ var isAV01 = /av01/.test(track.codec);
10992
11620
  var mdatSize = 0;
10993
- samples.forEach(function(s) {
10994
- mdatSize += s.units.reduce(function(t, c) {
10995
- return t + c.byteLength;
10996
- }, 0);
10997
- mdatSize += s.units.length * 4;
10998
- });
10999
- var mdata = new Uint8Array(mdatSize);
11000
- var mdatView = new DataView(mdata.buffer);
11001
- var _loop = function _loop2(_offset, _sample) {
11002
- _sample = samples[i];
11003
- var sampleSize = 0;
11004
- _sample.units.forEach(function(u) {
11005
- mdatView.setUint32(_offset, u.byteLength);
11006
- _offset += 4;
11007
- mdata.set(u, _offset);
11008
- _offset += u.byteLength;
11009
- sampleSize += 4 + u.byteLength;
11621
+ if (isAV01) {
11622
+ samples.forEach(function(s) {
11623
+ mdatSize += s.data.byteLength;
11624
+ });
11625
+ } else {
11626
+ samples.forEach(function(s) {
11627
+ mdatSize += s.units.reduce(function(t, c) {
11628
+ return t + c.byteLength;
11629
+ }, 0);
11630
+ mdatSize += s.units.length * 4;
11010
11631
  });
11011
- _sample.size = sampleSize;
11012
- offset = _offset, sample = _sample;
11013
- };
11014
- for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
11015
- _loop(offset, sample);
11632
+ }
11633
+ var mdata = new Uint8Array(mdatSize);
11634
+ if (isAV01) {
11635
+ for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
11636
+ sample = samples[i];
11637
+ mdata.set(sample.data, offset);
11638
+ sample.size = sample.data.byteLength;
11639
+ offset += sample.size;
11640
+ }
11641
+ } else {
11642
+ var mdatView = new DataView(mdata.buffer);
11643
+ var _loop = function _loop2(_offset2, _sample2) {
11644
+ _sample2 = samples[_i];
11645
+ var sampleSize = 0;
11646
+ _sample2.units.forEach(function(u) {
11647
+ mdatView.setUint32(_offset2, u.byteLength);
11648
+ _offset2 += 4;
11649
+ mdata.set(u, _offset2);
11650
+ _offset2 += u.byteLength;
11651
+ sampleSize += 4 + u.byteLength;
11652
+ });
11653
+ _sample2.size = sampleSize;
11654
+ _offset = _offset2, _sample = _sample2;
11655
+ };
11656
+ for (var _i = 0, _l = samples.length, _offset = 0, _sample; _i < _l; _i++) {
11657
+ _loop(_offset, _sample);
11658
+ }
11016
11659
  }
11017
11660
  var mdat = MP4.mdat(mdata);
11018
11661
  var moof = MP4.moof([track]);
@@ -11206,7 +11849,8 @@
11206
11849
  timescale: audioTrack.timescale,
11207
11850
  firstDts: audioTrack.firstDts / videoTrack.timescale,
11208
11851
  firstPts: audioTrack.firstPts / videoTrack.timescale,
11209
- duration: audioTrack.samplesDuration / videoTrack.timescale
11852
+ duration: audioTrack.samplesDuration / videoTrack.timescale,
11853
+ container: audioTrack.container
11210
11854
  };
11211
11855
  var newId = "".concat(videoTrack.codec, "/").concat(videoTrack.width, "/").concat(videoTrack.height, "/").concat(audioTrack.codec, "/").concat(audioTrack.config);
11212
11856
  if (newId !== this._initSegmentId) {
@@ -11330,7 +11974,7 @@
11330
11974
  }]);
11331
11975
  return Transmuxer2;
11332
11976
  }();
11333
- var _excluded = ["data"], _excluded2 = ["data"];
11977
+ var _excluded$1 = ["data"], _excluded2 = ["data"];
11334
11978
  var logger$2 = new Logger$2("BufferService");
11335
11979
  var BufferService = /* @__PURE__ */ function() {
11336
11980
  function BufferService2(hls) {
@@ -11496,7 +12140,8 @@
11496
12140
  key: "appendBuffer",
11497
12141
  value: function() {
11498
12142
  var _appendBuffer = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2(segment, audioSegment, videoChunk, audioChunk, discontinuity, contiguous, startTime) {
11499
- var p, needInit, _this$_transmuxer$tra, _this$_transmuxer$tra2, video, audio, isFirstAppend, mse, _p, videoData, videoRest, audioData, audioRest;
12143
+ var _this2 = this;
12144
+ var afterAppend, p, needInit, _this$_transmuxer$tra, _this$_transmuxer$tra2, video, audio, isFirstAppend, mse, _p, videoData, videoRest, audioData, audioRest;
11500
12145
  return _regeneratorRuntime$1().wrap(function _callee2$(_context2) {
11501
12146
  while (1)
11502
12147
  switch (_context2.prev = _context2.next) {
@@ -11507,8 +12152,18 @@
11507
12152
  }
11508
12153
  return _context2.abrupt("return");
11509
12154
  case 2:
12155
+ afterAppend = function afterAppend2() {
12156
+ var _this2$hls;
12157
+ if ((_this2$hls = _this2.hls) !== null && _this2$hls !== void 0 && _this2$hls.emit) {
12158
+ var _this2$hls2;
12159
+ (_this2$hls2 = _this2.hls) === null || _this2$hls2 === void 0 ? void 0 : _this2$hls2.emit(EVENT.APPEND_BUFFER, {
12160
+ start: segment.start,
12161
+ end: segment.end
12162
+ });
12163
+ }
12164
+ };
11510
12165
  if (!this._directAppend) {
11511
- _context2.next = 7;
12166
+ _context2.next = 8;
11512
12167
  break;
11513
12168
  }
11514
12169
  p = [];
@@ -11516,8 +12171,8 @@
11516
12171
  p.push(this._mse.append(MSE.VIDEO, videoChunk));
11517
12172
  if (audioChunk)
11518
12173
  p.push(this._mse.append(MSE.AUDIO, audioChunk));
11519
- return _context2.abrupt("return", Promise.all(p));
11520
- case 7:
12174
+ return _context2.abrupt("return", Promise.all(p).then(afterAppend));
12175
+ case 8:
11521
12176
  needInit = this._needInitSegment || discontinuity;
11522
12177
  _this$_transmuxer$tra = this._transmuxer.transmux(videoChunk, audioChunk, needInit, contiguous, startTime, this._needInitSegment || discontinuity), _this$_transmuxer$tra2 = _slicedToArray$1(_this$_transmuxer$tra, 2), video = _this$_transmuxer$tra2[0], audio = _this$_transmuxer$tra2[1];
11523
12178
  if (audioChunk && audioSegment) {
@@ -11533,21 +12188,22 @@
11533
12188
  this.hls.emit(Event$1.NO_AUDIO_TRACK);
11534
12189
  }
11535
12190
  if (!this._softVideo) {
11536
- _context2.next = 18;
12191
+ _context2.next = 20;
11537
12192
  break;
11538
12193
  }
11539
12194
  this._softVideo.appendBuffer(video, audio);
11540
12195
  this._needInitSegment = false;
11541
- _context2.next = 28;
12196
+ afterAppend();
12197
+ _context2.next = 30;
11542
12198
  break;
11543
- case 18:
12199
+ case 20:
11544
12200
  if (!this._mse) {
11545
- _context2.next = 28;
12201
+ _context2.next = 30;
11546
12202
  break;
11547
12203
  }
11548
12204
  isFirstAppend = !this._sourceCreated;
11549
12205
  if (isFirstAppend) {
11550
- this._createMseSource(video === null || video === void 0 ? void 0 : video.codec, audio === null || audio === void 0 ? void 0 : audio.codec);
12206
+ this._createMseSource(video === null || video === void 0 ? void 0 : video.codec, audio === null || audio === void 0 ? void 0 : audio.codec, audio === null || audio === void 0 ? void 0 : audio.container);
11551
12207
  }
11552
12208
  this._needInitSegment = false;
11553
12209
  mse = this._mse;
@@ -11558,15 +12214,15 @@
11558
12214
  });
11559
12215
  }
11560
12216
  if (video) {
11561
- videoData = video.data, videoRest = _objectWithoutProperties$1(video, _excluded);
12217
+ videoData = video.data, videoRest = _objectWithoutProperties$1(video, _excluded$1);
11562
12218
  _p.push(mse.append(MSE.VIDEO, videoData, videoRest));
11563
12219
  }
11564
12220
  if (audio) {
11565
12221
  audioData = audio.data, audioRest = _objectWithoutProperties$1(audio, _excluded2);
11566
12222
  _p.push(mse.append(MSE.AUDIO, audioData, audioRest));
11567
12223
  }
11568
- return _context2.abrupt("return", Promise.all(_p));
11569
- case 28:
12224
+ return _context2.abrupt("return", Promise.all(_p).then(afterAppend));
12225
+ case 30:
11570
12226
  case "end":
11571
12227
  return _context2.stop();
11572
12228
  }
@@ -11581,7 +12237,7 @@
11581
12237
  key: "removeBuffer",
11582
12238
  value: function() {
11583
12239
  var _removeBuffer = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee3() {
11584
- var _this2 = this;
12240
+ var _this3 = this;
11585
12241
  var start, end, media, _args3 = arguments;
11586
12242
  return _regeneratorRuntime$1().wrap(function _callee3$(_context3) {
11587
12243
  while (1)
@@ -11597,7 +12253,7 @@
11597
12253
  return _context3.abrupt("return");
11598
12254
  case 5:
11599
12255
  return _context3.abrupt("return", this._mse.clearBuffer(start, end).then(function() {
11600
- return _this2.hls.emit(EVENT.REMOVE_BUFFER, {
12256
+ return _this3.hls.emit(EVENT.REMOVE_BUFFER, {
11601
12257
  start,
11602
12258
  end,
11603
12259
  removeEnd: end
@@ -11778,30 +12434,51 @@
11778
12434
  return setLiveSeekableRange;
11779
12435
  }()
11780
12436
  }, {
11781
- key: "destroy",
12437
+ key: "detachMedia",
11782
12438
  value: function() {
11783
- var _destroy = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee9() {
11784
- var _this$_decryptor;
12439
+ var _detachMedia = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee9() {
11785
12440
  return _regeneratorRuntime$1().wrap(function _callee9$(_context9) {
11786
12441
  while (1)
11787
12442
  switch (_context9.prev = _context9.next) {
11788
12443
  case 0:
11789
- (_this$_decryptor = this._decryptor) === null || _this$_decryptor === void 0 ? void 0 : _this$_decryptor.destroy();
11790
12444
  if (!this._mse) {
11791
- _context9.next = 4;
12445
+ _context9.next = 3;
11792
12446
  break;
11793
12447
  }
11794
- _context9.next = 4;
12448
+ _context9.next = 3;
11795
12449
  return this._mse.unbindMedia();
11796
- case 4:
12450
+ case 3:
12451
+ case "end":
12452
+ return _context9.stop();
12453
+ }
12454
+ }, _callee9, this);
12455
+ }));
12456
+ function detachMedia() {
12457
+ return _detachMedia.apply(this, arguments);
12458
+ }
12459
+ return detachMedia;
12460
+ }()
12461
+ }, {
12462
+ key: "destroy",
12463
+ value: function() {
12464
+ var _destroy = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee10() {
12465
+ var _this$_decryptor;
12466
+ return _regeneratorRuntime$1().wrap(function _callee10$(_context10) {
12467
+ while (1)
12468
+ switch (_context10.prev = _context10.next) {
12469
+ case 0:
12470
+ (_this$_decryptor = this._decryptor) === null || _this$_decryptor === void 0 ? void 0 : _this$_decryptor.destroy();
12471
+ _context10.next = 3;
12472
+ return this.detachMedia();
12473
+ case 3:
11797
12474
  this._decryptor = null;
11798
12475
  this._mse = null;
11799
12476
  this._softVideo = null;
11800
- case 7:
12477
+ case 6:
11801
12478
  case "end":
11802
- return _context9.stop();
12479
+ return _context10.stop();
11803
12480
  }
11804
- }, _callee9, this);
12481
+ }, _callee10, this);
11805
12482
  }));
11806
12483
  function destroy() {
11807
12484
  return _destroy.apply(this, arguments);
@@ -11810,7 +12487,7 @@
11810
12487
  }()
11811
12488
  }, {
11812
12489
  key: "_createMseSource",
11813
- value: function _createMseSource(videoCodec, audioCodec) {
12490
+ value: function _createMseSource(videoCodec, audioCodec, container) {
11814
12491
  logger$2.debug("create mse source, videoCodec=".concat(videoCodec, ", audioCodec=").concat(audioCodec));
11815
12492
  var mse = this._mse;
11816
12493
  if (!mse)
@@ -11822,6 +12499,9 @@
11822
12499
  if (audioCodec) {
11823
12500
  mse.createSource(MSE.AUDIO, "audio/mp4;codecs=".concat(audioCodec));
11824
12501
  this._sourceCreated = true;
12502
+ } else if (container) {
12503
+ mse.createSource(MSE.AUDIO, "".concat(container, ';codecs=""'));
12504
+ this._sourceCreated = true;
11825
12505
  }
11826
12506
  this.hls.emit(EVENT.SOURCEBUFFER_CREATED);
11827
12507
  }
@@ -12131,6 +12811,31 @@
12131
12811
  }]);
12132
12812
  return MediaSegmentKey2;
12133
12813
  }();
12814
+ var HlsUrlParameters = /* @__PURE__ */ function() {
12815
+ function HlsUrlParameters2(msn, part, skip) {
12816
+ _classCallCheck$3(this, HlsUrlParameters2);
12817
+ this.msn = msn;
12818
+ this.part = part;
12819
+ this.skip = skip;
12820
+ }
12821
+ _createClass$3(HlsUrlParameters2, [{
12822
+ key: "addDirectives",
12823
+ value: function addDirectives(uri) {
12824
+ var url = new self.URL(uri);
12825
+ if (this.msn !== void 0) {
12826
+ url.searchParams.set("_HLS_msn", this.msn.toString());
12827
+ }
12828
+ if (this.part) {
12829
+ url.searchParams.set("_HLS_part", this.part.toString());
12830
+ }
12831
+ if (this.skip) {
12832
+ url.searchParams.set("_HLS_skip", this.skip);
12833
+ }
12834
+ return url.href;
12835
+ }
12836
+ }]);
12837
+ return HlsUrlParameters2;
12838
+ }();
12134
12839
  var REGEXP_TAG = /^#(EXT[^:]*)(?::(.*))?$/;
12135
12840
  var REGEXP_ATTR = /([^=]+)=(?:"([^"]*)"|([^",]*))(?:,|$)/g;
12136
12841
  var REGEXP_ABSOLUTE_URL = /^(?:[a-zA-Z0-9+\-.]+:)?\/\//;
@@ -12369,7 +13074,7 @@
12369
13074
  media.canBlockReload = _attr["CAN-BLOCK-RELOAD"] === "YES";
12370
13075
  media.partHoldBack = parseFloat(_attr["PART-HOLD-BACK"] || 0);
12371
13076
  media.canSkipUntil = parseFloat(_attr["CAN-SKIP-UNTIL"] || 0);
12372
- media.canSkipDateRanges = _attr["CAN-SKIP-DATERANGES"] === "YES";
13077
+ media.canSkipDateRanges = media.canSkipUntil > 0 && _attr["CAN-SKIP-DATERANGES"] === "YES";
12373
13078
  }
12374
13079
  break;
12375
13080
  case "ENDLIST":
@@ -12413,6 +13118,15 @@
12413
13118
  }
12414
13119
  break;
12415
13120
  case "PRELOAD-HINT":
13121
+ {
13122
+ var _attr3 = parseAttr(data);
13123
+ media.preloadHint = _attr3;
13124
+ if (_attr3["TYPE"] === "PART" && _attr3["URI"]) {
13125
+ var tmp = _attr3["URI"].split(".ts")[0].split("-");
13126
+ media.nextSN = tmp[3];
13127
+ media.nextIndex = tmp[tmp.length - 1];
13128
+ }
13129
+ }
12416
13130
  break;
12417
13131
  case "PROGRAM-DATE-TIME":
12418
13132
  curSegment.dataTime = data;
@@ -12432,21 +13146,21 @@
12432
13146
  break;
12433
13147
  case "KEY":
12434
13148
  {
12435
- var _attr3 = parseAttr(data);
12436
- if (_attr3.METHOD === "NONE") {
13149
+ var _attr4 = parseAttr(data);
13150
+ if (_attr4.METHOD === "NONE") {
12437
13151
  curKey = null;
12438
13152
  break;
12439
13153
  }
12440
13154
  curKey = new MediaSegmentKey();
12441
- curKey.method = _attr3.METHOD;
12442
- curKey.url = /^blob:/.test(_attr3.URI) ? _attr3.URI : getAbsoluteUrl(_attr3.URI, parentUrl);
12443
- curKey.keyFormat = _attr3.KEYFORMAT || "identity";
12444
- curKey.keyFormatVersions = _attr3.KEYFORMATVERSIONS;
13155
+ curKey.method = _attr4.METHOD;
13156
+ curKey.url = /^blob:/.test(_attr4.URI) ? _attr4.URI : getAbsoluteUrl(_attr4.URI, parentUrl);
13157
+ curKey.keyFormat = _attr4.KEYFORMAT || "identity";
13158
+ curKey.keyFormatVersions = _attr4.KEYFORMATVERSIONS;
12445
13159
  if (!curKey.isSupported()) {
12446
- throw new Error("encrypt ".concat(_attr3.METHOD, "/").concat(_attr3.KEYFORMAT, " is not supported"));
13160
+ throw new Error("encrypt ".concat(_attr4.METHOD, "/").concat(_attr4.KEYFORMAT, " is not supported"));
12447
13161
  }
12448
- if (_attr3.IV) {
12449
- var str = _attr3.IV.slice(2);
13162
+ if (_attr4.IV) {
13163
+ var str = _attr4.IV.slice(2);
12450
13164
  str = (str.length & 1 ? "0" : "") + str;
12451
13165
  curKey.iv = new Uint8Array(str.length / 2);
12452
13166
  for (var i = 0, l = str.length / 2; i < l; i++) {
@@ -12457,10 +13171,10 @@
12457
13171
  break;
12458
13172
  case "MAP":
12459
13173
  {
12460
- var _attr4 = parseAttr(data);
12461
- curSegment.url = getAbsoluteUrl(_attr4.URI, parentUrl);
12462
- if (_attr4.BYTERANGE)
12463
- curSegment.setByteRange(_attr4.BYTERANGE);
13174
+ var _attr5 = parseAttr(data);
13175
+ curSegment.url = getAbsoluteUrl(_attr5.URI, parentUrl);
13176
+ if (_attr5.BYTERANGE)
13177
+ curSegment.setByteRange(_attr5.BYTERANGE);
12464
13178
  curSegment.isInitSegment = true;
12465
13179
  curSegment.sn = 0;
12466
13180
  if (curKey) {
@@ -12472,24 +13186,25 @@
12472
13186
  break;
12473
13187
  case "SKIP":
12474
13188
  {
12475
- var _attr5 = parseAttr(data);
12476
- var skippedSegments = parseInt(_attr5["SKIPPED-SEGMENTS"], 10);
13189
+ var _attr6 = parseAttr(data);
13190
+ var skippedSegments = parseInt(_attr6["SKIPPED-SEGMENTS"], 10);
12477
13191
  if (skippedSegments <= Number.MAX_SAFE_INTEGER) {
12478
13192
  media.skippedSegments += skippedSegments;
13193
+ curSN += skippedSegments;
12479
13194
  }
12480
13195
  }
12481
13196
  break;
12482
13197
  case "DATERANGE":
12483
13198
  {
12484
- var _attr6 = parseAttr(data);
12485
- var dateRangeWithSameId = media.dateRanges[_attr6.ID];
12486
- _attr6._startDate = dateRangeWithSameId ? dateRangeWithSameId._startDate : new Date(_attr6["START-DATE"]);
12487
- var endDate = (dateRangeWithSameId === null || dateRangeWithSameId === void 0 ? void 0 : dateRangeWithSameId._endDate) || new Date(_attr6.END_DATE);
13199
+ var _attr7 = parseAttr(data);
13200
+ var dateRangeWithSameId = media.dateRanges[_attr7.ID];
13201
+ _attr7._startDate = dateRangeWithSameId ? dateRangeWithSameId._startDate : new Date(_attr7["START-DATE"]);
13202
+ var endDate = (dateRangeWithSameId === null || dateRangeWithSameId === void 0 ? void 0 : dateRangeWithSameId._endDate) || new Date(_attr7.END_DATE);
12488
13203
  if (Number.isFinite(endDate)) {
12489
- _attr6._endDate = endDate;
13204
+ _attr7._endDate = endDate;
12490
13205
  }
12491
- if (isValidDaterange(_attr6, dateRangeWithSameId) || media.skippedSegments) {
12492
- media.dateRanges[_attr6.ID] = _attr6;
13206
+ if (isValidDaterange(_attr7, dateRangeWithSameId) || media.skippedSegments) {
13207
+ media.dateRanges[_attr7.ID] = _attr7;
12493
13208
  }
12494
13209
  }
12495
13210
  break;
@@ -12686,6 +13401,13 @@
12686
13401
  playlist
12687
13402
  });
12688
13403
  } else {
13404
+ if (this._useLowLatency) {
13405
+ if (playlist.canBlockReload) {
13406
+ this.deliveryDirectives = new HlsUrlParameters(playlist.nextSN, playlist.nextIndex, "");
13407
+ } else {
13408
+ this.deliveryDirectives = null;
13409
+ }
13410
+ }
12689
13411
  this.hls.emit(Event$1.HLS_LEVEL_LOADED, {
12690
13412
  playlist
12691
13413
  });
@@ -12742,41 +13464,45 @@
12742
13464
  var retryCount = this.hls.config.pollRetryCount;
12743
13465
  var fn = /* @__PURE__ */ function() {
12744
13466
  var _ref2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2() {
12745
- var res;
13467
+ var reqUrl, res;
12746
13468
  return _regeneratorRuntime$1().wrap(function _callee2$(_context2) {
12747
13469
  while (1)
12748
13470
  switch (_context2.prev = _context2.next) {
12749
13471
  case 0:
12750
13472
  clearTimeout(_this2._timer);
12751
- _context2.prev = 1;
12752
- _context2.next = 4;
12753
- return _this2.load(url, audioUrl, subtitleUrl);
12754
- case 4:
13473
+ reqUrl = url;
13474
+ _context2.prev = 2;
13475
+ if (_this2.deliveryDirectives) {
13476
+ reqUrl = _this2.deliveryDirectives.addDirectives(url);
13477
+ }
13478
+ _context2.next = 6;
13479
+ return _this2.load(reqUrl, audioUrl, subtitleUrl);
13480
+ case 6:
12755
13481
  res = _context2.sent;
12756
13482
  if (res[0]) {
12757
- _context2.next = 7;
13483
+ _context2.next = 9;
12758
13484
  break;
12759
13485
  }
12760
13486
  return _context2.abrupt("return");
12761
- case 7:
13487
+ case 9:
12762
13488
  retryCount = _this2.hls.config.pollRetryCount;
12763
13489
  cb(res[0], res[1], res[2]);
12764
- _context2.next = 15;
13490
+ _context2.next = 17;
12765
13491
  break;
12766
- case 11:
12767
- _context2.prev = 11;
12768
- _context2.t0 = _context2["catch"](1);
13492
+ case 13:
13493
+ _context2.prev = 13;
13494
+ _context2.t0 = _context2["catch"](2);
12769
13495
  retryCount--;
12770
13496
  if (retryCount <= 0) {
12771
13497
  errorCb(_context2.t0);
12772
13498
  }
12773
- case 15:
13499
+ case 17:
12774
13500
  _this2._timer = setTimeout(fn, time);
12775
- case 16:
13501
+ case 18:
12776
13502
  case "end":
12777
13503
  return _context2.stop();
12778
13504
  }
12779
- }, _callee2, null, [[1, 11]]);
13505
+ }, _callee2, null, [[2, 13]]);
12780
13506
  }));
12781
13507
  return function fn2() {
12782
13508
  return _ref2.apply(this, arguments);
@@ -13306,7 +14032,7 @@
13306
14032
  }, {
13307
14033
  key: "clearOldSegment",
13308
14034
  value: function clearOldSegment() {
13309
- var maxPlaylistSize = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 50;
14035
+ var maxPlaylistSize = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : this.hls.config.maxPlaylistSize || 50;
13310
14036
  var stream = this.currentStream;
13311
14037
  if (!this.dvrWindow || !stream)
13312
14038
  return;
@@ -13817,7 +14543,6 @@
13817
14543
  return;
13818
14544
  _this._startTick();
13819
14545
  var media = _this.media;
13820
- var buffered = Buffer$1.get(media);
13821
14546
  var segLoaderError = _this._segmentLoader.error;
13822
14547
  _this._onCheckQuotaExceeded();
13823
14548
  if (_this._isProcessQuotaExceeded) {
@@ -13834,7 +14559,7 @@
13834
14559
  }
13835
14560
  return;
13836
14561
  }
13837
- if (Buffer$1.end(buffered) >= 0.1 && media.readyState) {
14562
+ if (media.readyState) {
13838
14563
  if (isMediaPlaying(media)) {
13839
14564
  _this._loadSegment();
13840
14565
  if (_this._gapService) {
@@ -13900,6 +14625,12 @@
13900
14625
  var _this$_bufferService;
13901
14626
  return (_this$_bufferService = this._bufferService) === null || _this$_bufferService === void 0 ? void 0 : _this$_bufferService.baseDts;
13902
14627
  }
14628
+ }, {
14629
+ key: "abrSwitchPoint",
14630
+ get: function get() {
14631
+ var targetSeg = this._urlSwitching ? this._playlist.currentSegment : this._playlist.nextSegment;
14632
+ return targetSeg ? targetSeg.start + targetSeg.duration / 2 : null;
14633
+ }
13903
14634
  }, {
13904
14635
  key: "speedInfo",
13905
14636
  value: function speedInfo() {
@@ -13925,30 +14656,37 @@
13925
14656
  }, {
13926
14657
  key: "load",
13927
14658
  value: function() {
13928
- var _load = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee4(url) {
13929
- var reuseMse, _args4 = arguments;
14659
+ var _load = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee4() {
14660
+ var url, options, reuseMse, _args4 = arguments;
13930
14661
  return _regeneratorRuntime$1().wrap(function _callee4$(_context4) {
13931
14662
  while (1)
13932
14663
  switch (_context4.prev = _context4.next) {
13933
14664
  case 0:
13934
- reuseMse = _args4.length > 1 && _args4[1] !== void 0 ? _args4[1] : false;
14665
+ url = _args4.length > 0 && _args4[0] !== void 0 ? _args4[0] : "";
14666
+ options = _args4.length > 1 && _args4[1] !== void 0 ? _args4[1] : {};
14667
+ reuseMse = typeof options === "boolean" ? options : !!(options !== null && options !== void 0 && options.reuseMse);
14668
+ if (_typeof$2(options) === "object" && options !== null && options !== void 0 && options.clearSwitchStatus) {
14669
+ this._urlSwitching = false;
14670
+ this._switchUrlOpts = null;
14671
+ this.config.startTime = void 0;
14672
+ }
13935
14673
  if (url)
13936
14674
  this.config.url = url;
13937
14675
  url = this.config.url;
13938
- _context4.next = 5;
14676
+ _context4.next = 8;
13939
14677
  return this._reset(reuseMse);
13940
- case 5:
13941
- _context4.next = 7;
14678
+ case 8:
14679
+ _context4.next = 10;
13942
14680
  return this._loadData(url);
13943
- case 7:
14681
+ case 10:
13944
14682
  this._startTick();
13945
- case 8:
14683
+ case 11:
13946
14684
  case "end":
13947
14685
  return _context4.stop();
13948
14686
  }
13949
14687
  }, _callee4, this);
13950
14688
  }));
13951
- function load(_x) {
14689
+ function load() {
13952
14690
  return _load.apply(this, arguments);
13953
14691
  }
13954
14692
  return load;
@@ -13957,7 +14695,7 @@
13957
14695
  key: "_loadData",
13958
14696
  value: function() {
13959
14697
  var _loadData2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5(url) {
13960
- var manifest, currentStream, _this$_switchUrlOpts, _this$_switchUrlOpts2, switchTimePoint, segIdx, nextSeg, bufferClearStartPoint, preIndex, startTime, _this$_switchUrlOpts3;
14698
+ var manifest, currentStream, preIndex, _this$_switchUrlOpts, _this$_switchUrlOpts3, _this$_switchUrlOpts4, _this$_switchUrlOpts2, switchTimePoint, segIdx, nextSeg, bufferClearStartPoint, startTime, _this$_switchUrlOpts5;
13961
14699
  return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
13962
14700
  while (1)
13963
14701
  switch (_context5.prev = _context5.next) {
@@ -13978,41 +14716,46 @@
13978
14716
  case 5:
13979
14717
  manifest = _context5.sent;
13980
14718
  currentStream = this._playlist.currentStream;
13981
- if (!(this._urlSwitching && !this.isLive)) {
13982
- _context5.next = 17;
14719
+ if (!this._urlSwitching) {
14720
+ _context5.next = 23;
13983
14721
  break;
13984
14722
  }
14723
+ if (!this.isLive) {
14724
+ _context5.next = 14;
14725
+ break;
14726
+ }
14727
+ preIndex = this._playlist.setNextSegmentBySN(this._prevSegSn);
14728
+ logger.log("segment nb=".concat(this._prevSegSn, " index of ").concat(preIndex, " in the new playlist"));
14729
+ if (preIndex === -1) {
14730
+ this._prevSegCc = null;
14731
+ this._prevSegSn = null;
14732
+ }
14733
+ _context5.next = 23;
14734
+ break;
14735
+ case 14:
13985
14736
  if (currentStream.bitrate === 0 && (_this$_switchUrlOpts = this._switchUrlOpts) !== null && _this$_switchUrlOpts !== void 0 && _this$_switchUrlOpts.bitrate) {
13986
14737
  currentStream.bitrate = (_this$_switchUrlOpts2 = this._switchUrlOpts) === null || _this$_switchUrlOpts2 === void 0 ? void 0 : _this$_switchUrlOpts2.bitrate;
13987
14738
  }
13988
- switchTimePoint = this._getSeamlessSwitchPoint();
14739
+ switchTimePoint = typeof ((_this$_switchUrlOpts3 = this._switchUrlOpts) === null || _this$_switchUrlOpts3 === void 0 ? void 0 : _this$_switchUrlOpts3.startTime) === "number" ? (_this$_switchUrlOpts4 = this._switchUrlOpts) === null || _this$_switchUrlOpts4 === void 0 ? void 0 : _this$_switchUrlOpts4.startTime : this._getSeamlessSwitchPoint();
13989
14740
  this.config.startTime = switchTimePoint;
13990
14741
  segIdx = this._playlist.findSegmentIndexByTime(switchTimePoint);
13991
14742
  nextSeg = this._playlist.getSegmentByIndex(segIdx + 1);
13992
14743
  if (!nextSeg) {
13993
- _context5.next = 17;
14744
+ _context5.next = 23;
13994
14745
  break;
13995
14746
  }
13996
14747
  bufferClearStartPoint = nextSeg.start;
13997
- _context5.next = 17;
14748
+ _context5.next = 23;
13998
14749
  return this._bufferService.removeBuffer(bufferClearStartPoint);
13999
- case 17:
14000
- if (this._urlSwitching && this.isLive) {
14001
- preIndex = this._playlist.setNextSegmentBySN(this._prevSegSn);
14002
- logger.log("segment nb=".concat(this._prevSegSn, " index of ").concat(preIndex, " in the new playlist"));
14003
- if (preIndex === -1) {
14004
- this._prevSegCc = null;
14005
- this._prevSegSn = null;
14006
- }
14007
- }
14750
+ case 23:
14008
14751
  if (manifest) {
14009
- _context5.next = 20;
14752
+ _context5.next = 25;
14010
14753
  break;
14011
14754
  }
14012
14755
  return _context5.abrupt("return");
14013
- case 20:
14756
+ case 25:
14014
14757
  if (!this.isLive) {
14015
- _context5.next = 31;
14758
+ _context5.next = 36;
14016
14759
  break;
14017
14760
  }
14018
14761
  this._bufferService.setLiveSeekableRange(0, 4294967295);
@@ -14025,35 +14768,35 @@
14025
14768
  if (!manifest.isMaster)
14026
14769
  this._pollM3U8(url);
14027
14770
  if (!(this._playlist.nbSegments < this.config.minSegmentsStartPlay)) {
14028
- _context5.next = 28;
14771
+ _context5.next = 33;
14029
14772
  break;
14030
14773
  }
14031
14774
  return _context5.abrupt("return");
14032
- case 28:
14033
- _context5.next = 30;
14775
+ case 33:
14776
+ _context5.next = 35;
14034
14777
  return this._loadSegment();
14035
- case 30:
14778
+ case 35:
14036
14779
  return _context5.abrupt("return");
14037
- case 31:
14038
- _context5.next = 33;
14780
+ case 36:
14781
+ _context5.next = 38;
14039
14782
  return this._bufferService.updateDuration(currentStream.totalDuration);
14040
- case 33:
14783
+ case 38:
14041
14784
  startTime = this.config.startTime;
14042
14785
  if (startTime) {
14043
- if (!((_this$_switchUrlOpts3 = this._switchUrlOpts) !== null && _this$_switchUrlOpts3 !== void 0 && _this$_switchUrlOpts3.seamless)) {
14786
+ if (!((_this$_switchUrlOpts5 = this._switchUrlOpts) !== null && _this$_switchUrlOpts5 !== void 0 && _this$_switchUrlOpts5.seamless)) {
14044
14787
  this.media.currentTime = startTime;
14045
14788
  }
14046
14789
  this._playlist.setNextSegmentByIndex(this._playlist.findSegmentIndexByTime(startTime) || 0);
14047
14790
  }
14048
- _context5.next = 37;
14791
+ _context5.next = 42;
14049
14792
  return this._loadSegment();
14050
- case 37:
14793
+ case 42:
14051
14794
  case "end":
14052
14795
  return _context5.stop();
14053
14796
  }
14054
14797
  }, _callee5, this);
14055
14798
  }));
14056
- function _loadData(_x2) {
14799
+ function _loadData(_x) {
14057
14800
  return _loadData2.apply(this, arguments);
14058
14801
  }
14059
14802
  return _loadData;
@@ -14067,18 +14810,20 @@
14067
14810
  switch (_context6.prev = _context6.next) {
14068
14811
  case 0:
14069
14812
  this.config.startTime = 0;
14070
- _context6.next = 3;
14813
+ this._urlSwitching = false;
14814
+ this._switchUrlOpts = null;
14815
+ _context6.next = 5;
14071
14816
  return this.load();
14072
- case 3:
14817
+ case 5:
14073
14818
  this._reloadOnPlay = false;
14074
14819
  return _context6.abrupt("return", this.media.play(!isPlayEmit));
14075
- case 5:
14820
+ case 7:
14076
14821
  case "end":
14077
14822
  return _context6.stop();
14078
14823
  }
14079
14824
  }, _callee6, this);
14080
14825
  }));
14081
- function replay(_x3) {
14826
+ function replay(_x2) {
14082
14827
  return _replay.apply(this, arguments);
14083
14828
  }
14084
14829
  return replay;
@@ -14183,7 +14928,7 @@
14183
14928
  }
14184
14929
  }, _callee7, this, [[18, 29]]);
14185
14930
  }));
14186
- function switchURL(_x4) {
14931
+ function switchURL(_x3) {
14187
14932
  return _switchURL.apply(this, arguments);
14188
14933
  }
14189
14934
  return switchURL;
@@ -14269,7 +15014,7 @@
14269
15014
  }
14270
15015
  }, _callee8, this, [[8, 16], [21, 31]]);
14271
15016
  }));
14272
- function switchStream(_x5) {
15017
+ function switchStream(_x4) {
14273
15018
  return _switchStream.apply(this, arguments);
14274
15019
  }
14275
15020
  return switchStream;
@@ -14355,7 +15100,7 @@
14355
15100
  }
14356
15101
  }, _callee9, this, [[10, 18], [22, 32]]);
14357
15102
  }));
14358
- function switchAudioStream(_x6) {
15103
+ function switchAudioStream(_x5) {
14359
15104
  return _switchAudioStream.apply(this, arguments);
14360
15105
  }
14361
15106
  return switchAudioStream;
@@ -14380,25 +15125,50 @@
14380
15125
  }
14381
15126
  }, _callee10, this);
14382
15127
  }));
14383
- function switchSubtitleStream(_x7) {
15128
+ function switchSubtitleStream(_x6) {
14384
15129
  return _switchSubtitleStream.apply(this, arguments);
14385
15130
  }
14386
15131
  return switchSubtitleStream;
14387
15132
  }()
14388
15133
  }, {
14389
- key: "destroy",
15134
+ key: "detachMedia",
14390
15135
  value: function() {
14391
- var _destroy = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee11() {
14392
- var _this$_seiService2;
15136
+ var _detachMedia = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee11() {
14393
15137
  return _regeneratorRuntime$1().wrap(function _callee11$(_context11) {
14394
15138
  while (1)
14395
15139
  switch (_context11.prev = _context11.next) {
15140
+ case 0:
15141
+ if (!this._bufferService) {
15142
+ _context11.next = 3;
15143
+ break;
15144
+ }
15145
+ _context11.next = 3;
15146
+ return this._bufferService.detachMedia();
15147
+ case 3:
15148
+ case "end":
15149
+ return _context11.stop();
15150
+ }
15151
+ }, _callee11, this);
15152
+ }));
15153
+ function detachMedia() {
15154
+ return _detachMedia.apply(this, arguments);
15155
+ }
15156
+ return detachMedia;
15157
+ }()
15158
+ }, {
15159
+ key: "destroy",
15160
+ value: function() {
15161
+ var _destroy = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee12() {
15162
+ var _this$_seiService2;
15163
+ return _regeneratorRuntime$1().wrap(function _callee12$(_context12) {
15164
+ while (1)
15165
+ switch (_context12.prev = _context12.next) {
14396
15166
  case 0:
14397
15167
  if (this.media) {
14398
- _context11.next = 2;
15168
+ _context12.next = 2;
14399
15169
  break;
14400
15170
  }
14401
- return _context11.abrupt("return");
15171
+ return _context12.abrupt("return");
14402
15172
  case 2:
14403
15173
  this.removeAllListeners();
14404
15174
  this._playlist.reset();
@@ -14409,15 +15179,15 @@
14409
15179
  this.media.removeEventListener("pause", this._onPause);
14410
15180
  this.media.removeEventListener("seeking", this._onSeeking);
14411
15181
  this.media.removeEventListener("timeupdate", this._onTimeupdate);
14412
- _context11.next = 13;
15182
+ _context12.next = 13;
14413
15183
  return Promise.all([this._clear(), this._bufferService.destroy()]);
14414
15184
  case 13:
14415
15185
  this.media = null;
14416
15186
  case 14:
14417
15187
  case "end":
14418
- return _context11.stop();
15188
+ return _context12.stop();
14419
15189
  }
14420
- }, _callee11, this);
15190
+ }, _callee12, this);
14421
15191
  }));
14422
15192
  function destroy() {
14423
15193
  return _destroy.apply(this, arguments);
@@ -14427,48 +15197,48 @@
14427
15197
  }, {
14428
15198
  key: "_loadM3U8",
14429
15199
  value: function() {
14430
- var _loadM3U = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee12(url) {
15200
+ var _loadM3U = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee13(url) {
14431
15201
  var playlist, _this$config$manifest, _this$config$manifest2, manifest, _ref4, _ref5, _this$_playlist$curre;
14432
- return _regeneratorRuntime$1().wrap(function _callee12$(_context12) {
15202
+ return _regeneratorRuntime$1().wrap(function _callee13$(_context13) {
14433
15203
  while (1)
14434
- switch (_context12.prev = _context12.next) {
15204
+ switch (_context13.prev = _context13.next) {
14435
15205
  case 0:
14436
- _context12.prev = 0;
15206
+ _context13.prev = 0;
14437
15207
  manifest = (_this$config$manifest = this.config.manifestList) === null || _this$config$manifest === void 0 ? void 0 : (_this$config$manifest2 = _this$config$manifest.filter(function(x) {
14438
15208
  return x.url === url;
14439
15209
  })[0]) === null || _this$config$manifest2 === void 0 ? void 0 : _this$config$manifest2.manifest;
14440
15210
  if (!manifest) {
14441
- _context12.next = 6;
15211
+ _context13.next = 6;
14442
15212
  break;
14443
15213
  }
14444
- _context12.t0 = this._manifestLoader.parseText(manifest, url);
14445
- _context12.next = 9;
15214
+ _context13.t0 = this._manifestLoader.parseText(manifest, url);
15215
+ _context13.next = 9;
14446
15216
  break;
14447
15217
  case 6:
14448
- _context12.next = 8;
15218
+ _context13.next = 8;
14449
15219
  return this._manifestLoader.load(url);
14450
15220
  case 8:
14451
- _context12.t0 = _context12.sent;
15221
+ _context13.t0 = _context13.sent;
14452
15222
  case 9:
14453
- _ref4 = _context12.t0;
15223
+ _ref4 = _context13.t0;
14454
15224
  _ref5 = _slicedToArray$1(_ref4, 1);
14455
15225
  playlist = _ref5[0];
14456
- _context12.next = 17;
15226
+ _context13.next = 17;
14457
15227
  break;
14458
15228
  case 14:
14459
- _context12.prev = 14;
14460
- _context12.t1 = _context12["catch"](0);
14461
- throw this._emitError(StreamingError.create(_context12.t1));
15229
+ _context13.prev = 14;
15230
+ _context13.t1 = _context13["catch"](0);
15231
+ throw this._emitError(StreamingError.create(_context13.t1));
14462
15232
  case 17:
14463
15233
  if (playlist) {
14464
- _context12.next = 19;
15234
+ _context13.next = 19;
14465
15235
  break;
14466
15236
  }
14467
- return _context12.abrupt("return");
15237
+ return _context13.abrupt("return");
14468
15238
  case 19:
14469
15239
  this._playlist.upsertPlaylist(playlist);
14470
15240
  if (!playlist.isMaster) {
14471
- _context12.next = 24;
15241
+ _context13.next = 24;
14472
15242
  break;
14473
15243
  }
14474
15244
  if ((_this$_playlist$curre = this._playlist.currentStream.subtitleStreams) !== null && _this$_playlist$curre !== void 0 && _this$_playlist$curre.length) {
@@ -14476,18 +15246,18 @@
14476
15246
  list: this._playlist.currentStream.subtitleStreams
14477
15247
  });
14478
15248
  }
14479
- _context12.next = 24;
15249
+ _context13.next = 24;
14480
15250
  return this._refreshM3U8();
14481
15251
  case 24:
14482
15252
  this.emit(Event$1.STREAM_PARSED);
14483
- return _context12.abrupt("return", playlist);
15253
+ return _context13.abrupt("return", playlist);
14484
15254
  case 26:
14485
15255
  case "end":
14486
- return _context12.stop();
15256
+ return _context13.stop();
14487
15257
  }
14488
- }, _callee12, this, [[0, 14]]);
15258
+ }, _callee13, this, [[0, 14]]);
14489
15259
  }));
14490
- function _loadM3U8(_x8) {
15260
+ function _loadM3U8(_x7) {
14491
15261
  return _loadM3U.apply(this, arguments);
14492
15262
  }
14493
15263
  return _loadM3U8;
@@ -14521,7 +15291,7 @@
14521
15291
  var isEmpty = this._playlist.isEmpty;
14522
15292
  var pollInterval;
14523
15293
  if (this._playlist.lowLatency) {
14524
- pollInterval = (this._playlist.currentStream.partTargetDuration * 2 || 0) * 1e3;
15294
+ pollInterval = (this._playlist.currentStream.partTargetDuration || 0) * 1e3;
14525
15295
  } else {
14526
15296
  var _this$_playlist$lastS;
14527
15297
  pollInterval = (((_this$_playlist$lastS = this._playlist.lastSegment) === null || _this$_playlist$lastS === void 0 ? void 0 : _this$_playlist$lastS.duration) || 0) * 1e3;
@@ -14549,53 +15319,53 @@
14549
15319
  }, {
14550
15320
  key: "_loadSegmentDirect",
14551
15321
  value: function() {
14552
- var _loadSegmentDirect2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee13(loadOnce) {
15322
+ var _loadSegmentDirect2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee14(loadOnce) {
14553
15323
  var seg, appended, cachedError, _this$_playlist$curre2, bufferEnd, sameStream;
14554
- return _regeneratorRuntime$1().wrap(function _callee13$(_context13) {
15324
+ return _regeneratorRuntime$1().wrap(function _callee14$(_context14) {
14555
15325
  while (1)
14556
- switch (_context13.prev = _context13.next) {
15326
+ switch (_context14.prev = _context14.next) {
14557
15327
  case 0:
14558
15328
  seg = this._playlist.nextSegment;
14559
15329
  if (seg) {
14560
- _context13.next = 3;
15330
+ _context14.next = 3;
14561
15331
  break;
14562
15332
  }
14563
- return _context13.abrupt("return");
15333
+ return _context14.abrupt("return");
14564
15334
  case 3:
14565
15335
  appended = false;
14566
15336
  cachedError = null;
14567
- _context13.prev = 5;
15337
+ _context14.prev = 5;
14568
15338
  this._segmentProcessing = true;
14569
15339
  logger.log("load segment, sn:".concat(seg.sn, ", [").concat(seg.start, ", ").concat(seg.end, "], partIndex:").concat(seg.partIndex));
14570
- _context13.next = 10;
15340
+ _context14.next = 10;
14571
15341
  return this._reqAndBufferSegment(seg, this._playlist.getAudioSegment(seg));
14572
15342
  case 10:
14573
- appended = _context13.sent;
14574
- _context13.next = 16;
15343
+ appended = _context14.sent;
15344
+ _context14.next = 16;
14575
15345
  break;
14576
15346
  case 13:
14577
- _context13.prev = 13;
14578
- _context13.t0 = _context13["catch"](5);
14579
- cachedError = _context13.t0;
15347
+ _context14.prev = 13;
15348
+ _context14.t0 = _context14["catch"](5);
15349
+ cachedError = _context14.t0;
14580
15350
  case 16:
14581
- _context13.prev = 16;
15351
+ _context14.prev = 16;
14582
15352
  this._segmentProcessing = false;
14583
- return _context13.finish(16);
15353
+ return _context14.finish(16);
14584
15354
  case 19:
14585
15355
  if (!cachedError) {
14586
- _context13.next = 26;
15356
+ _context14.next = 26;
14587
15357
  break;
14588
15358
  }
14589
15359
  if (!this._bufferService.isFull()) {
14590
- _context13.next = 25;
15360
+ _context14.next = 25;
14591
15361
  break;
14592
15362
  }
14593
15363
  logger.log("load segment, sn:".concat(seg.sn, ", partIndex:").concat(seg.partIndex));
14594
15364
  this._segmentProcessing = true;
14595
15365
  this._isProcessQuotaExceeded = true;
14596
- return _context13.abrupt("return", false);
15366
+ return _context14.abrupt("return", false);
14597
15367
  case 25:
14598
- return _context13.abrupt("return", this._emitError(StreamingError.create(cachedError)));
15368
+ return _context14.abrupt("return", this._emitError(StreamingError.create(cachedError)));
14599
15369
  case 26:
14600
15370
  if (appended) {
14601
15371
  bufferEnd = this.bufferInfo().end;
@@ -14621,14 +15391,14 @@
14621
15391
  this._loadSegment();
14622
15392
  }
14623
15393
  }
14624
- return _context13.abrupt("return", appended);
15394
+ return _context14.abrupt("return", appended);
14625
15395
  case 28:
14626
15396
  case "end":
14627
- return _context13.stop();
15397
+ return _context14.stop();
14628
15398
  }
14629
- }, _callee13, this, [[5, 13, 16, 19]]);
15399
+ }, _callee14, this, [[5, 13, 16, 19]]);
14630
15400
  }));
14631
- function _loadSegmentDirect(_x9) {
15401
+ function _loadSegmentDirect(_x8) {
14632
15402
  return _loadSegmentDirect2.apply(this, arguments);
14633
15403
  }
14634
15404
  return _loadSegmentDirect;
@@ -14636,45 +15406,45 @@
14636
15406
  }, {
14637
15407
  key: "_reqAndBufferSegment",
14638
15408
  value: function() {
14639
- var _reqAndBufferSegment2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee14(seg, audioSeg) {
15409
+ var _reqAndBufferSegment2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee15(seg, audioSeg) {
14640
15410
  var _this$_bufferService2;
14641
15411
  var cc, discontinuity, responses, data, sn, start, stream, before, contiguous, segStart;
14642
- return _regeneratorRuntime$1().wrap(function _callee14$(_context14) {
15412
+ return _regeneratorRuntime$1().wrap(function _callee15$(_context15) {
14643
15413
  while (1)
14644
- switch (_context14.prev = _context14.next) {
15414
+ switch (_context15.prev = _context15.next) {
14645
15415
  case 0:
14646
15416
  cc = seg ? seg.cc : audioSeg.cc;
14647
15417
  discontinuity = this._prevSegCc !== cc;
14648
15418
  responses = [];
14649
- _context14.prev = 3;
14650
- _context14.next = 6;
15419
+ _context15.prev = 3;
15420
+ _context15.next = 6;
14651
15421
  return this._segmentLoader.load(seg, audioSeg, discontinuity);
14652
15422
  case 6:
14653
- responses = _context14.sent;
14654
- _context14.next = 14;
15423
+ responses = _context15.sent;
15424
+ _context15.next = 14;
14655
15425
  break;
14656
15426
  case 9:
14657
- _context14.prev = 9;
14658
- _context14.t0 = _context14["catch"](3);
14659
- _context14.t0.fatal = false;
14660
- this._segmentLoader.error = _context14.t0;
14661
- throw _context14.t0;
15427
+ _context15.prev = 9;
15428
+ _context15.t0 = _context15["catch"](3);
15429
+ _context15.t0.fatal = false;
15430
+ this._segmentLoader.error = _context15.t0;
15431
+ throw _context15.t0;
14662
15432
  case 14:
14663
15433
  if (responses[0]) {
14664
- _context14.next = 16;
15434
+ _context15.next = 16;
14665
15435
  break;
14666
15436
  }
14667
- return _context14.abrupt("return");
15437
+ return _context15.abrupt("return");
14668
15438
  case 16:
14669
- _context14.next = 18;
15439
+ _context15.next = 18;
14670
15440
  return (_this$_bufferService2 = this._bufferService).decryptBuffer.apply(_this$_bufferService2, _toConsumableArray$2(responses));
14671
15441
  case 18:
14672
- data = _context14.sent;
15442
+ data = _context15.sent;
14673
15443
  if (data) {
14674
- _context14.next = 21;
15444
+ _context15.next = 21;
14675
15445
  break;
14676
15446
  }
14677
- return _context14.abrupt("return");
15447
+ return _context15.abrupt("return");
14678
15448
  case 21:
14679
15449
  sn = seg ? seg.sn : audioSeg.sn;
14680
15450
  start = seg ? seg.start : audioSeg.start;
@@ -14688,26 +15458,26 @@
14688
15458
  logger.warn("update the new playlist liveEdge, segment id=".concat(sn, ", buffer start=").concat(segStart, ", liveEdge=").concat(this._playlist.liveEdge));
14689
15459
  start = segStart;
14690
15460
  }
14691
- _context14.next = 30;
15461
+ _context15.next = 30;
14692
15462
  return this._bufferService.appendBuffer(seg, audioSeg, data[0], data[1], discontinuity, contiguous, start);
14693
15463
  case 30:
14694
15464
  this.emit(Event$1.APPEND_COST, {
14695
15465
  elapsed: Date.now() - before,
14696
15466
  url: seg.url
14697
15467
  });
14698
- _context14.next = 33;
15468
+ _context15.next = 33;
14699
15469
  return this._bufferService.evictBuffer(this.config.bufferBehind);
14700
15470
  case 33:
14701
15471
  this._prevSegCc = cc;
14702
15472
  this._prevSegSn = sn;
14703
- return _context14.abrupt("return", true);
15473
+ return _context15.abrupt("return", true);
14704
15474
  case 36:
14705
15475
  case "end":
14706
- return _context14.stop();
15476
+ return _context15.stop();
14707
15477
  }
14708
- }, _callee14, this, [[3, 9]]);
15478
+ }, _callee15, this, [[3, 9]]);
14709
15479
  }));
14710
- function _reqAndBufferSegment(_x10, _x11) {
15480
+ function _reqAndBufferSegment(_x9, _x10) {
14711
15481
  return _reqAndBufferSegment2.apply(this, arguments);
14712
15482
  }
14713
15483
  return _reqAndBufferSegment;
@@ -14715,11 +15485,11 @@
14715
15485
  }, {
14716
15486
  key: "_onCheckQuotaExceeded",
14717
15487
  value: function() {
14718
- var _onCheckQuotaExceeded2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee15() {
15488
+ var _onCheckQuotaExceeded2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee16() {
14719
15489
  var seekTime, buffered, inBuffered, i, bufferBehind, mediaTime;
14720
- return _regeneratorRuntime$1().wrap(function _callee15$(_context15) {
15490
+ return _regeneratorRuntime$1().wrap(function _callee16$(_context16) {
14721
15491
  while (1)
14722
- switch (_context15.prev = _context15.next) {
15492
+ switch (_context16.prev = _context16.next) {
14723
15493
  case 0:
14724
15494
  seekTime = this.media.currentTime;
14725
15495
  buffered = this.media.buffered;
@@ -14727,37 +15497,37 @@
14727
15497
  i = 0;
14728
15498
  case 4:
14729
15499
  if (!(i < buffered.length)) {
14730
- _context15.next = 11;
15500
+ _context16.next = 11;
14731
15501
  break;
14732
15502
  }
14733
15503
  if (!(buffered.start(0) >= seekTime && seekTime < buffered.end(i))) {
14734
- _context15.next = 8;
15504
+ _context16.next = 8;
14735
15505
  break;
14736
15506
  }
14737
15507
  inBuffered = true;
14738
- return _context15.abrupt("break", 11);
15508
+ return _context16.abrupt("break", 11);
14739
15509
  case 8:
14740
15510
  i++;
14741
- _context15.next = 4;
15511
+ _context16.next = 4;
14742
15512
  break;
14743
15513
  case 11:
14744
15514
  if (!this._bufferService.isFull()) {
14745
- _context15.next = 17;
15515
+ _context16.next = 17;
14746
15516
  break;
14747
15517
  }
14748
15518
  bufferBehind = inBuffered ? this.config.bufferBehind : 5;
14749
15519
  mediaTime = this.media.currentTime;
14750
15520
  if (!(mediaTime - bufferBehind > 0)) {
14751
- _context15.next = 17;
15521
+ _context16.next = 17;
14752
15522
  break;
14753
15523
  }
14754
- _context15.next = 17;
15524
+ _context16.next = 17;
14755
15525
  return this._bufferService.removeBuffer(0, mediaTime - bufferBehind);
14756
15526
  case 17:
14757
15527
  case "end":
14758
- return _context15.stop();
15528
+ return _context16.stop();
14759
15529
  }
14760
- }, _callee15, this);
15530
+ }, _callee16, this);
14761
15531
  }));
14762
15532
  function _onCheckQuotaExceeded() {
14763
15533
  return _onCheckQuotaExceeded2.apply(this, arguments);
@@ -14775,22 +15545,22 @@
14775
15545
  }, {
14776
15546
  key: "_clear",
14777
15547
  value: function() {
14778
- var _clear2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee16() {
14779
- return _regeneratorRuntime$1().wrap(function _callee16$(_context16) {
15548
+ var _clear2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee17() {
15549
+ return _regeneratorRuntime$1().wrap(function _callee17$(_context17) {
14780
15550
  while (1)
14781
- switch (_context16.prev = _context16.next) {
15551
+ switch (_context17.prev = _context17.next) {
14782
15552
  case 0:
14783
15553
  clearTimeout(this._disconnectTimer);
14784
15554
  this._stopTick();
14785
- _context16.next = 4;
15555
+ _context17.next = 4;
14786
15556
  return Promise.all([this._segmentLoader.cancel(), this._manifestLoader.stopPoll()]);
14787
15557
  case 4:
14788
15558
  this._segmentProcessing = false;
14789
15559
  case 5:
14790
15560
  case "end":
14791
- return _context16.stop();
15561
+ return _context17.stop();
14792
15562
  }
14793
- }, _callee16, this);
15563
+ }, _callee17, this);
14794
15564
  }));
14795
15565
  function _clear() {
14796
15566
  return _clear2.apply(this, arguments);
@@ -14800,14 +15570,14 @@
14800
15570
  }, {
14801
15571
  key: "_reset",
14802
15572
  value: function() {
14803
- var _reset2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee17() {
15573
+ var _reset2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee18() {
14804
15574
  var _this$_seiService3;
14805
- var reuseMse, _args17 = arguments;
14806
- return _regeneratorRuntime$1().wrap(function _callee17$(_context17) {
15575
+ var reuseMse, _args18 = arguments;
15576
+ return _regeneratorRuntime$1().wrap(function _callee18$(_context18) {
14807
15577
  while (1)
14808
- switch (_context17.prev = _context17.next) {
15578
+ switch (_context18.prev = _context18.next) {
14809
15579
  case 0:
14810
- reuseMse = _args17.length > 0 && _args17[0] !== void 0 ? _args17[0] : false;
15580
+ reuseMse = _args18.length > 0 && _args18[0] !== void 0 ? _args18[0] : false;
14811
15581
  this._reloadOnPlay = false;
14812
15582
  this._prevSegSn = null;
14813
15583
  this._prevSegCc = null;
@@ -14816,15 +15586,15 @@
14816
15586
  this._segmentLoader.reset();
14817
15587
  (_this$_seiService3 = this._seiService) === null || _this$_seiService3 === void 0 ? void 0 : _this$_seiService3.reset();
14818
15588
  this._stats.reset();
14819
- _context17.next = 11;
15589
+ _context18.next = 11;
14820
15590
  return this._clear();
14821
15591
  case 11:
14822
- return _context17.abrupt("return", this._bufferService.reset(reuseMse));
15592
+ return _context18.abrupt("return", this._bufferService.reset(reuseMse));
14823
15593
  case 12:
14824
15594
  case "end":
14825
- return _context17.stop();
15595
+ return _context18.stop();
14826
15596
  }
14827
- }, _callee17, this);
15597
+ }, _callee18, this);
14828
15598
  }));
14829
15599
  function _reset() {
14830
15600
  return _reset2.apply(this, arguments);
@@ -14942,7 +15712,7 @@
14942
15712
  }]);
14943
15713
  return Hls2;
14944
15714
  }(EventEmitter);
14945
- _defineProperty$3(Hls, "version", "3.0.20-alpha.2");
15715
+ _defineProperty$3(Hls, "version", "3.0.21-rc.2");
14946
15716
  try {
14947
15717
  if (localStorage.getItem("xgd")) {
14948
15718
  Hls.enableLogger();
@@ -15033,6 +15803,7 @@
15033
15803
  }]);
15034
15804
  return PluginExtension2;
15035
15805
  }();
15806
+ var _excluded = ["currentTime"];
15036
15807
  function parseSwitchUrlArgs(args, plugin) {
15037
15808
  var player = plugin.player;
15038
15809
  var curTime = player.currentTime;
@@ -15043,9 +15814,14 @@
15043
15814
  case "boolean":
15044
15815
  options.seamless = args;
15045
15816
  break;
15046
- case "object":
15047
- Object.assign(options, args);
15817
+ case "object": {
15818
+ var currentTime = args.currentTime, rest = _objectWithoutProperties$1(args, _excluded);
15819
+ Object.assign(options, rest);
15820
+ if (typeof currentTime === "number") {
15821
+ options.startTime = currentTime;
15822
+ }
15048
15823
  break;
15824
+ }
15049
15825
  }
15050
15826
  return options;
15051
15827
  }
@@ -15055,10 +15831,11 @@
15055
15831
  function HlsPlugin2() {
15056
15832
  var _this;
15057
15833
  _classCallCheck$3(this, HlsPlugin2);
15058
- for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
15059
- _args[_key] = arguments[_key];
15834
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
15835
+ args[_key] = arguments[_key];
15060
15836
  }
15061
- _this = _super.call.apply(_super, [this].concat(_args));
15837
+ _this = _super.call.apply(_super, [this].concat(args));
15838
+ _defineProperty$3(_assertThisInitialized$2(_this), "logger", logger);
15062
15839
  _defineProperty$3(_assertThisInitialized$2(_this), "hls", null);
15063
15840
  _defineProperty$3(_assertThisInitialized$2(_this), "pluginExtension", null);
15064
15841
  _defineProperty$3(_assertThisInitialized$2(_this), "getStats", function() {
@@ -15070,24 +15847,6 @@
15070
15847
  var lang = _ref.lang;
15071
15848
  (_this$hls2 = _this.hls) === null || _this$hls2 === void 0 ? void 0 : _this$hls2.switchSubtitleStream(lang);
15072
15849
  });
15073
- _defineProperty$3(_assertThisInitialized$2(_this), "_onSwitchURL", function(url, args) {
15074
- return new Promise(function(resolve, reject) {
15075
- var _assertThisInitialize = _assertThisInitialized$2(_this), player = _assertThisInitialize.player, hls = _assertThisInitialize.hls;
15076
- if (hls) {
15077
- var _this$player$config, _this$player$config$h;
15078
- var options = parseSwitchUrlArgs(args, _assertThisInitialized$2(_this));
15079
- player.config.url = url;
15080
- hls.switchURL(url, options).then(function() {
15081
- return resolve(true);
15082
- }).catch(reject);
15083
- if (!options.seamless && (_this$player$config = _this.player.config) !== null && _this$player$config !== void 0 && (_this$player$config$h = _this$player$config.hls) !== null && _this$player$config$h !== void 0 && _this$player$config$h.keepStatusAfterSwitch) {
15084
- _this._keepPauseStatus();
15085
- }
15086
- } else {
15087
- reject();
15088
- }
15089
- });
15090
- });
15091
15850
  _defineProperty$3(_assertThisInitialized$2(_this), "_keepPauseStatus", function() {
15092
15851
  var paused = _this.player.paused;
15093
15852
  if (!paused)
@@ -15112,8 +15871,8 @@
15112
15871
  }, {
15113
15872
  key: "softDecode",
15114
15873
  get: function get() {
15115
- var _this$player, _this$player$config2;
15116
- var mediaType = (_this$player = this.player) === null || _this$player === void 0 ? void 0 : (_this$player$config2 = _this$player.config) === null || _this$player$config2 === void 0 ? void 0 : _this$player$config2.mediaType;
15874
+ var _this$player, _this$player$config;
15875
+ var mediaType = (_this$player = this.player) === null || _this$player === void 0 ? void 0 : (_this$player$config = _this$player.config) === null || _this$player$config === void 0 ? void 0 : _this$player$config.mediaType;
15117
15876
  return !!mediaType && mediaType !== "video" && mediaType !== "audio";
15118
15877
  }
15119
15878
  }, {
@@ -15121,13 +15880,35 @@
15121
15880
  value: function beforePlayerInit() {
15122
15881
  var _this2 = this;
15123
15882
  var config = this.player.config;
15883
+ var mediaElem = this.player.media || this.player.video;
15124
15884
  var hlsOpts = config.hls || {};
15125
15885
  if (!config.url && !config.__allowHlsEmptyUrl__ || !hlsOpts.preferMMS && MSE.isMMSOnly()) {
15126
15886
  return;
15127
15887
  }
15128
15888
  if (this.hls)
15129
15889
  this.hls.destroy();
15130
- this.player.switchURL = this._onSwitchURL;
15890
+ var descriptor = Object.getOwnPropertyDescriptor(this.player, "switchURL");
15891
+ if (!descriptor || descriptor.writable) {
15892
+ this.player.switchURL = function(url, args) {
15893
+ return new Promise(function(resolve, reject) {
15894
+ var player = _this2.player, hls = _this2.hls;
15895
+ if (hls) {
15896
+ var _this2$player$config, _this2$player$config$;
15897
+ var options = parseSwitchUrlArgs(args, _this2);
15898
+ player.config.url = url;
15899
+ hls.switchURL(url, options).then(function() {
15900
+ return resolve(true);
15901
+ }).catch(reject);
15902
+ if (!options.seamless && (_this2$player$config = _this2.player.config) !== null && _this2$player$config !== void 0 && (_this2$player$config$ = _this2$player$config.hls) !== null && _this2$player$config$ !== void 0 && _this2$player$config$.keepStatusAfterSwitch) {
15903
+ _this2._keepPauseStatus();
15904
+ }
15905
+ } else {
15906
+ reject();
15907
+ }
15908
+ });
15909
+ };
15910
+ }
15911
+ var onSwitchUrl = this.player.switchURL;
15131
15912
  this.player.handleSource = false;
15132
15913
  hlsOpts.innerDegrade = hlsOpts.innerDegrade || config.innerDegrade;
15133
15914
  if (hlsOpts.disconnectTime === null || hlsOpts.disconnectTime === void 0)
@@ -15135,7 +15916,7 @@
15135
15916
  this.hls = new Hls(_objectSpread2$2({
15136
15917
  softDecode: this.softDecode,
15137
15918
  isLive: config.isLive,
15138
- media: this.player.media || this.player.video,
15919
+ media: mediaElem,
15139
15920
  startTime: config.startTime,
15140
15921
  url: config.url
15141
15922
  }, hlsOpts));
@@ -15153,7 +15934,7 @@
15153
15934
  if (this.softDecode) {
15154
15935
  this.pluginExtension = new PluginExtension(_objectSpread2$2({
15155
15936
  isLive: config.isLive,
15156
- media: this.player.video
15937
+ media: mediaElem
15157
15938
  }, hlsOpts), this);
15158
15939
  this.player.forceDegradeToVideo = function() {
15159
15940
  var _this2$pluginExtensio;
@@ -15170,8 +15951,8 @@
15170
15951
  return (_this2$hls2 = _this2.hls) === null || _this2$hls2 === void 0 ? void 0 : _this2$hls2.replay();
15171
15952
  });
15172
15953
  }
15954
+ this.on(URL_CHANGE, onSwitchUrl);
15173
15955
  this.on(SWITCH_SUBTITLE, this._onSwitchSubtitle);
15174
- this.on(URL_CHANGE, this._onSwitchURL);
15175
15956
  this.on(DESTROY, this.destroy.bind(this));
15176
15957
  this._transError();
15177
15958
  this._transCoreEvent(EVENT.TTFB);
@@ -15181,6 +15962,7 @@
15181
15962
  this._transCoreEvent(EVENT.LOAD_RETRY);
15182
15963
  this._transCoreEvent(EVENT.SOURCEBUFFER_CREATED);
15183
15964
  this._transCoreEvent(EVENT.MEDIASOURCE_OPENED);
15965
+ this._transCoreEvent(EVENT.APPEND_BUFFER);
15184
15966
  this._transCoreEvent(EVENT.REMOVE_BUFFER);
15185
15967
  this._transCoreEvent(EVENT.BUFFEREOS);
15186
15968
  this._transCoreEvent(EVENT.KEYFRAME);
@@ -15200,7 +15982,9 @@
15200
15982
  this._transCoreEvent(Event$1.SUBTITLE_PLAYLIST);
15201
15983
  this._transCoreEvent(Event$1.APPEND_COST);
15202
15984
  if (config.url) {
15203
- this.hls.load(config.url, true).catch(function(e) {
15985
+ this.hls.load(config.url, {
15986
+ reuseMse: true
15987
+ }).catch(function(e) {
15204
15988
  });
15205
15989
  }
15206
15990
  }