@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.
@@ -1640,7 +1640,7 @@ util.getCurrentTimeByOffset = function(offsetTime, segments) {
1640
1640
  }
1641
1641
  return offsetTime;
1642
1642
  };
1643
- var version = "3.0.19-rc.0";
1643
+ var version = "3.0.20-rc.3";
1644
1644
  var ERROR_MAP = {
1645
1645
  1: 5101,
1646
1646
  2: 5102,
@@ -2674,7 +2674,7 @@ function _arrayLikeToArray$1(arr, len) {
2674
2674
  arr2[i] = arr[i];
2675
2675
  return arr2;
2676
2676
  }
2677
- function _createForOfIteratorHelper(o, allowArrayLike) {
2677
+ function _createForOfIteratorHelper$1(o, allowArrayLike) {
2678
2678
  var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
2679
2679
  if (!it) {
2680
2680
  if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") {
@@ -2862,6 +2862,21 @@ var Buffer$1 = /* @__PURE__ */ function() {
2862
2862
  length: Buffer2.totalLength && Buffer2.totalLength(buffers)
2863
2863
  };
2864
2864
  }
2865
+ }, {
2866
+ key: "isBuffered",
2867
+ value: function isBuffered(media, pos) {
2868
+ if (media) {
2869
+ var buffered = Buffer2.get(media);
2870
+ if (buffered !== null && buffered !== void 0 && buffered.length) {
2871
+ for (var i = 0; i < buffered.length; i++) {
2872
+ if (pos >= buffered.start(i) && pos <= buffered.end(i)) {
2873
+ return true;
2874
+ }
2875
+ }
2876
+ }
2877
+ }
2878
+ return false;
2879
+ }
2865
2880
  }]);
2866
2881
  return Buffer2;
2867
2882
  }();
@@ -4766,7 +4781,7 @@ var XhrLoader = /* @__PURE__ */ function(_EventEmitter) {
4766
4781
  value: function _getHeaders(xhr) {
4767
4782
  var headerLines = xhr.getAllResponseHeaders().trim().split("\r\n");
4768
4783
  var headers = {};
4769
- var _iterator = _createForOfIteratorHelper(headerLines), _step;
4784
+ var _iterator = _createForOfIteratorHelper$1(headerLines), _step;
4770
4785
  try {
4771
4786
  for (_iterator.s(); !(_step = _iterator.n()).done; ) {
4772
4787
  var header = _step.value;
@@ -5604,6 +5619,60 @@ function _nonIterableSpread() {
5604
5619
  function _nonIterableRest() {
5605
5620
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
5606
5621
  }
5622
+ function _createForOfIteratorHelper(o, allowArrayLike) {
5623
+ var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
5624
+ if (!it) {
5625
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
5626
+ if (it)
5627
+ o = it;
5628
+ var i = 0;
5629
+ var F = function() {
5630
+ };
5631
+ return {
5632
+ s: F,
5633
+ n: function() {
5634
+ if (i >= o.length)
5635
+ return {
5636
+ done: true
5637
+ };
5638
+ return {
5639
+ done: false,
5640
+ value: o[i++]
5641
+ };
5642
+ },
5643
+ e: function(e) {
5644
+ throw e;
5645
+ },
5646
+ f: F
5647
+ };
5648
+ }
5649
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
5650
+ }
5651
+ var normalCompletion = true, didErr = false, err;
5652
+ return {
5653
+ s: function() {
5654
+ it = it.call(o);
5655
+ },
5656
+ n: function() {
5657
+ var step = it.next();
5658
+ normalCompletion = step.done;
5659
+ return step;
5660
+ },
5661
+ e: function(e) {
5662
+ didErr = true;
5663
+ err = e;
5664
+ },
5665
+ f: function() {
5666
+ try {
5667
+ if (!normalCompletion && it.return != null)
5668
+ it.return();
5669
+ } finally {
5670
+ if (didErr)
5671
+ throw err;
5672
+ }
5673
+ }
5674
+ };
5675
+ }
5607
5676
  function _toPrimitive(input, hint) {
5608
5677
  if (typeof input !== "object" || input === null)
5609
5678
  return input;
@@ -5626,6 +5695,7 @@ var TrackType = {
5626
5695
  METADATA: "metadata"
5627
5696
  };
5628
5697
  var VideoCodecType = {
5698
+ AV1: "av1",
5629
5699
  AVC: "avc",
5630
5700
  HEVC: "hevc"
5631
5701
  };
@@ -5672,6 +5742,7 @@ var VideoTrack = /* @__PURE__ */ function() {
5672
5742
  _defineProperty(this, "isVideoEncryption", false);
5673
5743
  _defineProperty(this, "isAudioEncryption", false);
5674
5744
  _defineProperty(this, "isVideo", true);
5745
+ _defineProperty(this, "lastKeyFrameDts", 0);
5675
5746
  _defineProperty(this, "kid", null);
5676
5747
  _defineProperty(this, "pssh", null);
5677
5748
  _defineProperty(this, "ext", void 0);
@@ -5714,6 +5785,9 @@ var VideoTrack = /* @__PURE__ */ function() {
5714
5785
  }, {
5715
5786
  key: "exist",
5716
5787
  value: function exist() {
5788
+ if (/av01/.test(this.codec)) {
5789
+ return true;
5790
+ }
5717
5791
  return !!(this.pps.length && this.sps.length && this.codec);
5718
5792
  }
5719
5793
  }, {
@@ -5982,7 +6056,7 @@ var AAC = /* @__PURE__ */ function() {
5982
6056
  continue;
5983
6057
  }
5984
6058
  frameLength = (data[i + 3] & 3) << 11 | data[i + 4] << 3 | (data[i + 5] & 224) >> 5;
5985
- if (len - i < frameLength)
6059
+ if (!frameLength || len - i < frameLength)
5986
6060
  break;
5987
6061
  protectionSkipBytes = (~data[i + 1] & 1) * 2;
5988
6062
  frames.push({
@@ -6176,6 +6250,15 @@ function parse2(a) {
6176
6250
  return parseInt(item, 16);
6177
6251
  });
6178
6252
  }
6253
+ function combineToFloat(integer, decimal) {
6254
+ return Number(integer + "." + decimal);
6255
+ }
6256
+ function toDegree(matrix) {
6257
+ if (matrix.length < 5)
6258
+ return 0;
6259
+ var scaled0 = Math.hypot(matrix[0], matrix[3]), scaled1 = Math.hypot(matrix[1], matrix[4]);
6260
+ return 0 === scaled0 || 0 === scaled1 ? 0 : 180 * Math.atan2(matrix[1] / scaled1, matrix[0] / scaled0) / Math.PI;
6261
+ }
6179
6262
  var NALu = /* @__PURE__ */ function() {
6180
6263
  function NALu2() {
6181
6264
  _classCallCheck(this, NALu2);
@@ -6838,13 +6921,16 @@ var MAX_SILENT_FRAME_DURATION = 9e4;
6838
6921
  var AUDIO_EXCETION_LOG_EMIT_DURATION = 5 * 9e4;
6839
6922
  var MAX_VIDEO_FRAME_DURATION = 9e4;
6840
6923
  var MAX_DTS_DELTA_WITH_NEXT_CHUNK = 9e4 / 2;
6924
+ var LARGE_AV_FIRST_FRAME_FORCE_FIX_THRESHOLD = 9e4 * 5;
6841
6925
  var TsFixer = /* @__PURE__ */ function() {
6842
- function TsFixer2(videoTrack, audioTrack, metadataTrack) {
6926
+ function TsFixer2(videoTrack, audioTrack, metadataTrack, fixerConfig) {
6843
6927
  _classCallCheck(this, TsFixer2);
6844
6928
  this.videoTrack = videoTrack;
6845
6929
  this.audioTrack = audioTrack;
6846
6930
  this.metadataTrack = metadataTrack;
6847
6931
  this._baseDts = -1;
6932
+ this._baseVideoDts = -1;
6933
+ this._baseAudioDts = -1;
6848
6934
  this._baseDtsInited = false;
6849
6935
  this._audioNextPts = void 0;
6850
6936
  this._videoNextDts = void 0;
@@ -6853,6 +6939,8 @@ var TsFixer = /* @__PURE__ */ function() {
6853
6939
  this._lastAudioExceptionGapDot = 0;
6854
6940
  this._lastAudioExceptionOverlapDot = 0;
6855
6941
  this._lastAudioExceptionLargeGapDot = 0;
6942
+ this._needForceFixLargeGap = fixerConfig === null || fixerConfig === void 0 ? void 0 : fixerConfig.forceFixLargeGap;
6943
+ this._largeGapThreshold = (fixerConfig === null || fixerConfig === void 0 ? void 0 : fixerConfig.largeGapThreshold) || LARGE_AV_FIRST_FRAME_FORCE_FIX_THRESHOLD;
6856
6944
  }
6857
6945
  _createClass(TsFixer2, [{
6858
6946
  key: "fix",
@@ -6880,10 +6968,16 @@ var TsFixer = /* @__PURE__ */ function() {
6880
6968
  if (discontinuity) {
6881
6969
  this._calculateBaseDts(this.audioTrack, this.videoTrack);
6882
6970
  this._baseDts -= startTime;
6971
+ this._baseAudioDts -= startTime;
6972
+ this._baseVideoDts -= startTime;
6883
6973
  }
6884
6974
  if (!contiguous) {
6885
6975
  this._videoNextDts = vaDelta > 0 ? startTime + vaDelta : startTime;
6886
6976
  this._audioNextPts = vaDelta > 0 ? startTime : startTime - vaDelta;
6977
+ if (this._needForceFixLargeGap) {
6978
+ this._videoNextDts = 0;
6979
+ this._audioNextPts = 0;
6980
+ }
6887
6981
  var vDeltaToNextDts = firstVideoSample ? firstVideoSample.dts - this._baseDts - this._videoNextDts : 0;
6888
6982
  var aDeltaToNextDts = firstAudioSample ? firstAudioSample.pts - this._baseDts - this._audioNextPts : 0;
6889
6983
  if (Math.abs(vDeltaToNextDts || aDeltaToNextDts) > MAX_VIDEO_FRAME_DURATION) {
@@ -6916,8 +7010,8 @@ var TsFixer = /* @__PURE__ */ function() {
6916
7010
  if (!samples.length)
6917
7011
  return;
6918
7012
  samples.forEach(function(x) {
6919
- x.dts -= _this2._baseDts;
6920
- x.pts -= _this2._baseDts;
7013
+ x.dts -= _this2._needForceFixLargeGap ? _this2._baseVideoDts : _this2._baseDts;
7014
+ x.pts -= _this2._needForceFixLargeGap ? _this2._baseVideoDts : _this2._baseDts;
6921
7015
  });
6922
7016
  if (this._videoNextDts === void 0) {
6923
7017
  var samp0 = samples[0];
@@ -7010,7 +7104,7 @@ var TsFixer = /* @__PURE__ */ function() {
7010
7104
  if (!samples.length)
7011
7105
  return;
7012
7106
  samples.forEach(function(x) {
7013
- x.pts -= _this3._baseDts;
7107
+ x.pts -= _this3._needForceFixLargeGap ? _this3._baseAudioDts : _this3._baseDts;
7014
7108
  x.dts = x.pts;
7015
7109
  });
7016
7110
  this._doFixAudioInternal(audioTrack, samples, 9e4);
@@ -7027,12 +7121,15 @@ var TsFixer = /* @__PURE__ */ function() {
7027
7121
  var videoBaseDts = Infinity;
7028
7122
  if (audioSamps.length) {
7029
7123
  audioTrack.baseDts = audioBasePts = audioSamps[0].pts;
7124
+ this._baseAudioDts = audioBasePts;
7030
7125
  }
7031
7126
  if (videoSamps.length) {
7032
7127
  videoTrack.baseDts = videoBaseDts = videoSamps[0].dts;
7128
+ this._baseVideoDts = videoBaseDts;
7033
7129
  }
7034
7130
  this._baseDts = Math.min(audioBasePts, videoBaseDts);
7035
7131
  var delta = videoBaseDts - audioBasePts;
7132
+ var largeGap = false;
7036
7133
  if (Number.isFinite(delta) && Math.abs(delta) > LARGE_AV_FIRST_FRAME_GAP) {
7037
7134
  videoTrack.warnings.push({
7038
7135
  type: WarningType.LARGE_AV_SHIFT,
@@ -7042,6 +7139,16 @@ var TsFixer = /* @__PURE__ */ function() {
7042
7139
  delta
7043
7140
  });
7044
7141
  }
7142
+ if (Number.isFinite(delta) && Math.abs(delta) > this._largeGapThreshold * MAX_SILENT_FRAME_DURATION) {
7143
+ largeGap = true;
7144
+ }
7145
+ if (!this._baseDtsInited) {
7146
+ if (largeGap && this._needForceFixLargeGap) {
7147
+ this._needForceFixLargeGap = true;
7148
+ } else {
7149
+ this._needForceFixLargeGap = false;
7150
+ }
7151
+ }
7045
7152
  this._baseDtsInited = true;
7046
7153
  return true;
7047
7154
  }
@@ -7135,6 +7242,7 @@ var TsFixer = /* @__PURE__ */ function() {
7135
7242
  var logger$4 = new Logger$1("TsDemuxer");
7136
7243
  var TsDemuxer = /* @__PURE__ */ function() {
7137
7244
  function TsDemuxer2(videoTrack, audioTrack, metadataTrack) {
7245
+ var fixerConfig = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {};
7138
7246
  _classCallCheck(this, TsDemuxer2);
7139
7247
  _defineProperty(this, "_pmtId", -1);
7140
7248
  _defineProperty(this, "_remainingPacketData", null);
@@ -7144,7 +7252,7 @@ var TsDemuxer = /* @__PURE__ */ function() {
7144
7252
  this.videoTrack = videoTrack || new VideoTrack();
7145
7253
  this.audioTrack = audioTrack || new AudioTrack();
7146
7254
  this.metadataTrack = metadataTrack || new MetadataTrack();
7147
- this._fixer = new TsFixer(this.videoTrack, this.audioTrack, this.metadataTrack);
7255
+ this._fixer = new TsFixer(this.videoTrack, this.audioTrack, this.metadataTrack, fixerConfig);
7148
7256
  }
7149
7257
  _createClass(TsDemuxer2, [{
7150
7258
  key: "demux",
@@ -7491,6 +7599,207 @@ var TsDemuxer = /* @__PURE__ */ function() {
7491
7599
  }]);
7492
7600
  return TsDemuxer2;
7493
7601
  }();
7602
+ var ByteReader = /* @__PURE__ */ function() {
7603
+ function ByteReader2(buf, offset, len) {
7604
+ _classCallCheck(this, ByteReader2);
7605
+ this.dv = new DataView(buf);
7606
+ this.start = this.offset = offset || this.dv.byteOffset;
7607
+ this.end = len ? this.start + len : this.start + this.dv.byteLength;
7608
+ }
7609
+ _createClass(ByteReader2, [{
7610
+ key: "buffer",
7611
+ get: function get() {
7612
+ return this.dv.buffer;
7613
+ }
7614
+ }, {
7615
+ key: "unreadLength",
7616
+ get: function get() {
7617
+ return Math.max(this.end - this.offset, 0);
7618
+ }
7619
+ }, {
7620
+ key: "size",
7621
+ get: function get() {
7622
+ return this.end - this.start;
7623
+ }
7624
+ }, {
7625
+ key: "readFloat",
7626
+ value: function readFloat(byteNum) {
7627
+ var val = 0;
7628
+ switch (byteNum) {
7629
+ case 4:
7630
+ val = this.dv.getFloat32(this.offset);
7631
+ break;
7632
+ case 8:
7633
+ val = this.dv.getFloat64(this.offset);
7634
+ break;
7635
+ default:
7636
+ throw new Error("read ".concat(byteNum, "-byte float is not supported"));
7637
+ }
7638
+ this.offset += byteNum;
7639
+ return val;
7640
+ }
7641
+ }, {
7642
+ key: "back",
7643
+ value: function back(byteNum) {
7644
+ this.offset -= byteNum;
7645
+ }
7646
+ }, {
7647
+ key: "skip",
7648
+ value: function skip(byteNum) {
7649
+ this.offset += byteNum;
7650
+ }
7651
+ }, {
7652
+ key: "readInt",
7653
+ value: function readInt(byteNum) {
7654
+ var offset = this.offset;
7655
+ this.offset += byteNum;
7656
+ switch (byteNum) {
7657
+ case 1:
7658
+ return this.dv.getInt8(offset);
7659
+ case 2:
7660
+ return this.dv.getInt16(offset);
7661
+ case 4:
7662
+ return this.dv.getInt32(offset);
7663
+ default:
7664
+ throw new Error("read ".concat(byteNum, "-byte integers is not supported"));
7665
+ }
7666
+ }
7667
+ }, {
7668
+ key: "read",
7669
+ value: function read(byteNum) {
7670
+ var offset = this.offset;
7671
+ this.offset += byteNum;
7672
+ switch (byteNum) {
7673
+ case 1:
7674
+ return this.dv.getUint8(offset);
7675
+ case 2:
7676
+ return this.dv.getUint16(offset);
7677
+ case 3:
7678
+ return (this.dv.getUint16(offset) << 8) + this.dv.getUint8(offset + 2);
7679
+ case 4:
7680
+ return this.dv.getUint32(offset);
7681
+ default:
7682
+ this.back(byteNum - 4);
7683
+ return this.read(byteNum - 4) + this.dv.getUint32(offset) * Math.pow(256, byteNum - 4);
7684
+ }
7685
+ }
7686
+ }, {
7687
+ key: "write",
7688
+ value: function write(byteNum, val) {
7689
+ var offset = this.offset;
7690
+ this.offset += byteNum;
7691
+ switch (byteNum) {
7692
+ case 1:
7693
+ return this.dv.setUint8(offset, val);
7694
+ case 2:
7695
+ return this.dv.setUint16(offset, val);
7696
+ case 3:
7697
+ return this.dv.setUint8(offset, val >>> 16), this.dv.setUint16(offset + 1, 65535 & val);
7698
+ case 4:
7699
+ return this.dv.setUint32(offset, val);
7700
+ default:
7701
+ throw new Error("write ".concat(byteNum, "-byte integers is not supported"));
7702
+ }
7703
+ }
7704
+ }, {
7705
+ key: "readToBuffer",
7706
+ value: function readToBuffer(len) {
7707
+ var buffer;
7708
+ if (this.offset || len) {
7709
+ buffer = this.dv.buffer.slice(this.offset, len ? this.offset + len : this.end);
7710
+ } else {
7711
+ buffer = this.dv.buffer;
7712
+ }
7713
+ this.offset += buffer.byteLength;
7714
+ return buffer;
7715
+ }
7716
+ }, {
7717
+ key: "readToUint8",
7718
+ value: function readToUint8(len) {
7719
+ var uint8 = new Uint8Array(this.dv.buffer, this.offset, len || this.unreadLength);
7720
+ this.offset += uint8.byteLength;
7721
+ return uint8;
7722
+ }
7723
+ }, {
7724
+ key: "readString",
7725
+ value: function readString(len) {
7726
+ var i = 0, str = "";
7727
+ for (; i < len; i++) {
7728
+ str += String.fromCharCode(this.dv.getUint8(this.offset));
7729
+ this.offset++;
7730
+ }
7731
+ return str;
7732
+ }
7733
+ }], [{
7734
+ key: "fromUint8",
7735
+ value: function fromUint8(uint8) {
7736
+ return new ByteReader2(uint8.buffer, uint8.byteOffset, uint8.byteLength);
7737
+ }
7738
+ }, {
7739
+ key: "concatUint8s",
7740
+ value: function concatUint8s(args) {
7741
+ var uint8 = new Uint8Array(args.reduce(function(ret, v) {
7742
+ return ret + v.byteLength;
7743
+ }, 0));
7744
+ var offset = 0;
7745
+ args.forEach(function(v) {
7746
+ uint8.set(v, offset);
7747
+ offset += v.byteLength;
7748
+ });
7749
+ return uint8;
7750
+ }
7751
+ }, {
7752
+ key: "concatUint8",
7753
+ value: function concatUint8() {
7754
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
7755
+ args[_key] = arguments[_key];
7756
+ }
7757
+ return this.concatUint8s(args);
7758
+ }
7759
+ }]);
7760
+ return ByteReader2;
7761
+ }();
7762
+ var BitReader = /* @__PURE__ */ function() {
7763
+ function BitReader2(val, size) {
7764
+ _classCallCheck(this, BitReader2);
7765
+ this.offset = 0;
7766
+ this.val = val;
7767
+ this.size = size;
7768
+ }
7769
+ _createClass(BitReader2, [{
7770
+ key: "skip",
7771
+ value: function skip(len) {
7772
+ this.offset += len;
7773
+ }
7774
+ }, {
7775
+ key: "read",
7776
+ value: function read(len) {
7777
+ var unreadLength = this.size - this.offset - len;
7778
+ if (unreadLength >= 0) {
7779
+ var bits = 0, i = 0;
7780
+ this.offset += len;
7781
+ if (this.size > 31) {
7782
+ for (; i < len; i++) {
7783
+ bits += Math.pow(2, i);
7784
+ }
7785
+ return this.val / Math.pow(2, unreadLength) & bits;
7786
+ } else {
7787
+ for (; i < len; i++) {
7788
+ bits += 1 << i;
7789
+ }
7790
+ return this.val >>> unreadLength & bits;
7791
+ }
7792
+ }
7793
+ throw new Error("the number of the read operation exceeds the total length limit of bits");
7794
+ }
7795
+ }], [{
7796
+ key: "fromByte",
7797
+ value: function fromByte(byte, len) {
7798
+ return new BitReader2(byte.read(len), len << 3);
7799
+ }
7800
+ }]);
7801
+ return BitReader2;
7802
+ }();
7494
7803
  var MP4Parser = /* @__PURE__ */ function() {
7495
7804
  function MP4Parser2() {
7496
7805
  _classCallCheck(this, MP4Parser2);
@@ -7648,18 +7957,36 @@ var MP4Parser = /* @__PURE__ */ function() {
7648
7957
  key: "tkhd",
7649
7958
  value: function tkhd(box) {
7650
7959
  return parseBox(box, true, function(ret, data) {
7651
- var start = 0;
7960
+ var byte = ByteReader.fromUint8(data);
7652
7961
  if (ret.version === 1) {
7653
- ret.trackId = readBig32(data, 16);
7654
- ret.duration = readBig64(data, 24);
7655
- start += 32;
7962
+ byte.read(8);
7963
+ byte.read(8);
7964
+ ret.trackId = byte.read(4);
7965
+ byte.read(4);
7966
+ ret.duration = byte.read(8);
7656
7967
  } else {
7657
- ret.trackId = readBig32(data, 8);
7658
- ret.duration = readBig32(data, 16);
7659
- start += 20;
7968
+ byte.read(4);
7969
+ byte.read(4);
7970
+ ret.trackId = byte.read(4);
7971
+ byte.read(4);
7972
+ ret.duration = byte.read(4);
7973
+ }
7974
+ byte.skip(16);
7975
+ ret.matrix = [];
7976
+ for (var i = 0; i < 36; i++) {
7977
+ ret.matrix.push(byte.read(1));
7978
+ }
7979
+ byte.back(36);
7980
+ var caculatedMatrix = [];
7981
+ for (var _i = 0, int32; _i < 3; _i++) {
7982
+ caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2)));
7983
+ caculatedMatrix.push(combineToFloat(byte.readInt(2), byte.readInt(2)));
7984
+ int32 = byte.readInt(4);
7985
+ caculatedMatrix.push(combineToFloat(int32 >> 30, int32 & 1073741823));
7660
7986
  }
7661
- ret.width = readBig32(data, start + 52);
7662
- ret.height = readBig32(data, start + 56);
7987
+ ret.rotation = toDegree(caculatedMatrix);
7988
+ ret.width = byte.read(4);
7989
+ ret.height = byte.read(4);
7663
7990
  });
7664
7991
  }
7665
7992
  }, {
@@ -7789,7 +8116,7 @@ var MP4Parser = /* @__PURE__ */ function() {
7789
8116
  if (ret.version > 0) {
7790
8117
  var numKeyIds = readBig32(data, start);
7791
8118
  start += 4;
7792
- for (var _i = 0; _i < ("" + numKeyIds).length; _i++) {
8119
+ for (var _i2 = 0; _i2 < ("" + numKeyIds).length; _i2++) {
7793
8120
  for (var j = 0; j < 16; j++) {
7794
8121
  var keyId = data[start];
7795
8122
  start += 1;
@@ -7812,6 +8139,8 @@ var MP4Parser = /* @__PURE__ */ function() {
7812
8139
  ret.entryCount = readBig32(data);
7813
8140
  ret.entries = MP4Parser2.findBox(data.subarray(4), [], start + 4).map(function(b) {
7814
8141
  switch (b.type) {
8142
+ case "av01":
8143
+ return MP4Parser2.av01(b);
7815
8144
  case "avc1":
7816
8145
  case "avc2":
7817
8146
  case "avc3":
@@ -7891,6 +8220,69 @@ var MP4Parser = /* @__PURE__ */ function() {
7891
8220
  }
7892
8221
  });
7893
8222
  }
8223
+ }, {
8224
+ key: "colr",
8225
+ value: function colr(box) {
8226
+ return parseBox(box, false, function(ret, data) {
8227
+ var byte = ByteReader.fromUint8(data);
8228
+ ret.data = box.data;
8229
+ ret.colorType = byte.readString(4);
8230
+ if (ret.colorType === "nclx") {
8231
+ ret.colorPrimaries = byte.read(2);
8232
+ ret.transferCharacteristics = byte.read(2);
8233
+ ret.matrixCoefficients = byte.read(2);
8234
+ ret.fullRangeFlag = byte.read(1) >> 7;
8235
+ } else if (ret.colorType === "rICC" || ret.colorType === "prof") {
8236
+ ret.iccProfile = data.readToUint8();
8237
+ }
8238
+ });
8239
+ }
8240
+ }, {
8241
+ key: "av01",
8242
+ value: function av01(box) {
8243
+ return parseBox(box, false, function(ret, data, start) {
8244
+ var bodyStart = parseVisualSampleEntry(ret, data);
8245
+ var bodyData = data.subarray(bodyStart);
8246
+ start += bodyStart;
8247
+ ret.av1C = MP4Parser2.av1C(MP4Parser2.findBox(bodyData, ["av1C"], start)[0]);
8248
+ ret.colr = MP4Parser2.colr(MP4Parser2.findBox(bodyData, ["colr"], start)[0]);
8249
+ });
8250
+ }
8251
+ }, {
8252
+ key: "av1C",
8253
+ value: function av1C(box) {
8254
+ return parseBox(box, false, function(ret, data) {
8255
+ ret.data = box.data;
8256
+ var byte = ByteReader.fromUint8(data);
8257
+ var bit = BitReader.fromByte(byte, 4);
8258
+ ret.marker = bit.read(1);
8259
+ ret.version = bit.read(7);
8260
+ ret.seqProfile = bit.read(3);
8261
+ ret.seqLevelIdx0 = bit.read(5);
8262
+ ret.seqTier0 = bit.read(1);
8263
+ ret.highBitdepth = bit.read(1);
8264
+ ret.twelveBit = bit.read(1);
8265
+ ret.monochrome = bit.read(1);
8266
+ ret.chromaSubsamplingX = bit.read(1);
8267
+ ret.chromaSubsamplingY = bit.read(1);
8268
+ ret.chromaSamplePosition = bit.read(2);
8269
+ ret.reserved = bit.read(3);
8270
+ ret.initialPresentationDelayPresent = bit.read(1);
8271
+ if (ret.initialPresentationDelayPresent) {
8272
+ ret.initialPresentationDelayMinusOne = bit.read(4);
8273
+ } else {
8274
+ ret.initialPresentationDelayMinusOne = 0;
8275
+ }
8276
+ ret.configOBUs = byte.readToUint8();
8277
+ var bitdepth;
8278
+ if (ret.seqLevelIdx0 === 2 && ret.highBitdepth === 1) {
8279
+ bitdepth = ret.twelveBit === 1 ? "12" : "10";
8280
+ } else if (ret.seqProfile <= 2) {
8281
+ bitdepth = ret.highBitdepth === 1 ? "10" : "08";
8282
+ }
8283
+ ret.codec = ["av01", ret.seqProfile, (ret.seqLevelIdx0 < 10 ? "0" + ret.seqLevelIdx0 : ret.seqLevelIdx0) + (ret.seqTier0 ? "H" : "M"), bitdepth].join(".");
8284
+ });
8285
+ }
7894
8286
  }, {
7895
8287
  key: "avc1",
7896
8288
  value: function avc1(box) {
@@ -7925,7 +8317,7 @@ var MP4Parser = /* @__PURE__ */ function() {
7925
8317
  ret.ppsLength = data[start];
7926
8318
  start += 1;
7927
8319
  ret.pps = [];
7928
- for (var _i2 = 0; _i2 < ret.ppsLength; _i2++) {
8320
+ for (var _i3 = 0; _i3 < ret.ppsLength; _i3++) {
7929
8321
  var _size = readBig16(data, start);
7930
8322
  start += 2;
7931
8323
  ret.pps.push(data.subarray(start, start += _size));
@@ -8094,7 +8486,7 @@ var MP4Parser = /* @__PURE__ */ function() {
8094
8486
  start += 8;
8095
8487
  }
8096
8488
  } else {
8097
- for (var _i3 = 0; _i3 < entryCount; _i3++) {
8489
+ for (var _i4 = 0; _i4 < entryCount; _i4++) {
8098
8490
  entries.push({
8099
8491
  count: readBig32(data, start),
8100
8492
  offset: -(~readBig32(data, start + 4) + 1)
@@ -8316,13 +8708,20 @@ var MP4Parser = /* @__PURE__ */ function() {
8316
8708
  v.mvhdTimecale = moov.mvhd.timescale;
8317
8709
  v.timescale = v.formatTimescale = vTrack.mdia.mdhd.timescale;
8318
8710
  v.duration = vTrack.mdia.mdhd.duration || v.mvhdDurtion / v.mvhdTimecale * v.timescale;
8711
+ v.rotation = vTrack.tkhd.rotation;
8712
+ v.matrix = vTrack.tkhd.matrix;
8319
8713
  var e1 = vTrack.mdia.minf.stbl.stsd.entries[0];
8320
8714
  v.width = e1.width;
8321
8715
  v.height = e1.height;
8322
8716
  if (e1.pasp) {
8323
8717
  v.sarRatio = [e1.pasp.hSpacing, e1.pasp.vSpacing];
8324
8718
  }
8325
- if (e1.hvcC) {
8719
+ if (e1.av1C) {
8720
+ v.codecType = VideoCodecType.AV1;
8721
+ v.codec = e1.av1C.codec;
8722
+ v.av1C = e1.av1C.data;
8723
+ v.colr = e1.colr.data;
8724
+ } else if (e1.hvcC) {
8326
8725
  v.codecType = VideoCodecType.HEVC;
8327
8726
  v.codec = e1.hvcC.codec;
8328
8727
  v.vps = e1.hvcC.vps;
@@ -8641,8 +9040,9 @@ function parseAudioSampleEntry(ret, data) {
8641
9040
  function parseBox(box, isFullBox, parse3) {
8642
9041
  if (!box)
8643
9042
  return;
8644
- if (box.size !== box.data.length)
9043
+ if (box.size !== box.data.length) {
8645
9044
  throw new Error("box ".concat(box.type, " size !== data.length"));
9045
+ }
8646
9046
  var ret = {
8647
9047
  start: box.start,
8648
9048
  size: box.size,
@@ -8681,11 +9081,167 @@ var toHex = function toHex2() {
8681
9081
  var FMP4Demuxer = /* @__PURE__ */ function() {
8682
9082
  function FMP4Demuxer2(videoTrack, audioTrack, metadataTrack) {
8683
9083
  _classCallCheck(this, FMP4Demuxer2);
9084
+ _defineProperty(this, "__loadedMoofWraps", []);
9085
+ _defineProperty(this, "__lastRemainData", null);
9086
+ _defineProperty(this, "__lastRemainDataStart", 0);
9087
+ _defineProperty(this, "__nextMoofStart", -1);
8684
9088
  this.videoTrack = videoTrack || new VideoTrack();
8685
9089
  this.audioTrack = audioTrack || new AudioTrack();
8686
9090
  this.metadataTrack = metadataTrack || new MetadataTrack();
8687
9091
  }
8688
9092
  _createClass(FMP4Demuxer2, [{
9093
+ key: "demuxPart",
9094
+ value: function demuxPart(partData, partDataStart, moov) {
9095
+ var _this = this;
9096
+ var videoTrack = this.videoTrack, audioTrack = this.audioTrack;
9097
+ var videoExist = videoTrack.exist();
9098
+ var audioExist = audioTrack.exist();
9099
+ var isAV01 = /av01/.test(videoTrack.codec);
9100
+ videoTrack.samples = [];
9101
+ audioTrack.samples = [];
9102
+ var data = partData;
9103
+ var dataStart = partDataStart;
9104
+ if (this.__lastRemainData) {
9105
+ var lastRemainDataEnd = this.__lastRemainDataStart + this.__lastRemainData.byteLength;
9106
+ var continuous = partDataStart <= lastRemainDataEnd && partDataStart > this.__lastRemainDataStart && partDataStart + partData.byteLength > lastRemainDataEnd;
9107
+ if (continuous) {
9108
+ var noDuplicateData = partData.subarray(this.__lastRemainData.byteLength + this.__lastRemainDataStart - partDataStart);
9109
+ data = concatUint8Array(this.__lastRemainData, noDuplicateData);
9110
+ dataStart = this.__lastRemainDataStart;
9111
+ this.__lastRemainData = null;
9112
+ } else {
9113
+ this.__lastRemainData = null;
9114
+ this.__lastRemainDataStart = 0;
9115
+ this.__nextMoofStart = -1;
9116
+ }
9117
+ }
9118
+ if (!moov) {
9119
+ var moovBox = MP4Parser.findBox(data, ["moov"])[0];
9120
+ if (!moovBox)
9121
+ throw new Error("cannot found moov box");
9122
+ moov = MP4Parser.moov(moovBox);
9123
+ }
9124
+ if (data) {
9125
+ var dataEnd = dataStart + data.byteLength;
9126
+ if (!videoExist && !audioExist) {
9127
+ MP4Parser.moovToTrack(moov, videoTrack, audioTrack);
9128
+ }
9129
+ var moofBoxes = [];
9130
+ if (this.__nextMoofStart < 0) {
9131
+ MP4Parser.findBox(data, ["moof"], dataStart).forEach(function(v) {
9132
+ return moofBoxes.push(v);
9133
+ });
9134
+ } else if (this.__nextMoofStart >= dataStart && this.__nextMoofStart <= dataEnd - 8) {
9135
+ MP4Parser.findBox(data.subarray(this.__nextMoofStart - dataStart), ["moof"], this.__nextMoofStart).forEach(function(v) {
9136
+ return moofBoxes.push(v);
9137
+ });
9138
+ }
9139
+ moofBoxes.filter(function(moofBox) {
9140
+ return moofBox.size <= moofBox.data.length;
9141
+ }).forEach(function(moofBox) {
9142
+ var moof = MP4Parser.moof(moofBox);
9143
+ _this.__nextMoofStart = moof.start + Math.max.apply(Math, _toConsumableArray(moof.traf.map(function(v) {
9144
+ return v.trun.samples.reduce(function(ret, w) {
9145
+ return ret + w.size;
9146
+ }, v.trun.dataOffset || 0);
9147
+ })));
9148
+ _this.__loadedMoofWraps.push({
9149
+ start: moof.start,
9150
+ nextMoofStart: _this.__nextMoofStart,
9151
+ moof
9152
+ });
9153
+ _this.__loadedMoofWraps.sort(function(p, n) {
9154
+ return p.start - n.start;
9155
+ });
9156
+ });
9157
+ var _iterator = _createForOfIteratorHelper(this.__loadedMoofWraps), _step;
9158
+ try {
9159
+ var _loop = function _loop2() {
9160
+ var moofWrap = _step.value;
9161
+ if (moofWrap.start > dataEnd || moofWrap.nextMoofStart < dataStart) {
9162
+ return "continue";
9163
+ }
9164
+ var moofStart = moofWrap.start;
9165
+ var tracks = MP4Parser.moofToSamples(moofWrap.moof, videoTrack, audioTrack);
9166
+ var videoBaseMediaDecodeTime = videoTrack.baseMediaDecodeTime;
9167
+ var audioBaseMediaDecodeTime = audioTrack.baseMediaDecodeTime;
9168
+ var nalSize;
9169
+ Object.keys(tracks).forEach(function(k) {
9170
+ if (videoTrack.id == k) {
9171
+ tracks[k].some(function(x) {
9172
+ var xStart = x.offset += moofStart;
9173
+ if (xStart < dataStart) {
9174
+ return;
9175
+ }
9176
+ if (xStart + x.size > dataEnd) {
9177
+ return true;
9178
+ }
9179
+ var sample = new VideoSample((x.pts || x.dts) + videoBaseMediaDecodeTime, x.dts + videoBaseMediaDecodeTime);
9180
+ sample.duration = x.duration;
9181
+ sample.gopId = x.gopId;
9182
+ if (x.keyframe)
9183
+ sample.setToKeyframe();
9184
+ var sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size);
9185
+ sample.data = sampleData;
9186
+ if (!isAV01) {
9187
+ var start = 0;
9188
+ var len = sampleData.length - 1;
9189
+ while (start < len) {
9190
+ nalSize = readBig32(sampleData, start);
9191
+ start += 4;
9192
+ sample.units.push(sampleData.subarray(start, start + nalSize));
9193
+ start += nalSize;
9194
+ }
9195
+ }
9196
+ _this.__lastRemainDataStart = xStart + x.size;
9197
+ videoTrack.samples.push(sample);
9198
+ });
9199
+ } else if (audioTrack.id == k) {
9200
+ tracks[k].some(function(x) {
9201
+ var xStart = x.offset + moofStart;
9202
+ if (xStart < dataStart) {
9203
+ return;
9204
+ }
9205
+ if (xStart + x.size > dataEnd) {
9206
+ return true;
9207
+ }
9208
+ var sampleData = data.subarray(xStart - dataStart, xStart - dataStart + x.size);
9209
+ audioTrack.samples.push(new AudioSample(x.dts + audioBaseMediaDecodeTime, sampleData, x.duration));
9210
+ _this.__lastRemainDataStart = xStart + x.size;
9211
+ });
9212
+ }
9213
+ });
9214
+ };
9215
+ for (_iterator.s(); !(_step = _iterator.n()).done; ) {
9216
+ var _ret = _loop();
9217
+ if (_ret === "continue")
9218
+ continue;
9219
+ }
9220
+ } catch (err) {
9221
+ _iterator.e(err);
9222
+ } finally {
9223
+ _iterator.f();
9224
+ }
9225
+ }
9226
+ if (this.__lastRemainDataStart > dataStart && this.__lastRemainDataStart < data.byteLength + dataStart) {
9227
+ this.__lastRemainData = data.subarray(this.__lastRemainDataStart - dataStart);
9228
+ } else {
9229
+ this.__lastRemainData = data;
9230
+ this.__lastRemainDataStart = dataStart;
9231
+ }
9232
+ if (videoTrack.samples.length) {
9233
+ videoTrack.baseMediaDecodeTime = videoTrack.samples[0].pts;
9234
+ }
9235
+ if (audioTrack.samples.length) {
9236
+ audioTrack.baseMediaDecodeTime = audioTrack.samples[0].pts;
9237
+ }
9238
+ return {
9239
+ videoTrack,
9240
+ audioTrack,
9241
+ metadataTrack: this.metadataTrack
9242
+ };
9243
+ }
9244
+ }, {
8689
9245
  key: "demux",
8690
9246
  value: function demux(videoData, audioData) {
8691
9247
  var videoTrack = this.videoTrack, audioTrack = this.audioTrack;
@@ -9181,6 +9737,8 @@ var MP4 = /* @__PURE__ */ function() {
9181
9737
  }
9182
9738
  } else if (track.useEME && track.encv) {
9183
9739
  content = MP42.encv(track);
9740
+ } else if (track.av1C) {
9741
+ content = MP42.av01(track);
9184
9742
  } else {
9185
9743
  content = MP42.avc1hev1(track);
9186
9744
  }
@@ -9393,6 +9951,90 @@ var MP4 = /* @__PURE__ */ function() {
9393
9951
  var schi = MP42.schi(data);
9394
9952
  return MP42.box(MP42.types.sinf, content, MP42.box(MP42.types.frma, frma), MP42.box(MP42.types.schm, schm), schi);
9395
9953
  }
9954
+ }, {
9955
+ key: "av01",
9956
+ value: function av01(track) {
9957
+ return MP42.box(MP42.types.av01, new Uint8Array([
9958
+ 0,
9959
+ 0,
9960
+ 0,
9961
+ 0,
9962
+ 0,
9963
+ 0,
9964
+ 0,
9965
+ 1,
9966
+ 0,
9967
+ 0,
9968
+ 0,
9969
+ 0,
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
+ track.width >> 8 & 255,
9983
+ track.width & 255,
9984
+ track.height >> 8 & 255,
9985
+ track.height & 255,
9986
+ 0,
9987
+ 72,
9988
+ 0,
9989
+ 0,
9990
+ 0,
9991
+ 72,
9992
+ 0,
9993
+ 0,
9994
+ 0,
9995
+ 0,
9996
+ 0,
9997
+ 0,
9998
+ 0,
9999
+ 1,
10000
+ 0,
10001
+ 0,
10002
+ 0,
10003
+ 0,
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
+ 24,
10034
+ 17,
10035
+ 17
10036
+ ]), track.av1C, track.colr);
10037
+ }
9396
10038
  }, {
9397
10039
  key: "avc1hev1",
9398
10040
  value: function avc1hev1(track) {
@@ -10365,7 +11007,7 @@ var MP4 = /* @__PURE__ */ function() {
10365
11007
  }]);
10366
11008
  return MP42;
10367
11009
  }();
10368
- _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) {
11010
+ _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) {
10369
11011
  p[c] = [c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2), c.charCodeAt(3)];
10370
11012
  return p;
10371
11013
  }, /* @__PURE__ */ Object.create(null)));
@@ -10700,30 +11342,46 @@ var FMP4Remuxer = /* @__PURE__ */ function() {
10700
11342
  };
10701
11343
  }
10702
11344
  var samples = track.samples;
11345
+ var isAV01 = /av01/.test(track.codec);
10703
11346
  var mdatSize = 0;
10704
- samples.forEach(function(s) {
10705
- mdatSize += s.units.reduce(function(t, c) {
10706
- return t + c.byteLength;
10707
- }, 0);
10708
- mdatSize += s.units.length * 4;
10709
- });
10710
- var mdata = new Uint8Array(mdatSize);
10711
- var mdatView = new DataView(mdata.buffer);
10712
- var _loop = function _loop2(_offset, _sample) {
10713
- _sample = samples[i];
10714
- var sampleSize = 0;
10715
- _sample.units.forEach(function(u) {
10716
- mdatView.setUint32(_offset, u.byteLength);
10717
- _offset += 4;
10718
- mdata.set(u, _offset);
10719
- _offset += u.byteLength;
10720
- sampleSize += 4 + u.byteLength;
11347
+ if (isAV01) {
11348
+ samples.forEach(function(s) {
11349
+ mdatSize += s.data.byteLength;
10721
11350
  });
10722
- _sample.size = sampleSize;
10723
- offset = _offset, sample = _sample;
10724
- };
10725
- for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
10726
- _loop(offset, sample);
11351
+ } else {
11352
+ samples.forEach(function(s) {
11353
+ mdatSize += s.units.reduce(function(t, c) {
11354
+ return t + c.byteLength;
11355
+ }, 0);
11356
+ mdatSize += s.units.length * 4;
11357
+ });
11358
+ }
11359
+ var mdata = new Uint8Array(mdatSize);
11360
+ if (isAV01) {
11361
+ for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
11362
+ sample = samples[i];
11363
+ mdata.set(sample.data, offset);
11364
+ sample.size = sample.data.byteLength;
11365
+ offset += sample.size;
11366
+ }
11367
+ } else {
11368
+ var mdatView = new DataView(mdata.buffer);
11369
+ var _loop = function _loop2(_offset2, _sample2) {
11370
+ _sample2 = samples[_i];
11371
+ var sampleSize = 0;
11372
+ _sample2.units.forEach(function(u) {
11373
+ mdatView.setUint32(_offset2, u.byteLength);
11374
+ _offset2 += 4;
11375
+ mdata.set(u, _offset2);
11376
+ _offset2 += u.byteLength;
11377
+ sampleSize += 4 + u.byteLength;
11378
+ });
11379
+ _sample2.size = sampleSize;
11380
+ _offset = _offset2, _sample = _sample2;
11381
+ };
11382
+ for (var _i = 0, _l = samples.length, _offset = 0, _sample; _i < _l; _i++) {
11383
+ _loop(_offset, _sample);
11384
+ }
10727
11385
  }
10728
11386
  var mdat = MP4.mdat(mdata);
10729
11387
  var moof = MP4.moof([track]);
@@ -10882,11 +11540,11 @@ var Event$1 = _objectSpread2$2(_objectSpread2$2({}, EVENT), {}, {
10882
11540
  });
10883
11541
  var logger$3 = new Logger$2("Transmuxer");
10884
11542
  var Transmuxer = /* @__PURE__ */ function() {
10885
- function Transmuxer2(hls, isMP4, needRemux) {
11543
+ function Transmuxer2(hls, isMP4, needRemux, fixerConfig) {
10886
11544
  _classCallCheck$3(this, Transmuxer2);
10887
11545
  _defineProperty$3(this, "_initSegmentId", "");
10888
11546
  this.hls = hls;
10889
- this._demuxer = isMP4 ? new FMP4Demuxer() : new TsDemuxer();
11547
+ this._demuxer = isMP4 ? new FMP4Demuxer() : new TsDemuxer(null, null, null, fixerConfig);
10890
11548
  this._isMP4 = isMP4;
10891
11549
  if (needRemux)
10892
11550
  this._remuxer = new FMP4Remuxer(this._demuxer.videoTrack, this._demuxer.audioTrack);
@@ -11153,11 +11811,11 @@ var BufferService = /* @__PURE__ */ function() {
11153
11811
  return;
11154
11812
  if (TsDemuxer.probe(chunk)) {
11155
11813
  if (!this._transmuxer)
11156
- this._transmuxer = new Transmuxer(this.hls, false, !this._softVideo);
11814
+ this._transmuxer = new Transmuxer(this.hls, false, !this._softVideo, this.hls.config.fixerConfig);
11157
11815
  } else if (MP4Parser.probe(chunk)) {
11158
11816
  if (this._softVideo) {
11159
11817
  if (!this._transmuxer)
11160
- this._transmuxer = new Transmuxer(this.hls, true);
11818
+ this._transmuxer = new Transmuxer(this.hls, true, null, this.hls.config.fixerConfig);
11161
11819
  } else {
11162
11820
  this._directAppend = true;
11163
11821
  var mix = false;
@@ -11600,7 +12258,11 @@ function getConfig(cfg) {
11600
12258
  minSegmentsStartPlay: 3,
11601
12259
  preferMMS: false,
11602
12260
  preferMMSStreaming: false,
11603
- mseLowLatency: true
12261
+ mseLowLatency: true,
12262
+ fixerConfig: {
12263
+ forceFixLargeGap: false,
12264
+ largeGapThreshold: 5
12265
+ }
11604
12266
  }, cfg), {}, {
11605
12267
  media
11606
12268
  });
@@ -11994,9 +12656,6 @@ function parseMediaPlaylist(lines, parentUrl, useLowLatency) {
11994
12656
  var endOfList = false;
11995
12657
  var partSegmentIndex = 0;
11996
12658
  while (line = lines[index++]) {
11997
- if (endOfList) {
11998
- break;
11999
- }
12000
12659
  if (line[0] !== "#") {
12001
12660
  if (media.lowLatency) {
12002
12661
  curSN++;
@@ -12050,11 +12709,6 @@ function parseMediaPlaylist(lines, parentUrl, useLowLatency) {
12050
12709
  break;
12051
12710
  case "ENDLIST":
12052
12711
  {
12053
- var _lastSegment = media.segments[media.segments.length - 1];
12054
- if (_lastSegment) {
12055
- _lastSegment.isLast = true;
12056
- }
12057
- media.live = false;
12058
12712
  endOfList = true;
12059
12713
  }
12060
12714
  break;
@@ -12158,11 +12812,14 @@ function parseMediaPlaylist(lines, parentUrl, useLowLatency) {
12158
12812
  });
12159
12813
  var lastSegment = media.segments[media.segments.length - 1];
12160
12814
  if (lastSegment) {
12161
- media.endSN = lastSegment.sn;
12162
- media.endPartIndex = lastSegment.partIndex;
12163
- if (endOfList && !lastSegment.isLast) {
12815
+ if (endOfList) {
12164
12816
  lastSegment.isLast = true;
12165
12817
  }
12818
+ media.endSN = lastSegment.sn;
12819
+ media.endPartIndex = lastSegment.partIndex;
12820
+ }
12821
+ if (endOfList) {
12822
+ media.live = false;
12166
12823
  }
12167
12824
  media.totalDuration = totalDuration;
12168
12825
  media.endCC = curCC;
@@ -13259,7 +13916,7 @@ var Hls = /* @__PURE__ */ function(_EventEmitter) {
13259
13916
  _defineProperty$3(_assertThisInitialized$2(_this), "_switchUrlOpts", null);
13260
13917
  _defineProperty$3(_assertThisInitialized$2(_this), "_isProcessQuotaExceeded", false);
13261
13918
  _defineProperty$3(_assertThisInitialized$2(_this), "_loadSegment", /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
13262
- var nextSeg, _assertThisInitialize, config, bInfo, bufferThroughout;
13919
+ var _this$_playlist, nextSegment, lastSegment, _assertThisInitialize, config, minFrameDuration, maxBufferThroughout, bInfo, bufferThroughout;
13263
13920
  return _regeneratorRuntime$1().wrap(function _callee$(_context) {
13264
13921
  while (1)
13265
13922
  switch (_context.prev = _context.next) {
@@ -13270,42 +13927,44 @@ var Hls = /* @__PURE__ */ function(_EventEmitter) {
13270
13927
  }
13271
13928
  return _context.abrupt("return");
13272
13929
  case 2:
13273
- nextSeg = _this._playlist.nextSegment;
13930
+ _this$_playlist = _this._playlist, nextSegment = _this$_playlist.nextSegment, lastSegment = _this$_playlist.lastSegment;
13274
13931
  _assertThisInitialize = _assertThisInitialized$2(_this), config = _assertThisInitialize.config;
13275
- if (nextSeg) {
13276
- _context.next = 6;
13932
+ minFrameDuration = 0.016;
13933
+ maxBufferThroughout = Math.min(Math.max((lastSegment === null || lastSegment === void 0 ? void 0 : lastSegment.duration) - minFrameDuration / 2 || 0, minFrameDuration), 0.1);
13934
+ if (nextSegment) {
13935
+ _context.next = 8;
13277
13936
  break;
13278
13937
  }
13279
13938
  return _context.abrupt("return");
13280
- case 6:
13939
+ case 8:
13281
13940
  if (_this.isLive) {
13282
- _context.next = 16;
13941
+ _context.next = 18;
13283
13942
  break;
13284
13943
  }
13285
13944
  bInfo = _this.bufferInfo();
13286
13945
  if (_this.media.paused && !_this.media.currentTime) {
13287
13946
  bInfo = _this.bufferInfo(bInfo.nextStart || 0.5);
13288
13947
  }
13289
- bufferThroughout = Math.abs(bInfo.end - _this.media.duration) < 0.1;
13948
+ bufferThroughout = Math.abs(bInfo.end - _this.media.duration) < maxBufferThroughout;
13290
13949
  if (!(bInfo.remaining >= config.preloadTime || bufferThroughout)) {
13291
- _context.next = 13;
13950
+ _context.next = 15;
13292
13951
  break;
13293
13952
  }
13294
13953
  _this._tryEos();
13295
13954
  return _context.abrupt("return");
13296
- case 13:
13955
+ case 15:
13297
13956
  if (!(config.preferMMSStreaming && !_this._bufferService.msStreaming)) {
13298
- _context.next = 15;
13957
+ _context.next = 17;
13299
13958
  break;
13300
13959
  }
13301
13960
  return _context.abrupt("return");
13302
- case 15:
13303
- if (!_this._urlSwitching && _this._prevSegSn !== nextSeg.sn - 1 && bInfo.end && Math.abs(nextSeg.start - bInfo.end) > 1) {
13961
+ case 17:
13962
+ if (!_this._urlSwitching && _this._prevSegSn !== nextSegment.sn - 1 && bInfo.end && Math.abs(nextSegment.start - bInfo.end) > 1) {
13304
13963
  _this._playlist.setNextSegmentByIndex(_this._playlist.findSegmentIndexByTime(bInfo.end + 0.1));
13305
13964
  }
13306
- case 16:
13965
+ case 18:
13307
13966
  return _context.abrupt("return", _this._loadSegmentDirect());
13308
- case 17:
13967
+ case 19:
13309
13968
  case "end":
13310
13969
  return _context.stop();
13311
13970
  }
@@ -14558,8 +15217,8 @@ var Hls = /* @__PURE__ */ function(_EventEmitter) {
14558
15217
  value: function _tryEos() {
14559
15218
  var _this$_bufferService3, _this$_bufferService4;
14560
15219
  var media = this.media;
14561
- var _this$_playlist = this._playlist, nextSegment = _this$_playlist.nextSegment, lastSegment = _this$_playlist.lastSegment;
14562
- 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);
15220
+ var _this$_playlist2 = this._playlist, nextSegment = _this$_playlist2.nextSegment, lastSegment = _this$_playlist2.lastSegment;
15221
+ 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);
14563
15222
  if (!eosAllowed) {
14564
15223
  return;
14565
15224
  }
@@ -14595,7 +15254,7 @@ var Hls = /* @__PURE__ */ function(_EventEmitter) {
14595
15254
  }]);
14596
15255
  return Hls2;
14597
15256
  }(EventEmitter);
14598
- _defineProperty$3(Hls, "version", "3.0.19-rc.0");
15257
+ _defineProperty$3(Hls, "version", "3.0.20-rc.3");
14599
15258
  try {
14600
15259
  if (localStorage.getItem("xgd")) {
14601
15260
  Hls.enableLogger();