@byteplus/veplayer-plugin 2.5.0-rc.1 → 2.6.0-rc.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 (41) hide show
  1. package/esm/index.development.css +1 -1
  2. package/esm/index.development.js +1845 -530
  3. package/esm/index.production.css +1 -1
  4. package/esm/index.production.js +4 -4
  5. package/esm/veplayer.plugin.abr.development.js +12 -0
  6. package/esm/veplayer.plugin.abr.production.js +1 -1
  7. package/esm/veplayer.plugin.ad.development.css +1 -1
  8. package/esm/veplayer.plugin.ad.development.js +111 -39
  9. package/esm/veplayer.plugin.ad.production.css +1 -1
  10. package/esm/veplayer.plugin.ad.production.js +2 -2
  11. package/esm/veplayer.plugin.drm.development.js +12 -0
  12. package/esm/veplayer.plugin.drm.production.js +1 -1
  13. package/esm/veplayer.plugin.flv.development.js +670 -193
  14. package/esm/veplayer.plugin.flv.production.js +1 -1
  15. package/esm/veplayer.plugin.hls.development.js +1159 -369
  16. package/esm/veplayer.plugin.hls.production.js +1 -1
  17. package/esm/veplayer.plugin.mp4.development.js +13 -1
  18. package/esm/veplayer.plugin.mp4.production.js +1 -1
  19. package/esm/veplayer.plugin.rtm.development.js +13 -1
  20. package/esm/veplayer.plugin.rtm.production.js +1 -1
  21. package/esm/veplayer.plugin.shaka.development.js +12 -0
  22. package/esm/veplayer.plugin.shaka.production.js +1 -1
  23. package/package.json +1 -1
  24. package/umd/veplayer.plugin.abr.development.js +12 -0
  25. package/umd/veplayer.plugin.abr.production.js +1 -1
  26. package/umd/veplayer.plugin.ad.development.css +1 -1
  27. package/umd/veplayer.plugin.ad.development.js +111 -39
  28. package/umd/veplayer.plugin.ad.production.css +1 -1
  29. package/umd/veplayer.plugin.ad.production.js +1 -1
  30. package/umd/veplayer.plugin.drm.development.js +12 -0
  31. package/umd/veplayer.plugin.drm.production.js +1 -1
  32. package/umd/veplayer.plugin.flv.development.js +670 -193
  33. package/umd/veplayer.plugin.flv.production.js +1 -1
  34. package/umd/veplayer.plugin.hls.development.js +1126 -336
  35. package/umd/veplayer.plugin.hls.production.js +1 -1
  36. package/umd/veplayer.plugin.mp4.development.js +13 -1
  37. package/umd/veplayer.plugin.mp4.production.js +1 -1
  38. package/umd/veplayer.plugin.rtm.development.js +13 -1
  39. package/umd/veplayer.plugin.rtm.production.js +1 -1
  40. package/umd/veplayer.plugin.shaka.development.js +12 -0
  41. package/umd/veplayer.plugin.shaka.production.js +1 -1
@@ -1542,7 +1542,7 @@
1542
1542
  }
1543
1543
  return offsetTime;
1544
1544
  };
1545
- var version = "3.0.20-alpha.4";
1545
+ var version = "3.0.21-rc.3";
1546
1546
  var ERROR_MAP = {
1547
1547
  1: 5101,
1548
1548
  2: 5102,
@@ -2009,6 +2009,18 @@
2009
2009
  }
2010
2010
  }
2011
2011
  }
2012
+ }, {
2013
+ key: "defineMethod",
2014
+ value: function defineMethod(Obj, map) {
2015
+ for (var key in map) {
2016
+ if (Object.prototype.hasOwnProperty.call(map, key) && typeof map[key] === "function") {
2017
+ Object.defineProperty(Obj, key, {
2018
+ configurable: true,
2019
+ value: map[key]
2020
+ });
2021
+ }
2022
+ }
2023
+ }
2012
2024
  }, {
2013
2025
  key: "defaultConfig",
2014
2026
  get: function get() {
@@ -2819,6 +2831,21 @@
2819
2831
  length: Buffer2.totalLength && Buffer2.totalLength(buffers)
2820
2832
  };
2821
2833
  }
2834
+ }, {
2835
+ key: "isBuffered",
2836
+ value: function isBuffered(media, pos) {
2837
+ if (media) {
2838
+ var buffered = Buffer2.get(media);
2839
+ if (buffered !== null && buffered !== void 0 && buffered.length) {
2840
+ for (var i = 0; i < buffered.length; i++) {
2841
+ if (pos >= buffered.start(i) && pos <= buffered.end(i)) {
2842
+ return true;
2843
+ }
2844
+ }
2845
+ }
2846
+ }
2847
+ return false;
2848
+ }
2822
2849
  }]);
2823
2850
  return Buffer2;
2824
2851
  }();
@@ -2971,7 +2998,7 @@
2971
2998
  this.logCache.apply(this, [LogCacheLevel.DEBUG].concat(args));
2972
2999
  if (Logger2.disabled)
2973
3000
  return;
2974
- (_console = console).debug.apply(_console, [this._prefix, nowTime$1()].concat(args));
3001
+ (_console = console).debug.apply(_console, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
2975
3002
  }
2976
3003
  }, {
2977
3004
  key: "log",
@@ -2983,7 +3010,7 @@
2983
3010
  this.logCache.apply(this, [LogCacheLevel.LOG].concat(args));
2984
3011
  if (Logger2.disabled)
2985
3012
  return;
2986
- (_console2 = console).log.apply(_console2, [this._prefix, nowTime$1()].concat(args));
3013
+ (_console2 = console).log.apply(_console2, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
2987
3014
  }
2988
3015
  }, {
2989
3016
  key: "warn",
@@ -2995,7 +3022,7 @@
2995
3022
  this.logCache.apply(this, [LogCacheLevel.WARN].concat(args));
2996
3023
  if (Logger2.disabled)
2997
3024
  return;
2998
- (_console3 = console).warn.apply(_console3, [this._prefix, nowTime$1()].concat(args));
3025
+ (_console3 = console).warn.apply(_console3, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
2999
3026
  }
3000
3027
  }, {
3001
3028
  key: "error",
@@ -3007,7 +3034,7 @@
3007
3034
  this.logCache.apply(this, [LogCacheLevel.ERROR].concat(args));
3008
3035
  if (Logger2.disabled)
3009
3036
  return;
3010
- (_console4 = console).error.apply(_console4, [this._prefix, nowTime$1()].concat(args));
3037
+ (_console4 = console).error.apply(_console4, ["[".concat(nowTime$1(), "]"), this._prefix].concat(args));
3011
3038
  }
3012
3039
  }, {
3013
3040
  key: "logCache",
@@ -3022,7 +3049,7 @@
3022
3049
  var finLogText = logText.map(function(item) {
3023
3050
  return logable(item);
3024
3051
  });
3025
- text = this._prefix + nowTime$1() + JSON.stringify(finLogText);
3052
+ text = "[".concat(nowTime$1(), "]") + this._prefix + JSON.stringify(finLogText);
3026
3053
  } catch (e) {
3027
3054
  return;
3028
3055
  }
@@ -3938,8 +3965,8 @@
3938
3965
  response
3939
3966
  };
3940
3967
  }
3941
- function calculateSpeed(byteLen, millisec) {
3942
- return Math.round(byteLen * 8 * 1e3 / millisec / 1024);
3968
+ function calculateSpeed(byteLen, milliSecond) {
3969
+ return Math.round(byteLen * 8 * 1e3 / milliSecond / 1024);
3943
3970
  }
3944
3971
  var EVENT = {
3945
3972
  ERROR: "error",
@@ -3951,6 +3978,7 @@
3951
3978
  SOURCEBUFFER_CREATED: "core.sourcebuffercreated",
3952
3979
  MEDIASOURCE_OPENED: "core.mediasourceopened",
3953
3980
  ANALYZE_DURATION_EXCEEDED: "core.analyzedurationexceeded",
3981
+ APPEND_BUFFER: "core.appendbuffer",
3954
3982
  REMOVE_BUFFER: "core.removebuffer",
3955
3983
  BUFFEREOS: "core.buffereos",
3956
3984
  KEYFRAME: "core.keyframe",
@@ -5583,13 +5611,16 @@
5583
5611
  METADATA: "metadata"
5584
5612
  };
5585
5613
  var VideoCodecType = {
5614
+ AV1: "av1",
5586
5615
  AVC: "avc",
5587
5616
  HEVC: "hevc"
5588
5617
  };
5589
5618
  var AudioCodecType = {
5590
5619
  AAC: "aac",
5591
5620
  G711PCMA: "g7110a",
5592
- G711PCMU: "g7110m"
5621
+ G711PCMU: "g7110m",
5622
+ OPUS: "opus",
5623
+ MP3: "mp3"
5593
5624
  };
5594
5625
  var WarningType = {
5595
5626
  LARGE_AV_SHIFT: "LARGE_AV_SHIFT",
@@ -5629,6 +5660,7 @@
5629
5660
  _defineProperty(this, "isVideoEncryption", false);
5630
5661
  _defineProperty(this, "isAudioEncryption", false);
5631
5662
  _defineProperty(this, "isVideo", true);
5663
+ _defineProperty(this, "lastKeyFrameDts", 0);
5632
5664
  _defineProperty(this, "kid", null);
5633
5665
  _defineProperty(this, "pssh", null);
5634
5666
  _defineProperty(this, "ext", void 0);
@@ -5671,6 +5703,9 @@
5671
5703
  }, {
5672
5704
  key: "exist",
5673
5705
  value: function exist() {
5706
+ if (/av01/.test(this.codec)) {
5707
+ return true;
5708
+ }
5674
5709
  return !!(this.pps.length && this.sps.length && this.codec);
5675
5710
  }
5676
5711
  }, {
@@ -5694,6 +5729,7 @@
5694
5729
  _defineProperty(this, "codecType", AudioCodecType.AAC);
5695
5730
  _defineProperty(this, "pid", -1);
5696
5731
  _defineProperty(this, "codec", "");
5732
+ _defineProperty(this, "container", "");
5697
5733
  _defineProperty(this, "sequenceNumber", 0);
5698
5734
  _defineProperty(this, "sampleDuration", 0);
5699
5735
  _defineProperty(this, "timescale", 0);
@@ -5734,7 +5770,7 @@
5734
5770
  }, {
5735
5771
  key: "exist",
5736
5772
  value: function exist() {
5737
- return !!(this.sampleRate && this.channelCount && this.codec && this.codecType === AudioCodecType.AAC);
5773
+ 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));
5738
5774
  }
5739
5775
  }, {
5740
5776
  key: "hasSample",
@@ -5948,7 +5984,7 @@
5948
5984
  continue;
5949
5985
  }
5950
5986
  frameLength = (data[i + 3] & 3) << 11 | data[i + 4] << 3 | (data[i + 5] & 224) >> 5;
5951
- if (len - i < frameLength)
5987
+ if (!frameLength || len - i < frameLength)
5952
5988
  break;
5953
5989
  protectionSkipBytes = (~data[i + 1] & 1) * 2;
5954
5990
  frames.push({
@@ -6082,14 +6118,57 @@
6082
6118
  return AAC2;
6083
6119
  }();
6084
6120
  _defineProperty(AAC, "FREQ", [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350]);
6121
+ var OPUS = /* @__PURE__ */ function() {
6122
+ function OPUS2() {
6123
+ _classCallCheck$1(this, OPUS2);
6124
+ }
6125
+ _createClass$1(OPUS2, null, [{
6126
+ key: "getFrameDuration",
6127
+ value: function getFrameDuration(samples) {
6128
+ return 20;
6129
+ }
6130
+ }, {
6131
+ key: "parseHeaderPackets",
6132
+ value: function parseHeaderPackets(data) {
6133
+ if (!data.length)
6134
+ return;
6135
+ var dv = new DataView(data.buffer, data.byteOffset, data.byteLength);
6136
+ var magicSignature = "";
6137
+ for (var i = 0; i < 8; i++) {
6138
+ magicSignature += String.fromCodePoint(data[i]);
6139
+ }
6140
+ if (magicSignature !== "OpusHead") {
6141
+ throw new Error("Invalid Opus MagicSignature");
6142
+ }
6143
+ var channelCount = data[9];
6144
+ console.log("Pre-skip", data[10], data[11]);
6145
+ var sampleRate = dv.getUint32(12, true);
6146
+ var outputGain = dv.getInt16(16, true);
6147
+ if (!sampleRate)
6148
+ return;
6149
+ var codec = "opus";
6150
+ var originCodec = "opus";
6151
+ var config = new Uint8Array(data.buffer, data.byteOffset + 8, data.byteLength - 8);
6152
+ return {
6153
+ outputGain,
6154
+ sampleRate,
6155
+ channelCount,
6156
+ config,
6157
+ codec,
6158
+ originCodec
6159
+ };
6160
+ }
6161
+ }]);
6162
+ return OPUS2;
6163
+ }();
6085
6164
  var LARGE_AV_FIRST_FRAME_GAP = 500;
6086
6165
  var AUDIO_GAP_OVERLAP_THRESHOLD_COUNT = 3;
6087
6166
  var MAX_SILENT_FRAME_DURATION = 1e3;
6088
- var AUDIO_EXCETION_LOG_EMIT_DURATION = 5e3;
6167
+ var AUDIO_EXCEPTION_LOG_EMIT_DURATION = 5e3;
6089
6168
  var MAX_VIDEO_FRAME_DURATION = 1e3;
6090
6169
  var MAX_DTS_DELTA_WITH_NEXT_CHUNK = 200;
6091
- var VIDEO_EXCETION_LOG_EMIT_DURATION = 5e3;
6092
- var TRACK_BREACKED_CHECK_TIME = 5;
6170
+ var VIDEO_EXCEPTION_LOG_EMIT_DURATION = 5e3;
6171
+ var TRACK_BROKEN_CHECK_TIME = 5;
6093
6172
  var FlvFixer = /* @__PURE__ */ function() {
6094
6173
  function FlvFixer2(videoTrack, audioTrack, metadataTrack) {
6095
6174
  _classCallCheck$1(this, FlvFixer2);
@@ -6205,7 +6284,7 @@
6205
6284
  var firstSample = samples[0];
6206
6285
  var vDelta = this._videoNextDts - firstSample.dts;
6207
6286
  if (Math.abs(vDelta) > MAX_DTS_DELTA_WITH_NEXT_CHUNK) {
6208
- if (Math.abs(firstSample.dts - this._lastVideoExceptionChunkFirstDtsDot) > VIDEO_EXCETION_LOG_EMIT_DURATION) {
6287
+ if (Math.abs(firstSample.dts - this._lastVideoExceptionChunkFirstDtsDot) > VIDEO_EXCEPTION_LOG_EMIT_DURATION) {
6209
6288
  var _samples$;
6210
6289
  this._lastVideoExceptionChunkFirstDtsDot = firstSample.dts;
6211
6290
  videoTrack.warnings.push({
@@ -6216,7 +6295,7 @@
6216
6295
  sampleDuration: vDelta
6217
6296
  });
6218
6297
  }
6219
- if (this._videoTimestampBreak >= TRACK_BREACKED_CHECK_TIME) {
6298
+ if (this._videoTimestampBreak >= TRACK_BROKEN_CHECK_TIME) {
6220
6299
  this._videoNextDts = firstSample.dts;
6221
6300
  this._videoTimestampBreak = 0;
6222
6301
  } else {
@@ -6239,7 +6318,7 @@
6239
6318
  }
6240
6319
  if (sampleDuration > MAX_VIDEO_FRAME_DURATION || sampleDuration < 0) {
6241
6320
  this._videoTimestampBreak++;
6242
- if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCETION_LOG_EMIT_DURATION) {
6321
+ if (Math.abs(dts - this._lastVideoExceptionLargeGapDot) > VIDEO_EXCEPTION_LOG_EMIT_DURATION) {
6243
6322
  this._lastVideoExceptionLargeGapDot = dts;
6244
6323
  videoTrack.warnings.push({
6245
6324
  type: WarningType.LARGE_VIDEO_GAP,
@@ -6320,10 +6399,27 @@
6320
6399
  key: "_doFixAudioInternal",
6321
6400
  value: function _doFixAudioInternal(audioTrack, samples, timescale) {
6322
6401
  if (!audioTrack.sampleDuration) {
6323
- audioTrack.sampleDuration = audioTrack.codecType === AudioCodecType.AAC ? AAC.getFrameDuration(audioTrack.timescale, timescale) : this._getG711Duration(audioTrack);
6402
+ switch (audioTrack.codecType) {
6403
+ case AudioCodecType.AAC: {
6404
+ audioTrack.sampleDuration = AAC.getFrameDuration(audioTrack.timescale, timescale);
6405
+ break;
6406
+ }
6407
+ case AudioCodecType.OPUS: {
6408
+ audioTrack.sampleDuration = OPUS.getFrameDuration(audioTrack.samples, timescale);
6409
+ break;
6410
+ }
6411
+ case AudioCodecType.G711PCMA:
6412
+ case AudioCodecType.G711PCMU: {
6413
+ audioTrack.sampleDuration = this._getG711Duration(audioTrack);
6414
+ break;
6415
+ }
6416
+ default:
6417
+ console.error("can't fix audio codecType:", audioTrack.codecType);
6418
+ break;
6419
+ }
6324
6420
  }
6325
6421
  var refSampleDuration = audioTrack.sampleDuration;
6326
- var sampleDurationInSampleRate = audioTrack.codecType === AudioCodecType.AAC ? 1024 : refSampleDuration * audioTrack.timescale / 1e3;
6422
+ var sampleDurationInSampleRate = audioTrack.codecType === AudioCodecType.OPUS ? 20 : audioTrack.codecType === AudioCodecType.AAC ? 1024 : refSampleDuration * audioTrack.timescale / 1e3;
6327
6423
  if (this._audioNextPts === void 0) {
6328
6424
  var samp0 = samples[0];
6329
6425
  this._audioNextPts = samp0.pts;
@@ -6332,7 +6428,7 @@
6332
6428
  var nextPts = this._audioNextPts;
6333
6429
  var sample = samples[i];
6334
6430
  var delta = sample.pts - nextPts;
6335
- if (i === 0 && this._audioTimestampBreak >= TRACK_BREACKED_CHECK_TIME && this._keyFrameInNextChunk) {
6431
+ if (i === 0 && this._audioTimestampBreak >= TRACK_BROKEN_CHECK_TIME && this._keyFrameInNextChunk) {
6336
6432
  nextPts = this._audioNextPts = sample.dts;
6337
6433
  delta = 0;
6338
6434
  this._audioTimestampBreak = 0;
@@ -6340,7 +6436,7 @@
6340
6436
  if (!this._audioTimestampBreak && delta >= AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta <= MAX_SILENT_FRAME_DURATION && !isSafari) {
6341
6437
  var silentFrame = this._getSilentFrame(audioTrack) || samples[0].data.subarray();
6342
6438
  var count = Math.floor(delta / refSampleDuration);
6343
- if (Math.abs(sample.pts - this._lastAudioExceptionGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {
6439
+ if (Math.abs(sample.pts - this._lastAudioExceptionGapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {
6344
6440
  this._lastAudioExceptionGapDot = sample.pts;
6345
6441
  audioTrack.warnings.push({
6346
6442
  type: WarningType.AUDIO_FILLED,
@@ -6360,7 +6456,7 @@
6360
6456
  }
6361
6457
  i--;
6362
6458
  } else if (delta <= -AUDIO_GAP_OVERLAP_THRESHOLD_COUNT * refSampleDuration && delta >= -1 * MAX_SILENT_FRAME_DURATION) {
6363
- if (Math.abs(sample.pts - this._lastAudioExceptionOverlapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {
6459
+ if (Math.abs(sample.pts - this._lastAudioExceptionOverlapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {
6364
6460
  this._lastAudioExceptionOverlapDot = sample.pts;
6365
6461
  audioTrack.warnings.push({
6366
6462
  type: WarningType.AUDIO_DROPPED,
@@ -6375,7 +6471,7 @@
6375
6471
  } else {
6376
6472
  if (Math.abs(delta) > MAX_SILENT_FRAME_DURATION) {
6377
6473
  this._audioTimestampBreak++;
6378
- if (Math.abs(sample.pts - this._lastAudioExceptionLargeGapDot) > AUDIO_EXCETION_LOG_EMIT_DURATION) {
6474
+ if (Math.abs(sample.pts - this._lastAudioExceptionLargeGapDot) > AUDIO_EXCEPTION_LOG_EMIT_DURATION) {
6379
6475
  this._lastAudioExceptionLargeGapDot = sample.pts;
6380
6476
  audioTrack.warnings.push({
6381
6477
  type: WarningType.LARGE_AUDIO_GAP,
@@ -6388,8 +6484,15 @@
6388
6484
  });
6389
6485
  }
6390
6486
  }
6391
- sample.dts = sample.pts = nextPts;
6392
- sample.duration = sampleDurationInSampleRate;
6487
+ if (audioTrack.codecType === AudioCodecType.OPUS) {
6488
+ var lastSample = samples[samples.length - 1];
6489
+ if (lastSample) {
6490
+ lastSample.duration = sample.pts - lastSample.pts;
6491
+ }
6492
+ } else {
6493
+ sample.dts = sample.pts = nextPts;
6494
+ sample.duration = sampleDurationInSampleRate;
6495
+ }
6393
6496
  this._audioNextPts += refSampleDuration;
6394
6497
  }
6395
6498
  }
@@ -7348,6 +7451,13 @@
7348
7451
  }]);
7349
7452
  return AMF2;
7350
7453
  }();
7454
+ var FlvSoundFormat = {
7455
+ MP3: 2,
7456
+ G711A: 7,
7457
+ G711M: 8,
7458
+ AAC: 10,
7459
+ OPUS: 13
7460
+ };
7351
7461
  var logger$2 = new Logger$1("FlvDemuxer");
7352
7462
  var FlvDemuxer = /* @__PURE__ */ function() {
7353
7463
  function FlvDemuxer2(videoTrack, audioTrack, metadataTrack) {
@@ -7364,8 +7474,10 @@
7364
7474
  _createClass$1(FlvDemuxer2, [{
7365
7475
  key: "demux",
7366
7476
  value: function demux(data) {
7477
+ var _scriptDataObject$dat;
7367
7478
  var discontinuity = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
7368
7479
  var contiguous = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
7480
+ var seamlessLoadingSwitching = arguments.length > 3 ? arguments[3] : void 0;
7369
7481
  var audioTrack = this.audioTrack, videoTrack = this.videoTrack, metadataTrack = this.metadataTrack;
7370
7482
  if (discontinuity || !contiguous) {
7371
7483
  this._remainingData = null;
@@ -7423,6 +7535,8 @@
7423
7535
  if (tagType === 8) {
7424
7536
  this._parseAudio(bodyData, timestamp);
7425
7537
  } else if (tagType === 9) {
7538
+ if (seamlessLoadingSwitching)
7539
+ this.seamlessLoadingSwitching = true;
7426
7540
  this._parseVideo(bodyData, timestamp);
7427
7541
  } else if (tagType === 18) {
7428
7542
  this._parseScript(bodyData, timestamp);
@@ -7440,13 +7554,31 @@
7440
7554
  this._remainingData = data.subarray(offset);
7441
7555
  }
7442
7556
  audioTrack.formatTimescale = videoTrack.formatTimescale = videoTrack.timescale = metadataTrack.timescale = 1e3;
7443
- audioTrack.timescale = audioTrack.sampleRate || 0;
7557
+ audioTrack.timescale = audioTrack.codecType === AudioCodecType.OPUS ? 1e3 : audioTrack.sampleRate || 0;
7444
7558
  if (!audioTrack.exist() && audioTrack.hasSample()) {
7445
7559
  audioTrack.reset();
7446
7560
  }
7447
7561
  if (!videoTrack.exist() && videoTrack.hasSample()) {
7448
7562
  videoTrack.reset();
7449
7563
  }
7564
+ var scriptDataObject = metadataTrack.flvScriptSamples[metadataTrack.flvScriptSamples.length - 1];
7565
+ var metaData = scriptDataObject === null || scriptDataObject === void 0 ? void 0 : (_scriptDataObject$dat = scriptDataObject.data) === null || _scriptDataObject$dat === void 0 ? void 0 : _scriptDataObject$dat.onMetaData;
7566
+ if (metaData) {
7567
+ if (videoTrack !== null && videoTrack !== void 0 && videoTrack.exist()) {
7568
+ if (metaData.hasOwnProperty("duration")) {
7569
+ videoTrack.duration = metaData.duration * 1e3;
7570
+ }
7571
+ if (metaData.hasOwnProperty("width") && metaData.hasOwnProperty("height")) {
7572
+ videoTrack.width = metaData.width;
7573
+ videoTrack.height = metaData.height;
7574
+ }
7575
+ }
7576
+ if (audioTrack !== null && audioTrack !== void 0 && audioTrack.exist()) {
7577
+ if (metaData.hasOwnProperty("duration")) {
7578
+ audioTrack.duration = metaData.duration * 1e3;
7579
+ }
7580
+ }
7581
+ }
7450
7582
  return {
7451
7583
  videoTrack,
7452
7584
  audioTrack,
@@ -7465,8 +7597,8 @@
7465
7597
  }
7466
7598
  }, {
7467
7599
  key: "demuxAndFix",
7468
- value: function demuxAndFix(data, discontinuity, contiguous, startTime) {
7469
- this.demux(data, discontinuity, contiguous);
7600
+ value: function demuxAndFix(data, discontinuity, contiguous, startTime, seamlessLoadingSwitching) {
7601
+ this.demux(data, discontinuity, contiguous, seamlessLoadingSwitching);
7470
7602
  return this.fix(startTime, discontinuity, contiguous);
7471
7603
  }
7472
7604
  }, {
@@ -7476,12 +7608,12 @@
7476
7608
  return;
7477
7609
  var format = (data[0] & 240) >>> 4;
7478
7610
  var track = this.audioTrack;
7479
- if (format !== 10 && format !== 7 && format !== 8) {
7611
+ if (format !== FlvSoundFormat.AAC && format !== FlvSoundFormat.G711A && format !== FlvSoundFormat.G711M && format !== FlvSoundFormat.OPUS) {
7480
7612
  logger$2.warn("Unsupported sound format: ".concat(format));
7481
7613
  track.reset();
7482
7614
  return;
7483
7615
  }
7484
- if (format !== 10) {
7616
+ if (format !== FlvSoundFormat.AAC && format !== FlvSoundFormat.OPUS) {
7485
7617
  var soundRate = (data[0] & 12) >> 2;
7486
7618
  var soundSize = (data[0] & 2) >> 1;
7487
7619
  var soundType = data[0] & 1;
@@ -7489,10 +7621,49 @@
7489
7621
  track.sampleSize = soundSize ? 16 : 8;
7490
7622
  track.channelCount = soundType + 1;
7491
7623
  }
7492
- if (format === 10) {
7493
- this._parseAac(data, pts);
7494
- } else {
7495
- this._parseG711(data, pts, format);
7624
+ switch (format) {
7625
+ case FlvSoundFormat.G711A:
7626
+ case FlvSoundFormat.G711M:
7627
+ this._parseG711(data, pts, format);
7628
+ break;
7629
+ case FlvSoundFormat.AAC:
7630
+ this._parseAac(data, pts);
7631
+ break;
7632
+ case FlvSoundFormat.OPUS:
7633
+ this._parseOpus(data, pts);
7634
+ break;
7635
+ }
7636
+ }
7637
+ }, {
7638
+ key: "_parseOpus",
7639
+ value: function _parseOpus(data, pts) {
7640
+ var track = this.audioTrack;
7641
+ var packetType = data[1];
7642
+ track.codecType = AudioCodecType.OPUS;
7643
+ switch (packetType) {
7644
+ case 0: {
7645
+ var ret = OPUS.parseHeaderPackets(data.subarray(2));
7646
+ if (ret) {
7647
+ track.codec = ret.codec;
7648
+ track.channelCount = ret.channelCount;
7649
+ track.sampleRate = ret.sampleRate;
7650
+ track.config = ret.config;
7651
+ track.sampleDuration = OPUS.getFrameDuration([], track.timescale);
7652
+ } else {
7653
+ track.reset();
7654
+ logger$2.warn("Cannot parse AudioSpecificConfig", data);
7655
+ }
7656
+ break;
7657
+ }
7658
+ case 1: {
7659
+ if (pts === void 0 || pts === null)
7660
+ return;
7661
+ var newSample = new AudioSample(pts, data.subarray(2), track.sampleDuration);
7662
+ track.samples.push(newSample);
7663
+ break;
7664
+ }
7665
+ default:
7666
+ logger$2.warn("Unknown OpusPacketType: ".concat(packetType));
7496
7667
  }
7497
7668
  }
7498
7669
  }, {
@@ -7580,8 +7751,13 @@
7580
7751
  units = this._checkAddMetaNalToUnits(isHevc, units, track);
7581
7752
  if (units && units.length) {
7582
7753
  var sample = new VideoSample(dts + cts, dts, units);
7754
+ if (this.seamlessLoadingSwitching && dts < track.lastKeyFrameDts) {
7755
+ return;
7756
+ }
7757
+ this.seamlessLoadingSwitching = false;
7583
7758
  if (frameType === 1) {
7584
7759
  sample.setToKeyframe();
7760
+ track.lastKeyFrameDts = dts;
7585
7761
  }
7586
7762
  track.samples.push(sample);
7587
7763
  units.forEach(function(unit) {
@@ -8055,10 +8231,16 @@
8055
8231
  if (track.useEME && track.enca) {
8056
8232
  content = MP42.enca(track);
8057
8233
  } else {
8058
- content = MP42.mp4a(track);
8234
+ if (track.codecType === AudioCodecType.OPUS) {
8235
+ content = MP42.opus(track);
8236
+ } else {
8237
+ content = MP42.mp4a(track);
8238
+ }
8059
8239
  }
8060
8240
  } else if (track.useEME && track.encv) {
8061
8241
  content = MP42.encv(track);
8242
+ } else if (track.av1C) {
8243
+ content = MP42.av01(track);
8062
8244
  } else {
8063
8245
  content = MP42.avc1hev1(track);
8064
8246
  }
@@ -8271,6 +8453,90 @@
8271
8453
  var schi = MP42.schi(data);
8272
8454
  return MP42.box(MP42.types.sinf, content, MP42.box(MP42.types.frma, frma), MP42.box(MP42.types.schm, schm), schi);
8273
8455
  }
8456
+ }, {
8457
+ key: "av01",
8458
+ value: function av01(track) {
8459
+ return MP42.box(MP42.types.av01, new Uint8Array([
8460
+ 0,
8461
+ 0,
8462
+ 0,
8463
+ 0,
8464
+ 0,
8465
+ 0,
8466
+ 0,
8467
+ 1,
8468
+ 0,
8469
+ 0,
8470
+ 0,
8471
+ 0,
8472
+ 0,
8473
+ 0,
8474
+ 0,
8475
+ 0,
8476
+ 0,
8477
+ 0,
8478
+ 0,
8479
+ 0,
8480
+ 0,
8481
+ 0,
8482
+ 0,
8483
+ 0,
8484
+ track.width >> 8 & 255,
8485
+ track.width & 255,
8486
+ track.height >> 8 & 255,
8487
+ track.height & 255,
8488
+ 0,
8489
+ 72,
8490
+ 0,
8491
+ 0,
8492
+ 0,
8493
+ 72,
8494
+ 0,
8495
+ 0,
8496
+ 0,
8497
+ 0,
8498
+ 0,
8499
+ 0,
8500
+ 0,
8501
+ 1,
8502
+ 0,
8503
+ 0,
8504
+ 0,
8505
+ 0,
8506
+ 0,
8507
+ 0,
8508
+ 0,
8509
+ 0,
8510
+ 0,
8511
+ 0,
8512
+ 0,
8513
+ 0,
8514
+ 0,
8515
+ 0,
8516
+ 0,
8517
+ 0,
8518
+ 0,
8519
+ 0,
8520
+ 0,
8521
+ 0,
8522
+ 0,
8523
+ 0,
8524
+ 0,
8525
+ 0,
8526
+ 0,
8527
+ 0,
8528
+ 0,
8529
+ 0,
8530
+ 0,
8531
+ 0,
8532
+ 0,
8533
+ 0,
8534
+ 0,
8535
+ 24,
8536
+ 17,
8537
+ 17
8538
+ ]), track.av1C, track.colr);
8539
+ }
8274
8540
  }, {
8275
8541
  key: "avc1hev1",
8276
8542
  value: function avc1hev1(track) {
@@ -8641,6 +8907,53 @@
8641
8907
  )));
8642
8908
  return esds2;
8643
8909
  }
8910
+ }, {
8911
+ key: "opus",
8912
+ value: function opus(track) {
8913
+ var opusAudioDescription = new Uint8Array([
8914
+ 0,
8915
+ 0,
8916
+ 0,
8917
+ 0,
8918
+ 0,
8919
+ 0,
8920
+ 0,
8921
+ 1,
8922
+ 0,
8923
+ 0,
8924
+ 0,
8925
+ 0,
8926
+ 0,
8927
+ 0,
8928
+ 0,
8929
+ 0,
8930
+ 0,
8931
+ track.channelCount,
8932
+ 0,
8933
+ 16,
8934
+ 0,
8935
+ 0,
8936
+ 0,
8937
+ 0,
8938
+ track.sampleRate >> 8 & 255,
8939
+ track.sampleRate & 255,
8940
+ 0,
8941
+ 0
8942
+ ]);
8943
+ var opusSpecificConfig = track.config.length ? MP42.dOps(track) : [];
8944
+ return MP42.box(MP42.types.Opus, opusAudioDescription, opusSpecificConfig);
8945
+ }
8946
+ }, {
8947
+ key: "dOps",
8948
+ value: function dOps(track) {
8949
+ if (track.config) {
8950
+ track.config[4] = track.sampleRate >>> 24 & 255;
8951
+ track.config[5] = track.sampleRate >>> 16 & 255;
8952
+ track.config[6] = track.sampleRate >>> 8 & 255;
8953
+ track.config[7] = track.sampleRate & 255;
8954
+ return MP42.box(MP42.types.dOps, track.config);
8955
+ }
8956
+ }
8644
8957
  }, {
8645
8958
  key: "mvex",
8646
8959
  value: function mvex(tracks) {
@@ -9243,7 +9556,7 @@
9243
9556
  }]);
9244
9557
  return MP42;
9245
9558
  }();
9246
- _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) {
9559
+ _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) {
9247
9560
  p[c] = [c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2), c.charCodeAt(3)];
9248
9561
  return p;
9249
9562
  }, /* @__PURE__ */ Object.create(null)));
@@ -9578,30 +9891,46 @@
9578
9891
  };
9579
9892
  }
9580
9893
  var samples = track.samples;
9894
+ var isAV01 = /av01/.test(track.codec);
9581
9895
  var mdatSize = 0;
9582
- samples.forEach(function(s) {
9583
- mdatSize += s.units.reduce(function(t, c) {
9584
- return t + c.byteLength;
9585
- }, 0);
9586
- mdatSize += s.units.length * 4;
9587
- });
9588
- var mdata = new Uint8Array(mdatSize);
9589
- var mdatView = new DataView(mdata.buffer);
9590
- var _loop = function _loop2(_offset, _sample) {
9591
- _sample = samples[i];
9592
- var sampleSize = 0;
9593
- _sample.units.forEach(function(u) {
9594
- mdatView.setUint32(_offset, u.byteLength);
9595
- _offset += 4;
9596
- mdata.set(u, _offset);
9597
- _offset += u.byteLength;
9598
- sampleSize += 4 + u.byteLength;
9896
+ if (isAV01) {
9897
+ samples.forEach(function(s) {
9898
+ mdatSize += s.data.byteLength;
9899
+ });
9900
+ } else {
9901
+ samples.forEach(function(s) {
9902
+ mdatSize += s.units.reduce(function(t, c) {
9903
+ return t + c.byteLength;
9904
+ }, 0);
9905
+ mdatSize += s.units.length * 4;
9599
9906
  });
9600
- _sample.size = sampleSize;
9601
- offset = _offset, sample = _sample;
9602
- };
9603
- for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
9604
- _loop(offset, sample);
9907
+ }
9908
+ var mdata = new Uint8Array(mdatSize);
9909
+ if (isAV01) {
9910
+ for (var i = 0, l = samples.length, offset = 0, sample; i < l; i++) {
9911
+ sample = samples[i];
9912
+ mdata.set(sample.data, offset);
9913
+ sample.size = sample.data.byteLength;
9914
+ offset += sample.size;
9915
+ }
9916
+ } else {
9917
+ var mdatView = new DataView(mdata.buffer);
9918
+ var _loop = function _loop2(_offset2, _sample2) {
9919
+ _sample2 = samples[_i];
9920
+ var sampleSize = 0;
9921
+ _sample2.units.forEach(function(u) {
9922
+ mdatView.setUint32(_offset2, u.byteLength);
9923
+ _offset2 += 4;
9924
+ mdata.set(u, _offset2);
9925
+ _offset2 += u.byteLength;
9926
+ sampleSize += 4 + u.byteLength;
9927
+ });
9928
+ _sample2.size = sampleSize;
9929
+ _offset = _offset2, _sample = _sample2;
9930
+ };
9931
+ for (var _i = 0, _l = samples.length, _offset = 0, _sample; _i < _l; _i++) {
9932
+ _loop(_offset, _sample);
9933
+ }
9605
9934
  }
9606
9935
  var mdat = MP4.mdat(mdata);
9607
9936
  var moof = MP4.moof([track]);
@@ -9631,6 +9960,55 @@
9631
9960
  }]);
9632
9961
  return FMP4Remuxer2;
9633
9962
  }();
9963
+ var TransferCost = /* @__PURE__ */ function() {
9964
+ function TransferCost2() {
9965
+ _classCallCheck$4(this, TransferCost2);
9966
+ _defineProperty$3(this, "_ttfb", 0);
9967
+ _defineProperty$3(this, "_demuxStart", 0);
9968
+ _defineProperty$3(this, "_demuxEnd", 0);
9969
+ _defineProperty$3(this, "_demuxCost", 0);
9970
+ _defineProperty$3(this, "_remuxStart", 0);
9971
+ _defineProperty$3(this, "_remuxEnd", 0);
9972
+ _defineProperty$3(this, "_remuxCost", 0);
9973
+ _defineProperty$3(this, "_appendStart", 0);
9974
+ _defineProperty$3(this, "_appendEnd", 0);
9975
+ _defineProperty$3(this, "_appendCost", 0);
9976
+ }
9977
+ _createClass$4(TransferCost2, [{
9978
+ key: "set",
9979
+ value: function set(event, value) {
9980
+ this["_".concat(event)] = value;
9981
+ }
9982
+ }, {
9983
+ key: "start",
9984
+ value: function start(event) {
9985
+ this["_".concat(event, "Start")] = Date.now();
9986
+ }
9987
+ }, {
9988
+ key: "end",
9989
+ value: function end(event) {
9990
+ this["_".concat(event, "End")] = Date.now();
9991
+ this["_".concat(event, "Cost")] = this["_".concat(event, "Cost")] + (this["_".concat(event, "End")] - this["_".concat(event, "Start")]);
9992
+ }
9993
+ }, {
9994
+ key: "transferCost",
9995
+ get: function get() {
9996
+ return {
9997
+ ttfbCost: this._ttfb,
9998
+ demuxCost: this._demuxCost,
9999
+ remuxCost: this._remuxCost,
10000
+ appendCost: this._appendCost
10001
+ };
10002
+ }
10003
+ }]);
10004
+ return TransferCost2;
10005
+ }();
10006
+ var TRANSFER_EVENT = {
10007
+ TTFB: "ttfb",
10008
+ DEMUX: "demux",
10009
+ REMUX: "remux",
10010
+ APPEND: "append"
10011
+ };
9634
10012
  var logger$1 = new Logger$2("BufferService");
9635
10013
  var BufferService = /* @__PURE__ */ function() {
9636
10014
  function BufferService2(flv, softVideo) {
@@ -9718,7 +10096,8 @@
9718
10096
  this._contiguous = false;
9719
10097
  this._sourceCreated = false;
9720
10098
  this._initSegmentId = "";
9721
- case 11:
10099
+ this.resetSeamlessSwitchStats();
10100
+ case 12:
9722
10101
  case "end":
9723
10102
  return _context.stop();
9724
10103
  }
@@ -9729,6 +10108,15 @@
9729
10108
  }
9730
10109
  return reset;
9731
10110
  }()
10111
+ }, {
10112
+ key: "resetSeamlessSwitchStats",
10113
+ value: function resetSeamlessSwitchStats() {
10114
+ this.seamlessLoadingSwitch = null;
10115
+ this.seamlessLoadingSwitching = false;
10116
+ if (this._demuxer) {
10117
+ this._demuxer.seamlessLoadingSwitching = false;
10118
+ }
10119
+ }
9732
10120
  }, {
9733
10121
  key: "endOfStream",
9734
10122
  value: function() {
@@ -9834,32 +10222,56 @@
9834
10222
  key: "appendBuffer",
9835
10223
  value: function() {
9836
10224
  var _appendBuffer = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5(chunk) {
9837
- var demuxer, videoTrack, audioTrack, metadataTrack, videoExist, audioExist, duration, track, videoType, audioType, mse, newId, remuxResult, p;
10225
+ var _this = this;
10226
+ var switchingNoReset, demuxer, videoTrack, audioTrack, metadataTrack, idx, videoExist, audioExist, duration, track, videoType, audioType, mse, afterAppend, newId, remuxResult, p;
9838
10227
  return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
9839
10228
  while (1)
9840
10229
  switch (_context5.prev = _context5.next) {
9841
10230
  case 0:
10231
+ switchingNoReset = false;
9842
10232
  if (this._cachedBuffer) {
9843
10233
  chunk = concatUint8Array$1(this._cachedBuffer, chunk);
9844
10234
  this._cachedBuffer = null;
9845
10235
  }
9846
10236
  demuxer = this._demuxer;
9847
10237
  if (!(!chunk || !chunk.length || !demuxer)) {
9848
- _context5.next = 4;
10238
+ _context5.next = 5;
9849
10239
  break;
9850
10240
  }
9851
10241
  return _context5.abrupt("return");
9852
- case 4:
9853
- _context5.prev = 4;
9854
- demuxer.demuxAndFix(chunk, this._discontinuity, this._contiguous, this._demuxStartTime);
9855
- _context5.next = 11;
10242
+ case 5:
10243
+ _context5.prev = 5;
10244
+ this.flv._transferCost.start(TRANSFER_EVENT.DEMUX);
10245
+ demuxer.demuxAndFix(chunk, this.seamlessLoadingSwitching || this._discontinuity, this._contiguous, this._demuxStartTime, this.seamlessLoadingSwitching);
10246
+ this.seamlessLoadingSwitching = false;
10247
+ this.flv._transferCost.end(TRANSFER_EVENT.DEMUX);
10248
+ _context5.next = 15;
9856
10249
  break;
9857
- case 8:
9858
- _context5.prev = 8;
9859
- _context5.t0 = _context5["catch"](4);
10250
+ case 12:
10251
+ _context5.prev = 12;
10252
+ _context5.t0 = _context5["catch"](5);
9860
10253
  throw new StreamingError(ERR.DEMUX, ERR.SUB_TYPES.FLV, _context5.t0);
9861
- case 11:
10254
+ case 15:
9862
10255
  videoTrack = demuxer.videoTrack, audioTrack = demuxer.audioTrack, metadataTrack = demuxer.metadataTrack;
10256
+ if (!this.seamlessLoadingSwitch) {
10257
+ _context5.next = 25;
10258
+ break;
10259
+ }
10260
+ idx = videoTrack.samples.findIndex(function(sample) {
10261
+ return sample.originDts === videoTrack.lastKeyFrameDts;
10262
+ });
10263
+ if (!(idx >= 0)) {
10264
+ _context5.next = 25;
10265
+ break;
10266
+ }
10267
+ videoTrack.samples.splice(idx);
10268
+ _context5.next = 22;
10269
+ return this.seamlessLoadingSwitch();
10270
+ case 22:
10271
+ this.seamlessLoadingSwitch = null;
10272
+ chunk = null;
10273
+ switchingNoReset = true;
10274
+ case 25:
9863
10275
  videoExist = videoTrack.exist();
9864
10276
  audioExist = audioTrack.exist();
9865
10277
  if (this._opts.onlyAudio) {
@@ -9871,7 +10283,7 @@
9871
10283
  audioTrack.present = false;
9872
10284
  }
9873
10285
  if (!(!videoExist && videoTrack.present || !audioExist && audioTrack.present)) {
9874
- _context5.next = 29;
10286
+ _context5.next = 42;
9875
10287
  break;
9876
10288
  }
9877
10289
  duration = 0;
@@ -9880,7 +10292,7 @@
9880
10292
  duration = (track.samples[track.samples.length - 1].originPts - track.samples[0].originPts) / track.timescale * 1e3;
9881
10293
  }
9882
10294
  if (!(duration > this._opts.analyzeDuration)) {
9883
- _context5.next = 27;
10295
+ _context5.next = 40;
9884
10296
  break;
9885
10297
  }
9886
10298
  logger$1.warn("analyze duration exceeded, ".concat(duration, "ms"), track);
@@ -9889,19 +10301,28 @@
9889
10301
  this.flv.emit(EVENT.ANALYZE_DURATION_EXCEEDED, {
9890
10302
  duration
9891
10303
  });
9892
- _context5.next = 29;
10304
+ _context5.next = 42;
9893
10305
  break;
9894
- case 27:
10306
+ case 40:
9895
10307
  this._cachedBuffer = chunk;
9896
10308
  return _context5.abrupt("return");
9897
- case 29:
10309
+ case 42:
9898
10310
  videoType = videoTrack.type;
9899
10311
  audioType = audioTrack.type;
9900
10312
  this._fireEvents(videoTrack, audioTrack, metadataTrack);
9901
- this._discontinuity = false;
9902
- this._contiguous = true;
9903
- this._demuxStartTime = 0;
10313
+ if (!switchingNoReset) {
10314
+ this._discontinuity = false;
10315
+ this._contiguous = true;
10316
+ this._demuxStartTime = 0;
10317
+ }
9904
10318
  mse = this._mse;
10319
+ afterAppend = function afterAppend2() {
10320
+ var _this$flv;
10321
+ if ((_this$flv = _this.flv) !== null && _this$flv !== void 0 && _this$flv.emit) {
10322
+ var _this$flv2;
10323
+ (_this$flv2 = _this.flv) === null || _this$flv2 === void 0 ? void 0 : _this$flv2.emit(EVENT.APPEND_BUFFER, {});
10324
+ }
10325
+ };
9905
10326
  this.flv.emit(EVENT.DEMUXED_TRACK, {
9906
10327
  videoTrack
9907
10328
  });
@@ -9912,16 +10333,16 @@
9912
10333
  this._emitMetaParsedEvent(videoTrack, audioTrack);
9913
10334
  }
9914
10335
  if (!mse) {
9915
- _context5.next = 66;
10336
+ _context5.next = 81;
9916
10337
  break;
9917
10338
  }
9918
10339
  if (this._sourceCreated) {
9919
- _context5.next = 47;
10340
+ _context5.next = 59;
9920
10341
  break;
9921
10342
  }
9922
- _context5.next = 43;
10343
+ _context5.next = 55;
9923
10344
  return mse.open();
9924
- case 43:
10345
+ case 55:
9925
10346
  if (videoExist) {
9926
10347
  logger$1.log("codec: video/mp4;codecs=".concat(videoTrack.codec));
9927
10348
  mse.createSource(videoType, "video/mp4;codecs=".concat(videoTrack.codec));
@@ -9932,26 +10353,28 @@
9932
10353
  }
9933
10354
  this._sourceCreated = true;
9934
10355
  this.flv.emit(EVENT.SOURCEBUFFER_CREATED);
9935
- case 47:
9936
- _context5.prev = 47;
10356
+ case 59:
10357
+ _context5.prev = 59;
9937
10358
  if (this._needInitSegment && !this._opts.mseLowLatency) {
9938
10359
  videoTrack.duration = this._opts.durationForMSELowLatencyOff * videoTrack.timescale;
9939
10360
  audioTrack.duration = this._opts.durationForMSELowLatencyOff * audioExist.timescale;
9940
10361
  }
10362
+ this.flv._transferCost.start(TRANSFER_EVENT.REMUX);
9941
10363
  remuxResult = this._remuxer.remux(this._needInitSegment);
9942
- _context5.next = 55;
10364
+ this.flv._transferCost.end(TRANSFER_EVENT.REMUX);
10365
+ _context5.next = 69;
9943
10366
  break;
9944
- case 52:
9945
- _context5.prev = 52;
9946
- _context5.t1 = _context5["catch"](47);
10367
+ case 66:
10368
+ _context5.prev = 66;
10369
+ _context5.t1 = _context5["catch"](59);
9947
10370
  throw new StreamingError(ERR.REMUX, ERR.SUB_TYPES.FMP4, _context5.t1);
9948
- case 55:
10371
+ case 69:
9949
10372
  if (!(this._needInitSegment && !remuxResult.videoInitSegment && !remuxResult.audioInitSegment)) {
9950
- _context5.next = 57;
10373
+ _context5.next = 71;
9951
10374
  break;
9952
10375
  }
9953
10376
  return _context5.abrupt("return");
9954
- case 57:
10377
+ case 71:
9955
10378
  this._needInitSegment = false;
9956
10379
  p = [];
9957
10380
  if (remuxResult.videoInitSegment)
@@ -9962,16 +10385,21 @@
9962
10385
  p.push(mse.append(videoType, remuxResult.videoSegment));
9963
10386
  if (remuxResult.audioSegment)
9964
10387
  p.push(mse.append(audioType, remuxResult.audioSegment));
9965
- return _context5.abrupt("return", Promise.all(p));
9966
- case 66:
10388
+ this.flv._transferCost.start(TRANSFER_EVENT.APPEND);
10389
+ return _context5.abrupt("return", Promise.all(p).then(afterAppend).then(function() {
10390
+ _this.flv._transferCost.end(TRANSFER_EVENT.APPEND);
10391
+ afterAppend();
10392
+ }));
10393
+ case 81:
9967
10394
  if (this._softVideo) {
9968
10395
  this._softVideo.appendBuffer(videoTrack, audioTrack);
10396
+ afterAppend();
9969
10397
  }
9970
- case 67:
10398
+ case 82:
9971
10399
  case "end":
9972
10400
  return _context5.stop();
9973
10401
  }
9974
- }, _callee5, this, [[4, 8], [47, 52]]);
10402
+ }, _callee5, this, [[5, 12], [59, 66]]);
9975
10403
  }));
9976
10404
  function appendBuffer(_x2) {
9977
10405
  return _appendBuffer.apply(this, arguments);
@@ -9982,7 +10410,7 @@
9982
10410
  key: "evictBuffer",
9983
10411
  value: function() {
9984
10412
  var _evictBuffer = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(bufferBehind) {
9985
- var _this = this;
10413
+ var _this2 = this;
9986
10414
  var media, currentTime, removeEnd, start;
9987
10415
  return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
9988
10416
  while (1)
@@ -10011,7 +10439,7 @@
10011
10439
  return _context6.abrupt("return");
10012
10440
  case 10:
10013
10441
  return _context6.abrupt("return", this._mse.clearBuffer(0, removeEnd).then(function() {
10014
- return _this.flv.emit(EVENT.REMOVE_BUFFER, {
10442
+ return _this2.flv.emit(EVENT.REMOVE_BUFFER, {
10015
10443
  removeEnd
10016
10444
  });
10017
10445
  }));
@@ -10061,16 +10489,16 @@
10061
10489
  }, {
10062
10490
  key: "_fireEvents",
10063
10491
  value: function _fireEvents(videoTrack, audioTrack, metadataTrack) {
10064
- var _this2 = this;
10065
- logger$1.debug(videoTrack.samples, audioTrack.samples);
10492
+ var _this3 = this;
10493
+ logger$1.debug("videoTrack samples count: ".concat(videoTrack.samples.length, ", audioTrack samples count: ").concat(audioTrack.samples.length));
10066
10494
  metadataTrack.flvScriptSamples.forEach(function(sample) {
10067
- _this2.flv.emit(EVENT.FLV_SCRIPT_DATA, sample);
10495
+ _this3.flv.emit(EVENT.FLV_SCRIPT_DATA, sample);
10068
10496
  logger$1.debug("flvScriptData", sample);
10069
10497
  });
10070
10498
  videoTrack.samples.forEach(function(sample) {
10071
10499
  if (sample.keyframe) {
10072
- _this2.flv.emit(EVENT.KEYFRAME, {
10073
- pts: sample.pts
10500
+ _this3.flv.emit(EVENT.KEYFRAME, {
10501
+ pts: sample.originPts
10074
10502
  });
10075
10503
  }
10076
10504
  });
@@ -10088,7 +10516,7 @@
10088
10516
  break;
10089
10517
  }
10090
10518
  if (type)
10091
- _this2.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10519
+ _this3.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10092
10520
  type
10093
10521
  }));
10094
10522
  logger$1.warn("video exception", warn);
@@ -10107,13 +10535,13 @@
10107
10535
  break;
10108
10536
  }
10109
10537
  if (type)
10110
- _this2.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10538
+ _this3.flv.emit(EVENT.STREAM_EXCEPTION, _objectSpread2$2(_objectSpread2$2({}, warn), {}, {
10111
10539
  type
10112
10540
  }));
10113
10541
  logger$1.warn("audio exception", warn);
10114
10542
  });
10115
10543
  metadataTrack.seiSamples.forEach(function(sei) {
10116
- _this2.flv.emit(EVENT.SEI, _objectSpread2$2(_objectSpread2$2({}, sei), {}, {
10544
+ _this3.flv.emit(EVENT.SEI, _objectSpread2$2(_objectSpread2$2({}, sei), {}, {
10117
10545
  sei: {
10118
10546
  code: sei.data.type,
10119
10547
  content: sei.data.payload,
@@ -10148,7 +10576,8 @@
10148
10576
  durationForMSELowLatencyOff: 6,
10149
10577
  chunkCountForSpeed: 50,
10150
10578
  skipChunkSize: 1e3,
10151
- longtimeNoReceived: 3e3
10579
+ longtimeNoReceived: 3e3,
10580
+ enableStartGapJump: true
10152
10581
  }, opts);
10153
10582
  if (ret.isLive) {
10154
10583
  if (ret.preloadTime) {
@@ -10216,7 +10645,7 @@
10216
10645
  _defineProperty$3(_assertThisInitialized$3(_this), "_acceptRanges", true);
10217
10646
  _defineProperty$3(_assertThisInitialized$3(_this), "_onProgress", /* @__PURE__ */ function() {
10218
10647
  var _ref2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee(chunk, done, _ref, response) {
10219
- var startTime, endTime, st, firstByteTime, _this$_mediaLoader, headers, _this$_bufferService, remaining, maxReaderInterval;
10648
+ var startTime, endTime, st, firstByteTime, _this$_mediaLoader, headers, elapsed, _this$_bufferService, remaining, maxReaderInterval;
10220
10649
  return _regeneratorRuntime$1().wrap(function _callee$(_context) {
10221
10650
  while (1)
10222
10651
  switch (_context.prev = _context.next) {
@@ -10224,7 +10653,7 @@
10224
10653
  startTime = _ref.startTime, endTime = _ref.endTime, st = _ref.st, firstByteTime = _ref.firstByteTime;
10225
10654
  _this._loading = !done;
10226
10655
  if (_this._firstProgressEmit) {
10227
- _context.next = 11;
10656
+ _context.next = 13;
10228
10657
  break;
10229
10658
  }
10230
10659
  if (_this.media) {
@@ -10235,49 +10664,51 @@
10235
10664
  return _context.abrupt("return");
10236
10665
  case 6:
10237
10666
  headers = response.headers;
10667
+ elapsed = st ? firstByteTime - st : endTime - startTime;
10238
10668
  _this.emit(EVENT.TTFB, {
10239
10669
  url: _this._opts.url,
10240
10670
  responseUrl: response.url,
10241
- elapsed: st ? firstByteTime - st : endTime - startTime
10671
+ elapsed
10242
10672
  });
10243
10673
  _this.emit(EVENT.LOAD_RESPONSE_HEADERS, {
10244
10674
  headers
10245
10675
  });
10676
+ _this._transferCost.set(TRANSFER_EVENT.TTFB, elapsed);
10246
10677
  _this._acceptRanges = !!(headers !== null && headers !== void 0 && headers.get("Accept-Ranges")) || !!(headers !== null && headers !== void 0 && headers.get("Content-Range"));
10247
10678
  _this._firstProgressEmit = true;
10248
- case 11:
10679
+ case 13:
10249
10680
  if (_this._bufferService) {
10250
- _context.next = 13;
10681
+ _context.next = 15;
10251
10682
  break;
10252
10683
  }
10253
10684
  return _context.abrupt("return");
10254
- case 13:
10685
+ case 15:
10255
10686
  clearTimeout(_this._maxChunkWaitTimer);
10256
10687
  _this._bandwidthService.addChunkRecord(chunk === null || chunk === void 0 ? void 0 : chunk.byteLength, endTime - startTime);
10257
- _context.prev = 15;
10258
- _context.next = 18;
10688
+ _context.prev = 17;
10689
+ _context.next = 20;
10259
10690
  return _this._bufferService.appendBuffer(chunk);
10260
- case 18:
10691
+ case 20:
10261
10692
  (_this$_bufferService = _this._bufferService) === null || _this$_bufferService === void 0 ? void 0 : _this$_bufferService.evictBuffer(_this._opts.bufferBehind);
10262
- _context.next = 31;
10693
+ _context.next = 33;
10263
10694
  break;
10264
- case 21:
10265
- _context.prev = 21;
10266
- _context.t0 = _context["catch"](15);
10695
+ case 23:
10696
+ _context.prev = 23;
10697
+ _context.t0 = _context["catch"](17);
10267
10698
  if (!(!_this.isLive && _this._bufferService.isFull())) {
10268
- _context.next = 30;
10699
+ _context.next = 32;
10269
10700
  break;
10270
10701
  }
10271
- _context.next = 26;
10702
+ _context.next = 28;
10272
10703
  return _this._mediaLoader.cancel();
10273
- case 26:
10704
+ case 28:
10274
10705
  _this._loading = false;
10275
10706
  remaining = _this.bufferInfo().remaining;
10276
10707
  _this._opts.preloadTime = parseInt(remaining) / 2;
10277
10708
  return _context.abrupt("return");
10278
- case 30:
10709
+ case 32:
10279
10710
  return _context.abrupt("return", _this._emitError(StreamingError.create(_context.t0)));
10280
- case 31:
10711
+ case 33:
10281
10712
  if (_this._urlSwitching) {
10282
10713
  _this._urlSwitching = false;
10283
10714
  _this.emit(EVENT.SWITCH_URL_SUCCESS, {
@@ -10289,7 +10720,7 @@
10289
10720
  _this._tick();
10290
10721
  }
10291
10722
  if (!(done && !_this.media.seeking)) {
10292
- _context.next = 38;
10723
+ _context.next = 40;
10293
10724
  break;
10294
10725
  }
10295
10726
  _this.emit(EVENT.LOAD_COMPLETE);
@@ -10298,13 +10729,13 @@
10298
10729
  _this._end();
10299
10730
  }
10300
10731
  return _context.abrupt("return");
10301
- case 38:
10732
+ case 40:
10302
10733
  if (_this.isLive) {
10303
- _context.next = 40;
10734
+ _context.next = 42;
10304
10735
  break;
10305
10736
  }
10306
10737
  return _context.abrupt("return");
10307
- case 40:
10738
+ case 42:
10308
10739
  maxReaderInterval = _this._opts.maxReaderInterval;
10309
10740
  if (maxReaderInterval && _this._firstProgressEmit) {
10310
10741
  clearTimeout(_this._maxChunkWaitTimer);
@@ -10318,11 +10749,11 @@
10318
10749
  _this._end();
10319
10750
  }, maxReaderInterval);
10320
10751
  }
10321
- case 42:
10752
+ case 44:
10322
10753
  case "end":
10323
10754
  return _context.stop();
10324
10755
  }
10325
- }, _callee, null, [[15, 21]]);
10756
+ }, _callee, null, [[17, 23]]);
10326
10757
  }));
10327
10758
  return function(_x, _x2, _x3, _x4) {
10328
10759
  return _ref2.apply(this, arguments);
@@ -10355,19 +10786,19 @@
10355
10786
  if (bufferEnd < MAX_HOLE || !media.readyState)
10356
10787
  return;
10357
10788
  var opts = _this._opts;
10358
- if (isMediaPlaying(media)) {
10789
+ if (isMediaPlaying(media) && media.currentTime) {
10359
10790
  if (_this._gapService) {
10360
10791
  _this._gapService.do(media, opts.maxJumpDistance, _this.isLive, 3);
10361
10792
  }
10362
10793
  } else {
10363
- if (!media.currentTime && _this._gapService) {
10794
+ if (!media.currentTime && _this._gapService && opts.enableStartGapJump) {
10364
10795
  var gapJump = _this._opts.mseLowLatency || _this._opts.mseLowLatency === false && _this.bufferInfo(MAX_START_GAP).nextStart;
10365
10796
  if (gapJump) {
10366
10797
  _this._gapService.do(media, opts.maxJumpDistance, _this.isLive, 3);
10367
10798
  }
10368
10799
  return;
10369
10800
  }
10370
- if (opts.isLive && media.readyState === 4 && bufferEnd > opts.disconnectTime) {
10801
+ if (opts.isLive && media.readyState === 4 && bufferEnd - media.currentTime > opts.disconnectTime) {
10371
10802
  _this.disconnect();
10372
10803
  }
10373
10804
  }
@@ -10516,6 +10947,7 @@
10516
10947
  responseType: "arraybuffer"
10517
10948
  }));
10518
10949
  _this._disconnectRetryCount = _this._opts.disconnectRetryCount;
10950
+ _this._transferCost = new TransferCost();
10519
10951
  _this._bufferService = new BufferService(_assertThisInitialized$3(_this), _this._opts.softDecode ? _this.media : void 0, _this._opts);
10520
10952
  _this._seiService = new SeiService(_assertThisInitialized$3(_this));
10521
10953
  _this._bandwidthService = new BandwidthService({
@@ -10539,7 +10971,7 @@
10539
10971
  _createClass$4(Flv2, [{
10540
10972
  key: "version",
10541
10973
  get: function get() {
10542
- return "3.0.19-rc.0";
10974
+ return "3.0.21-rc.3";
10543
10975
  }
10544
10976
  }, {
10545
10977
  key: "isLive",
@@ -10655,9 +11087,9 @@
10655
11087
  return this._clear();
10656
11088
  case 8:
10657
11089
  setTimeout(function() {
11090
+ _this2._seamlessSwitching = true;
10658
11091
  _this2._loadData(_this2._opts.url);
10659
11092
  _this2._bufferService.seamlessSwitch();
10660
- _this2._seamlessSwitching = true;
10661
11093
  });
10662
11094
  _context5.next = 13;
10663
11095
  break;
@@ -10681,50 +11113,82 @@
10681
11113
  }, {
10682
11114
  key: "disconnect",
10683
11115
  value: function disconnect() {
11116
+ var _this$_bufferService4;
10684
11117
  logger.debug("disconnect!");
11118
+ (_this$_bufferService4 = this._bufferService) === null || _this$_bufferService4 === void 0 ? void 0 : _this$_bufferService4.resetSeamlessSwitchStats();
10685
11119
  return this._clear();
10686
11120
  }
10687
11121
  }, {
10688
11122
  key: "switchURL",
10689
11123
  value: function() {
10690
- var _switchURL = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(url, seamless) {
11124
+ var _switchURL = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7(url, seamless) {
10691
11125
  var _this3 = this;
10692
- return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
11126
+ return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
10693
11127
  while (1)
10694
- switch (_context6.prev = _context6.next) {
11128
+ switch (_context7.prev = _context7.next) {
10695
11129
  case 0:
10696
11130
  if (this._bufferService) {
10697
- _context6.next = 2;
11131
+ _context7.next = 2;
10698
11132
  break;
10699
11133
  }
10700
- return _context6.abrupt("return");
11134
+ return _context7.abrupt("return");
10701
11135
  case 2:
10702
11136
  this._resetDisconnectCount();
11137
+ if (!(this._loading && seamless)) {
11138
+ _context7.next = 6;
11139
+ break;
11140
+ }
11141
+ this._bufferService.seamlessLoadingSwitch = /* @__PURE__ */ function() {
11142
+ var _ref5 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(pts) {
11143
+ return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
11144
+ while (1)
11145
+ switch (_context6.prev = _context6.next) {
11146
+ case 0:
11147
+ _context6.next = 2;
11148
+ return _this3._clear();
11149
+ case 2:
11150
+ _this3._bufferService.seamlessLoadingSwitching = true;
11151
+ _this3._urlSwitching = true;
11152
+ _this3._seamlessSwitching = true;
11153
+ _this3._bufferService.seamlessSwitch();
11154
+ _this3._loadData(url);
11155
+ case 7:
11156
+ case "end":
11157
+ return _context6.stop();
11158
+ }
11159
+ }, _callee6);
11160
+ }));
11161
+ return function(_x8) {
11162
+ return _ref5.apply(this, arguments);
11163
+ };
11164
+ }();
11165
+ return _context7.abrupt("return");
11166
+ case 6:
10703
11167
  if (!(!seamless || !this._opts.isLive)) {
10704
- _context6.next = 8;
11168
+ _context7.next = 11;
10705
11169
  break;
10706
11170
  }
10707
- _context6.next = 6;
11171
+ _context7.next = 9;
10708
11172
  return this.load(url);
10709
- case 6:
11173
+ case 9:
10710
11174
  this._urlSwitching = true;
10711
- return _context6.abrupt("return", this.media.play(true).catch(function() {
11175
+ return _context7.abrupt("return", this.media.play(true).catch(function() {
10712
11176
  }));
10713
- case 8:
10714
- _context6.next = 10;
11177
+ case 11:
11178
+ _context7.next = 13;
10715
11179
  return this._clear();
10716
- case 10:
11180
+ case 13:
10717
11181
  setTimeout(function() {
10718
11182
  _this3._urlSwitching = true;
10719
11183
  _this3._seamlessSwitching = true;
10720
11184
  _this3._loadData(url);
10721
11185
  _this3._bufferService.seamlessSwitch();
10722
11186
  });
10723
- case 11:
11187
+ case 14:
10724
11188
  case "end":
10725
- return _context6.stop();
11189
+ return _context7.stop();
10726
11190
  }
10727
- }, _callee6, this);
11191
+ }, _callee7, this);
10728
11192
  }));
10729
11193
  function switchURL(_x6, _x7) {
10730
11194
  return _switchURL.apply(this, arguments);
@@ -10734,16 +11198,16 @@
10734
11198
  }, {
10735
11199
  key: "destroy",
10736
11200
  value: function() {
10737
- var _destroy = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7() {
10738
- return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
11201
+ var _destroy = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8() {
11202
+ return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
10739
11203
  while (1)
10740
- switch (_context7.prev = _context7.next) {
11204
+ switch (_context8.prev = _context8.next) {
10741
11205
  case 0:
10742
11206
  if (this.media) {
10743
- _context7.next = 2;
11207
+ _context8.next = 2;
10744
11208
  break;
10745
11209
  }
10746
- return _context7.abrupt("return");
11210
+ return _context8.abrupt("return");
10747
11211
  case 2:
10748
11212
  this.removeAllListeners();
10749
11213
  this._seiService.reset();
@@ -10753,16 +11217,16 @@
10753
11217
  this.media.removeEventListener("timeupdate", this._onTimeupdate);
10754
11218
  this.media.removeEventListener("waiting", this._onWaiting);
10755
11219
  this.media.removeEventListener("progress", this._onBufferUpdate);
10756
- _context7.next = 12;
11220
+ _context8.next = 12;
10757
11221
  return Promise.all([this._clear(), this._bufferService.destroy()]);
10758
11222
  case 12:
10759
11223
  this.media = null;
10760
11224
  this._bufferService = null;
10761
11225
  case 14:
10762
11226
  case "end":
10763
- return _context7.stop();
11227
+ return _context8.stop();
10764
11228
  }
10765
- }, _callee7, this);
11229
+ }, _callee8, this);
10766
11230
  }));
10767
11231
  function destroy() {
10768
11232
  return _destroy.apply(this, arguments);
@@ -10791,26 +11255,26 @@
10791
11255
  }, {
10792
11256
  key: "_reset",
10793
11257
  value: function() {
10794
- var _reset2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8() {
10795
- var reuseMse, _args8 = arguments;
10796
- return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
11258
+ var _reset2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee9() {
11259
+ var reuseMse, _args9 = arguments;
11260
+ return _regeneratorRuntime$1().wrap(function _callee9$(_context9) {
10797
11261
  while (1)
10798
- switch (_context8.prev = _context8.next) {
11262
+ switch (_context9.prev = _context9.next) {
10799
11263
  case 0:
10800
- reuseMse = _args8.length > 0 && _args8[0] !== void 0 ? _args8[0] : false;
11264
+ reuseMse = _args9.length > 0 && _args9[0] !== void 0 ? _args9[0] : false;
10801
11265
  this._seiService.reset();
10802
11266
  this._bandwidthService.reset();
10803
11267
  this._stats.reset();
10804
- _context8.next = 6;
11268
+ _context9.next = 6;
10805
11269
  return this._clear();
10806
11270
  case 6:
10807
- _context8.next = 8;
11271
+ _context9.next = 8;
10808
11272
  return this._bufferService.reset(reuseMse);
10809
11273
  case 8:
10810
11274
  case "end":
10811
- return _context8.stop();
11275
+ return _context9.stop();
10812
11276
  }
10813
- }, _callee8, this);
11277
+ }, _callee9, this);
10814
11278
  }));
10815
11279
  function _reset() {
10816
11280
  return _reset2.apply(this, arguments);
@@ -10820,17 +11284,17 @@
10820
11284
  }, {
10821
11285
  key: "_loadData",
10822
11286
  value: function() {
10823
- var _loadData2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee9(url, range) {
11287
+ var _loadData2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee10(url, range) {
10824
11288
  var finnalUrl;
10825
- return _regeneratorRuntime$1().wrap(function _callee9$(_context9) {
11289
+ return _regeneratorRuntime$1().wrap(function _callee10$(_context10) {
10826
11290
  while (1)
10827
- switch (_context9.prev = _context9.next) {
11291
+ switch (_context10.prev = _context10.next) {
10828
11292
  case 0:
10829
11293
  if (url)
10830
11294
  this._opts.url = url;
10831
11295
  finnalUrl = url = this._opts.url;
10832
11296
  if (url) {
10833
- _context9.next = 4;
11297
+ _context10.next = 4;
10834
11298
  break;
10835
11299
  }
10836
11300
  throw new Error("Source url is missing");
@@ -10845,34 +11309,34 @@
10845
11309
  });
10846
11310
  logger.debug("load data, loading:", this._loading, finnalUrl);
10847
11311
  if (!this._loading) {
10848
- _context9.next = 11;
11312
+ _context10.next = 11;
10849
11313
  break;
10850
11314
  }
10851
- _context9.next = 11;
11315
+ _context10.next = 11;
10852
11316
  return this._mediaLoader.cancel();
10853
11317
  case 11:
10854
11318
  this._loading = true;
10855
- _context9.prev = 12;
10856
- _context9.next = 15;
11319
+ _context10.prev = 12;
11320
+ _context10.next = 15;
10857
11321
  return this._mediaLoader.load({
10858
11322
  url: finnalUrl,
10859
11323
  range
10860
11324
  });
10861
11325
  case 15:
10862
- _context9.next = 21;
11326
+ _context10.next = 21;
10863
11327
  break;
10864
11328
  case 17:
10865
- _context9.prev = 17;
10866
- _context9.t0 = _context9["catch"](12);
11329
+ _context10.prev = 17;
11330
+ _context10.t0 = _context10["catch"](12);
10867
11331
  this._loading = false;
10868
- return _context9.abrupt("return", this._emitError(StreamingError.network(_context9.t0), false));
11332
+ return _context10.abrupt("return", this._emitError(StreamingError.network(_context10.t0), false));
10869
11333
  case 21:
10870
11334
  case "end":
10871
- return _context9.stop();
11335
+ return _context10.stop();
10872
11336
  }
10873
- }, _callee9, this, [[12, 17]]);
11337
+ }, _callee10, this, [[12, 17]]);
10874
11338
  }));
10875
- function _loadData(_x8, _x9) {
11339
+ function _loadData(_x9, _x10) {
10876
11340
  return _loadData2.apply(this, arguments);
10877
11341
  }
10878
11342
  return _loadData;
@@ -10880,16 +11344,16 @@
10880
11344
  }, {
10881
11345
  key: "_clear",
10882
11346
  value: function() {
10883
- var _clear2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee10() {
10884
- return _regeneratorRuntime$1().wrap(function _callee10$(_context10) {
11347
+ var _clear2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee11() {
11348
+ return _regeneratorRuntime$1().wrap(function _callee11$(_context11) {
10885
11349
  while (1)
10886
- switch (_context10.prev = _context10.next) {
11350
+ switch (_context11.prev = _context11.next) {
10887
11351
  case 0:
10888
11352
  if (!this._mediaLoader) {
10889
- _context10.next = 3;
11353
+ _context11.next = 3;
10890
11354
  break;
10891
11355
  }
10892
- _context10.next = 3;
11356
+ _context11.next = 3;
10893
11357
  return this._mediaLoader.cancel();
10894
11358
  case 3:
10895
11359
  clearTimeout(this._maxChunkWaitTimer);
@@ -10898,9 +11362,9 @@
10898
11362
  this._firstProgressEmit = false;
10899
11363
  case 7:
10900
11364
  case "end":
10901
- return _context10.stop();
11365
+ return _context11.stop();
10902
11366
  }
10903
- }, _callee10, this);
11367
+ }, _callee11, this);
10904
11368
  }));
10905
11369
  function _clear() {
10906
11370
  return _clear2.apply(this, arguments);
@@ -10987,9 +11451,13 @@
10987
11451
  _createClass$4(PluginExtension2, [{
10988
11452
  key: "_init",
10989
11453
  value: function _init() {
10990
- var _this$_opts2 = this._opts, media = _this$_opts2.media, preloadTime = _this$_opts2.preloadTime, innerDegrade = _this$_opts2.innerDegrade, decodeMode = _this$_opts2.decodeMode;
11454
+ var _this$_opts2 = this._opts, media = _this$_opts2.media, isLive = _this$_opts2.isLive, preloadTime = _this$_opts2.preloadTime, innerDegrade = _this$_opts2.innerDegrade, decodeMode = _this$_opts2.decodeMode;
10991
11455
  if (!media)
10992
11456
  return;
11457
+ if (!isLive && media.setPlayMode) {
11458
+ media.setPlayMode("VOD");
11459
+ return;
11460
+ }
10993
11461
  if (innerDegrade) {
10994
11462
  media.setAttribute("innerdegrade", innerDegrade);
10995
11463
  }
@@ -11027,6 +11495,7 @@
11027
11495
  args[_key] = arguments[_key];
11028
11496
  }
11029
11497
  _this = _super.call.apply(_super, [this].concat(args));
11498
+ _defineProperty$3(_assertThisInitialized$3(_this), "logger", logger);
11030
11499
  _defineProperty$3(_assertThisInitialized$3(_this), "flv", null);
11031
11500
  _defineProperty$3(_assertThisInitialized$3(_this), "pluginExtension", null);
11032
11501
  _defineProperty$3(_assertThisInitialized$3(_this), "getStats", function() {
@@ -11094,11 +11563,17 @@
11094
11563
  var _this$flv3;
11095
11564
  return (_this$flv3 = this.flv) === null || _this$flv3 === void 0 ? void 0 : _this$flv3.loader;
11096
11565
  }
11566
+ }, {
11567
+ key: "transferCost",
11568
+ get: function get() {
11569
+ return this.flv._transferCost.transferCost;
11570
+ }
11097
11571
  }, {
11098
11572
  key: "beforePlayerInit",
11099
11573
  value: function beforePlayerInit() {
11100
11574
  var _this2 = this;
11101
11575
  var config = this.player.config;
11576
+ var mediaElem = this.player.media || this.player.video;
11102
11577
  if (!config.url)
11103
11578
  return;
11104
11579
  if (this.flv)
@@ -11111,10 +11586,10 @@
11111
11586
  this.flv = new Flv(_objectSpread2$2({
11112
11587
  softDecode: this.softDecode,
11113
11588
  isLive: config.isLive,
11114
- media: this.player.video,
11589
+ media: mediaElem,
11115
11590
  preProcessUrl: function preProcessUrl(url, ext) {
11116
- var _this2$player$preProc, _this2$player;
11117
- return ((_this2$player$preProc = (_this2$player = _this2.player).preProcessUrl) === null || _this2$player$preProc === void 0 ? void 0 : _this2$player$preProc.call(_this2$player, url, ext)) || {
11591
+ var _this2$player, _this2$player$preProc;
11592
+ return ((_this2$player = _this2.player) === null || _this2$player === void 0 ? void 0 : (_this2$player$preProc = _this2$player.preProcessUrl) === null || _this2$player$preProc === void 0 ? void 0 : _this2$player$preProc.call(_this2$player, url, ext)) || {
11118
11593
  url,
11119
11594
  ext
11120
11595
  };
@@ -11133,7 +11608,8 @@
11133
11608
  }
11134
11609
  if (this.softDecode) {
11135
11610
  this.pluginExtension = new PluginExtension(_objectSpread2$2({
11136
- media: this.player.video
11611
+ media: this.player.video,
11612
+ isLive: config.isLive
11137
11613
  }, config.flv), this);
11138
11614
  this.player.forceDegradeToVideo = function() {
11139
11615
  var _this2$pluginExtensio;
@@ -11160,6 +11636,7 @@
11160
11636
  this._transCoreEvent(EVENT.LOAD_RETRY);
11161
11637
  this._transCoreEvent(EVENT.SOURCEBUFFER_CREATED);
11162
11638
  this._transCoreEvent(EVENT.ANALYZE_DURATION_EXCEEDED);
11639
+ this._transCoreEvent(EVENT.APPEND_BUFFER);
11163
11640
  this._transCoreEvent(EVENT.REMOVE_BUFFER);
11164
11641
  this._transCoreEvent(EVENT.BUFFEREOS);
11165
11642
  this._transCoreEvent(EVENT.KEYFRAME);