@volcengine/veplayer-plugin 2.8.0 → 2.8.1-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.
@@ -478,6 +478,38 @@
478
478
  return false;
479
479
  }
480
480
  }
481
+ function _objectWithoutPropertiesLoose$1(source, excluded) {
482
+ if (source == null)
483
+ return {};
484
+ var target = {};
485
+ var sourceKeys = Object.keys(source);
486
+ var key, i;
487
+ for (i = 0; i < sourceKeys.length; i++) {
488
+ key = sourceKeys[i];
489
+ if (excluded.indexOf(key) >= 0)
490
+ continue;
491
+ target[key] = source[key];
492
+ }
493
+ return target;
494
+ }
495
+ function _objectWithoutProperties$1(source, excluded) {
496
+ if (source == null)
497
+ return {};
498
+ var target = _objectWithoutPropertiesLoose$1(source, excluded);
499
+ var key, i;
500
+ if (Object.getOwnPropertySymbols) {
501
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
502
+ for (i = 0; i < sourceSymbolKeys.length; i++) {
503
+ key = sourceSymbolKeys[i];
504
+ if (excluded.indexOf(key) >= 0)
505
+ continue;
506
+ if (!Object.prototype.propertyIsEnumerable.call(source, key))
507
+ continue;
508
+ target[key] = source[key];
509
+ }
510
+ }
511
+ return target;
512
+ }
481
513
  function _assertThisInitialized$1(self2) {
482
514
  if (self2 === void 0) {
483
515
  throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
@@ -4011,7 +4043,7 @@
4011
4043
  }]);
4012
4044
  return XhrLoader2;
4013
4045
  }(EventEmitter);
4014
- var _excluded = ["retry", "retryDelay", "onRetryError", "transformError"];
4046
+ var _excluded$1 = ["retry", "retryDelay", "onRetryError", "transformError"];
4015
4047
  var Task = /* @__PURE__ */ function() {
4016
4048
  function Task2(type, config) {
4017
4049
  _classCallCheck$1(this, Task2);
@@ -4031,7 +4063,7 @@
4031
4063
  key: "exec",
4032
4064
  value: function exec() {
4033
4065
  var _this = this;
4034
- var _this$_config = this._config, retry = _this$_config.retry, retryDelay = _this$_config.retryDelay, onRetryError = _this$_config.onRetryError, transformError = _this$_config.transformError, rest = _objectWithoutProperties(_this$_config, _excluded);
4066
+ var _this$_config = this._config, retry = _this$_config.retry, retryDelay = _this$_config.retryDelay, onRetryError = _this$_config.onRetryError, transformError = _this$_config.transformError, rest = _objectWithoutProperties(_this$_config, _excluded$1);
4035
4067
  var request = /* @__PURE__ */ function() {
4036
4068
  var _ref = _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee() {
4037
4069
  var response, error, isRetry;
@@ -4947,7 +4979,9 @@
4947
4979
  lib.parseRemoteCandidates = parser.parseRemoteCandidates;
4948
4980
  lib.parseImageAttributes = parser.parseImageAttributes;
4949
4981
  lib.parseSimulcastStreamList = parser.parseSimulcastStreamList;
4950
- function getOption(opts) {
4982
+ var _excluded = ["adaptiveJitterBuffer"];
4983
+ function getOption(options) {
4984
+ var _ref = options || {}, _ref$adaptiveJitterBu = _ref.adaptiveJitterBuffer, adaptiveJitterBuffer = _ref$adaptiveJitterBu === void 0 ? {} : _ref$adaptiveJitterBu, opts = _objectWithoutProperties$1(_ref, _excluded);
4951
4985
  return _objectSpread2$2({
4952
4986
  retryCount: 0,
4953
4987
  retryDelay: 1e3,
@@ -4963,6 +4997,7 @@
4963
4997
  connectionStateChangeTimeout: 5e3,
4964
4998
  enableNetworkQuality: false,
4965
4999
  hackCreateOfferIssue: false,
5000
+ progressiveSetDelay: false,
4966
5001
  networkQuality: {
4967
5002
  networkQos: {
4968
5003
  1: {
@@ -4993,9 +5028,14 @@
4993
5028
  }
4994
5029
  },
4995
5030
  enableAdaptiveJitterBuffer: false,
4996
- adaptiveJitterBuffer: {
4997
- networkWindow: 3
4998
- },
5031
+ adaptiveJitterBuffer: _objectSpread2$2({
5032
+ networkWindow: 3,
5033
+ windowMethod: "max",
5034
+ loopInterval: 500,
5035
+ maxAvSyncDelay: 400,
5036
+ maxJitterBufferDiff: 500,
5037
+ maxStep: 500
5038
+ }, adaptiveJitterBuffer),
4999
5039
  networkStrategy: {
5000
5040
  1: {
5001
5041
  "jitterBuffer": null
@@ -6444,6 +6484,12 @@
6444
6484
  if (stat.fecPacketsReceived !== void 0) {
6445
6485
  currentStats.fecPacketsReceived = stat.fecPacketsReceived;
6446
6486
  }
6487
+ if (stat.estimatedPlayoutTimestamp !== void 0) {
6488
+ currentStats.estimatedPlayoutTimestamp = stat.estimatedPlayoutTimestamp;
6489
+ }
6490
+ if (stat.totalSamplesDuration !== void 0) {
6491
+ currentStats.totalSamplesDuration = stat.totalSamplesDuration;
6492
+ }
6447
6493
  } else if (stat.type === "codec") {
6448
6494
  currentStats.recordSampleRate = stat.clockRate;
6449
6495
  if (stat.channels) {
@@ -6471,13 +6517,17 @@
6471
6517
  var statsInterval = diffNumber(oldStats, newStats, "timestamp");
6472
6518
  var packetsLostDiff = diffNumber(oldStats, newStats, "packetsLost");
6473
6519
  var jitterBufferDelay = Math.round(diffNumber(oldStats, newStats, "jitterBufferDelay") / diffNumber(oldStats, newStats, "jitterBufferEmittedCount") * 1e3);
6520
+ var packetsReceived = diffNumber(oldStats, newStats, "packetsReceived");
6474
6521
  return {
6475
- audioLossRate: +(packetsLostDiff / (diffNumber(oldStats, newStats, "packetsReceived") + packetsLostDiff)).toFixed(2),
6522
+ audioLossRate: +(packetsLostDiff / (packetsReceived + packetsLostDiff)).toFixed(2),
6476
6523
  receivedKBitrate: +(diffNumber(oldStats, newStats, "bytesReceived") * 8 / statsInterval).toFixed(2),
6477
6524
  statsInterval,
6478
6525
  rtt: newStats.rtt || 0,
6479
6526
  jitterBufferDelay,
6527
+ packetsReceived,
6480
6528
  numChannels: newStats.numChannels || 1,
6529
+ estimatedPlayoutTimestamp: newStats.estimatedPlayoutTimestamp,
6530
+ samplesDuration: Math.round(diffNumber(oldStats, newStats, "totalSamplesDuration") * 1e3),
6481
6531
  receivedSampleRate: diffNumber(oldStats, newStats, "totalSamplesReceived") / statsInterval,
6482
6532
  concealedSamples: Math.round(diffNumber(oldStats, newStats, "concealedSamples")),
6483
6533
  concealmentEvent: Math.round(diffNumber(oldStats, newStats, "concealmentEvents")),
@@ -6521,6 +6571,9 @@
6521
6571
  currentStats.width = stat.frameWidth;
6522
6572
  currentStats.height = stat.frameHeight;
6523
6573
  }
6574
+ if (stat.estimatedPlayoutTimestamp !== void 0) {
6575
+ currentStats.estimatedPlayoutTimestamp = stat.estimatedPlayoutTimestamp;
6576
+ }
6524
6577
  } else if (stat.type === "track" && stat.frameWidth !== void 0) {
6525
6578
  currentStats.width = stat.frameWidth;
6526
6579
  currentStats.height = stat.frameHeight;
@@ -6553,6 +6606,7 @@
6553
6606
  statsInterval,
6554
6607
  width: newStats.width || 0,
6555
6608
  height: newStats.height || 0,
6609
+ estimatedPlayoutTimestamp: newStats.estimatedPlayoutTimestamp,
6556
6610
  videoLossRate: +(packetsLostDiff / (diffNumber(oldStats, newStats, "packetsReceived") + packetsLostDiff)),
6557
6611
  receivedKBitrate: +(diffNumber(oldStats, newStats, "bytesReceived") * 8 / statsInterval).toFixed(2),
6558
6612
  decoderOutputFrameRate: Math.round(diffNumber(oldStats, newStats, "framesDecoded") * 1e3 / statsInterval),
@@ -6810,33 +6864,165 @@
6810
6864
  });
6811
6865
  });
6812
6866
  _defineProperty$2(_assertThisInitialized$1(_this), "_setDelay", function(delayHint) {
6813
- var videoDelaySync = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
6814
- var currentDelay = _this._getDelay();
6815
- delayHint = typeof delayHint === "number" && delayHint > 0 ? delayHint : null;
6816
- if (currentDelay === delayHint)
6817
- return;
6818
- try {
6819
- var videoReceiver = _this._videoTransceicer.receiver;
6820
- var audioReceiver = _this._audioTransceicer.receiver;
6867
+ if (_this._opts.progressiveSetDelay) {
6868
+ _this._startSetDelayLoop(delayHint);
6869
+ } else {
6870
+ var _this$_audioTransceic2;
6821
6871
  var key = [
6822
6872
  "playoutDelayHint",
6823
6873
  "jitterBufferDelayHint",
6824
6874
  "jitterBufferTarget"
6825
6875
  ].find(function(key2) {
6826
- return key2 in videoReceiver && key2 in audioReceiver;
6876
+ var _this$_audioTransceic, _this$_videoTransceic;
6877
+ return key2 in ((_this$_audioTransceic = _this._audioTransceicer) === null || _this$_audioTransceic === void 0 ? void 0 : _this$_audioTransceic.receiver) && key2 in ((_this$_videoTransceic = _this._videoTransceicer) === null || _this$_videoTransceic === void 0 ? void 0 : _this$_videoTransceic.receiver);
6827
6878
  });
6828
- if (key) {
6829
- audioReceiver[key] = delayHint;
6830
- if (!videoDelaySync) {
6831
- videoReceiver[key] = delayHint;
6832
- logger.log("set videoReceiver.".concat(key, " = ").concat(delayHint));
6833
- }
6834
- logger.log("set audioReceiver.".concat(key, " = ").concat(delayHint));
6835
- }
6836
- } catch (error) {
6837
- logger.error("set delay error", error);
6879
+ if (!key)
6880
+ return;
6881
+ delayHint = typeof delayHint === "number" && delayHint > 0 ? delayHint : null;
6882
+ if (((_this$_audioTransceic2 = _this._audioTransceicer) === null || _this$_audioTransceic2 === void 0 ? void 0 : _this$_audioTransceic2.receiver[key]) === delayHint)
6883
+ return;
6884
+ _this._audioTransceicer.receiver[key] = delayHint;
6885
+ _this._videoTransceicer.receiver[key] = delayHint;
6838
6886
  }
6839
6887
  });
6888
+ _defineProperty$2(_assertThisInitialized$1(_this), "_targetDelayHint", null);
6889
+ _defineProperty$2(_assertThisInitialized$1(_this), "_setDelayTimer", null);
6890
+ _defineProperty$2(_assertThisInitialized$1(_this), "_setDelayError", null);
6891
+ _defineProperty$2(_assertThisInitialized$1(_this), "_startSetDelayLoop", /* @__PURE__ */ function() {
6892
+ var _ref3 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee4(delayHint) {
6893
+ var key, preAudioStats, preVideoStats, _this$_opts$adaptiveJ, loopInterval, maxAvSyncDelay, maxJitterBufferDiff, maxStep, avDiffTooMuchCount;
6894
+ return _regeneratorRuntime$1().wrap(function _callee4$(_context4) {
6895
+ while (1)
6896
+ switch (_context4.prev = _context4.next) {
6897
+ case 0:
6898
+ key = [
6899
+ "playoutDelayHint",
6900
+ "jitterBufferDelayHint",
6901
+ "jitterBufferTarget"
6902
+ ].find(function(key2) {
6903
+ var _this$_audioTransceic3, _this$_videoTransceic2;
6904
+ return key2 in ((_this$_audioTransceic3 = _this._audioTransceicer) === null || _this$_audioTransceic3 === void 0 ? void 0 : _this$_audioTransceic3.receiver) && key2 in ((_this$_videoTransceic2 = _this._videoTransceicer) === null || _this$_videoTransceic2 === void 0 ? void 0 : _this$_videoTransceic2.receiver);
6905
+ });
6906
+ if (key) {
6907
+ _context4.next = 3;
6908
+ break;
6909
+ }
6910
+ return _context4.abrupt("return");
6911
+ case 3:
6912
+ delayHint = typeof delayHint === "number" && delayHint > 0 ? delayHint : null;
6913
+ if (!(_this._targetDelayHint === delayHint)) {
6914
+ _context4.next = 6;
6915
+ break;
6916
+ }
6917
+ return _context4.abrupt("return");
6918
+ case 6:
6919
+ _this._targetDelayHint = delayHint;
6920
+ if (!_this._setDelayTimer) {
6921
+ _context4.next = 9;
6922
+ break;
6923
+ }
6924
+ return _context4.abrupt("return");
6925
+ case 9:
6926
+ preAudioStats = null;
6927
+ preVideoStats = null;
6928
+ _this$_opts$adaptiveJ = _this._opts.adaptiveJitterBuffer, loopInterval = _this$_opts$adaptiveJ.loopInterval, maxAvSyncDelay = _this$_opts$adaptiveJ.maxAvSyncDelay, maxJitterBufferDiff = _this$_opts$adaptiveJ.maxJitterBufferDiff, maxStep = _this$_opts$adaptiveJ.maxStep;
6929
+ avDiffTooMuchCount = 0;
6930
+ _this._setDelayTimer = setInterval(/* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee3() {
6931
+ var _this$_audioTransceic4, _this$_videoTransceic3, currentTargetDelay, targetDelayMs, currentTargetDelayMs, _yield$Promise$all, _yield$Promise$all2, curAudioStats, curVideoStats, audioStats, videoStats, av_sync_diff, currentAudioDelay, currentVideoDelay, addOrReduce, nextJitterBufferDelay;
6932
+ return _regeneratorRuntime$1().wrap(function _callee3$(_context3) {
6933
+ while (1)
6934
+ switch (_context3.prev = _context3.next) {
6935
+ case 0:
6936
+ _context3.prev = 0;
6937
+ if (!(!((_this$_audioTransceic4 = _this._audioTransceicer) !== null && _this$_audioTransceic4 !== void 0 && _this$_audioTransceic4.receiver) || !((_this$_videoTransceic3 = _this._videoTransceicer) !== null && _this$_videoTransceic3 !== void 0 && _this$_videoTransceic3.receiver))) {
6938
+ _context3.next = 5;
6939
+ break;
6940
+ }
6941
+ preAudioStats = null;
6942
+ preVideoStats = null;
6943
+ return _context3.abrupt("return");
6944
+ case 5:
6945
+ currentTargetDelay = _this._audioTransceicer.receiver[key];
6946
+ if (!(currentTargetDelay === _this._targetDelayHint)) {
6947
+ _context3.next = 8;
6948
+ break;
6949
+ }
6950
+ return _context3.abrupt("return");
6951
+ case 8:
6952
+ targetDelayMs = _this._targetDelayHint * 1e3;
6953
+ currentTargetDelayMs = currentTargetDelay * 1e3;
6954
+ _context3.next = 12;
6955
+ return Promise.all([getRecvAudioStats(_this._audioTransceicer.receiver.getStats()), getRecvVideoStats(_this._videoTransceicer.receiver.getStats())]);
6956
+ case 12:
6957
+ _yield$Promise$all = _context3.sent;
6958
+ _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2);
6959
+ curAudioStats = _yield$Promise$all2[0];
6960
+ curVideoStats = _yield$Promise$all2[1];
6961
+ if (!(preAudioStats && preVideoStats)) {
6962
+ _context3.next = 36;
6963
+ break;
6964
+ }
6965
+ audioStats = diffRecvAudioStats(preAudioStats, curAudioStats);
6966
+ videoStats = diffRecvVideoStats(preVideoStats, curVideoStats);
6967
+ if (videoStats.estimatedPlayoutTimestamp && audioStats.estimatedPlayoutTimestamp) {
6968
+ av_sync_diff = videoStats.estimatedPlayoutTimestamp - audioStats.estimatedPlayoutTimestamp;
6969
+ }
6970
+ currentAudioDelay = audioStats.jitterBufferDelay;
6971
+ currentVideoDelay = videoStats.jitterBufferDelay;
6972
+ if (!(currentAudioDelay && currentVideoDelay)) {
6973
+ _context3.next = 36;
6974
+ break;
6975
+ }
6976
+ if (!(Math.abs(currentAudioDelay - currentVideoDelay) > maxAvSyncDelay || av_sync_diff && Math.abs(av_sync_diff) > maxAvSyncDelay)) {
6977
+ _context3.next = 27;
6978
+ break;
6979
+ }
6980
+ if (avDiffTooMuchCount++ > 8 && currentVideoDelay > currentAudioDelay) {
6981
+ _this._audioTransceicer.receiver[key] = Math.min(currentVideoDelay / 1e3, _this._targetDelayHint);
6982
+ avDiffTooMuchCount = 0;
6983
+ }
6984
+ logger.log("av_jb_diff(".concat(currentAudioDelay - currentVideoDelay, "=").concat(currentAudioDelay, "-").concat(currentVideoDelay, ") or av_sync_diff(").concat(av_sync_diff, ") too much, skip setting"));
6985
+ return _context3.abrupt("return");
6986
+ case 27:
6987
+ avDiffTooMuchCount = 0;
6988
+ if (!(currentTargetDelay !== null && (Math.abs(currentAudioDelay - currentTargetDelayMs) > maxJitterBufferDiff || Math.abs(currentVideoDelay - currentTargetDelayMs) > maxJitterBufferDiff))) {
6989
+ _context3.next = 31;
6990
+ break;
6991
+ }
6992
+ logger.log("audio(".concat(currentAudioDelay - currentTargetDelayMs, "),video(").concat(currentVideoDelay - currentTargetDelayMs, "). current_target_diff too much, skip setting"));
6993
+ return _context3.abrupt("return");
6994
+ case 31:
6995
+ addOrReduce = targetDelayMs > (currentTargetDelayMs || currentAudioDelay) ? 1 : -1;
6996
+ nextJitterBufferDelay = (Math.abs(targetDelayMs - (currentTargetDelayMs || currentAudioDelay)) > maxStep ? (currentTargetDelayMs || currentAudioDelay) + addOrReduce * maxStep : targetDelayMs) / 1e3;
6997
+ nextJitterBufferDelay = nextJitterBufferDelay > 0.2 ? nextJitterBufferDelay : null;
6998
+ logger.log("set receiver.".concat(key, " = ").concat(nextJitterBufferDelay));
6999
+ _this._audioTransceicer.receiver[key] = nextJitterBufferDelay;
7000
+ case 36:
7001
+ preAudioStats = curAudioStats;
7002
+ preVideoStats = curVideoStats;
7003
+ _context3.next = 44;
7004
+ break;
7005
+ case 40:
7006
+ _context3.prev = 40;
7007
+ _context3.t0 = _context3["catch"](0);
7008
+ logger.error("set delay loop error:", _context3.t0);
7009
+ _this._setDelayError = _context3.t0.message || _context3.t0.toString() || "unknown error";
7010
+ case 44:
7011
+ case "end":
7012
+ return _context3.stop();
7013
+ }
7014
+ }, _callee3, null, [[0, 40]]);
7015
+ })), loopInterval);
7016
+ case 14:
7017
+ case "end":
7018
+ return _context4.stop();
7019
+ }
7020
+ }, _callee4);
7021
+ }));
7022
+ return function(_x) {
7023
+ return _ref3.apply(this, arguments);
7024
+ };
7025
+ }());
6840
7026
  _defineProperty$2(_assertThisInitialized$1(_this), "_getDelay", function() {
6841
7027
  try {
6842
7028
  var key = ["playoutDelayHint", "jitterBufferDelayHint", "jitterBufferTarget"].find(function(key2) {
@@ -6912,51 +7098,51 @@
6912
7098
  }, {
6913
7099
  key: "load",
6914
7100
  value: function() {
6915
- var _load = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee3(url) {
7101
+ var _load = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5(url) {
6916
7102
  var _this2 = this;
6917
- var lastPc, encodedTransformSupported;
6918
- return _regeneratorRuntime$1().wrap(function _callee3$(_context3) {
7103
+ var encodedTransformSupported, lastPc;
7104
+ return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
6919
7105
  while (1)
6920
- switch (_context3.prev = _context3.next) {
7106
+ switch (_context5.prev = _context5.next) {
6921
7107
  case 0:
6922
7108
  this._disconnect();
6923
7109
  this._url = url;
6924
7110
  this._retry = this._opts.retryCount;
6925
- lastPc = this._pc;
6926
- if (lastPc) {
6927
- lastPc.close();
6928
- }
6929
- encodedTransformSupported = isLegacyEncodedTransformSupported();
6930
- _context3.prev = 6;
6931
7111
  if (!this._opts.hackCreateOfferIssue) {
6932
- _context3.next = 10;
7112
+ _context5.next = 6;
6933
7113
  break;
6934
7114
  }
6935
- _context3.next = 10;
7115
+ _context5.next = 6;
6936
7116
  return this._createEmptyPeer();
6937
- case 10:
7117
+ case 6:
7118
+ encodedTransformSupported = isLegacyEncodedTransformSupported();
7119
+ _context5.prev = 7;
7120
+ lastPc = this._pc;
7121
+ if (lastPc) {
7122
+ lastPc.close();
7123
+ }
6938
7124
  this._pc = new RTCPeerConnection({
6939
7125
  encodedInsertableStreams: encodedTransformSupported && this._opts.enableSei ? true : void 0
6940
7126
  });
6941
7127
  this._bindRTCEvents();
6942
- _context3.next = 14;
7128
+ _context5.next = 14;
6943
7129
  return this._connect(url);
6944
7130
  case 14:
6945
- _context3.next = 19;
7131
+ _context5.next = 19;
6946
7132
  break;
6947
7133
  case 16:
6948
- _context3.prev = 16;
6949
- _context3.t0 = _context3["catch"](6);
7134
+ _context5.prev = 16;
7135
+ _context5.t0 = _context5["catch"](7);
6950
7136
  setTimeout(function() {
6951
- return _this2._emitError(StreamingError.create(ERR.OTHER, null, _context3.t0));
7137
+ return _this2._emitError(StreamingError.create(ERR.OTHER, null, _context5.t0));
6952
7138
  });
6953
7139
  case 19:
6954
7140
  case "end":
6955
- return _context3.stop();
7141
+ return _context5.stop();
6956
7142
  }
6957
- }, _callee3, this, [[6, 16]]);
7143
+ }, _callee5, this, [[7, 16]]);
6958
7144
  }));
6959
- function load(_x) {
7145
+ function load(_x2) {
6960
7146
  return _load.apply(this, arguments);
6961
7147
  }
6962
7148
  return load;
@@ -7094,15 +7280,15 @@
7094
7280
  }, {
7095
7281
  key: "_connect",
7096
7282
  value: function() {
7097
- var _connect2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee4() {
7283
+ var _connect2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6() {
7098
7284
  var pc, offer, parsed, finnalUrl, _this$_opts, _answer$remoteSdp, _this$_opts2, _answer$remoteSdp2, _parsed$media, parseSession, sessionId, reqStart, res, answer, err, _parsed;
7099
- return _regeneratorRuntime$1().wrap(function _callee4$(_context4) {
7285
+ return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
7100
7286
  while (1)
7101
- switch (_context4.prev = _context4.next) {
7287
+ switch (_context6.prev = _context6.next) {
7102
7288
  case 0:
7103
7289
  pc = this._pc;
7104
7290
  if (!pc.addTransceiver) {
7105
- _context4.next = 11;
7291
+ _context6.next = 11;
7106
7292
  break;
7107
7293
  }
7108
7294
  this._audioTransceicer = pc.addTransceiver("audio", {
@@ -7111,26 +7297,26 @@
7111
7297
  this._videoTransceicer = pc.addTransceiver("video", {
7112
7298
  direction: "recvonly"
7113
7299
  });
7114
- this._opts.delayHint !== void 0 && this._setDelay(this._opts.delayHint, this._opts.videoDelaySync);
7300
+ this._setDelay(this._opts.delayHint);
7115
7301
  if (this._opts.enableSei) {
7116
7302
  this.initVideoEncodedTransform();
7117
7303
  this.initAudioEncodedTransform();
7118
7304
  }
7119
- _context4.next = 8;
7305
+ _context6.next = 8;
7120
7306
  return pc.createOffer();
7121
7307
  case 8:
7122
- offer = _context4.sent;
7123
- _context4.next = 14;
7308
+ offer = _context6.sent;
7309
+ _context6.next = 14;
7124
7310
  break;
7125
7311
  case 11:
7126
- _context4.next = 13;
7312
+ _context6.next = 13;
7127
7313
  return pc.createOffer({
7128
7314
  iceRestart: true,
7129
7315
  offerToReceiveAudio: true,
7130
7316
  offerToReceiveVideo: true
7131
7317
  });
7132
7318
  case 13:
7133
- offer = _context4.sent;
7319
+ offer = _context6.sent;
7134
7320
  case 14:
7135
7321
  if (this._opts.hackCreateOfferIssue) {
7136
7322
  this._createEmptyPeer();
@@ -7159,11 +7345,11 @@
7159
7345
  });
7160
7346
  offer.sdp = lib.write(parsed);
7161
7347
  logger.log("local offer modified:\n", offer.sdp);
7162
- _context4.next = 23;
7348
+ _context6.next = 23;
7163
7349
  return pc.setLocalDescription(offer);
7164
7350
  case 23:
7165
7351
  finnalUrl = this._url;
7166
- _context4.prev = 24;
7352
+ _context6.prev = 24;
7167
7353
  if (this._opts.preProcessUrl) {
7168
7354
  finnalUrl = this._opts.preProcessUrl(finnalUrl).url;
7169
7355
  }
@@ -7176,7 +7362,7 @@
7176
7362
  sessionId
7177
7363
  });
7178
7364
  reqStart = Date.now();
7179
- _context4.next = 33;
7365
+ _context6.next = 33;
7180
7366
  return this._loader.load(finnalUrl, {
7181
7367
  body: JSON.stringify({
7182
7368
  sessionId,
@@ -7185,22 +7371,22 @@
7185
7371
  })
7186
7372
  });
7187
7373
  case 33:
7188
- res = _context4.sent;
7374
+ res = _context6.sent;
7189
7375
  this.emit(EVENT.LOAD_RESPONSE_HEADERS, {
7190
7376
  headers: res.response.headers
7191
7377
  });
7192
7378
  answer = res === null || res === void 0 ? void 0 : res.data;
7193
7379
  if (!((answer === null || answer === void 0 ? void 0 : answer.code) === 404 || (answer === null || answer === void 0 ? void 0 : answer.code) === 403)) {
7194
- _context4.next = 41;
7380
+ _context6.next = 41;
7195
7381
  break;
7196
7382
  }
7197
7383
  err = StreamingError.create(answer.code === 404 ? ERR.NETWORK_NOTFOUND : ERR.NETWORK_FORBIDDEN, null, answer);
7198
7384
  err.errorType = ERR.NETWORK;
7199
7385
  this._emitError(err);
7200
- return _context4.abrupt("return");
7386
+ return _context6.abrupt("return");
7201
7387
  case 41:
7202
7388
  if (!((answer === null || answer === void 0 ? void 0 : answer.code) !== 200)) {
7203
- _context4.next = 43;
7389
+ _context6.next = 43;
7204
7390
  break;
7205
7391
  }
7206
7392
  throw new Error("code: ".concat(answer === null || answer === void 0 ? void 0 : answer.code, ", message:").concat(answer === null || answer === void 0 ? void 0 : answer.message));
@@ -7233,22 +7419,28 @@
7233
7419
  answer.remoteSdp.sdp = lib.write(_parsed);
7234
7420
  logger.log("answer modified:\n", answer.remoteSdp.sdp);
7235
7421
  this._rctConnectStartTs = Date.now();
7236
- _context4.next = 53;
7237
- return this._pc.setRemoteDescription(answer.remoteSdp);
7422
+ if (!(pc.signalingState === "closed")) {
7423
+ _context6.next = 53;
7424
+ break;
7425
+ }
7426
+ return _context6.abrupt("return");
7238
7427
  case 53:
7428
+ _context6.next = 55;
7429
+ return pc.setRemoteDescription(answer.remoteSdp);
7430
+ case 55:
7239
7431
  this._networkEvaluate = new NetworkEvaluate(pc, this._opts.networkEvaluateInterval);
7240
7432
  this._listenPeerStateTimeout();
7241
- _context4.next = 60;
7433
+ _context6.next = 62;
7242
7434
  break;
7243
- case 57:
7244
- _context4.prev = 57;
7245
- _context4.t0 = _context4["catch"](24);
7246
- this._emitError(StreamingError.network(_context4.t0));
7247
- case 60:
7435
+ case 59:
7436
+ _context6.prev = 59;
7437
+ _context6.t0 = _context6["catch"](24);
7438
+ this._emitError(StreamingError.network(_context6.t0));
7439
+ case 62:
7248
7440
  case "end":
7249
- return _context4.stop();
7441
+ return _context6.stop();
7250
7442
  }
7251
- }, _callee4, this, [[24, 57]]);
7443
+ }, _callee6, this, [[24, 59]]);
7252
7444
  }));
7253
7445
  function _connect() {
7254
7446
  return _connect2.apply(this, arguments);
@@ -7279,12 +7471,21 @@
7279
7471
  value: function _startRtcReport() {
7280
7472
  var _this7 = this;
7281
7473
  this._stopRtcReport();
7282
- this._rtcReportTimer = setInterval(/* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5() {
7283
- var _yield$Promise$all, _yield$Promise$all2, curAudioStats, curVideoStats, _this7$_audioStallObs, _this7$_videoStallObs, _this7$_networkQualit, _this7$_networkQualit2, audioStats, videoStats, audioStallInfo, videoStallInfo, _ref4, _ref5, quality, qualityInfo, targetDelay;
7284
- return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
7474
+ this._rtcReportTimer = setInterval(/* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7() {
7475
+ var _this7$_audioTranscei, _this7$_videoTranscei;
7476
+ var _yield$Promise$all3, _yield$Promise$all4, curAudioStats, curVideoStats, _this7$_audioStallObs, _this7$_videoStallObs, _this7$_networkQualit, _this7$_networkQualit2, audioStats, videoStats, audioStallInfo, videoStallInfo, _ref6, _ref7, quality, qualityInfo, av_sync_diff;
7477
+ return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
7285
7478
  while (1)
7286
- switch (_context5.prev = _context5.next) {
7479
+ switch (_context7.prev = _context7.next) {
7287
7480
  case 0:
7481
+ if (!(!((_this7$_audioTranscei = _this7._audioTransceicer) !== null && _this7$_audioTranscei !== void 0 && _this7$_audioTranscei.receiver) || !((_this7$_videoTranscei = _this7._videoTransceicer) !== null && _this7$_videoTranscei !== void 0 && _this7$_videoTranscei.receiver))) {
7482
+ _context7.next = 4;
7483
+ break;
7484
+ }
7485
+ _this7._preAudioStats = null;
7486
+ _this7._preVideoStats = null;
7487
+ return _context7.abrupt("return");
7488
+ case 4:
7288
7489
  if (!_this7._audioStallObserver && _this7._audioTransceicer) {
7289
7490
  _this7._audioStallObserver = new AudioStallObserver();
7290
7491
  _this7._audioStallObserver.start(_this7._audioTransceicer);
@@ -7296,43 +7497,45 @@
7296
7497
  if (!_this7._networkQuality && _this7._opts.enableNetworkQuality) {
7297
7498
  _this7._networkQuality = new NetworkQuality(_this7._pc, _this7._opts.networkQuality);
7298
7499
  }
7299
- _context5.next = 5;
7500
+ _context7.next = 9;
7300
7501
  return Promise.all([getRecvAudioStats(_this7._audioTransceicer.receiver.getStats()), getRecvVideoStats(_this7._videoTransceicer.receiver.getStats())]);
7301
- case 5:
7302
- _yield$Promise$all = _context5.sent;
7303
- _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2);
7304
- curAudioStats = _yield$Promise$all2[0];
7305
- curVideoStats = _yield$Promise$all2[1];
7502
+ case 9:
7503
+ _yield$Promise$all3 = _context7.sent;
7504
+ _yield$Promise$all4 = _slicedToArray(_yield$Promise$all3, 2);
7505
+ curAudioStats = _yield$Promise$all4[0];
7506
+ curVideoStats = _yield$Promise$all4[1];
7306
7507
  if (!(_this7._preAudioStats && _this7._preVideoStats)) {
7307
- _context5.next = 21;
7508
+ _context7.next = 26;
7308
7509
  break;
7309
7510
  }
7310
7511
  audioStats = diffRecvAudioStats(_this7._preAudioStats, curAudioStats);
7311
7512
  videoStats = diffRecvVideoStats(_this7._preVideoStats, curVideoStats);
7312
- _context5.next = 14;
7513
+ _context7.next = 18;
7313
7514
  return (_this7$_audioStallObs = _this7._audioStallObserver) === null || _this7$_audioStallObs === void 0 ? void 0 : _this7$_audioStallObs.getAudioStallInfo();
7314
- case 14:
7315
- audioStallInfo = _context5.sent;
7316
- _context5.next = 17;
7515
+ case 18:
7516
+ audioStallInfo = _context7.sent;
7517
+ _context7.next = 21;
7317
7518
  return (_this7$_videoStallObs = _this7._videoStallObserver) === null || _this7$_videoStallObs === void 0 ? void 0 : _this7$_videoStallObs.getStallInfo({
7318
7519
  interval: videoStats.statsInterval,
7319
7520
  frameRateReceived: videoStats.frameRateReceived,
7320
7521
  frameRateDecoded: videoStats.frameRateDecoded,
7321
7522
  bitrate: videoStats.receivedKBitrate
7322
7523
  });
7323
- case 17:
7324
- videoStallInfo = _context5.sent;
7325
- _ref4 = (_this7$_networkQualit = (_this7$_networkQualit2 = _this7._networkQuality) === null || _this7$_networkQualit2 === void 0 ? void 0 : _this7$_networkQualit2.getDownlinkQuality(_objectSpread2$2(_objectSpread2$2({}, audioStats), {}, {
7524
+ case 21:
7525
+ videoStallInfo = _context7.sent;
7526
+ _ref6 = (_this7$_networkQualit = (_this7$_networkQualit2 = _this7._networkQuality) === null || _this7$_networkQualit2 === void 0 ? void 0 : _this7$_networkQualit2.getDownlinkQuality(_objectSpread2$2(_objectSpread2$2({}, audioStats), {}, {
7326
7527
  stallDuration: audioStallInfo.stallDuration
7327
7528
  }), _objectSpread2$2(_objectSpread2$2({}, videoStats), {}, {
7328
- stallDuration: videoStallInfo.stall.stallDuration100ms
7329
- }))) !== null && _this7$_networkQualit !== void 0 ? _this7$_networkQualit : [], _ref5 = _slicedToArray(_ref4, 2), quality = _ref5[0], qualityInfo = _ref5[1];
7529
+ stallDuration: videoStallInfo.stall.stallDuration100ms || videoStallInfo.stall.stallDuration500ms
7530
+ }))) !== null && _this7$_networkQualit !== void 0 ? _this7$_networkQualit : [], _ref7 = _slicedToArray(_ref6, 2), quality = _ref7[0], qualityInfo = _ref7[1];
7330
7531
  if (_this7._opts.enableAdaptiveJitterBuffer) {
7331
- targetDelay = _this7._handleJitterBuffer(qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos, _this7._opts.adaptiveJitterBuffer, _this7._opts.networkStrategy);
7532
+ _this7._handleJitterBuffer(qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos, _this7._opts.adaptiveJitterBuffer, _this7._opts.networkStrategy);
7533
+ }
7534
+ if (videoStats.estimatedPlayoutTimestamp && audioStats.estimatedPlayoutTimestamp) {
7535
+ av_sync_diff = videoStats.estimatedPlayoutTimestamp - audioStats.estimatedPlayoutTimestamp;
7332
7536
  }
7333
7537
  _this7.emit(EXTEND_EVENTS.RTC_NETWORK, {
7334
7538
  interval: videoStats.statsInterval,
7335
- visibility_state: document.visibilityState,
7336
7539
  network_quality: quality,
7337
7540
  audio_stall_duration: audioStallInfo.stallDuration,
7338
7541
  audio_stall_count: audioStallInfo.stallCount,
@@ -7358,16 +7561,20 @@
7358
7561
  quality_audio_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioQoe,
7359
7562
  quality_video_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoQoe,
7360
7563
  current_delay: _this7._getDelay(),
7361
- target_delay: targetDelay
7564
+ visibility_state: document.visibilityState,
7565
+ target_delay: _this7._targetDelayHint,
7566
+ av_sync_diff,
7567
+ set_delay_error: _this7._setDelayError || null
7362
7568
  });
7363
- case 21:
7569
+ case 26:
7364
7570
  _this7._preAudioStats = curAudioStats;
7365
7571
  _this7._preVideoStats = curVideoStats;
7366
- case 23:
7572
+ _this7.set_delay_error = null;
7573
+ case 29:
7367
7574
  case "end":
7368
- return _context5.stop();
7575
+ return _context7.stop();
7369
7576
  }
7370
- }, _callee5);
7577
+ }, _callee7);
7371
7578
  })), 2e3);
7372
7579
  }
7373
7580
  }, {
@@ -7380,15 +7587,21 @@
7380
7587
  var validNetworkQualityResult = this._networkQualityResult.filter(Boolean);
7381
7588
  if (validNetworkQualityResult.length === adaptiveJitterBuffer.networkWindow) {
7382
7589
  var _networkStrategy$aver;
7383
- var sorted = _toConsumableArray$1(validNetworkQualityResult).sort(function(a, b) {
7384
- return a - b;
7385
- });
7386
- var mid = Math.floor(sorted.length / 2);
7387
- var averageQuality = sorted.length % 2 !== 0 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
7590
+ var averageQuality;
7591
+ if (adaptiveJitterBuffer.windowMethod === "min") {
7592
+ averageQuality = Math.min.apply(Math, _toConsumableArray$1(validNetworkQualityResult));
7593
+ } else if (adaptiveJitterBuffer.windowMethod === "max") {
7594
+ averageQuality = Math.max.apply(Math, _toConsumableArray$1(validNetworkQualityResult));
7595
+ } else {
7596
+ var sorted = _toConsumableArray$1(validNetworkQualityResult).sort(function(a, b) {
7597
+ return a - b;
7598
+ });
7599
+ var mid = Math.floor(sorted.length / 2);
7600
+ averageQuality = sorted.length % 2 !== 0 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
7601
+ }
7388
7602
  if (averageQuality && ((_networkStrategy$aver = networkStrategy[averageQuality]) === null || _networkStrategy$aver === void 0 ? void 0 : _networkStrategy$aver.jitterBuffer) !== void 0) {
7389
- var _networkStrategy$aver2, _networkStrategy$aver3;
7390
- this._setDelay((_networkStrategy$aver2 = networkStrategy[averageQuality]) === null || _networkStrategy$aver2 === void 0 ? void 0 : _networkStrategy$aver2.jitterBuffer);
7391
- return (_networkStrategy$aver3 = networkStrategy[averageQuality]) === null || _networkStrategy$aver3 === void 0 ? void 0 : _networkStrategy$aver3.jitterBuffer;
7603
+ var _networkStrategy$aver2;
7604
+ this._startSetDelayLoop((_networkStrategy$aver2 = networkStrategy[averageQuality]) === null || _networkStrategy$aver2 === void 0 ? void 0 : _networkStrategy$aver2.jitterBuffer);
7392
7605
  }
7393
7606
  }
7394
7607
  }
@@ -7402,6 +7615,8 @@
7402
7615
  this._audioStallObserver = null;
7403
7616
  this._videoStallObserver = null;
7404
7617
  this._networkQuality = null;
7618
+ this._preAudioStats = null;
7619
+ this._preVideoStats = null;
7405
7620
  if (this._rtcReportTimer) {
7406
7621
  clearInterval(this._rtcReportTimer);
7407
7622
  this._rtcReportTimer = 0;
@@ -7429,28 +7644,31 @@
7429
7644
  this._clearPeerStateTimeout();
7430
7645
  if (this._pc) {
7431
7646
  this._pc.close();
7647
+ if (this._media) {
7648
+ this._media.srcObject = null;
7649
+ }
7432
7650
  }
7433
7651
  }
7434
7652
  }, {
7435
7653
  key: "_createEmptyPeer",
7436
7654
  value: function() {
7437
- var _createEmptyPeer2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6() {
7655
+ var _createEmptyPeer2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8() {
7438
7656
  var pc;
7439
- return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
7657
+ return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
7440
7658
  while (1)
7441
- switch (_context6.prev = _context6.next) {
7659
+ switch (_context8.prev = _context8.next) {
7442
7660
  case 0:
7443
7661
  pc = new RTCPeerConnection();
7444
- _context6.next = 3;
7662
+ _context8.next = 3;
7445
7663
  return pc.createOffer();
7446
7664
  case 3:
7447
7665
  pc.close();
7448
7666
  pc = null;
7449
7667
  case 5:
7450
7668
  case "end":
7451
- return _context6.stop();
7669
+ return _context8.stop();
7452
7670
  }
7453
- }, _callee6);
7671
+ }, _callee8);
7454
7672
  }));
7455
7673
  function _createEmptyPeer() {
7456
7674
  return _createEmptyPeer2.apply(this, arguments);
@@ -7597,7 +7815,7 @@
7597
7815
  }, {
7598
7816
  key: "version",
7599
7817
  get: function get() {
7600
- return "0.2.1-alpha.35";
7818
+ return "0.2.1-alpha.42";
7601
7819
  }
7602
7820
  }, {
7603
7821
  key: "beforePlayerInit",