@flashphoner/websdk 2.0.238 → 2.0.239

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.
@@ -9403,15 +9403,15 @@ var _require = require('uuid'),
9403
9403
  var constants = require("./constants");
9404
9404
  var util = require('./util');
9405
9405
  var LoggerObject = require('./util').logger;
9406
+ var Promise = require('promise-polyfill');
9407
+ var KalmanFilter = require('kalmanjs');
9408
+ var browserDetails = require('webrtc-adapter')["default"].browserDetails;
9409
+ var LOG_PREFIX = "core";
9406
9410
  var coreLogger;
9407
9411
  var loggerConf = {
9408
9412
  push: false,
9409
9413
  severity: "INFO"
9410
9414
  };
9411
- var Promise = require('promise-polyfill');
9412
- var KalmanFilter = require('kalmanjs');
9413
- var browserDetails = require('webrtc-adapter')["default"].browserDetails;
9414
- var LOG_PREFIX = "core";
9415
9415
  var isUsingTemasysPlugin = false;
9416
9416
 
9417
9417
  /**
@@ -9423,7 +9423,6 @@ var STREAM_EVENT = constants.STREAM_EVENT;
9423
9423
  var STREAM_EVENT_TYPE = constants.STREAM_EVENT_TYPE;
9424
9424
  var STREAM_STATUS = constants.STREAM_STATUS;
9425
9425
  var CALL_STATUS = constants.CALL_STATUS;
9426
- var TRANSPORT_TYPE = constants.TRANSPORT_TYPE;
9427
9426
  var CONNECTION_QUALITY = constants.CONNECTION_QUALITY;
9428
9427
  var ERROR_INFO = constants.ERROR_INFO;
9429
9428
  var VIDEO_RATE_GOOD_QUALITY_PERCENT_DIFFERENCE = 20;
@@ -9432,6 +9431,18 @@ var LOW_VIDEO_RATE_THRESHOLD_BAD_PERFECT = 50000;
9432
9431
  var LOW_VIDEO_RATE_BAD_QUALITY_PERCENT_DIFFERENCE = 150;
9433
9432
  var OUTBOUND_VIDEO_RATE = "outboundVideoRate";
9434
9433
  var INBOUND_VIDEO_RATE = "inboundVideoRate";
9434
+ var CONSTRAINT_AUDIO = "audio";
9435
+ var CONSTRAINT_AUDIO_STEREO = "stereo";
9436
+ var CONSTRAINT_AUDIO_BITRATE = "bitrate";
9437
+ var CONSTRAINT_AUDIO_FEC = "fec";
9438
+ var CONSTRAINT_AUDIO_OUTPUT_ID = "outputId";
9439
+ var CONSTRAINT_VIDEO = "video";
9440
+ var CONSTRAINT_VIDEO_BITRATE = "video.bitrate";
9441
+ var CONSTRAINT_VIDEO_MIN_BITRATE = "video.minBitrate";
9442
+ var CONSTRAINT_VIDEO_MAX_BITRATE = "video.maxBitrate";
9443
+ var CONSTRAINT_VIDEO_QUALITY = "video.quality";
9444
+ var CONSTRAINT_VIDEO_WIDTH = "video.width";
9445
+ var CONSTRAINT_VIDEO_HEIGHT = "video.height";
9435
9446
  var MediaProvider = {};
9436
9447
  var sessions = {};
9437
9448
  var initialized = false;
@@ -10261,9 +10272,9 @@ var createSession = function createSession(options) {
10261
10272
  var disableConstraintsNormalization = options.disableConstraintsNormalization;
10262
10273
  }
10263
10274
  var audioOutputId;
10264
- var audioProperty = getConstraintsProperty(constraints, "audio", undefined);
10275
+ var audioProperty = getConstraintsProperty(constraints, CONSTRAINT_AUDIO, undefined);
10265
10276
  if (_typeof(audioProperty) === 'object') {
10266
- audioOutputId = getConstraintsProperty(audioProperty, "outputId", 0);
10277
+ audioOutputId = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_OUTPUT_ID, 0);
10267
10278
  }
10268
10279
  var stripCodecs = options.stripCodecs || [];
10269
10280
  // Receive media
@@ -10278,6 +10289,9 @@ var createSession = function createSession(options) {
10278
10289
  var sipHeaders = options.sipHeaders;
10279
10290
  var videoContentHint = options.videoContentHint;
10280
10291
  var useControls = options.useControls;
10292
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
10293
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
10294
+
10281
10295
  /**
10282
10296
  * Represents sip call.
10283
10297
  *
@@ -10314,6 +10328,8 @@ var createSession = function createSession(options) {
10314
10328
  //set remote sdp
10315
10329
  if (sdp && sdp !== '') {
10316
10330
  sdp = sdpHookHandler(sdp, sdpHook);
10331
+ // Adjust publishing bitrate #WCS-4013
10332
+ sdp = util.setPublishingBitrate(sdp, mediaConnection, minBitrate, maxBitrate);
10317
10333
  mediaConnection.setRemoteSdp(sdp, hasTransferredCall, id_).then(function () {});
10318
10334
  return;
10319
10335
  }
@@ -10479,6 +10495,8 @@ var createSession = function createSession(options) {
10479
10495
  status_ = CALL_STATUS.PENDING;
10480
10496
  var sdp;
10481
10497
  var sdpHook = answerOptions.sdpHook;
10498
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
10499
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
10482
10500
  sipSDP = answerOptions.sipSDP;
10483
10501
  sipHeaders = answerOptions.sipHeaders;
10484
10502
  if (!remoteSdpCache[id_]) {
@@ -10486,6 +10504,8 @@ var createSession = function createSession(options) {
10486
10504
  throw new Error("No remote sdp available");
10487
10505
  } else {
10488
10506
  sdp = sdpHookHandler(remoteSdpCache[id_], sdpHook);
10507
+ // Adjust publishing bitrate #WCS-4013
10508
+ sdp = util.setPublishingBitrate(sdp, null, minBitrate, maxBitrate);
10489
10509
  delete remoteSdpCache[id_];
10490
10510
  }
10491
10511
  if (util.SDP.matchPrefix(sdp, "m=video").length == 0) {
@@ -10519,6 +10539,8 @@ var createSession = function createSession(options) {
10519
10539
  useControls: useControls
10520
10540
  }).then(function (newConnection) {
10521
10541
  mediaConnection = newConnection;
10542
+ // Set publishing bitrate via sender encodings if SDP feature is not supported
10543
+ mediaConnection.setPublishingBitrate(minBitrate, maxBitrate);
10522
10544
  return mediaConnection.setRemoteSdp(sdp);
10523
10545
  }).then(function () {
10524
10546
  return mediaConnection.createAnswer({
@@ -11053,15 +11075,15 @@ var createSession = function createSession(options) {
11053
11075
  // Receive media
11054
11076
  var receiveAudio;
11055
11077
  var audioOutputId;
11056
- var audioProperty = getConstraintsProperty(constraints, "audio", undefined);
11078
+ var audioProperty = getConstraintsProperty(constraints, CONSTRAINT_AUDIO, undefined);
11057
11079
  if (typeof audioProperty === 'boolean') {
11058
11080
  receiveAudio = audioProperty;
11059
11081
  } else if (_typeof(audioProperty) === 'object') {
11060
11082
  receiveAudio = true;
11061
- var _stereo = getConstraintsProperty(audioProperty, "stereo", 0);
11062
- var _bitrate = getConstraintsProperty(audioProperty, "bitrate", 0);
11063
- var _fec = getConstraintsProperty(audioProperty, "fec", 0);
11064
- audioOutputId = getConstraintsProperty(audioProperty, "outputId", 0);
11083
+ var _stereo = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_STEREO, 0);
11084
+ var _bitrate = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_BITRATE, 0);
11085
+ var _fec = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_FEC, 0);
11086
+ audioOutputId = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_OUTPUT_ID, 0);
11065
11087
  var _codecOptions = "";
11066
11088
  if (_bitrate) _codecOptions += "maxaveragebitrate=" + _bitrate + ";";
11067
11089
  if (_stereo) _codecOptions += "stereo=1;sprop-stereo=1;";
@@ -11070,7 +11092,7 @@ var createSession = function createSession(options) {
11070
11092
  receiveAudio = typeof options.receiveAudio !== 'undefined' ? options.receiveAudio : true;
11071
11093
  }
11072
11094
  var receiveVideo;
11073
- var videoProperty = getConstraintsProperty(constraints, "video", undefined);
11095
+ var videoProperty = getConstraintsProperty(constraints, CONSTRAINT_VIDEO, undefined);
11074
11096
  if (typeof videoProperty === 'boolean') {
11075
11097
  receiveVideo = videoProperty;
11076
11098
  } else if (_typeof(videoProperty) === 'object') {
@@ -11079,16 +11101,16 @@ var createSession = function createSession(options) {
11079
11101
  receiveVideo = typeof options.receiveVideo !== 'undefined' ? options.receiveVideo : true;
11080
11102
  }
11081
11103
  // Bitrate
11082
- var bitrate = getConstraintsProperty(constraints, "video.bitrate", 0);
11083
- var minBitrate = getConstraintsProperty(constraints, "video.minBitrate", 0);
11084
- var maxBitrate = getConstraintsProperty(constraints, "video.maxBitrate", 0);
11104
+ var bitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_BITRATE, 0);
11105
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
11106
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
11085
11107
 
11086
11108
  // Quality
11087
- var quality = getConstraintsProperty(constraints, "video.quality", 0);
11109
+ var quality = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_QUALITY, 0);
11088
11110
  if (quality > 100) quality = 100;
11089
11111
  // Play resolution
11090
- var playWidth = typeof options.playWidth !== 'undefined' ? options.playWidth : getConstraintsProperty(constraints, "video.width", 0);
11091
- var playHeight = typeof options.playHeight !== 'undefined' ? options.playHeight : getConstraintsProperty(constraints, "video.height", 0);
11112
+ var playWidth = typeof options.playWidth !== 'undefined' ? options.playWidth : getConstraintsProperty(constraints, CONSTRAINT_VIDEO_WIDTH, 0);
11113
+ var playHeight = typeof options.playHeight !== 'undefined' ? options.playHeight : getConstraintsProperty(constraints, CONSTRAINT_VIDEO_HEIGHT, 0);
11092
11114
  var stripCodecs = options.stripCodecs || [];
11093
11115
  var resolution = {};
11094
11116
  var published_ = false;
@@ -11143,6 +11165,8 @@ var createSession = function createSession(options) {
11143
11165
  var _sdp = sdp;
11144
11166
  if (_codecOptions) _sdp = util.SDP.writeFmtp(sdp, _codecOptions, "opus");
11145
11167
  _sdp = sdpHookHandler(_sdp, sdpHook);
11168
+ // Adjust publishing bitrate #WCS-4013
11169
+ _sdp = util.setPublishingBitrate(_sdp, mediaConnection, minBitrate, maxBitrate);
11146
11170
  mediaConnection.setRemoteSdp(_sdp).then(function () {});
11147
11171
  return;
11148
11172
  }
@@ -12993,6 +13017,62 @@ var SDP = {
12993
13017
  }
12994
13018
  }
12995
13019
  return result;
13020
+ },
13021
+ setPublishingBitrate: function setPublishingBitrate(sdp, minBitrate, maxBitrate) {
13022
+ if (sdp && (minBitrate || maxBitrate)) {
13023
+ var sdpArray = sdp.split("\n");
13024
+ var i;
13025
+ var rtpmap = -1,
13026
+ codec = "";
13027
+ var matches;
13028
+ var bitrateString = "";
13029
+ for (i = 0; i < sdpArray.length; i++) {
13030
+ if (sdpArray[i].startsWith("a=rtpmap")) {
13031
+ matches = sdpArray[i].match("a=rtpmap:(.+) (.+)/.*");
13032
+ if (matches && matches.length > 2) {
13033
+ rtpmap = parseInt(matches[1], 10);
13034
+ codec = matches[2];
13035
+ }
13036
+ } else {
13037
+ if (codec === "H264" || codec === "VP8") {
13038
+ if (sdpArray[i].startsWith("a=fmtp:" + rtpmap)) {
13039
+ bitrateString = this.getBitrateString(sdpArray[i], minBitrate, maxBitrate);
13040
+ if (bitrateString) {
13041
+ sdpArray[i] += ";" + bitrateString;
13042
+ }
13043
+ } else {
13044
+ bitrateString = this.getBitrateString("", minBitrate, maxBitrate);
13045
+ if (bitrateString) {
13046
+ sdpArray[i] = "a=fmtp:" + rtpmap + " " + bitrateString + "\r\n" + sdpArray[i];
13047
+ }
13048
+ }
13049
+ codec = "";
13050
+ rtpmap = -1;
13051
+ }
13052
+ }
13053
+ }
13054
+ var newSDP = "";
13055
+ for (i = 0; i < sdpArray.length; i++) {
13056
+ if (sdpArray[i] != "") {
13057
+ newSDP += sdpArray[i] + "\n";
13058
+ }
13059
+ }
13060
+ return newSDP;
13061
+ }
13062
+ return sdp;
13063
+ },
13064
+ getBitrateString: function getBitrateString(string, minBitrate, maxBitrate) {
13065
+ var bitrateString = "";
13066
+ if (minBitrate && string.indexOf("x-google-min-bitrate") == -1) {
13067
+ bitrateString += "x-google-min-bitrate=" + minBitrate;
13068
+ }
13069
+ if (maxBitrate && string.indexOf("x-google-max-bitrate") == -1) {
13070
+ if (bitrateString) {
13071
+ bitrateString += ";";
13072
+ }
13073
+ bitrateString += "x-google-max-bitrate=" + maxBitrate;
13074
+ }
13075
+ return bitrateString;
12996
13076
  }
12997
13077
  };
12998
13078
  var logger = function logger() {
@@ -13236,6 +13316,18 @@ var isPromise = function isPromise(object) {
13236
13316
  }
13237
13317
  return false;
13238
13318
  };
13319
+ var setPublishingBitrate = function setPublishingBitrate(sdp, mediaConnection, minBitrate, maxBitrate) {
13320
+ if (minBitrate || maxBitrate) {
13321
+ if (sdp && Browser.isChrome() || Browser.isSafariWebRTC()) {
13322
+ // Set publishing bitrate constraints via remote SDP
13323
+ sdp = SDP.setPublishingBitrate(sdp, minBitrate, maxBitrate);
13324
+ } else if (mediaConnection) {
13325
+ // Set publishing bitrate via sender encodings if SDP feature is not supported
13326
+ mediaConnection.setPublishingBitrate(minBitrate, maxBitrate);
13327
+ }
13328
+ }
13329
+ return sdp;
13330
+ };
13239
13331
  module.exports = {
13240
13332
  isEmptyObject: isEmptyObject,
13241
13333
  copyObjectToArray: copyObjectToArray,
@@ -13246,7 +13338,8 @@ module.exports = {
13246
13338
  logger: logger,
13247
13339
  stripCodecs: stripCodecs,
13248
13340
  getCurrentCodecAndSampleRate: getCurrentCodecAndSampleRate,
13249
- isPromise: isPromise
13341
+ isPromise: isPromise,
13342
+ setPublishingBitrate: setPublishingBitrate
13250
13343
  };
13251
13344
 
13252
13345
  },{}],45:[function(require,module,exports){
@@ -16158,15 +16158,15 @@ var _require = require('uuid'),
16158
16158
  var constants = require("./constants");
16159
16159
  var util = require('./util');
16160
16160
  var LoggerObject = require('./util').logger;
16161
+ var Promise = require('promise-polyfill');
16162
+ var KalmanFilter = require('kalmanjs');
16163
+ var browserDetails = require('webrtc-adapter')["default"].browserDetails;
16164
+ var LOG_PREFIX = "core";
16161
16165
  var coreLogger;
16162
16166
  var loggerConf = {
16163
16167
  push: false,
16164
16168
  severity: "INFO"
16165
16169
  };
16166
- var Promise = require('promise-polyfill');
16167
- var KalmanFilter = require('kalmanjs');
16168
- var browserDetails = require('webrtc-adapter')["default"].browserDetails;
16169
- var LOG_PREFIX = "core";
16170
16170
  var isUsingTemasysPlugin = false;
16171
16171
 
16172
16172
  /**
@@ -16178,7 +16178,6 @@ var STREAM_EVENT = constants.STREAM_EVENT;
16178
16178
  var STREAM_EVENT_TYPE = constants.STREAM_EVENT_TYPE;
16179
16179
  var STREAM_STATUS = constants.STREAM_STATUS;
16180
16180
  var CALL_STATUS = constants.CALL_STATUS;
16181
- var TRANSPORT_TYPE = constants.TRANSPORT_TYPE;
16182
16181
  var CONNECTION_QUALITY = constants.CONNECTION_QUALITY;
16183
16182
  var ERROR_INFO = constants.ERROR_INFO;
16184
16183
  var VIDEO_RATE_GOOD_QUALITY_PERCENT_DIFFERENCE = 20;
@@ -16187,6 +16186,18 @@ var LOW_VIDEO_RATE_THRESHOLD_BAD_PERFECT = 50000;
16187
16186
  var LOW_VIDEO_RATE_BAD_QUALITY_PERCENT_DIFFERENCE = 150;
16188
16187
  var OUTBOUND_VIDEO_RATE = "outboundVideoRate";
16189
16188
  var INBOUND_VIDEO_RATE = "inboundVideoRate";
16189
+ var CONSTRAINT_AUDIO = "audio";
16190
+ var CONSTRAINT_AUDIO_STEREO = "stereo";
16191
+ var CONSTRAINT_AUDIO_BITRATE = "bitrate";
16192
+ var CONSTRAINT_AUDIO_FEC = "fec";
16193
+ var CONSTRAINT_AUDIO_OUTPUT_ID = "outputId";
16194
+ var CONSTRAINT_VIDEO = "video";
16195
+ var CONSTRAINT_VIDEO_BITRATE = "video.bitrate";
16196
+ var CONSTRAINT_VIDEO_MIN_BITRATE = "video.minBitrate";
16197
+ var CONSTRAINT_VIDEO_MAX_BITRATE = "video.maxBitrate";
16198
+ var CONSTRAINT_VIDEO_QUALITY = "video.quality";
16199
+ var CONSTRAINT_VIDEO_WIDTH = "video.width";
16200
+ var CONSTRAINT_VIDEO_HEIGHT = "video.height";
16190
16201
  var MediaProvider = {};
16191
16202
  var sessions = {};
16192
16203
  var initialized = false;
@@ -17016,9 +17027,9 @@ var createSession = function createSession(options) {
17016
17027
  var disableConstraintsNormalization = options.disableConstraintsNormalization;
17017
17028
  }
17018
17029
  var audioOutputId;
17019
- var audioProperty = getConstraintsProperty(constraints, "audio", undefined);
17030
+ var audioProperty = getConstraintsProperty(constraints, CONSTRAINT_AUDIO, undefined);
17020
17031
  if (_typeof(audioProperty) === 'object') {
17021
- audioOutputId = getConstraintsProperty(audioProperty, "outputId", 0);
17032
+ audioOutputId = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_OUTPUT_ID, 0);
17022
17033
  }
17023
17034
  var stripCodecs = options.stripCodecs || [];
17024
17035
  // Receive media
@@ -17033,6 +17044,9 @@ var createSession = function createSession(options) {
17033
17044
  var sipHeaders = options.sipHeaders;
17034
17045
  var videoContentHint = options.videoContentHint;
17035
17046
  var useControls = options.useControls;
17047
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
17048
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
17049
+
17036
17050
  /**
17037
17051
  * Represents sip call.
17038
17052
  *
@@ -17069,6 +17083,8 @@ var createSession = function createSession(options) {
17069
17083
  //set remote sdp
17070
17084
  if (sdp && sdp !== '') {
17071
17085
  sdp = sdpHookHandler(sdp, sdpHook);
17086
+ // Adjust publishing bitrate #WCS-4013
17087
+ sdp = util.setPublishingBitrate(sdp, mediaConnection, minBitrate, maxBitrate);
17072
17088
  mediaConnection.setRemoteSdp(sdp, hasTransferredCall, id_).then(function () {});
17073
17089
  return;
17074
17090
  }
@@ -17234,6 +17250,8 @@ var createSession = function createSession(options) {
17234
17250
  status_ = CALL_STATUS.PENDING;
17235
17251
  var sdp;
17236
17252
  var sdpHook = answerOptions.sdpHook;
17253
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
17254
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
17237
17255
  sipSDP = answerOptions.sipSDP;
17238
17256
  sipHeaders = answerOptions.sipHeaders;
17239
17257
  if (!remoteSdpCache[id_]) {
@@ -17241,6 +17259,8 @@ var createSession = function createSession(options) {
17241
17259
  throw new Error("No remote sdp available");
17242
17260
  } else {
17243
17261
  sdp = sdpHookHandler(remoteSdpCache[id_], sdpHook);
17262
+ // Adjust publishing bitrate #WCS-4013
17263
+ sdp = util.setPublishingBitrate(sdp, null, minBitrate, maxBitrate);
17244
17264
  delete remoteSdpCache[id_];
17245
17265
  }
17246
17266
  if (util.SDP.matchPrefix(sdp, "m=video").length == 0) {
@@ -17274,6 +17294,8 @@ var createSession = function createSession(options) {
17274
17294
  useControls: useControls
17275
17295
  }).then(function (newConnection) {
17276
17296
  mediaConnection = newConnection;
17297
+ // Set publishing bitrate via sender encodings if SDP feature is not supported
17298
+ mediaConnection.setPublishingBitrate(minBitrate, maxBitrate);
17277
17299
  return mediaConnection.setRemoteSdp(sdp);
17278
17300
  }).then(function () {
17279
17301
  return mediaConnection.createAnswer({
@@ -17808,15 +17830,15 @@ var createSession = function createSession(options) {
17808
17830
  // Receive media
17809
17831
  var receiveAudio;
17810
17832
  var audioOutputId;
17811
- var audioProperty = getConstraintsProperty(constraints, "audio", undefined);
17833
+ var audioProperty = getConstraintsProperty(constraints, CONSTRAINT_AUDIO, undefined);
17812
17834
  if (typeof audioProperty === 'boolean') {
17813
17835
  receiveAudio = audioProperty;
17814
17836
  } else if (_typeof(audioProperty) === 'object') {
17815
17837
  receiveAudio = true;
17816
- var _stereo = getConstraintsProperty(audioProperty, "stereo", 0);
17817
- var _bitrate = getConstraintsProperty(audioProperty, "bitrate", 0);
17818
- var _fec = getConstraintsProperty(audioProperty, "fec", 0);
17819
- audioOutputId = getConstraintsProperty(audioProperty, "outputId", 0);
17838
+ var _stereo = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_STEREO, 0);
17839
+ var _bitrate = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_BITRATE, 0);
17840
+ var _fec = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_FEC, 0);
17841
+ audioOutputId = getConstraintsProperty(audioProperty, CONSTRAINT_AUDIO_OUTPUT_ID, 0);
17820
17842
  var _codecOptions = "";
17821
17843
  if (_bitrate) _codecOptions += "maxaveragebitrate=" + _bitrate + ";";
17822
17844
  if (_stereo) _codecOptions += "stereo=1;sprop-stereo=1;";
@@ -17825,7 +17847,7 @@ var createSession = function createSession(options) {
17825
17847
  receiveAudio = typeof options.receiveAudio !== 'undefined' ? options.receiveAudio : true;
17826
17848
  }
17827
17849
  var receiveVideo;
17828
- var videoProperty = getConstraintsProperty(constraints, "video", undefined);
17850
+ var videoProperty = getConstraintsProperty(constraints, CONSTRAINT_VIDEO, undefined);
17829
17851
  if (typeof videoProperty === 'boolean') {
17830
17852
  receiveVideo = videoProperty;
17831
17853
  } else if (_typeof(videoProperty) === 'object') {
@@ -17834,16 +17856,16 @@ var createSession = function createSession(options) {
17834
17856
  receiveVideo = typeof options.receiveVideo !== 'undefined' ? options.receiveVideo : true;
17835
17857
  }
17836
17858
  // Bitrate
17837
- var bitrate = getConstraintsProperty(constraints, "video.bitrate", 0);
17838
- var minBitrate = getConstraintsProperty(constraints, "video.minBitrate", 0);
17839
- var maxBitrate = getConstraintsProperty(constraints, "video.maxBitrate", 0);
17859
+ var bitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_BITRATE, 0);
17860
+ var minBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MIN_BITRATE, 0);
17861
+ var maxBitrate = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_MAX_BITRATE, 0);
17840
17862
 
17841
17863
  // Quality
17842
- var quality = getConstraintsProperty(constraints, "video.quality", 0);
17864
+ var quality = getConstraintsProperty(constraints, CONSTRAINT_VIDEO_QUALITY, 0);
17843
17865
  if (quality > 100) quality = 100;
17844
17866
  // Play resolution
17845
- var playWidth = typeof options.playWidth !== 'undefined' ? options.playWidth : getConstraintsProperty(constraints, "video.width", 0);
17846
- var playHeight = typeof options.playHeight !== 'undefined' ? options.playHeight : getConstraintsProperty(constraints, "video.height", 0);
17867
+ var playWidth = typeof options.playWidth !== 'undefined' ? options.playWidth : getConstraintsProperty(constraints, CONSTRAINT_VIDEO_WIDTH, 0);
17868
+ var playHeight = typeof options.playHeight !== 'undefined' ? options.playHeight : getConstraintsProperty(constraints, CONSTRAINT_VIDEO_HEIGHT, 0);
17847
17869
  var stripCodecs = options.stripCodecs || [];
17848
17870
  var resolution = {};
17849
17871
  var published_ = false;
@@ -17898,6 +17920,8 @@ var createSession = function createSession(options) {
17898
17920
  var _sdp = sdp;
17899
17921
  if (_codecOptions) _sdp = util.SDP.writeFmtp(sdp, _codecOptions, "opus");
17900
17922
  _sdp = sdpHookHandler(_sdp, sdpHook);
17923
+ // Adjust publishing bitrate #WCS-4013
17924
+ _sdp = util.setPublishingBitrate(_sdp, mediaConnection, minBitrate, maxBitrate);
17901
17925
  mediaConnection.setRemoteSdp(_sdp).then(function () {});
17902
17926
  return;
17903
17927
  }
@@ -19748,6 +19772,62 @@ var SDP = {
19748
19772
  }
19749
19773
  }
19750
19774
  return result;
19775
+ },
19776
+ setPublishingBitrate: function setPublishingBitrate(sdp, minBitrate, maxBitrate) {
19777
+ if (sdp && (minBitrate || maxBitrate)) {
19778
+ var sdpArray = sdp.split("\n");
19779
+ var i;
19780
+ var rtpmap = -1,
19781
+ codec = "";
19782
+ var matches;
19783
+ var bitrateString = "";
19784
+ for (i = 0; i < sdpArray.length; i++) {
19785
+ if (sdpArray[i].startsWith("a=rtpmap")) {
19786
+ matches = sdpArray[i].match("a=rtpmap:(.+) (.+)/.*");
19787
+ if (matches && matches.length > 2) {
19788
+ rtpmap = parseInt(matches[1], 10);
19789
+ codec = matches[2];
19790
+ }
19791
+ } else {
19792
+ if (codec === "H264" || codec === "VP8") {
19793
+ if (sdpArray[i].startsWith("a=fmtp:" + rtpmap)) {
19794
+ bitrateString = this.getBitrateString(sdpArray[i], minBitrate, maxBitrate);
19795
+ if (bitrateString) {
19796
+ sdpArray[i] += ";" + bitrateString;
19797
+ }
19798
+ } else {
19799
+ bitrateString = this.getBitrateString("", minBitrate, maxBitrate);
19800
+ if (bitrateString) {
19801
+ sdpArray[i] = "a=fmtp:" + rtpmap + " " + bitrateString + "\r\n" + sdpArray[i];
19802
+ }
19803
+ }
19804
+ codec = "";
19805
+ rtpmap = -1;
19806
+ }
19807
+ }
19808
+ }
19809
+ var newSDP = "";
19810
+ for (i = 0; i < sdpArray.length; i++) {
19811
+ if (sdpArray[i] != "") {
19812
+ newSDP += sdpArray[i] + "\n";
19813
+ }
19814
+ }
19815
+ return newSDP;
19816
+ }
19817
+ return sdp;
19818
+ },
19819
+ getBitrateString: function getBitrateString(string, minBitrate, maxBitrate) {
19820
+ var bitrateString = "";
19821
+ if (minBitrate && string.indexOf("x-google-min-bitrate") == -1) {
19822
+ bitrateString += "x-google-min-bitrate=" + minBitrate;
19823
+ }
19824
+ if (maxBitrate && string.indexOf("x-google-max-bitrate") == -1) {
19825
+ if (bitrateString) {
19826
+ bitrateString += ";";
19827
+ }
19828
+ bitrateString += "x-google-max-bitrate=" + maxBitrate;
19829
+ }
19830
+ return bitrateString;
19751
19831
  }
19752
19832
  };
19753
19833
  var logger = function logger() {
@@ -19991,6 +20071,18 @@ var isPromise = function isPromise(object) {
19991
20071
  }
19992
20072
  return false;
19993
20073
  };
20074
+ var setPublishingBitrate = function setPublishingBitrate(sdp, mediaConnection, minBitrate, maxBitrate) {
20075
+ if (minBitrate || maxBitrate) {
20076
+ if (sdp && Browser.isChrome() || Browser.isSafariWebRTC()) {
20077
+ // Set publishing bitrate constraints via remote SDP
20078
+ sdp = SDP.setPublishingBitrate(sdp, minBitrate, maxBitrate);
20079
+ } else if (mediaConnection) {
20080
+ // Set publishing bitrate via sender encodings if SDP feature is not supported
20081
+ mediaConnection.setPublishingBitrate(minBitrate, maxBitrate);
20082
+ }
20083
+ }
20084
+ return sdp;
20085
+ };
19994
20086
  module.exports = {
19995
20087
  isEmptyObject: isEmptyObject,
19996
20088
  copyObjectToArray: copyObjectToArray,
@@ -20001,7 +20093,8 @@ module.exports = {
20001
20093
  logger: logger,
20002
20094
  stripCodecs: stripCodecs,
20003
20095
  getCurrentCodecAndSampleRate: getCurrentCodecAndSampleRate,
20004
- isPromise: isPromise
20096
+ isPromise: isPromise,
20097
+ setPublishingBitrate: setPublishingBitrate
20005
20098
  };
20006
20099
 
20007
20100
  },{}],45:[function(require,module,exports){