diff --git a/config.js b/config.js index db9c3b195..1074b03c7 100644 --- a/config.js +++ b/config.js @@ -15,5 +15,6 @@ var config = { enableRtpStats: true, // Enables RTP stats processing openSctp: true, // Toggle to enable/disable SCTP channels // channelLastN: -1, // The default value of the channel attribute last-n. +// useRtcpMux: true, enableRecording: false }; diff --git a/libs/colibri/colibri.focus.js b/libs/colibri/colibri.focus.js index 20a55a53e..62c5b4bb9 100644 --- a/libs/colibri/colibri.focus.js +++ b/libs/colibri/colibri.focus.js @@ -303,6 +303,9 @@ ColibriFocus.prototype._makeConference = function () { elem.c(elemName, elemAttrs); elem.attrs({ endpoint: peer.substr(1 + peer.lastIndexOf('/')) }); + if ('channel' === elemName && config.useRtcpMux) { + elem.c('rtcp-mux').up(); + } elem.up(); // end of channel/sctpconnection } elem.up(); // end of content @@ -407,6 +410,7 @@ ColibriFocus.prototype.createdConference = function (result) { 'a=rtpmap:13 CN/8000\r\n' + 'a=rtpmap:126 telephone-event/8000\r\n' + 'a=maxptime:60\r\n' + + (config.useRtcpMux ? 'a=rtcp-mux\r\n' : '') + /* Video */ 'm=video 1 RTP/SAVPF 100 116 117\r\n' + 'c=IN IP4 0.0.0.0\r\n' + @@ -421,6 +425,7 @@ ColibriFocus.prototype.createdConference = function (result) { 'a=rtcp-fb:100 goog-remb\r\n' + 'a=rtpmap:116 red/90000\r\n' + 'a=rtpmap:117 ulpfec/90000\r\n' + + (config.useRtcpMux ? 'a=rtcp-mux\r\n' : '') + /* Data SCTP */ (config.openSctp ? 'm=application 1 DTLS/SCTP 5000\r\n' + @@ -617,7 +622,9 @@ ColibriFocus.prototype.initiate = function (peer, isInitiator) { sdp.removeSessionLines('a=group:'); sdp.removeSessionLines('a=msid-semantic:'); // FIXME: not mapped over jingle anyway... for (var i = 0; i < sdp.media.length; i++) { - sdp.removeMediaLines(i, 'a=rtcp-mux'); + if (!config.useRtcpMux){ + sdp.removeMediaLines(i, 'a=rtcp-mux'); + } sdp.removeMediaLines(i, 'a=ssrc:'); sdp.removeMediaLines(i, 'a=crypto:'); sdp.removeMediaLines(i, 'a=candidate:'); @@ -774,6 +781,9 @@ ColibriFocus.prototype.addNewParticipant = function (peer) { elem.c('content', { name: name }); elem.c(elemName, elemAttrs); + if ('channel' === elemName && config.useRtcpMux) { + elem.c('rtcp-mux').up(); + } elem.up(); // end of channel/sctpconnection elem.up(); // end of content }); @@ -821,6 +831,9 @@ ColibriFocus.prototype.updateChannel = function (remoteSDP, participant) { endpoint: $(this.channels[participant][channel]).attr('endpoint'), expire: self.channelExpire }); + if (config.useRtcpMux) { + change.c('rtcp-mux').up(); + } var rtpmap = SDPUtil.find_lines(remoteSDP.media[channel], 'a=rtpmap:'); rtpmap.forEach(function (val) { @@ -1031,6 +1044,10 @@ ColibriFocus.prototype.addIceCandidate = function (session, elem) { endpoint: $(self.channels[participant][channel]).attr('endpoint'), expire: self.channelExpire }); + + if (config.useRtcpMux) { + change.c('rtcp-mux').up(); + } } else { @@ -1114,6 +1131,10 @@ ColibriFocus.prototype.sendIceCandidates = function (candidates) { endpoint: $(this.mychannel[cands[0].sdpMLineIndex]).attr('endpoint'), expire: self.channelExpire }); + if (config.useRtcpMux) { + mycands.c('rtcp-mux').up(); + } + } else { diff --git a/libs/strophe/strophe.jingle.adapter.js b/libs/strophe/strophe.jingle.adapter.js index 05c69bcd6..30eaff65e 100644 --- a/libs/strophe/strophe.jingle.adapter.js +++ b/libs/strophe/strophe.jingle.adapter.js @@ -513,7 +513,7 @@ function getUserMediaWithConstraints(um, success_callback, failure_callback, res constraints.video = { mandatory: {}, optional: [] };// same behaviour as true } if (um.indexOf('audio') >= 0) { - constraints.audio = {};// same behaviour as true + constraints.audio = { mandatory: {}, optional: []};// same behaviour as true } if (um.indexOf('screen') >= 0) { constraints.video = { @@ -541,6 +541,29 @@ function getUserMediaWithConstraints(um, success_callback, failure_callback, res } } + if (constraints.audio) { + // if it is good enough for hangouts... + constraints.audio.optional.push( + {googEchoCancellation: true}, + {googAutoGainControl: true}, + {googNoiseSupression: true}, + {googHighpassFilter: true}, + {googNoisesuppression2: true}, + {googEchoCancellation2: true}, + {googAutoGainControl2: true} + ); + } + if (constraints.video) { + constraints.video.optional.push( + {googNoiseReduction: true} + ); + if (um.indexOf('video') >= 0) { + constraints.video.optional.push( + {googLeakyBucket: true} + ); + } + } + // Check if we are running on Android device var isAndroid = navigator.userAgent.indexOf('Android') != -1; @@ -596,12 +619,12 @@ function getUserMediaWithConstraints(um, success_callback, failure_callback, res } if (bandwidth) { // doesn't work currently, see webrtc issue 1846 - if (!constraints.video) constraints.video = {mandatory: {}};//same behaviour as true - constraints.video.optional = [{bandwidth: bandwidth}]; + if (!constraints.video) constraints.video = {mandatory: {}, optional: []};//same behaviour as true + constraints.video.optional.push({bandwidth: bandwidth}); } if (fps) { // for some cameras it might be necessary to request 30fps // so they choose 30fps mjpg over 10fps yuy2 - if (!constraints.video) constraints.video = {mandatory: {}};// same behaviour as tru; + if (!constraints.video) constraints.video = {mandatory: {}, optional: []};// same behaviour as true; constraints.video.mandatory.minFrameRate = fps; }