From d20dd4e957c577b4831edfe77336e5cbfaafba05 Mon Sep 17 00:00:00 2001 From: Simon Eisenmann Date: Tue, 4 Nov 2014 12:26:23 +0100 Subject: [PATCH] Changed offer generation to generate offer when negotiation is required and signaling state is stable. --- static/js/mediastream/peercall.js | 3 +- static/js/mediastream/peerconference.js | 7 ++-- static/js/mediastream/peerconnection.js | 2 +- static/js/mediastream/webrtc.js | 45 +++++++++++++++++++++---- 4 files changed, 46 insertions(+), 11 deletions(-) diff --git a/static/js/mediastream/peercall.js b/static/js/mediastream/peercall.js index a56f3202..be961623 100644 --- a/static/js/mediastream/peercall.js +++ b/static/js/mediastream/peercall.js @@ -196,11 +196,12 @@ define(['jquery', 'underscore', 'mediastream/utils', 'mediastream/peerconnection }; - PeerCall.prototype.onNegotiationNeeded = function(peerconnection) { + PeerCall.prototype.onNegotiationNeeded = function() { if (!this.negotiationNeeded) { this.negotiationNeeded = true; console.log("Negotiation needed.", this); + this.e.triggerHandler("negotiationNeeded", [this]); } }; diff --git a/static/js/mediastream/peerconference.js b/static/js/mediastream/peerconference.js index cda53304..b1a450c3 100644 --- a/static/js/mediastream/peerconference.js +++ b/static/js/mediastream/peerconference.js @@ -92,13 +92,16 @@ define(['underscore', 'mediastream/peercall'], function(_, PeerCall) { console.log("Creating PeerConnection", call); call.createPeerConnection(_.bind(function(peerconnection) { // Success call. + call.e.on("negotiationNeeded", _.bind(function(event, extracall) { + this.webrtc.sendOfferWhenNegotiationNeeded(extracall); + }, this)); if (this.webrtc.usermedia) { this.webrtc.usermedia.addToPeerConnection(peerconnection); } - call.createOffer(_.bind(function(sessionDescription, extracall) { + /*call.createOffer(_.bind(function(sessionDescription, extracall) { console.log("Sending offer with sessionDescription", sessionDescription, extracall.id); this.webrtc.api.sendOffer(extracall.id, sessionDescription); - }, this)); + }, this));*/ }, this), _.bind(function() { // Error call. console.error("Failed to create peer connection for conference call."); diff --git a/static/js/mediastream/peerconnection.js b/static/js/mediastream/peerconnection.js index 760835e3..1db75f2f 100644 --- a/static/js/mediastream/peerconnection.js +++ b/static/js/mediastream/peerconnection.js @@ -230,7 +230,7 @@ define(['jquery', 'underscore', 'webrtc.adapter'], function($, _) { var peerconnection = event.target; if (peerconnection === this.pc) { //console.log("Negotiation needed.", peerconnection.remoteDescription, peerconnection.iceConnectionState, peerconnection.signalingState, this); - this.currentcall.onNegotiationNeeded(this); + this.currentcall.onNegotiationNeeded(); } }; diff --git a/static/js/mediastream/webrtc.js b/static/js/mediastream/webrtc.js index bc23bbe7..353e08e0 100644 --- a/static/js/mediastream/webrtc.js +++ b/static/js/mediastream/webrtc.js @@ -280,7 +280,10 @@ function($, _, PeerCall, PeerConference, PeerXfer, PeerScreenshare, UserMedia, u } // TODO(longsleep): In case of negotiation this could switch offer and answer // and result in a offer sdp sent as answer data. We need to handle this. - targetcall.setRemoteDescription(new RTCSessionDescription(data)); + targetcall.setRemoteDescription(new RTCSessionDescription(data), function() { + // Received remote description as answer. + console.log("Received answer after we sent offer", data); + }); break; case "Bye": targetcall = this.findTargetCall(from); @@ -482,12 +485,17 @@ function($, _, PeerCall, PeerConference, PeerXfer, PeerScreenshare, UserMedia, u // Connect. xfer.setInitiate(true); - xfer.createPeerConnection(); + xfer.createPeerConnection(_.bind(function() { + xfer.e.on("negotiationNeeded", _.bind(function(event, currentxfer) { + this.sendOfferWhenNegotiationNeeded(currentxfer, id); + }, this)); + }, this)); + /* xfer.createOffer(_.bind(function(sessionDescription, currentxfer) { console.log("Sending xfer offer with sessionDescription", sessionDescription, currentxfer.id); // TODO(longsleep): Support sending this through data channel too if we have one. this.api.sendOffer(id, sessionDescription); - }, this)); + }, this));*/ }; @@ -553,12 +561,17 @@ function($, _, PeerCall, PeerConference, PeerXfer, PeerScreenshare, UserMedia, u // Connect. peerscreenshare.setInitiate(true); //XXX(longsleep): This creates a data channel which is not needed. - peerscreenshare.createPeerConnection(); + peerscreenshare.createPeerConnection(_.bind(function() { + peerscreenshare.e.on("negotiationNeeded", _.bind(function(event, currentscreenshare) { + this.sendOfferWhenNegotiationNeeded(currentscreenshare, id); + }, this)); + }, this)); + /* peerscreenshare.createOffer(_.bind(function(sessionDescription, currentscreenshare) { console.log("Sending screen share offer with sessionDescription", sessionDescription, currentscreenshare.id); // TODO(longsleep): Support sending this through data channel too if we have one. this.api.sendOffer(id, sessionDescription); - }, this)); + }, this));*/ }; @@ -637,13 +650,16 @@ function($, _, PeerCall, PeerConference, PeerXfer, PeerScreenshare, UserMedia, u } this.started = true; if (this.initiator) { - currentcall.createOffer(_.bind(function(sessionDescription, currentcall) { + /*currentcall.createOffer(_.bind(function(sessionDescription, currentcall) { console.log("Sending offer with sessionDescription", sessionDescription, currentcall.id); this.api.sendOffer(currentcall.id, sessionDescription); - }, this)); + }, this));*/ } else { this.calleeStart(); } + currentcall.e.on("negotiationNeeded", _.bind(function(event, currentcall) { + this.sendOfferWhenNegotiationNeeded(currentcall); + }, this)); }, this), _.bind(function() { // Error call. this.e.triggerHandler("error", ["Failed to create peer connection. See log for details."]); @@ -664,6 +680,21 @@ function($, _, PeerCall, PeerConference, PeerXfer, PeerScreenshare, UserMedia, u }; + WebRTC.prototype.sendOfferWhenNegotiationNeeded = function(currentcall, to) { + + if (currentcall.peerconnection.pc.signalingState === "stable") { + if (!to) { + to = currentcall.id; + } + currentcall.createOffer(_.bind(function(sessionDescription, currentcall) { + console.log("Sending offer with sessionDescription", sessionDescription, to, currentcall); + // TODO(longsleep): Support sending this through data channel too if we have one. + this.api.sendOffer(to, sessionDescription); + }, this)); + } + + }; + WebRTC.prototype.onConnectionStateChange = function(iceConnectionState, currentcall) { // Defer this to allow native event handlers to complete before running more stuff. _.defer(_.bind(function() {