@byteplus/veplayer-plugin 2.4.0 → 2.4.1-rc.1

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.
@@ -1644,7 +1644,7 @@
1644
1644
  }
1645
1645
  return offsetTime;
1646
1646
  };
1647
- var version = "3.0.19-rc.0";
1647
+ var version = "3.0.20-rc.3";
1648
1648
  var ERROR_MAP = {
1649
1649
  1: 5101,
1650
1650
  2: 5102,
@@ -2678,7 +2678,7 @@
2678
2678
  arr2[i] = arr[i];
2679
2679
  return arr2;
2680
2680
  }
2681
- function _createForOfIteratorHelper(o, allowArrayLike) {
2681
+ function _createForOfIteratorHelper$1(o, allowArrayLike) {
2682
2682
  var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
2683
2683
  if (!it) {
2684
2684
  if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") {
@@ -2866,6 +2866,21 @@
2866
2866
  length: Buffer2.totalLength && Buffer2.totalLength(buffers)
2867
2867
  };
2868
2868
  }
2869
+ }, {
2870
+ key: "isBuffered",
2871
+ value: function isBuffered(media, pos) {
2872
+ if (media) {
2873
+ var buffered = Buffer2.get(media);
2874
+ if (buffered !== null && buffered !== void 0 && buffered.length) {
2875
+ for (var i = 0; i < buffered.length; i++) {
2876
+ if (pos >= buffered.start(i) && pos <= buffered.end(i)) {
2877
+ return true;
2878
+ }
2879
+ }
2880
+ }
2881
+ }
2882
+ return false;
2883
+ }
2869
2884
  }]);
2870
2885
  return Buffer2;
2871
2886
  }();
@@ -4770,7 +4785,7 @@
4770
4785
  value: function _getHeaders(xhr) {
4771
4786
  var headerLines = xhr.getAllResponseHeaders().trim().split("\r\n");
4772
4787
  var headers = {};
4773
- var _iterator = _createForOfIteratorHelper(headerLines), _step;
4788
+ var _iterator = _createForOfIteratorHelper$1(headerLines), _step;
4774
4789
  try {
4775
4790
  for (_iterator.s(); !(_step = _iterator.n()).done; ) {
4776
4791
  var header = _step.value;
@@ -5608,6 +5623,60 @@
5608
5623
  function _nonIterableRest() {
5609
5624
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
5610
5625
  }
5626
+ function _createForOfIteratorHelper(o, allowArrayLike) {
5627
+ var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
5628
+ if (!it) {
5629
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
5630
+ if (it)
5631
+ o = it;
5632
+ var i = 0;
5633
+ var F = function() {
5634
+ };
5635
+ return {
5636
+ s: F,
5637
+ n: function() {
5638
+ if (i >= o.length)
5639
+ return {
5640
+ done: true
5641
+ };
5642
+ return {
5643
+ done: false,
5644
+ value: o[i++]
5645
+ };
5646
+ },
5647
+ e: function(e) {
5648
+ throw e;
5649
+ },
5650
+ f: F
5651
+ };
5652
+ }
5653
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
5654
+ }
5655
+ var normalCompletion = true, didErr = false, err;
5656
+ return {
5657
+ s: function() {
5658
+ it = it.call(o);
5659
+ },
5660
+ n: function() {
5661
+ var step = it.next();
5662
+ normalCompletion = step.done;
5663
+ return step;
5664
+ },
5665
+ e: function(e) {
5666
+ didErr = true;
5667
+ err = e;
5668
+ },
5669
+ f: function() {
5670
+ try {
5671
+ if (!normalCompletion && it.return != null)
5672
+ it.return();
5673
+ } finally {
5674
+ if (didErr)
5675
+ throw err;
5676
+ }
5677
+ }
5678
+ };
5679
+ }
5611
5680
  function _toPrimitive(input, hint) {
5612
5681
  if (typeof input !== "object" || input === null)
5613
5682
  return input;
@@ -5630,6 +5699,7 @@
5630
5699
  METADATA: "metadata"
5631
5700
  };
5632
5701
  var VideoCodecType = {
5702
+ AV1: "av1",
5633
5703
  AVC: "avc",
5634
5704
  HEVC: "hevc"
5635
5705
  };
@@ -5676,6 +5746,7 @@
5676
5746
  _defineProperty(this, "isVideoEncryption", false);
5677
5747
  _defineProperty(this, "isAudioEncryption", false);
5678
5748
  _defineProperty(this, "isVideo", true);
5749
+ _defineProperty(this, "lastKeyFrameDts", 0);
5679
5750
  _defineProperty(this, "kid", null);
5680
5751
  _defineProperty(this, "pssh", null);
5681
5752
  _defineProperty(this, "ext", void 0);
@@ -5718,6 +5789,9 @@
5718
5789
  }, {
5719
5790
  key: "exist",
5720
5791
  value: function exist() {
5792
+ if (/av01/.test(this.codec)) {
5793
+ return true;
5794
+ }
5721
5795
  return !!(this.pps.length && this.sps.length && this.codec);
5722
5796
  }
5723
5797
  }, {
@@ -5986,7 +6060,7 @@
5986
6060
  continue;
5987
6061
  }
5988
6062
  frameLength = (data[i + 3] & 3) << 11 | data[i + 4] << 3 | (data[i + 5] & 224) >> 5;
5989
- if (len - i < frameLength)
6063
+ if (!frameLength || len - i < frameLength)
5990
6064
  break;
5991
6065
  protectionSkipBytes = (~data[i + 1] & 1) * 2;
5992
6066
  frames.push({
@@ -6180,6 +6254,15 @@
6180
6254
  return parseInt(item, 16);
6181
6255
  });
6182
6256
  }
6257
+ function combineToFloat(integer, decimal) {
6258
+ return Number(integer + "." + decimal);
6259
+ }
6260
+ function toDegree(matrix) {
6261
+ if (matrix.length < 5)
6262
+ return 0;
6263
+ var scaled0 = Math.hypot(matrix[0], matrix[3]), scaled1 = Math.hypot(matrix[1], matrix[4]);
6264
+ return 0 === scaled0 || 0 === scaled1 ? 0 : 180 * Math.atan2(matrix[1] / scaled1, matrix[0] / scaled0) / Math.PI;
6265
+ }
6183
6266
  var NALu = /* @__PURE__ */ function() {
6184
6267
  function NALu2() {
6185
6268
  _classCallCheck(this, NALu2);
@@ -6842,13 +6925,16 @@
6842
6925
  var AUDIO_EXCETION_LOG_EMIT_DURATION = 5 * 9e4;
6843
6926
  var MAX_VIDEO_FRAME_DURATION = 9e4;
6844
6927
  var MAX_DTS_DELTA_WITH_NEXT_CHUNK = 9e4 / 2;
6928
+ var LARGE_AV_FIRST_FRAME_FORCE_FIX_THRESHOLD = 9e4 * 5;
6845
6929
  var TsFixer = /* @__PURE__ */ function() {
6846
- function TsFixer2(videoTrack, audioTrack, metadataTrack) {
6930
+ function TsFixer2(videoTrack, audioTrack, metadataTrack, fixerConfig) {
6847
6931
  _classCallCheck(this, TsFixer2);
6848
6932
  this.videoTrack = videoTrack;
6849
6933
  this.audioTrack = audioTrack;
6850
6934
  this.metadataTrack = metadataTrack;
6851
6935
  this._baseDts = -1;
6936
+ this._baseVideoDts = -1;
6937
+ this._baseAudioDts = -1;
6852
6938
  this._baseDtsInited = false;
6853
6939
  this._audioNextPts = void 0;
6854
6940
  this._videoNextDts = void 0;
@@ -6857,6 +6943,8 @@
6857
6943
  this._lastAudioExceptionGapDot = 0;
6858
6944
  this._lastAudioExceptionOverlapDot = 0;
6859
6945
  this._lastAudioExceptionLargeGapDot = 0;
6946
+ this._needForceFixLargeGap = fixerConfig === null || fixerConfig === void 0 ? void 0 : fixerConfig.forceFixLargeGap;
6947
+ this._largeGapThreshold = (fixerConfig === null || fixerConfig === void 0 ? void 0 : fixerConfig.largeGapThreshold) || LARGE_AV_FIRST_FRAME_FORCE_FIX_THRESHOLD;
6860
6948
  }
6861
6949
  _createClass(TsFixer2, [{
6862
6950
  key: "fix",
@@ -6884,10 +6972,16 @@
6884
6972
  if (discontinuity) {
6885
6973
  this._calculateBaseDts(this.audioTrack, this.videoTrack);
6886
6974
  this._baseDts -= startTime;
6975
+ this._baseAudioDts -= startTime;
6976
+ this._baseVideoDts -= startTime;
6887
6977
  }
6888
6978
  if (!contiguous) {
6889
6979
  this._videoNextDts = vaDelta > 0 ? startTime + vaDelta : startTime;
6890
6980
  this._audioNextPts = vaDelta > 0 ? startTime : startTime - vaDelta;
6981
+ if (this._needForceFixLargeGap) {
6982
+ this._videoNextDts = 0;
6983
+ this._audioNextPts = 0;
6984
+ }
6891
6985
  var vDeltaToNextDts = firstVideoSample ? firstVideoSample.dts - this._baseDts - this._videoNextDts : 0;
6892
6986
  var aDeltaToNextDts = firstAudioSample ? firstAudioSample.pts - this._baseDts - this._audioNextPts : 0;
6893
6987
  if (Math.abs(vDeltaToNextDts || aDeltaToNextDts) > MAX_VIDEO_FRAME_DURATION) {
@@ -6920,8 +7014,8 @@
6920
7014
  if (!samples.length)
6921
7015
  return;
6922
7016
  samples.forEach(function(x) {
6923
- x.dts -= _this2._baseDts;
6924
- x.pts -= _this2._baseDts;
7017
+ x.dts -= _this2._needForceFixLargeGap ? _this2._baseVideoDts : _this2._baseDts;
7018
+ x.pts -= _this2._needForceFixLargeGap ? _this2._baseVideoDts : _this2._baseDts;
6925
7019
  });
6926
7020
  if (this._videoNextDts === void 0) {
6927
7021
  var samp0 = samples[0];
@@ -7014,7 +7108,7 @@
7014
7108
  if (!samples.length)
7015
7109
  return;
7016
7110
  samples.forEach(function(x) {
7017
- x.pts -= _this3._baseDts;
7111
+ x.pts -= _this3._needForceFixLargeGap ? _this3._baseAudioDts : _this3._baseDts;
7018
7112
  x.dts = x.pts;
7019
7113
  });
7020
7114
  this._doFixAudioInternal(audioTrack, samples, 9e4);
@@ -7031,12 +7125,15 @@
7031
7125
  var videoBaseDts = Infinity;
7032
7126
  if (audioSamps.length) {
7033
7127
  audioTrack.baseDts = audioBasePts = audioSamps[0].pts;
7128
+ this._baseAudioDts = audioBasePts;
7034
7129
  }
7035
7130
  if (videoSamps.length) {
7036
7131
  videoTrack.baseDts = videoBaseDts = videoSamps[0].dts;
7132
+ this._baseVideoDts = videoBaseDts;
7037
7133
  }
7038
7134
  this._baseDts = Math.min(audioBasePts, videoBaseDts);
7039
7135
  var delta = videoBaseDts - audioBasePts;
7136
+ var largeGap = false;
7040
7137
  if (Number.isFinite(delta) && Math.abs(delta) > LARGE_AV_FIRST_FRAME_GAP) {
7041
7138
  videoTrack.warnings.push({
7042
7139
  type: WarningType.LARGE_AV_SHIFT,
@@ -7046,6 +7143,16 @@
7046
7143
  delta
7047
7144
  });
7048
7145
  }
7146
+ if (Number.isFinite(delta) && Math.abs(delta) > this._largeGapThreshold * MAX_SILENT_FRAME_DURATION) {
7147
+ largeGap = true;
7148
+ }
7149
+ if (!this._baseDtsInited) {
7150
+ if (largeGap && this._needForceFixLargeGap) {
7151
+ this._needForceFixLargeGap = true;
7152
+ } else {
7153
+ this._needForceFixLargeGap = false;
7154
+ }
7155
+ }
7049
7156
  this._baseDtsInited = true;
7050
7157
  return true;
7051
7158
  }
@@ -7139,6 +7246,7 @@
7139
7246
  var logger$4 = new Logger$1("TsDemuxer");
7140
7247
  var TsDemuxer = /* @__PURE__ */ function() {
7141
7248
  function TsDemuxer2(videoTrack, audioTrack, metadataTrack) {
7249
+ var fixerConfig = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {};
7142
7250
  _classCallCheck(this, TsDemuxer2);
7143
7251
  _defineProperty(this, "_pmtId", -1);
7144
7252
  _defineProperty(this, "_remainingPacketData", null);
@@ -7148,7 +7256,7 @@
7148
7256
  this.videoTrack = videoTrack || new VideoTrack();
7149
7257
  this.audioTrack = audioTrack || new AudioTrack();
7150
7258
  this.metadataTrack = metadataTrack || new MetadataTrack();
7151
- this._fixer = new TsFixer(this.videoTrack, this.audioTrack, this.metadataTrack);
7259
+ this._fixer = new TsFixer(this.videoTrack, this.audioTrack, this.metadataTrack, fixerConfig);
7152
7260
  }
7153
7261
  _createClass(TsDemuxer2, [{
7154
7262
  key: "demux",
@@ -7495,6 +7603,207 @@
7495
7603
  }]);
7496
7604
  return TsDemuxer2;
7497
7605
  }();
7606
+ var ByteReader = /* @__PURE__ */ function() {
7607
+ function ByteReader2(buf, offset, len) {
7608
+ _classCallCheck(this, ByteReader2);
7609
+ this.dv = new DataView(buf);
7610
+ this.start = this.offset = offset || this.dv.byteOffset;
7611
+ this.end = len ? this.start + len : this.start + this.dv.byteLength;
7612
+ }
7613
+ _createClass(ByteReader2, [{
7614
+ key: "buffer",
7615
+ get: function get() {
7616
+ return this.dv.buffer;
7617
+ }
7618
+ }, {
7619
+ key: "unreadLength",
7620
+ get: function get() {
7621
+ return Math.max(this.end - this.offset, 0);
7622
+ }
7623
+ }, {
7624
+ key: "size",
7625
+ get: function get() {
7626
+ return this.end - this.start;
7627
+ }
7628
+ }, {
7629
+ key: "readFloat",
7630
+ value: function readFloat(byteNum) {
7631
+ var val = 0;
7632
+ switch (byteNum) {
7633
+ case 4:
7634
+ val = this.dv.getFloat32(this.offset);
7635
+ break;
7636
+ case 8:
7637
+ val = this.dv.getFloat64(this.offset);
7638
+ break;
7639
+ default:
7640
+ throw new Error("read ".concat(byteNum, "-byte float is not supported"));
7641
+ }
7642
+ this.offset += byteNum;
7643
+ return val;
7644
+ }
7645
+ }, {
7646
+ key: "back",
7647
+ value: function back(byteNum) {
7648
+ this.offset -= byteNum;
7649
+ }
7650
+ }, {
7651
+ key: "skip",
7652
+ value: function skip(byteNum) {
7653
+ this.offset += byteNum;
7654
+ }
7655
+ }, {
7656
+ key: "readInt",
7657
+ value: function readInt(byteNum) {
7658
+ var offset = this.offset;
7659
+ this.offset += byteNum;
7660
+ switch (byteNum) {
7661
+ case 1:
7662
+ return this.dv.getInt8(offset);
7663
+ case 2:
7664
+ return this.dv.getInt16(offset);
7665
+ case 4:
7666
+ return this.dv.getInt32(offset);
7667
+ default:
7668
+ throw new Error("read ".concat(byteNum, "-byte integers is not supported"));
7669
+ }
7670
+ }
7671
+ }, {
7672
+ key: "read",
7673
+ value: function read(byteNum) {
7674
+ var offset = this.offset;
7675
+ this.offset += byteNum;
7676
+ switch (byteNum) {
7677
+ case 1:
7678
+ return this.dv.getUint8(offset);
7679
+ case 2:
7680
+ return this.dv.getUint16(offset);
7681
+ case 3:
7682
+ return (this.dv.getUint16(offset) << 8) + this.dv.getUint8(offset + 2);
7683
+ case 4:
7684
+ return this.dv.getUint32(offset);
7685
+ default:
7686
+ this.back(byteNum - 4);
7687
+ return this.read(byteNum - 4) + this.dv.getUint32(offset) * Math.pow(256, byteNum - 4);
7688
+ }
7689
+ }
7690
+ }, {
7691
+ key: "write",
7692
+ value: function write(byteNum, val) {
7693
+ var offset = this.offset;
7694
+ this.offset += byteNum;
7695
+ switch (byteNum) {
7696
+ case 1:
7697
+ return this.dv.setUint8(offset, val);
7698
+ case 2:
7699
+ return this.dv.setUint16(offset, val);
7700
+ case 3:
7701
+ return this.dv.setUint8(offset, val >>> 16), this.dv.setUint16(offset + 1, 65535 & val);
7702
+ case 4:
7703
+ return this.dv.setUint32(offset, val);
7704
+ default:
7705
+ throw new Error("write ".concat(byteNum, "-byte integers is not supported"));
7706
+ }
7707
+ }
7708
+ }, {
7709
+ key: "readToBuffer",
7710
+ value: function readToBuffer(len) {
7711
+ var buffer;
7712
+ if (this.offset || len) {
7713
+ buffer = this.dv.buffer.slice(this.offset, len ? this.offset + len : this.end);
7714
+ } else {
7715
+ buffer = this.dv.buffer;
7716
+ }
7717
+ this.offset += buffer.byteLength;
7718
+ return buffer;
7719
+ }
7720
+ }, {
7721
+ key: "readToUint8",
7722
+ value: function readToUint8(len) {
7723
+ var uint8 = new Uint8Array(this.dv.buffer, this.offset, len || this.unreadLength);
7724
+ this.offset += uint8.byteLength;
7725
+ return uint8;
7726
+ }
7727
+ }, {
7728
+ key: "readString",
7729
+ value: function readString(len) {
7730
+ var i = 0, str = "";
7731
+ for (; i < len; i++) {
7732
+ str += String.fromCharCode(this.dv.getUint8(this.offset));
7733
+ this.offset++;
7734
+ }
7735
+ return str;
7736
+ }
7737
+ }], [{
7738
+ key: "fromUint8",
7739
+ value: function fromUint8(uint8) {
7740
+ return new ByteReader2(uint8.buffer, uint8.byteOffset, uint8.byteLength);
7741
+ }
7742
+ }, {
7743
+ key: "concatUint8s",
7744
+ value: function concatUint8s(args) {
7745
+ var uint8 = new Uint8Array(args.reduce(function(ret, v) {
7746
+ return ret + v.byteLength;
7747
+ }, 0));
7748
+ var offset = 0;
7749
+ args.forEach(function(v) {
7750
+ uint8.set(v, offset);
7751
+ offset += v.byteLength;
7752
+ });
7753
+ return uint8;
7754
+ }
7755
+ }, {
7756
+ key: "concatUint8",
7757
+ value: function concatUint8() {
7758
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
7759
+ args[_key] = arguments[_key];
7760
+ }
7761
+ return this.concatUint8s(args);
7762
+ }
7763
+ }]);
7764
+ return ByteReader2;
7765
+ }();
7766
+ var BitReader = /* @__PURE__ */ function() {
7767
+ function BitReader2(val, size) {
7768
+ _classCallCheck(this, BitReader2);
7769
+ this.offset = 0;
7770
+ this.val = val;
7771
+ this.size = size;
7772
+ }
7773
+ _createClass(BitReader2, [{
7774
+ key: "skip",
7775
+ value: function skip(len) {
7776
+ this.offset += len;
7777
+ }
7778
+ }, {
7779
+ key: "read",
7780
+ value: function read(len) {
7781
+ var unreadLength = this.size - this.offset - len;
7782
+ if (unreadLength >= 0) {
7783
+ var bits = 0, i = 0;
7784
+ this.offset += len;
7785
+ if (this.size > 31) {
7786
+ for (; i < len; i++) {
7787
+ bits += Math.pow(2, i);
7788
+ }
7789
+ return this.val / Math.pow(2, unreadLength) & bits;
7790
+ } else {
7791
+ for (; i < len; i++) {
7792
+ bits += 1 << i;
7793
+ }
7794
+ return this.val >>> unreadLength & bits;
7795
+ }
7796
+ }
7797
+ throw new Error("the number of the read operation exceeds the total length limit of bits");
7798
+ }
7799
+ }], [{
7800
+ key: "fromByte",
7801
+ value: function fromByte(byte, len) {
7802
+ return new BitReader2(byte.read(len), len << 3);
7803
+ }
7804
+ }]);
7805
+ return BitReader2;
7806
+ }();
7498
7807
  var MP4Parser = /* @__PURE__ */ function() {
7499
7808
  function MP4Parser2() {
7500
7809
  _classCallCheck(this, MP4Parser2);
@@ -7652,18 +7961,36 @@
7652
7961
  key: "tkhd",
7653
7962
  value: function tkhd(box) {
7654
7963
  return parseBox(box, true, function(ret, data) {
7655
- var start = 0;
7964
+ var byte = ByteReader.fromUint8(data);
7656
7965
  if (ret.version === 1) {
7657
- ret.trackId = readBig32(data, 16);
7658
- ret.duration = readBig64(data, 24);
7659
- start += 32;
7966
+ byte.read(8);
7967
+ byte.read(8);
7968
+ ret.trackId = byte.read(4);
7969
+ byte.read(4);
7970
+ ret.duration = byte.read(8);
7660
7971
  } else {
7661
- ret.trackId = readBig32(data, 8);
7662
- ret.duration = readBig32(data, 16);
7663
- start += 20;
7972
+ byte.read(4);
7973
+ byte.read(4);
7974
+ ret.trackId = byte.read(4);
7975
+ byte.read(4);
7976
+ ret.duration = byte.read(4);
7977
+ }
7978
+ byte.skip(16);
7979
+ ret.matrix = [];
7980
+ for (var i = 0; i < 36; i++) {
7981
+ ret.matrix.push(byte.read(1));
7982
+ }
7983
+ byte.back(36);
7984
+ var caculatedMatrix = [];
7985
+ for (var _i = 0, int32; _i < 3; _i++) {
7986
+ caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2)));
7987
+ caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2)));
7988
+ int32 = byte.readInt(4);
7989
+ caculatedMatrix.push(combineToFloat(int32 >> 30, int32 & 1073741823));
7664
7990
  }
7665
- ret.width = readBig32(data, start + 52);
7666
- ret.height = readBig32(data, start + 56);
7991
+ ret.rotation = toDegree(caculatedMatrix);
7992
+ ret.width = byte.read(4);
7993
+ ret.height = byte.read(4);
7667
7994
  });
7668
7995
  }
7669
7996
  }, {
@@ -7793,7 +8120,7 @@
7793
8120
  if (ret.version > 0) {
7794
8121
  var numKeyIds = readBig32(data, start);
7795
8122
  start += 4;
7796
- for (var _i = 0; _i < ("" + numKeyIds).length; _i++) {
8123
+ for (var _i2 = 0; _i2 < ("" + numKeyIds).length; _i2++) {
7797
8124
  for (var j = 0; j < 16; j++) {
7798
8125
  var keyId = data[start];
7799
8126
  start += 1;
@@ -7816,6 +8143,8 @@
7816
8143
  ret.entryCount = readBig32(data);
7817
8144
  ret.entries = MP4Parser2.findBox(data.subarray(4), [], start + 4).map(function(b) {
7818
8145
  switch (b.type) {
8146
+ case "av01":
8147
+ return MP4Parser2.av01(b);
7819
8148
  case "avc1":
7820
8149
  case "avc2":
7821
8150
  case "avc3":
@@ -7895,6 +8224,69 @@
7895
8224
  }
7896
8225
  });
7897
8226
  }
8227
+ }, {
8228
+ key: "colr",
8229
+ value: function colr(box) {
8230
+ return parseBox(box, false, function(ret, data) {
8231
+ var byte = ByteReader.fromUint8(data);
8232
+ ret.data = box.data;
8233
+ ret.colorType = byte.readString(4);
8234
+ if (ret.colorType === "nclx") {
8235
+ ret.colorPrimaries = byte.read(2);
8236
+ ret.transferCharacteristics = byte.read(2);
8237
+ ret.matrixCoefficients = byte.read(2);
8238
+ ret.fullRangeFlag = byte.read(1) >> 7;
8239
+ } else if (ret.colorType === "rICC" || ret.colorType === "prof") {
8240
+ ret.iccProfile = data.readToUint8();
8241
+ }
8242
+ });
8243
+ }
8244
+ }, {
8245
+ key: "av01",
8246
+ value: function av01(box) {
8247
+ return parseBox(box, false, function(ret, data, start) {
8248
+ var bodyStart = parseVisualSampleEntry(ret, data);
8249
+ var bodyData = data.subarray(bodyStart);
8250
+ start += bodyStart;
8251
+ ret.av1C = MP4Parser2.av1C(MP4Parser2.findBox(bodyData, ["av1C"], start)[0]);
8252
+ ret.colr = MP4Parser2.colr(MP4Parser2.findBox(bodyData, ["colr"], start)[0]);
8253
+ });
8254
+ }
8255
+ }, {
8256
+ key: "av1C",
8257
+ value: function av1C(box) {
8258
+ return parseBox(box, false, function(ret, data) {
8259
+ ret.data = box.data;
8260
+ var byte = ByteReader.fromUint8(data);
8261
+ var bit = BitReader.fromByte(byte, 4);
8262
+ ret.marker = bit.read(1);
8263
+ ret.version = bit.read(7);
8264
+ ret.seqProfile = bit.read(3);
8265
+ ret.seqLevelIdx0 = bit.read(5);
8266
+ ret.seqTier0 = bit.read(1);
8267
+ ret.highBitdepth = bit.read(1);
8268
+ ret.twelveBit = bit.read(1);
8269
+ ret.monochrome = bit.read(1);
8270
+ ret.chromaSubsamplingX = bit.read(1);
8271
+ ret.chromaSubsamplingY = bit.read(1);
8272
+ ret.chromaSamplePosition = bit.read(2);
8273
+ ret.reserved = bit.read(3);
8274
+ ret.initialPresentationDelayPresent = bit.read(1);
8275
+ if (ret.initialPresentationDelayPresent) {
8276
+ ret.initialPresentationDelayMinusOne = bit.read(4);
8277
+ } else {
8278
+ ret.initialPresentationDelayMinusOne = 0;
8279
+ }
8280
+ ret.configOBUs = byte.readToUint8();
8281
+ var bitdepth;
8282
+ if (ret.seqLevelIdx0 === 2 && ret.highBitdepth === 1) {
8283
+ bitdepth = ret.twelveBit === 1 ? "12" : "10";
8284
+ } else if (ret.seqProfile <= 2) {
8285
+ bitdepth = ret.highBitdepth === 1 ? "10" : "08";
8286
+ }
8287
+ ret.codec = ["av01", ret.seqProfile, (ret.seqLevelIdx0 < 10 ? "0" + ret.seqLevelIdx0 : ret.seqLevelIdx0) + (ret.seqTier0 ? "H" : "M"), bitdepth].join(".");
8288
+ });
8289
+ }
7898
8290
  }, {
7899
8291
  key: "avc1",
7900
8292
  value: function avc1(box) {
@@ -7929,7 +8321,7 @@
7929
8321
  ret.ppsLength = data[start];
7930
8322
  start += 1;
7931
8323
  ret.pps = [];
7932
- for (var _i2 = 0; _i2 < ret.ppsLength; _i2++) {
8324
+ for (var _i3 = 0; _i3 < ret.ppsLength; _i3++) {
7933
8325
  var _size = readBig16(data, start);
7934
8326
  start += 2;
7935
8327
  ret.pps.push(data.subarray(start, start += _size));
@@ -8098,7 +8490,7 @@
8098
8490
  start += 8;
8099
8491
  }
8100
8492
  } else {
8101
- for (var _i3 = 0; _i3 < entryCount; _i3++) {
8493
+ for (var _i4 = 0; _i4 < entryCount; _i4++) {
8102
8494
  entries.push({
8103
8495
  count: readBig32(data, start),
8104
8496
  offset: -(~readBig32(data, start + 4) + 1)
@@ -8320,13 +8712,20 @@
8320
8712
  v.mvhdTimecale = moov.mvhd.timescale;
8321
8713
  v.timescale = v.formatTimescale = vTrack.mdia.mdhd.timescale;
8322
8714
  v.duration = vTrack.mdia.mdhd.duration || v.mvhdDurtion / v.mvhdTimecale * v.timescale;
8715
+ v.rotation = vTrack.tkhd.rotation;
8716
+ v.matrix = vTrack.tkhd.matrix;
8323
8717
  var e1 = vTrack.mdia.minf.stbl.stsd.entries[0];
8324
8718
  v.width = e1.width;
8325
8719
  v.height = e1.height;
8326
8720
  if (e1.pasp) {
8327
8721
  v.sarRatio = [e1.pasp.hSpacing, e1.pasp.vSpacing];
8328
8722
  }
8329
- if (e1.hvcC) {
8723
+ if (e1.av1C) {
8724
+ v.codecType = VideoCodecType.AV1;
8725
+ v.codec = e1.av1C.codec;
8726
+ v.av1C = e1.av1C.data;
8727
+ v.colr = e1.colr.data;
8728
+ } else if (e1.hvcC) {
8330
8729
  v.codecType = VideoCodecType.HEVC;
8331
8730
  v.codec = e1.hvcC.codec;
8332
8731
  v.vps = e1.hvcC.vps;
@@ -8645,8 +9044,9 @@
8645
9044
  function parseBox(box, isFullBox, parse2) {
8646
9045
  if (!box)
8647
9046
  return;
8648
- if (box.size !== box.data.length)
9047
+ if (box.size !== box.data.length) {
8649
9048
  throw new Error("box ".concat(box.type, " size !== data.length"));
9049
+ }
8650
9050
  var ret = {
8651
9051
  start: box.start,
8652
9052
  size: box.size,
@@ -8685,11 +9085,167 @@
8685
9085
  var FMP4Demuxer = /* @__PURE__ */ function() {
8686
9086
  function FMP4Demuxer2(videoTrack, audioTrack, metadataTrack) {
8687
9087
  _classCallCheck(this, FMP4Demuxer2);
9088
+ _defineProperty(this, "__loadedMoofWraps", []);
9089
+ _defineProperty(this, "__lastRemainData", null);
9090
+ _defineProperty(this, "__lastRemainDataStart", 0);
9091
+ _defineProperty(this, "__nextMoofStart", -1);
8688
9092
  this.videoTrack = videoTrack || new VideoTrack();
8689
9093
  this.audioTrack = audioTrack || new AudioTrack();
8690
9094
  this.metadataTrack = metadataTrack || new MetadataTrack();
8691
9095
  }
8692
9096
  _createClass(FMP4Demuxer2, [{
9097
+ key: "demuxPart",
9098
+ value: function demuxPart(partData, partDataStart, moov) {
9099
+ var _this = this;
9100
+ var videoTrack = this.videoTrack, audioTrack = this.audioTrack;
9101
+ var videoExist = videoTrack.exist();
9102
+ var audioExist = audioTrack.exist();
9103
+ var isAV01 = /av01/.test(videoTrack.codec);
9104
+ videoTrack.samples = [];
9105
+ audioTrack.samples = [];
9106
+ var data = partData;
9107
+ var dataStart = partDataStart;
9108
+ if (this.__lastRemainData) {
9109
+ var lastRemainDataEnd = this.__lastRemainDataStart + this.__lastRemainData.byteLength;
9110
+ var continuous = partDataStart <= lastRemainDataEnd && partDataStart > this.__lastRemainDataStart && partDataStart + partData.byteLength > lastRemainDataEnd;
9111
+ if (continuous) {
9112
+ var noDuplicateData = partData.subarray(this.__lastRemainData.byteLength + this.__lastRemainDataStart - partDataStart);
9113
+ data = concatUint8Array(this.__lastRemainData, noDuplicateData);
9114
+ dataStart = this.__lastRemainDataStart;
9115
+ this.__lastRemainData = null;
9116
+ } else {
9117
+ this.__lastRemainData = null;
9118
+ this.__lastRemainDataStart = 0;
9119
+ this.__nextMoofStart = -1;
9120
+ }
9121
+ }
9122
+ if (!moov) {
9123
+ var moovBox = MP4Parser.findBox(data, ["moov"])[0];
9124
+ if (!moovBox)
9125
+ throw new Error("cannot found moov box");
9126
+ moov = MP4Parser.moov(moovBox);
9127
+ }
9128
+ if (data) {
9129
+ var dataEnd = dataStart + data.byteLength;
9130
+ if (!videoExist && !audioExist) {
9131
+ MP4Parser.moovToTrack(moov, videoTrack, audioTrack);
9132
+ }
9133
+ var moofBoxes = [];
9134
+ if (this.__nextMoofStart < 0) {
9135
+ MP4Parser.findBox(data, ["moof"], dataStart).forEach(function(v) {
9136
+ return moofBoxes.push(v);
9137
+ });
9138
+ } else if (this.__nextMoofStart >= dataStart && this.__nextMoofStart <= dataEnd - 8) {
9139
+ MP4Parser.findBox(data.subarray(this.__nextMoofStart - dataStart), ["moof"], this.__nextMoofStart).forEach(function(v) {
9140
+ return moofBoxes.push(v);
9141
+ });
9142
+ }
9143
+ moofBoxes.filter(function(moofBox) {
9144
+ return moofBox.size <= moofBox.data.length;
9145
+ }).forEach(function(moofBox) {
9146
+ var moof = MP4Parser.moof(moofBox);
9147
+ _this.__nextMoofStart = moof.start + Math.max.apply(Math, _toConsumableArray(moof.traf.map(function(v) {
9148
+ return v.trun.samples.reduce(function(ret, w) {
9149
+ return ret + w.size;
9150
+ }, v.trun.dataOffset || 0);
9151
+ })));
9152
+ _this.__loadedMoofWraps.push({
9153
+ start: moof.start,
9154
+ nextMoofStart: _this.__nextMoofStart,
9155
+ moof
9156
+ });
9157
+ _this.__loadedMoofWraps.sort(function(p, n) {
9158
+ return p.start - n.start;
9159
+ });
9160
+ });
9161
+ var _iterator = _createForOfIteratorHelper(this.__loadedMoofWraps), _step;
9162
+ try {
9163
+ var _loop = function _loop2() {
9164
+ var moofWrap = _step.value;
9165
+ if (moofWrap.start > dataEnd || moofWrap.nextMoofStart < dataStart) {
9166
+ return "continue";
9167
+ }
9168
+ var moofStart = moofWrap.start;
9169
+ var tracks = MP4Parser.moofToSamples(moofWrap.moof, videoTrack, audioTrack);
9170
+ var videoBaseMediaDecodeTime = videoTrack.baseMediaDecodeTime;
9171
+ var audioBaseMediaDecodeTime = audioTrack.baseMediaDecodeTime;
9172
+ var nalSize;
9173
+ Object.keys(tracks).forEach(function(k) {
9174
+ if (videoTrack.id == k) {
9175
+ tracks[k].some(function(x) {
9176
+ var xStart = x.offset += moofStart;
9177
+ if (xStart < dataStart) {
9178
+ return;
9179
+ }
9180
+ if (xStart + x.size > dataEnd) {
9181
+ return true;
9182
+ }
9183
+ var sample = new VideoSample((x.pts || x.dts) + videoBaseMediaDecodeTime, x.dts + videoBaseMediaDecodeTime);
9184
+ sample.duration = x.duration;
9185
+ sample.gopId = x.gopId;
9186
+ if (x.keyframe)
9187
+ sample.setToKeyframe();
9188
+ var sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size);
9189
+ sample.data = sampleData;
9190
+ if (!isAV01) {
9191
+ var start = 0;
9192
+ var len = sampleData.length - 1;
9193
+ while (start < len) {
9194
+ nalSize = readBig32(sampleData, start);
9195
+ start += 4;
9196
+ sample.units.push(sampleData.subarray(start, start + nalSize));
9197
+ start += nalSize;
9198
+ }
9199
+ }
9200
+ _this.__lastRemainDataStart = xStart + x.size;
9201
+ videoTrack.samples.push(sample);
9202
+ });
9203
+ } else if (audioTrack.id == k) {
9204
+ tracks[k].some(function(x) {
9205
+ var xStart = x.offset + moofStart;
9206
+ if (xStart < dataStart) {
9207
+ return;
9208
+ }
9209
+ if (xStart + x.size > dataEnd) {
9210
+ return true;
9211
+ }
9212
+ var sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size);
9213
+ audioTrack.samples.push(new AudioSample(x.dts + audioBaseMediaDecodeTime, sampleData, x.duration));
9214
+ _this.__lastRemainDataStart = xStart + x.size;
9215
+ });
9216
+ }
9217
+ });
9218
+ };
9219
+ for (_iterator.s(); !(_step = _iterator.n()).done; ) {
9220
+ var _ret = _loop();
9221
+ if (_ret === "continue")
9222
+ continue;
9223
+ }
9224
+ } catch (err) {
9225
+ _iterator.e(err);
9226
+ } finally {
9227
+ _iterator.f();
9228
+ }
9229
+ }
9230
+ if (this.__lastRemainDataStart > dataStart && this.__lastRemainDataStart < data.byteLength + dataStart) {
9231
+ this.__lastRemainData = data.subarray(this.__lastRemainDataStart - dataStart);
9232
+ } else {
9233
+ this.__lastRemainData = data;
9234
+ this.__lastRemainDataStart = dataStart;
9235
+ }
9236
+ if (videoTrack.samples.length) {
9237
+ videoTrack.baseMediaDecodeTime = videoTrack.samples[0].pts;
9238
+ }
9239
+ if (audioTrack.samples.length) {
9240
+ audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts;
9241
+ }
9242
+ return {
9243
+ videoTrack,
9244
+ audioTrack,
9245
+ metadataTrack: this.metadataTrack
9246
+ };
9247
+ }
9248
+ }, {
8693
9249
  key: "demux",
8694
9250
  value: function demux(videoData, audioData) {
8695
9251
  var videoTrack = this.videoTrack, audioTrack = this.audioTrack;
@@ -9185,6 +9741,8 @@
9185
9741
  }
9186
9742
  } else if (track.useEME && track.encv) {
9187
9743
  content = MP42.encv(track);
9744
+ } else if (track.av1C) {
9745
+ content = MP42.av01(track);
9188
9746
  } else {
9189
9747
  content = MP42.avc1hev1(track);
9190
9748
  }
@@ -9397,6 +9955,90 @@
9397
9955
  var schi = MP42.schi(data);
9398
9956
  return MP42.box(MP42.types.sinf, content, MP42.box(MP42.types.frma, frma), MP42.box(MP42.types.schm, schm), schi);
9399
9957
  }
9958
+ }, {
9959
+ key: "av01",
9960
+ value: function av01(track) {
9961
+ return MP42.box(MP42.types.av01, new Uint8Array([
9962
+ 0,
9963
+ 0,
9964
+ 0,
9965
+ 0,
9966
+ 0,
9967
+ 0,
9968
+ 0,
9969
+ 1,
9970
+ 0,
9971
+ 0,
9972
+ 0,
9973
+ 0,
9974
+ 0,
9975
+ 0,
9976
+ 0,
9977
+ 0,
9978
+ 0,
9979
+ 0,
9980
+ 0,
9981
+ 0,
9982
+ 0,
9983
+ 0,
9984
+ 0,
9985
+ 0,
9986
+ track.width >> 8 & 255,
9987
+ track.width & 255,
9988
+ track.height >> 8 & 255,
9989
+ track.height & 255,
9990
+ 0,
9991
+ 72,
9992
+ 0,
9993
+ 0,
9994
+ 0,
9995
+ 72,
9996
+ 0,
9997
+ 0,
9998
+ 0,
9999
+ 0,
10000
+ 0,
10001
+ 0,
10002
+ 0,
10003
+ 1,
10004
+ 0,
10005
+ 0,
10006
+ 0,
10007
+ 0,
10008
+ 0,
10009
+ 0,
10010
+ 0,
10011
+ 0,
10012
+ 0,
10013
+ 0,
10014
+ 0,
10015
+ 0,
10016
+ 0,
10017
+ 0,
10018
+ 0,
10019
+ 0,
10020
+ 0,
10021
+ 0,
10022
+ 0,
10023
+ 0,
10024
+ 0,
10025
+ 0,
10026
+ 0,
10027
+ 0,
10028
+ 0,
10029
+ 0,
10030
+ 0,
10031
+ 0,
10032
+ 0,
10033
+ 0,
10034
+ 0,
10035
+ 0,
10036
+ 0,
10037
+ 24,
10038
+ 17,
10039
+ 17
10040
+ ]), track.av1C, track.colr);
10041
+ }
9400
10042
  }, {
9401
10043
  key: "avc1hev1",
9402
10044
  value: function avc1hev1(track) {
@@ -10369,7 +11011,7 @@
10369
11011
  }]);
10370
11012
  return MP42;
10371
11013
  }();
10372
- _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) {
11014
+ _defineProperty(MP4, "types", ["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) {
10373
11015
  p[c] = [c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2), c.charCodeAt(3)];
10374
11016
  return p;
10375
11017
  }, /* @__PURE__ */ Object.create(null)));
@@ -10704,30 +11346,46 @@
10704
11346
  };
10705
11347
  }
10706
11348
  var samples = track.samples;
11349
+ var isAV01 = /av01/.test(track.codec);
10707
11350
  var mdatSize = 0;
10708
- samples.forEach(function(s) {
10709
- mdatSize += s.units.reduce(function(t, c) {
10710
- return t + c.byteLength;
10711
- }, 0);
10712
- mdatSize += s.units.length * 4;
10713
- });
10714
- var mdata = new Uint8Array(mdatSize);
10715
- var mdatView = new DataView(mdata.buffer);
10716
- var _loop = function _loop2(_offset, _sample) {
10717
- _sample = samples[i];
10718
- var sampleSize = 0;
10719
- _sample.units.forEach(function(u) {
10720
- mdatView.setUint32(_offset, u.byteLength);
10721
- _offset += 4;
10722
- mdata.set(u, _offset);
10723
- _offset += u.byteLength;
10724
- sampleSize += 4 + u.byteLength;
11351
+ if (isAV01) {
11352
+ samples.forEach(function(s) {
11353
+ mdatSize += s.data.byteLength;
10725
11354
  });
10726
- _sample.size = sampleSize;
10727
- offset = _offset, sample = _sample;
10728
- };
10729
- for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
10730
- _loop(offset, sample);
11355
+ } else {
11356
+ samples.forEach(function(s) {
11357
+ mdatSize += s.units.reduce(function(t, c) {
11358
+ return t + c.byteLength;
11359
+ }, 0);
11360
+ mdatSize += s.units.length * 4;
11361
+ });
11362
+ }
11363
+ var mdata = new Uint8Array(mdatSize);
11364
+ if (isAV01) {
11365
+ for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
11366
+ sample = samples[i];
11367
+ mdata.set(sample.data, offset);
11368
+ sample.size = sample.data.byteLength;
11369
+ offset += sample.size;
11370
+ }
11371
+ } else {
11372
+ var mdatView = new DataView(mdata.buffer);
11373
+ var _loop = function _loop2(_offset2, _sample2) {
11374
+ _sample2 = samples[_i];
11375
+ var sampleSize = 0;
11376
+ _sample2.units.forEach(function(u) {
11377
+ mdatView.setUint32(_offset2, u.byteLength);
11378
+ _offset2 += 4;
11379
+ mdata.set(u, _offset2);
11380
+ _offset2 += u.byteLength;
11381
+ sampleSize += 4 + u.byteLength;
11382
+ });
11383
+ _sample2.size = sampleSize;
11384
+ _offset = _offset2, _sample = _sample2;
11385
+ };
11386
+ for (var _i = 0, _l = samples.length, _offset = 0, _sample; _i < _l; _i++) {
11387
+ _loop(_offset, _sample);
11388
+ }
10731
11389
  }
10732
11390
  var mdat = MP4.mdat(mdata);
10733
11391
  var moof = MP4.moof([track]);
@@ -10886,11 +11544,11 @@
10886
11544
  });
10887
11545
  var logger$3 = new Logger$2("Transmuxer");
10888
11546
  var Transmuxer = /* @__PURE__ */ function() {
10889
- function Transmuxer2(hls, isMP4, needRemux) {
11547
+ function Transmuxer2(hls, isMP4, needRemux, fixerConfig) {
10890
11548
  _classCallCheck$3(this, Transmuxer2);
10891
11549
  _defineProperty$3(this, "_initSegmentId", "");
10892
11550
  this.hls = hls;
10893
- this._demuxer = isMP4 ? new FMP4Demuxer() : new TsDemuxer();
11551
+ this._demuxer = isMP4 ? new FMP4Demuxer() : new TsDemuxer(null, null, null, fixerConfig);
10894
11552
  this._isMP4 = isMP4;
10895
11553
  if (needRemux)
10896
11554
  this._remuxer = new FMP4Remuxer(this._demuxer.videoTrack, this._demuxer.audioTrack);
@@ -11157,11 +11815,11 @@
11157
11815
  return;
11158
11816
  if (TsDemuxer.probe(chunk)) {
11159
11817
  if (!this._transmuxer)
11160
- this._transmuxer = new Transmuxer(this.hls, false, !this._softVideo);
11818
+ this._transmuxer = new Transmuxer(this.hls, false, !this._softVideo, this.hls.config.fixerConfig);
11161
11819
  } else if (MP4Parser.probe(chunk)) {
11162
11820
  if (this._softVideo) {
11163
11821
  if (!this._transmuxer)
11164
- this._transmuxer = new Transmuxer(this.hls, true);
11822
+ this._transmuxer = new Transmuxer(this.hls, true, null, this.hls.config.fixerConfig);
11165
11823
  } else {
11166
11824
  this._directAppend = true;
11167
11825
  var mix = false;
@@ -11604,7 +12262,11 @@
11604
12262
  minSegmentsStartPlay: 3,
11605
12263
  preferMMS: false,
11606
12264
  preferMMSStreaming: false,
11607
- mseLowLatency: true
12265
+ mseLowLatency: true,
12266
+ fixerConfig: {
12267
+ forceFixLargeGap: false,
12268
+ largeGapThreshold: 5
12269
+ }
11608
12270
  }, cfg), {}, {
11609
12271
  media
11610
12272
  });
@@ -11998,9 +12660,6 @@
11998
12660
  var endOfList = false;
11999
12661
  var partSegmentIndex = 0;
12000
12662
  while (line = lines[index++]) {
12001
- if (endOfList) {
12002
- break;
12003
- }
12004
12663
  if (line[0] !== "#") {
12005
12664
  if (media.lowLatency) {
12006
12665
  curSN++;
@@ -12054,11 +12713,6 @@
12054
12713
  break;
12055
12714
  case "ENDLIST":
12056
12715
  {
12057
- var _lastSegment = media.segments[media.segments.length - 1];
12058
- if (_lastSegment) {
12059
- _lastSegment.isLast = true;
12060
- }
12061
- media.live = false;
12062
12716
  endOfList = true;
12063
12717
  }
12064
12718
  break;
@@ -12162,11 +12816,14 @@
12162
12816
  });
12163
12817
  var lastSegment = media.segments[media.segments.length - 1];
12164
12818
  if (lastSegment) {
12165
- media.endSN = lastSegment.sn;
12166
- media.endPartIndex = lastSegment.partIndex;
12167
- if (endOfList && !lastSegment.isLast) {
12819
+ if (endOfList) {
12168
12820
  lastSegment.isLast = true;
12169
12821
  }
12822
+ media.endSN = lastSegment.sn;
12823
+ media.endPartIndex = lastSegment.partIndex;
12824
+ }
12825
+ if (endOfList) {
12826
+ media.live = false;
12170
12827
  }
12171
12828
  media.totalDuration = totalDuration;
12172
12829
  media.endCC = curCC;
@@ -13263,7 +13920,7 @@
13263
13920
  _defineProperty$3(_assertThisInitialized$2(_this), "_switchUrlOpts", null);
13264
13921
  _defineProperty$3(_assertThisInitialized$2(_this), "_isProcessQuotaExceeded", false);
13265
13922
  _defineProperty$3(_assertThisInitialized$2(_this), "_loadSegment", /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
13266
- var nextSeg, _assertThisInitialize, config, bInfo, bufferThroughout;
13923
+ var _this$_playlist, nextSegment, lastSegment, _assertThisInitialize, config, minFrameDuration, maxBufferThroughout, bInfo, bufferThroughout;
13267
13924
  return _regeneratorRuntime$1().wrap(function _callee$(_context) {
13268
13925
  while (1)
13269
13926
  switch (_context.prev = _context.next) {
@@ -13274,42 +13931,44 @@
13274
13931
  }
13275
13932
  return _context.abrupt("return");
13276
13933
  case 2:
13277
- nextSeg = _this._playlist.nextSegment;
13934
+ _this$_playlist = _this._playlist, nextSegment = _this$_playlist.nextSegment, lastSegment = _this$_playlist.lastSegment;
13278
13935
  _assertThisInitialize = _assertThisInitialized$2(_this), config = _assertThisInitialize.config;
13279
- if (nextSeg) {
13280
- _context.next = 6;
13936
+ minFrameDuration = 0.016;
13937
+ maxBufferThroughout = Math.min(Math.max((lastSegment === null || lastSegment === void 0 ? void 0 : lastSegment.duration) - minFrameDuration / 2 || 0, minFrameDuration), 0.1);
13938
+ if (nextSegment) {
13939
+ _context.next = 8;
13281
13940
  break;
13282
13941
  }
13283
13942
  return _context.abrupt("return");
13284
- case 6:
13943
+ case 8:
13285
13944
  if (_this.isLive) {
13286
- _context.next = 16;
13945
+ _context.next = 18;
13287
13946
  break;
13288
13947
  }
13289
13948
  bInfo = _this.bufferInfo();
13290
13949
  if (_this.media.paused && !_this.media.currentTime) {
13291
13950
  bInfo = _this.bufferInfo(bInfo.nextStart || 0.5);
13292
13951
  }
13293
- bufferThroughout = Math.abs(bInfo.end - _this.media.duration) < 0.1;
13952
+ bufferThroughout = Math.abs(bInfo.end - _this.media.duration) < maxBufferThroughout;
13294
13953
  if (!(bInfo.remaining >= config.preloadTime || bufferThroughout)) {
13295
- _context.next = 13;
13954
+ _context.next = 15;
13296
13955
  break;
13297
13956
  }
13298
13957
  _this._tryEos();
13299
13958
  return _context.abrupt("return");
13300
- case 13:
13959
+ case 15:
13301
13960
  if (!(config.preferMMSStreaming && !_this._bufferService.msStreaming)) {
13302
- _context.next = 15;
13961
+ _context.next = 17;
13303
13962
  break;
13304
13963
  }
13305
13964
  return _context.abrupt("return");
13306
- case 15:
13307
- if (!_this._urlSwitching && _this._prevSegSn !== nextSeg.sn - 1 && bInfo.end && Math.abs(nextSeg.start - bInfo.end) > 1) {
13965
+ case 17:
13966
+ if (!_this._urlSwitching && _this._prevSegSn !== nextSegment.sn - 1 && bInfo.end && Math.abs(nextSegment.start - bInfo.end) > 1) {
13308
13967
  _this._playlist.setNextSegmentByIndex(_this._playlist.findSegmentIndexByTime(bInfo.end + 0.1));
13309
13968
  }
13310
- case 16:
13969
+ case 18:
13311
13970
  return _context.abrupt("return", _this._loadSegmentDirect());
13312
- case 17:
13971
+ case 19:
13313
13972
  case "end":
13314
13973
  return _context.stop();
13315
13974
  }
@@ -14562,8 +15221,8 @@
14562
15221
  value: function _tryEos() {
14563
15222
  var _this$_bufferService3, _this$_bufferService4;
14564
15223
  var media = this.media;
14565
- var _this$_playlist = this._playlist, nextSegment = _this$_playlist.nextSegment, lastSegment = _this$_playlist.lastSegment;
14566
- var eosAllowed = !nextSegment && media.readyState && media.duration > 0 && ((_this$_bufferService3 = this._bufferService) === null || _this$_bufferService3 === void 0 ? void 0 : _this$_bufferService3.msIsOpened) && !((_this$_bufferService4 = this._bufferService) !== null && _this$_bufferService4 !== void 0 && _this$_bufferService4.msHasOpTasks);
15224
+ var _this$_playlist2 = this._playlist, nextSegment = _this$_playlist2.nextSegment, lastSegment = _this$_playlist2.lastSegment;
15225
+ var eosAllowed = (!nextSegment || lastSegment && Buffer$1.isBuffered(media, lastSegment.start + lastSegment.duration / 2)) && media.readyState && media.duration > 0 && ((_this$_bufferService3 = this._bufferService) === null || _this$_bufferService3 === void 0 ? void 0 : _this$_bufferService3.msIsOpened) && !((_this$_bufferService4 = this._bufferService) !== null && _this$_bufferService4 !== void 0 && _this$_bufferService4.msHasOpTasks);
14567
15226
  if (!eosAllowed) {
14568
15227
  return;
14569
15228
  }
@@ -14599,7 +15258,7 @@
14599
15258
  }]);
14600
15259
  return Hls2;
14601
15260
  }(EventEmitter);
14602
- _defineProperty$3(Hls, "version", "3.0.19-rc.0");
15261
+ _defineProperty$3(Hls, "version", "3.0.20-rc.3");
14603
15262
  try {
14604
15263
  if (localStorage.getItem("xgd")) {
14605
15264
  Hls.enableLogger();