Enable DTLS for peerconnection example. If it's a loopback test, then we recreate another peerconnection with DTLS off.

BUG=3872
TEST=Manual Test
R=jiayl@webrtc.org, tommi@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/36989004

Cr-Commit-Position: refs/heads/master@{#8193}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8193 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
braveyao@webrtc.org 2015-01-29 04:23:01 +00:00
parent f17ee9c709
commit a742cb1f37
3 changed files with 88 additions and 36 deletions

View File

@ -32,6 +32,7 @@
#include "talk/app/webrtc/videosourceinterface.h"
#include "talk/examples/peerconnection/client/defaults.h"
#include "talk/media/devices/devicemanager.h"
#include "talk/app/webrtc/test/fakeconstraints.h"
#include "webrtc/base/common.h"
#include "webrtc/base/json.h"
#include "webrtc/base/logging.h"
@ -45,6 +46,9 @@ const char kCandidateSdpName[] = "candidate";
const char kSessionDescriptionTypeName[] = "type";
const char kSessionDescriptionSdpName[] = "sdp";
#define DTLS_ON true
#define DTLS_OFF false
class DummySetSessionDescriptionObserver
: public webrtc::SetSessionDescriptionObserver {
public:
@ -66,6 +70,7 @@ class DummySetSessionDescriptionObserver
Conductor::Conductor(PeerConnectionClient* client, MainWindow* main_wnd)
: peer_id_(-1),
loopback_(false),
client_(client),
main_wnd_(main_wnd) {
client_->RegisterObserver(this);
@ -98,16 +103,7 @@ bool Conductor::InitializePeerConnection() {
return false;
}
webrtc::PeerConnectionInterface::IceServers servers;
webrtc::PeerConnectionInterface::IceServer server;
server.uri = GetPeerConnectionString();
servers.push_back(server);
peer_connection_ = peer_connection_factory_->CreatePeerConnection(servers,
NULL,
NULL,
NULL,
this);
if (!peer_connection_.get()) {
if (!CreatePeerConnection(DTLS_ON)) {
main_wnd_->MessageBox("Error",
"CreatePeerConnection failed", true);
DeletePeerConnection();
@ -116,6 +112,43 @@ bool Conductor::InitializePeerConnection() {
return peer_connection_.get() != NULL;
}
bool Conductor::ReinitializePeerConnectionForLoopback() {
loopback_ = true;
rtc::scoped_refptr<webrtc::StreamCollectionInterface> streams(
peer_connection_->local_streams());
peer_connection_ = NULL;
if (CreatePeerConnection(DTLS_OFF)) {
for (size_t i = 0; i < streams->count(); ++i)
peer_connection_->AddStream(streams->at(i));
peer_connection_->CreateOffer(this, NULL);
}
return peer_connection_.get() != NULL;
}
bool Conductor::CreatePeerConnection(bool dtls) {
ASSERT(peer_connection_factory_.get() != NULL);
ASSERT(peer_connection_.get() == NULL);
webrtc::PeerConnectionInterface::IceServers servers;
webrtc::PeerConnectionInterface::IceServer server;
server.uri = GetPeerConnectionString();
servers.push_back(server);
webrtc::FakeConstraints constraints;
if (dtls) {
constraints.AddOptional(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
"true");
}
peer_connection_ =
peer_connection_factory_->CreatePeerConnection(servers,
&constraints,
NULL,
NULL,
this);
return peer_connection_.get() != NULL;
}
void Conductor::DeletePeerConnection() {
peer_connection_ = NULL;
active_streams_.clear();
@ -123,6 +156,7 @@ void Conductor::DeletePeerConnection() {
main_wnd_->StopRemoteRenderer();
peer_connection_factory_ = NULL;
peer_id_ = -1;
loopback_ = false;
}
void Conductor::EnsureStreamingUI() {
@ -155,6 +189,14 @@ void Conductor::OnRemoveStream(webrtc::MediaStreamInterface* stream) {
void Conductor::OnIceCandidate(const webrtc::IceCandidateInterface* candidate) {
LOG(INFO) << __FUNCTION__ << " " << candidate->sdp_mline_index();
// For loopback test. To save some connecting delay.
if (loopback_) {
if (!peer_connection_->AddIceCandidate(candidate)) {
LOG(WARNING) << "Failed to apply the received candidate";
}
return;
}
Json::StyledWriter writer;
Json::Value jmessage;
@ -237,6 +279,17 @@ void Conductor::OnMessageFromPeer(int peer_id, const std::string& message) {
GetStringFromJsonObject(jmessage, kSessionDescriptionTypeName, &type);
if (!type.empty()) {
if (type == "offer-loopback") {
// This is a loopback call.
// Recreate the peerconnection with DTLS disabled.
if (!ReinitializePeerConnectionForLoopback()) {
LOG(LS_ERROR) << "Failed to initialize our PeerConnection instance";
DeletePeerConnection();
client_->SignOut();
}
return;
}
std::string sdp;
if (!GetStringFromJsonObject(jmessage, kSessionDescriptionSdpName, &sdp)) {
LOG(WARNING) << "Can't parse received session description message.";
@ -465,13 +518,25 @@ void Conductor::UIThreadCallback(int msg_id, void* data) {
}
void Conductor::OnSuccess(webrtc::SessionDescriptionInterface* desc) {
peer_connection_->SetLocalDescription(
DummySetSessionDescriptionObserver::Create(), desc);
peer_connection_->SetLocalDescription(
DummySetSessionDescriptionObserver::Create(), desc);
std::string sdp;
desc->ToString(&sdp);
// For loopback test. To save some connecting delay.
if (loopback_) {
// Replace message type from "offer" to "answer"
webrtc::SessionDescriptionInterface* session_description(
webrtc::CreateSessionDescription("answer", sdp));
peer_connection_->SetRemoteDescription(
DummySetSessionDescriptionObserver::Create(), session_description);
return;
}
Json::StyledWriter writer;
Json::Value jmessage;
jmessage[kSessionDescriptionTypeName] = desc->type();
std::string sdp;
desc->ToString(&sdp);
jmessage[kSessionDescriptionSdpName] = sdp;
SendMessage(writer.write(jmessage));
}

View File

@ -71,6 +71,8 @@ class Conductor
protected:
~Conductor();
bool InitializePeerConnection();
bool ReinitializePeerConnectionForLoopback();
bool CreatePeerConnection(bool dtls);
void DeletePeerConnection();
void EnsureStreamingUI();
void AddStreams();
@ -129,6 +131,7 @@ class Conductor
void SendMessage(const std::string& json_object);
int peer_id_;
bool loopback_;
rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
peer_connection_factory_;

View File

@ -33,28 +33,12 @@ function handlePeerMessage(peer_id, data) {
trace(str);
if (document.getElementById("loopback").checked) {
if (data.search("offer") != -1) {
// In loopback mode, replace the offer with an answer.
data = data.replace("offer", "answer");
// Keep only the first crypto line for each m line in the answer.
var mlines = data.split("m=");
// Start from 1 because the first item in the array is not a m line.
for (var i = 1; i < mlines.length; ++i) {
var mline = mlines[i];
var cryptoBegin = mline.indexOf("a=crypto:", 0);
if (cryptoBegin == -1) {
// No crypto line found.
continue;
}
// Skip the first crypto line.
cryptoBegin = mline.indexOf("a=crypto:", cryptoBegin + 1);
while (cryptoBegin != -1) {
var cryptoEnd = mline.indexOf("\\n", cryptoBegin);
var crypto = mline.substring(cryptoBegin, cryptoEnd + 2);
data = data.replace(crypto, "");
// Search for the the next crypto line.
cryptoBegin = mline.indexOf("a=crypto:", cryptoBegin + 1);
}
}
// In loopback mode, if DTLS is enabled, notify the client to disable it.
// Otherwise replace the offer with an answer.
if (data.search("fingerprint") != -1)
data = data.replace("offer", "offer-loopback");
else
data = data.replace("offer", "answer");
}
sendToPeer(peer_id, data);
}