Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Unified Diff: content/renderer/media/rtc_peer_connection_handler.cc

Issue 675013005: Split libjingle's signaling thread from the UI thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase after landing data channel change Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/media/rtc_peer_connection_handler.cc
diff --git a/content/renderer/media/rtc_peer_connection_handler.cc b/content/renderer/media/rtc_peer_connection_handler.cc
index 9dedab4f827215a1519b9ffc8a85fa7776653f52..cf1a82f161518e7c3951dc46230f8b3421fa9093 100644
--- a/content/renderer/media/rtc_peer_connection_handler.cc
+++ b/content/renderer/media/rtc_peer_connection_handler.cc
@@ -41,7 +41,13 @@
#include "third_party/WebKit/public/platform/WebRTCVoidRequest.h"
#include "third_party/WebKit/public/platform/WebURL.h"
+using webrtc::DataChannelInterface;
+using webrtc::IceCandidateInterface;
+using webrtc::MediaStreamInterface;
+using webrtc::PeerConnectionInterface;
+using webrtc::PeerConnectionObserver;
using webrtc::StatsReport;
+using webrtc::StatsReportCopyable;
using webrtc::StatsReports;
namespace content {
@@ -171,25 +177,30 @@ class SessionDescriptionRequestTracker {
: handler_(handler), action_(action) {}
void TrackOnSuccess(const webrtc::SessionDescriptionInterface* desc) {
+ DCHECK(thread_checker_.CalledOnValidThread());
std::string value;
if (desc) {
desc->ToString(&value);
value = "type: " + desc->type() + ", sdp: " + value;
}
- if (handler_->peer_connection_tracker())
+ if (handler_->peer_connection_tracker()) {
handler_->peer_connection_tracker()->TrackSessionDescriptionCallback(
handler_, action_, "OnSuccess", value);
+ }
}
void TrackOnFailure(const std::string& error) {
- if (handler_->peer_connection_tracker())
+ DCHECK(thread_checker_.CalledOnValidThread());
+ if (handler_->peer_connection_tracker()) {
handler_->peer_connection_tracker()->TrackSessionDescriptionCallback(
handler_, action_, "OnFailure", error);
+ }
}
private:
RTCPeerConnectionHandler* handler_;
PeerConnectionTracker::Action action_;
+ base::ThreadChecker thread_checker_;
};
// Class mapping responses from calls to libjingle CreateOffer/Answer and
@@ -198,17 +209,33 @@ class CreateSessionDescriptionRequest
: public webrtc::CreateSessionDescriptionObserver {
public:
explicit CreateSessionDescriptionRequest(
+ const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
const blink::WebRTCSessionDescriptionRequest& request,
RTCPeerConnectionHandler* handler,
PeerConnectionTracker::Action action)
- : webkit_request_(request), tracker_(handler, action) {}
+ : main_thread_(main_thread),
+ webkit_request_(request),
+ tracker_(handler, action) {
+ }
void OnSuccess(webrtc::SessionDescriptionInterface* desc) override {
+ if (!main_thread_->BelongsToCurrentThread()) {
perkj_chrome 2014/10/30 12:42:35 Why is this? To avoid having a separate method OnS
tommi (sloooow) - chröme 2014/10/30 20:37:36 Yes, this is first always called on the signaling
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&CreateSessionDescriptionRequest::OnSuccess, this, desc));
+ return;
+ }
+
tracker_.TrackOnSuccess(desc);
webkit_request_.requestSucceeded(CreateWebKitSessionDescription(desc));
delete desc;
}
void OnFailure(const std::string& error) override {
+ if (!main_thread_->BelongsToCurrentThread()) {
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&CreateSessionDescriptionRequest::OnFailure, this, error));
+ return;
+ }
+
tracker_.TrackOnFailure(error);
webkit_request_.requestFailed(base::UTF8ToUTF16(error));
}
@@ -216,7 +243,7 @@ class CreateSessionDescriptionRequest
protected:
~CreateSessionDescriptionRequest() override {}
- private:
+ const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
blink::WebRTCSessionDescriptionRequest webkit_request_;
SessionDescriptionRequestTracker tracker_;
};
@@ -227,16 +254,30 @@ class SetSessionDescriptionRequest
: public webrtc::SetSessionDescriptionObserver {
public:
explicit SetSessionDescriptionRequest(
+ const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
const blink::WebRTCVoidRequest& request,
RTCPeerConnectionHandler* handler,
PeerConnectionTracker::Action action)
- : webkit_request_(request), tracker_(handler, action) {}
+ : main_thread_(main_thread),
+ webkit_request_(request),
+ tracker_(handler, action) {
+ }
void OnSuccess() override {
+ if (!main_thread_->BelongsToCurrentThread()) {
perkj_chrome 2014/10/30 12:42:35 Same question as 222.
tommi (sloooow) - chröme 2014/10/30 20:37:36 Let me know if you prefer to split these up into s
perkj_chrome 2014/10/31 08:37:24 I personally think this is fine at least on this t
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&SetSessionDescriptionRequest::OnSuccess, this));
+ return;
+ }
tracker_.TrackOnSuccess(NULL);
webkit_request_.requestSucceeded();
}
void OnFailure(const std::string& error) override {
+ if (!main_thread_->BelongsToCurrentThread()) {
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&SetSessionDescriptionRequest::OnFailure, this, error));
+ return;
+ }
tracker_.TrackOnFailure(error);
webkit_request_.requestFailed(base::UTF8ToUTF16(error));
}
@@ -245,6 +286,7 @@ class SetSessionDescriptionRequest
~SetSessionDescriptionRequest() override {}
private:
+ const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
blink::WebRTCVoidRequest webkit_request_;
SessionDescriptionRequestTracker tracker_;
};
@@ -254,29 +296,44 @@ class SetSessionDescriptionRequest
class StatsResponse : public webrtc::StatsObserver {
public:
explicit StatsResponse(const scoped_refptr<LocalRTCStatsRequest>& request)
- : request_(request.get()), response_(request_->createResponse().get()) {
+ : request_(request.get()),
+ main_thread_(base::ThreadTaskRunnerHandle::Get()) {
// Measure the overall time it takes to satisfy a getStats request.
TRACE_EVENT_ASYNC_BEGIN0("webrtc", "getStats_Native", this);
}
void OnComplete(const StatsReports& reports) override {
- TRACE_EVENT0("webrtc", "StatsResponse::OnComplete")
- for (StatsReports::const_iterator it = reports.begin();
- it != reports.end(); ++it) {
- if ((*it)->values.size() > 0) {
- AddReport(*(*it));
- }
+ TRACE_EVENT0("webrtc", "StatsResponse::OnComplete");
+ DCHECK(reports_.empty());
+ reports_.reserve(reports.size());
perkj_chrome 2014/10/30 12:42:35 reports_ are used to two threads. Please add threa
tommi (sloooow) - chröme 2014/10/30 20:37:36 ah, right, there's no need for that (meant to do t
+ for (auto it : reports)
+ reports_.push_back(StatsReportCopyable(*it));
+
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&StatsResponse::DeliverCallback, this));
+ }
+
+ private:
+ void DeliverCallback() {
+ DCHECK(main_thread_->BelongsToCurrentThread());
+ TRACE_EVENT0("webrtc", "StatsResponse::DeliverCallback");
+
+ // TODO: response_ doesn't need to be a member.
perkj_chrome 2014/10/30 12:42:35 please fix.
tommi (sloooow) - chröme 2014/10/30 20:37:36 Done.
+ response_ = request_->createResponse().get();
+ for (const auto& report : reports_) {
+ if (report.values.size() > 0)
+ AddReport(report);
}
+ reports_.clear();
+
// Record the getSync operation as done before calling into Blink so that
// we don't skew the perf measurements of the native code with whatever the
// callback might be doing.
TRACE_EVENT_ASYNC_END0("webrtc", "getStats_Native", this);
-
request_->requestSucceeded(response_);
}
- private:
void AddReport(const StatsReport& report) {
int idx = response_->addReport(blink::WebString::fromUTF8(report.id),
blink::WebString::fromUTF8(report.type),
@@ -294,13 +351,14 @@ class StatsResponse : public webrtc::StatsObserver {
}
rtc::scoped_refptr<LocalRTCStatsRequest> request_;
+ std::vector<StatsReportCopyable> reports_;
rtc::scoped_refptr<LocalRTCStatsResponse> response_;
+ const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
};
// Implementation of LocalRTCStatsRequest.
LocalRTCStatsRequest::LocalRTCStatsRequest(blink::WebRTCStatsRequest impl)
- : impl_(impl),
- response_(NULL) {
+ : impl_(impl) {
}
LocalRTCStatsRequest::LocalRTCStatsRequest() {}
@@ -315,10 +373,8 @@ blink::WebMediaStreamTrack LocalRTCStatsRequest::component() const {
}
scoped_refptr<LocalRTCStatsResponse> LocalRTCStatsRequest::createResponse() {
- DCHECK(!response_);
- response_ = new rtc::RefCountedObject<LocalRTCStatsResponse>(
- impl_.createResponse());
- return response_.get();
+ return scoped_refptr<LocalRTCStatsResponse>(
+ new rtc::RefCountedObject<LocalRTCStatsResponse>(impl_.createResponse()));
}
void LocalRTCStatsRequest::requestSucceeded(
@@ -345,6 +401,19 @@ void LocalRTCStatsResponse::addStatistic(size_t report,
namespace {
+void GetStatsOnSignalingThread(
+ const scoped_refptr<webrtc::PeerConnectionInterface>& pc,
+ webrtc::PeerConnectionInterface::StatsOutputLevel level,
+ const scoped_refptr<webrtc::StatsObserver>& observer,
+ const scoped_refptr<webrtc::MediaStreamTrackInterface>& track) {
+ TRACE_EVENT0("webrtc", "GetStatsOnSignalingThread");
+ if (!pc->GetStats(observer.get(), track.get(), level)) {
+ DVLOG(1) << "GetStats failed.";
+ // TODO(hta): Consider how to get an error back.
+ observer->OnComplete(StatsReports());
+ }
+}
+
class PeerConnectionUMAObserver : public webrtc::UMAObserver {
public:
PeerConnectionUMAObserver() {}
@@ -352,6 +421,7 @@ class PeerConnectionUMAObserver : public webrtc::UMAObserver {
void IncrementCounter(
webrtc::PeerConnectionUMAMetricsCounter counter) override {
+ // Runs on libjingle's signaling thread.
UMA_HISTOGRAM_ENUMERATION("WebRTC.PeerConnection.IPMetrics",
counter,
webrtc::kBoundary);
@@ -359,6 +429,7 @@ class PeerConnectionUMAObserver : public webrtc::UMAObserver {
void AddHistogramSample(webrtc::PeerConnectionUMAMetricsName type,
int value) override {
+ // Runs on libjingle's signaling thread.
switch (type) {
case webrtc::kTimeToConnect:
UMA_HISTOGRAM_MEDIUM_TIMES(
@@ -384,20 +455,154 @@ base::LazyInstance<std::set<RTCPeerConnectionHandler*> >::Leaky
} // namespace
+class RTCPeerConnectionHandler::Observer
perkj_chrome 2014/10/30 12:42:35 Please add a comment about the purpose of this cla
tommi (sloooow) - chröme 2014/10/30 20:37:36 Done.
+ : public base::RefCountedThreadSafe<RTCPeerConnectionHandler::Observer>,
+ public PeerConnectionObserver {
+ public:
+ Observer(const base::WeakPtr<RTCPeerConnectionHandler>& handler)
+ : handler_(handler), main_thread_(base::ThreadTaskRunnerHandle::Get()) {}
+
+ protected:
+ friend class base::RefCountedThreadSafe<RTCPeerConnectionHandler::Observer>;
+ virtual ~Observer() {}
+
+ void OnError() override {
+ // TODO(perkj): Implement.
perkj_chrome 2014/10/30 12:42:35 Or rater remove from the pc interface.
tommi (sloooow) - chröme 2014/10/30 20:37:36 Done.
+ NOTIMPLEMENTED();
+ }
+
+ void OnSignalingChange(
+ PeerConnectionInterface::SignalingState new_state) override {
+ if (!main_thread_->BelongsToCurrentThread()) {
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&RTCPeerConnectionHandler::Observer::OnSignalingChange,
+ this, new_state));
+ } else if (handler_) {
+ handler_->OnSignalingChange(new_state);
+ }
+ }
+
+ void OnAddStream(MediaStreamInterface* stream) override {
+ DCHECK(stream);
+ scoped_ptr<RemoteMediaStreamImpl> remote_stream(
+ new RemoteMediaStreamImpl(main_thread_, stream));
perkj_chrome 2014/10/30 12:42:35 So this is instantiating |remote_stream| on the si
tommi (sloooow) - chröme 2014/10/30 20:37:36 Discussed offline
+
+ // The webkit object owned by RemoteMediaStreamImpl, will be initialized
+ // asynchronously and the posted task will execude after that initialization
+ // is done.
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&RTCPeerConnectionHandler::Observer::OnAddStreamImpl,
+ this, base::Passed(&remote_stream)));
+ }
+
+ void OnRemoveStream(MediaStreamInterface* stream) override {
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&RTCPeerConnectionHandler::Observer::OnRemoveStreamImpl,
+ this, make_scoped_refptr(stream)));
+ }
+
+ void OnDataChannel(DataChannelInterface* data_channel) override {
+ scoped_ptr<RtcDataChannelHandler> handler(
+ new RtcDataChannelHandler(main_thread_, data_channel));
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&RTCPeerConnectionHandler::Observer::OnDataChannelImpl,
+ this, base::Passed(&handler)));
+ }
+
+ void OnRenegotiationNeeded() override {
+ if (!main_thread_->BelongsToCurrentThread()) {
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&RTCPeerConnectionHandler::Observer::OnRenegotiationNeeded,
+ this));
+ } else if (handler_) {
+ handler_->OnRenegotiationNeeded();
+ }
+ }
+
+ void OnIceConnectionChange(
+ PeerConnectionInterface::IceConnectionState new_state) override {
+ if (!main_thread_->BelongsToCurrentThread()) {
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(
+ &RTCPeerConnectionHandler::Observer::OnIceConnectionChange, this,
+ new_state));
+ } else if (handler_) {
+ handler_->OnIceConnectionChange(new_state);
+ }
+ }
+
+ void OnIceGatheringChange(
+ PeerConnectionInterface::IceGatheringState new_state) override {
+ if (!main_thread_->BelongsToCurrentThread()) {
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&RTCPeerConnectionHandler::Observer::OnIceGatheringChange,
+ this, new_state));
+ } else if (handler_) {
+ handler_->OnIceGatheringChange(new_state);
+ }
+ }
+
+ void OnIceCandidate(const IceCandidateInterface* candidate) override {
+ std::string sdp;
+ if (!candidate->ToString(&sdp)) {
+ NOTREACHED() << "OnIceCandidate: Could not get SDP string.";
+ return;
+ }
+
+ main_thread_->PostTask(FROM_HERE,
+ base::Bind(&RTCPeerConnectionHandler::Observer::OnIceCandidateImpl,
+ this, sdp, candidate->sdp_mid(), candidate->sdp_mline_index(),
+ candidate->candidate().component(),
+ candidate->candidate().address().family()));
+ }
+
+ void OnAddStreamImpl(scoped_ptr<RemoteMediaStreamImpl> stream) {
+ DCHECK(stream->webkit_stream().extraData()) << "Initialization not done";
+ if (handler_)
+ handler_->OnAddStream(stream.Pass());
+ }
+
+ void OnRemoveStreamImpl(const scoped_refptr<MediaStreamInterface>& stream) {
+ if (handler_)
+ handler_->OnRemoveStream(stream);
+ }
+
+ void OnDataChannelImpl(scoped_ptr<RtcDataChannelHandler> handler) {
+ if (handler_)
+ handler_->OnDataChannel(handler.Pass());
+ }
+
+ void OnIceCandidateImpl(const std::string& sdp, const std::string& sdp_mid,
+ int sdp_mline_index, int component, int address_family) {
+ if (handler_) {
+ handler_->OnIceCandidate(sdp, sdp_mid, sdp_mline_index, component,
+ address_family);
+ }
+ }
+
+ private:
+ const base::WeakPtr<RTCPeerConnectionHandler> handler_;
+ const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
+};
+
RTCPeerConnectionHandler::RTCPeerConnectionHandler(
blink::WebRTCPeerConnectionHandlerClient* client,
- PeerConnectionDependencyFactory* dependency_factory)
+ PeerConnectionDependencyFactory* dependency_factory,
+ const scoped_refptr<base::SingleThreadTaskRunner>& signaling_thread)
: client_(client),
dependency_factory_(dependency_factory),
frame_(NULL),
+ signaling_thread_(signaling_thread),
peer_connection_tracker_(NULL),
num_data_channels_created_(0),
num_local_candidates_ipv4_(0),
- num_local_candidates_ipv6_(0) {
+ num_local_candidates_ipv6_(0),
+ weak_factory_(this) {
g_peer_connection_handlers.Get().insert(this);
}
RTCPeerConnectionHandler::~RTCPeerConnectionHandler() {
+ DCHECK(thread_checker_.CalledOnValidThread());
g_peer_connection_handlers.Get().erase(this);
if (peer_connection_tracker_)
peer_connection_tracker_->UnregisterPeerConnection(this);
@@ -412,13 +617,13 @@ void RTCPeerConnectionHandler::DestructAllHandlers() {
std::set<RTCPeerConnectionHandler*> handlers(
g_peer_connection_handlers.Get().begin(),
g_peer_connection_handlers.Get().end());
- for (std::set<RTCPeerConnectionHandler*>::iterator handler = handlers.begin();
- handler != handlers.end();
- ++handler) {
- (*handler)->client_->releasePeerConnectionHandler();
+ for (auto handler : handlers) {
+ if (handler->client_)
+ handler->client_->releasePeerConnectionHandler();
}
}
+// static
void RTCPeerConnectionHandler::ConvertOfferOptionsToConstraints(
const blink::WebRTCOfferOptions& options,
RTCMediaConstraints* output) {
@@ -446,6 +651,7 @@ void RTCPeerConnectionHandler::ConvertOfferOptionsToConstraints(
}
void RTCPeerConnectionHandler::associateWithFrame(blink::WebFrame* frame) {
+ DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(frame);
frame_ = frame;
}
@@ -453,6 +659,7 @@ void RTCPeerConnectionHandler::associateWithFrame(blink::WebFrame* frame) {
bool RTCPeerConnectionHandler::initialize(
const blink::WebRTCConfiguration& server_configuration,
const blink::WebMediaConstraints& options) {
+ DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(frame_);
peer_connection_tracker_ =
@@ -463,17 +670,19 @@ bool RTCPeerConnectionHandler::initialize(
RTCMediaConstraints constraints(options);
- native_peer_connection_ =
- dependency_factory_->CreatePeerConnection(
- config, &constraints, frame_, this);
+ peer_connection_observer_ = new Observer(weak_factory_.GetWeakPtr());
+ native_peer_connection_ = dependency_factory_->CreatePeerConnection(
+ config, &constraints, frame_, peer_connection_observer_.get());
if (!native_peer_connection_.get()) {
LOG(ERROR) << "Failed to initialize native PeerConnection.";
return false;
}
- if (peer_connection_tracker_)
+
+ if (peer_connection_tracker_) {
peer_connection_tracker_->RegisterPeerConnection(
this, config, constraints, frame_);
+ }
uma_observer_ = new rtc::RefCountedObject<PeerConnectionUMAObserver>();
native_peer_connection_->RegisterUMAObserver(uma_observer_.get());
@@ -484,13 +693,14 @@ bool RTCPeerConnectionHandler::InitializeForTest(
const blink::WebRTCConfiguration& server_configuration,
const blink::WebMediaConstraints& options,
PeerConnectionTracker* peer_connection_tracker) {
+ DCHECK(thread_checker_.CalledOnValidThread());
webrtc::PeerConnectionInterface::RTCConfiguration config;
GetNativeRtcConfiguration(server_configuration, &config);
+ peer_connection_observer_ = new Observer(weak_factory_.GetWeakPtr());
RTCMediaConstraints constraints(options);
- native_peer_connection_ =
- dependency_factory_->CreatePeerConnection(
- config, &constraints, NULL, this);
+ native_peer_connection_ = dependency_factory_->CreatePeerConnection(
+ config, &constraints, NULL, peer_connection_observer_.get());
if (!native_peer_connection_.get()) {
LOG(ERROR) << "Failed to initialize native PeerConnection.";
return false;
@@ -502,10 +712,14 @@ bool RTCPeerConnectionHandler::InitializeForTest(
void RTCPeerConnectionHandler::createOffer(
const blink::WebRTCSessionDescriptionRequest& request,
const blink::WebMediaConstraints& options) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createOffer");
+
scoped_refptr<CreateSessionDescriptionRequest> description_request(
new rtc::RefCountedObject<CreateSessionDescriptionRequest>(
- request, this, PeerConnectionTracker::ACTION_CREATE_OFFER));
+ base::ThreadTaskRunnerHandle::Get(), request, this,
+ PeerConnectionTracker::ACTION_CREATE_OFFER));
+
RTCMediaConstraints constraints(options);
native_peer_connection_->CreateOffer(description_request.get(), &constraints);
@@ -516,10 +730,13 @@ void RTCPeerConnectionHandler::createOffer(
void RTCPeerConnectionHandler::createOffer(
const blink::WebRTCSessionDescriptionRequest& request,
const blink::WebRTCOfferOptions& options) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createOffer");
+
scoped_refptr<CreateSessionDescriptionRequest> description_request(
new rtc::RefCountedObject<CreateSessionDescriptionRequest>(
- request, this, PeerConnectionTracker::ACTION_CREATE_OFFER));
+ base::ThreadTaskRunnerHandle::Get(), request, this,
+ PeerConnectionTracker::ACTION_CREATE_OFFER));
RTCMediaConstraints constraints;
ConvertOfferOptionsToConstraints(options, &constraints);
@@ -532,10 +749,12 @@ void RTCPeerConnectionHandler::createOffer(
void RTCPeerConnectionHandler::createAnswer(
const blink::WebRTCSessionDescriptionRequest& request,
const blink::WebMediaConstraints& options) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createAnswer");
scoped_refptr<CreateSessionDescriptionRequest> description_request(
new rtc::RefCountedObject<CreateSessionDescriptionRequest>(
- request, this, PeerConnectionTracker::ACTION_CREATE_ANSWER));
+ base::ThreadTaskRunnerHandle::Get(), request, this,
+ PeerConnectionTracker::ACTION_CREATE_ANSWER));
RTCMediaConstraints constraints(options);
native_peer_connection_->CreateAnswer(description_request.get(),
&constraints);
@@ -547,6 +766,7 @@ void RTCPeerConnectionHandler::createAnswer(
void RTCPeerConnectionHandler::setLocalDescription(
const blink::WebRTCVoidRequest& request,
const blink::WebRTCSessionDescription& description) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::setLocalDescription");
webrtc::SdpParseError error;
webrtc::SessionDescriptionInterface* native_desc =
@@ -560,19 +780,23 @@ void RTCPeerConnectionHandler::setLocalDescription(
request.requestFailed(blink::WebString::fromUTF8(reason_str));
return;
}
- if (peer_connection_tracker_)
+
+ if (peer_connection_tracker_) {
peer_connection_tracker_->TrackSetSessionDescription(
this, description, PeerConnectionTracker::SOURCE_LOCAL);
+ }
scoped_refptr<SetSessionDescriptionRequest> set_request(
new rtc::RefCountedObject<SetSessionDescriptionRequest>(
- request, this, PeerConnectionTracker::ACTION_SET_LOCAL_DESCRIPTION));
+ base::ThreadTaskRunnerHandle::Get(), request, this,
+ PeerConnectionTracker::ACTION_SET_LOCAL_DESCRIPTION));
native_peer_connection_->SetLocalDescription(set_request.get(), native_desc);
}
void RTCPeerConnectionHandler::setRemoteDescription(
const blink::WebRTCVoidRequest& request,
const blink::WebRTCSessionDescription& description) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::setRemoteDescription");
webrtc::SdpParseError error;
webrtc::SessionDescriptionInterface* native_desc =
@@ -586,18 +810,28 @@ void RTCPeerConnectionHandler::setRemoteDescription(
request.requestFailed(blink::WebString::fromUTF8(reason_str));
return;
}
- if (peer_connection_tracker_)
+
+ if (peer_connection_tracker_) {
peer_connection_tracker_->TrackSetSessionDescription(
this, description, PeerConnectionTracker::SOURCE_REMOTE);
+ }
scoped_refptr<SetSessionDescriptionRequest> set_request(
new rtc::RefCountedObject<SetSessionDescriptionRequest>(
- request, this, PeerConnectionTracker::ACTION_SET_REMOTE_DESCRIPTION));
+ base::ThreadTaskRunnerHandle::Get(), request, this,
+ PeerConnectionTracker::ACTION_SET_REMOTE_DESCRIPTION));
+ // TODO(tommi): This cannot be posted to the signaling thread unfortunately
perkj_chrome 2014/10/30 12:42:35 Can we talk about this? Is this only due to our t
tommi (sloooow) - chröme 2014/10/30 20:37:36 Added a TODO to do this in a following cl as discu
+ // because the caller depends on the state being changed synchronously.
perkj_chrome 2014/10/30 12:42:35 We should at least but a similar explanation with
tommi (sloooow) - chröme 2014/10/30 20:37:36 Done.
+ // I'm guessing this is so that the local and remote getter functions will
+ // immediately return what was just set.
+ // This unfortunately does block the UI thread for some time (tens of ms on
+ // beefy machines) each time it's called.
native_peer_connection_->SetRemoteDescription(set_request.get(), native_desc);
}
blink::WebRTCSessionDescription
RTCPeerConnectionHandler::localDescription() {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::localDescription");
const webrtc::SessionDescriptionInterface* native_desc =
native_peer_connection_->local_description();
perkj_chrome 2014/10/30 12:42:35 Are these methods the problem?
tommi (sloooow) - chröme 2014/10/30 20:37:36 Yes - or rather the html test page had a bug which
@@ -608,6 +842,7 @@ RTCPeerConnectionHandler::localDescription() {
blink::WebRTCSessionDescription
RTCPeerConnectionHandler::remoteDescription() {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::remoteDescription");
const webrtc::SessionDescriptionInterface* native_desc =
native_peer_connection_->remote_description();
@@ -619,6 +854,7 @@ RTCPeerConnectionHandler::remoteDescription() {
bool RTCPeerConnectionHandler::updateICE(
const blink::WebRTCConfiguration& server_configuration,
const blink::WebMediaConstraints& options) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::updateICE");
webrtc::PeerConnectionInterface::RTCConfiguration config;
GetNativeRtcConfiguration(server_configuration, &config);
@@ -627,13 +863,13 @@ bool RTCPeerConnectionHandler::updateICE(
if (peer_connection_tracker_)
peer_connection_tracker_->TrackUpdateIce(this, config, constraints);
- return native_peer_connection_->UpdateIce(config.servers,
- &constraints);
+ return native_peer_connection_->UpdateIce(config.servers, &constraints);
}
bool RTCPeerConnectionHandler::addICECandidate(
- const blink::WebRTCVoidRequest& request,
- const blink::WebRTCICECandidate& candidate) {
+ const blink::WebRTCVoidRequest& request,
+ const blink::WebRTCICECandidate& candidate) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::addICECandidate");
// Libjingle currently does not accept callbacks for addICECandidate.
// For that reason we are going to call callbacks from here.
@@ -641,13 +877,14 @@ bool RTCPeerConnectionHandler::addICECandidate(
base::MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(&RTCPeerConnectionHandler::OnaddICECandidateResult,
- base::Unretained(this), request, result));
+ weak_factory_.GetWeakPtr(), request, result));
// On failure callback will be triggered.
return true;
}
bool RTCPeerConnectionHandler::addICECandidate(
const blink::WebRTCICECandidate& candidate) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::addICECandidate");
scoped_ptr<webrtc::IceCandidateInterface> native_candidate(
dependency_factory_->CreateIceCandidate(
@@ -673,6 +910,7 @@ bool RTCPeerConnectionHandler::addICECandidate(
void RTCPeerConnectionHandler::OnaddICECandidateResult(
const blink::WebRTCVoidRequest& webkit_request, bool result) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnaddICECandidateResult");
if (!result) {
// We don't have the actual error code from the libjingle, so for now
@@ -687,6 +925,7 @@ void RTCPeerConnectionHandler::OnaddICECandidateResult(
bool RTCPeerConnectionHandler::addStream(
const blink::WebMediaStream& stream,
const blink::WebMediaConstraints& options) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::addStream");
for (ScopedVector<WebRtcMediaStreamAdapter>::iterator adapter_it =
local_streams_.begin(); adapter_it != local_streams_.end();
@@ -698,9 +937,10 @@ bool RTCPeerConnectionHandler::addStream(
}
}
- if (peer_connection_tracker_)
+ if (peer_connection_tracker_) {
peer_connection_tracker_->TrackAddStream(
this, stream, PeerConnectionTracker::SOURCE_LOCAL);
+ }
PerSessionWebRTCAPIMetrics::GetInstance()->IncrementStreamCounter();
@@ -718,6 +958,7 @@ bool RTCPeerConnectionHandler::addStream(
void RTCPeerConnectionHandler::removeStream(
const blink::WebMediaStream& stream) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::removeStream");
// Find the webrtc stream.
scoped_refptr<webrtc::MediaStreamInterface> webrtc_stream;
@@ -733,9 +974,10 @@ void RTCPeerConnectionHandler::removeStream(
DCHECK(webrtc_stream.get());
native_peer_connection_->RemoveStream(webrtc_stream.get());
- if (peer_connection_tracker_)
+ if (peer_connection_tracker_) {
peer_connection_tracker_->TrackRemoveStream(
this, stream, PeerConnectionTracker::SOURCE_LOCAL);
+ }
PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter();
track_metrics_.RemoveStream(MediaStreamTrackMetrics::SENT_STREAM,
webrtc_stream.get());
@@ -743,12 +985,16 @@ void RTCPeerConnectionHandler::removeStream(
void RTCPeerConnectionHandler::getStats(
const blink::WebRTCStatsRequest& request) {
+ DCHECK(thread_checker_.CalledOnValidThread());
scoped_refptr<LocalRTCStatsRequest> inner_request(
new rtc::RefCountedObject<LocalRTCStatsRequest>(request));
- getStats(inner_request.get());
+ getStats(inner_request);
}
-void RTCPeerConnectionHandler::getStats(LocalRTCStatsRequest* request) {
+void RTCPeerConnectionHandler::getStats(
+ const scoped_refptr<LocalRTCStatsRequest>& request) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::getStats");
rtc::scoped_refptr<webrtc::StatsObserver> observer(
new rtc::RefCountedObject<StatsResponse>(request));
webrtc::MediaStreamTrackInterface* track = NULL;
@@ -757,6 +1003,8 @@ void RTCPeerConnectionHandler::getStats(LocalRTCStatsRequest* request) {
request->component().source().type();
std::string track_id = request->component().id().utf8();
if (type == blink::WebMediaStreamSource::TypeAudio) {
+ // TODO: native_peer_connection_ will introduce a thread hop. Do this
perkj_chrome 2014/10/30 12:42:35 What is the status of this?
tommi (sloooow) - chröme 2014/10/30 20:37:36 Move all of this over to the signaling thread as d
+ // on the signaling thread.
track =
native_peer_connection_->local_streams()->FindAudioTrack(track_id);
if (!track) {
@@ -788,21 +1036,25 @@ void RTCPeerConnectionHandler::GetStats(
webrtc::StatsObserver* observer,
webrtc::MediaStreamTrackInterface* track,
webrtc::PeerConnectionInterface::StatsOutputLevel level) {
- TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::GetStats");
- if (!native_peer_connection_->GetStats(observer, track, level)) {
- DVLOG(1) << "GetStats failed.";
- // TODO(hta): Consider how to get an error back.
- observer->OnComplete(StatsReports());
- return;
- }
+ DCHECK(thread_checker_.CalledOnValidThread());
+ scoped_refptr<webrtc::StatsObserver> ref_observer(observer);
+ scoped_refptr<webrtc::MediaStreamTrackInterface> ref_track(track);
+
+ // TODO(tommi): Make other methods run from the signaling thread too.
+ signaling_thread_->PostTask(FROM_HERE,
+ base::Bind(&GetStatsOnSignalingThread, native_peer_connection_, level,
+ ref_observer, ref_track));
}
void RTCPeerConnectionHandler::CloseClientPeerConnection() {
- client_->closePeerConnection();
+ DCHECK(thread_checker_.CalledOnValidThread());
+ if (client_)
+ client_->closePeerConnection();
}
blink::WebRTCDataChannelHandler* RTCPeerConnectionHandler::createDataChannel(
const blink::WebString& label, const blink::WebRTCDataChannelInit& init) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createDataChannel");
DVLOG(1) << "createDataChannel label " << base::UTF16ToUTF8(label);
@@ -824,9 +1076,10 @@ blink::WebRTCDataChannelHandler* RTCPeerConnectionHandler::createDataChannel(
DLOG(ERROR) << "Could not create native data channel.";
return NULL;
}
- if (peer_connection_tracker_)
+ if (peer_connection_tracker_) {
peer_connection_tracker_->TrackCreateDataChannel(
this, webrtc_channel.get(), PeerConnectionTracker::SOURCE_LOCAL);
+ }
++num_data_channels_created_;
@@ -836,14 +1089,15 @@ blink::WebRTCDataChannelHandler* RTCPeerConnectionHandler::createDataChannel(
blink::WebRTCDTMFSenderHandler* RTCPeerConnectionHandler::createDTMFSender(
const blink::WebMediaStreamTrack& track) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createDTMFSender");
DVLOG(1) << "createDTMFSender.";
MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track);
- if (!native_track ||
+ if (!native_track || !native_track->is_local_track() ||
track.source().type() != blink::WebMediaStreamSource::TypeAudio) {
- DLOG(ERROR) << "Could not create DTMF sender from a non-audio track.";
- return NULL;
+ DLOG(ERROR) << "The DTMF sender requires a local audio track.";
+ return nullptr;
}
webrtc::AudioTrackInterface* audio_track = native_track->GetAudioAdapter();
@@ -851,7 +1105,7 @@ blink::WebRTCDTMFSenderHandler* RTCPeerConnectionHandler::createDTMFSender(
native_peer_connection_->CreateDtmfSender(audio_track));
if (!sender) {
DLOG(ERROR) << "Could not create native DTMF sender.";
- return NULL;
+ return nullptr;
}
if (peer_connection_tracker_)
peer_connection_tracker_->TrackCreateDTMFSender(this, track);
@@ -860,32 +1114,35 @@ blink::WebRTCDTMFSenderHandler* RTCPeerConnectionHandler::createDTMFSender(
}
void RTCPeerConnectionHandler::stop() {
+ DCHECK(thread_checker_.CalledOnValidThread());
DVLOG(1) << "RTCPeerConnectionHandler::stop";
if (peer_connection_tracker_)
peer_connection_tracker_->TrackStop(this);
native_peer_connection_->Close();
-}
-
-void RTCPeerConnectionHandler::OnError() {
- // TODO(perkj): Implement.
- NOTIMPLEMENTED();
+ // The client_ pointer is not considered valid after this point and no further
+ // callbacks must be made.
+ client_ = nullptr;
}
void RTCPeerConnectionHandler::OnSignalingChange(
webrtc::PeerConnectionInterface::SignalingState new_state) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnSignalingChange");
+
blink::WebRTCPeerConnectionHandlerClient::SignalingState state =
GetWebKitSignalingState(new_state);
if (peer_connection_tracker_)
peer_connection_tracker_->TrackSignalingStateChange(this, state);
- client_->didChangeSignalingState(state);
+ if (client_)
+ client_->didChangeSignalingState(state);
}
// Called any time the IceConnectionState changes
void RTCPeerConnectionHandler::OnIceConnectionChange(
webrtc::PeerConnectionInterface::IceConnectionState new_state) {
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceConnectionChange");
+ DCHECK(thread_checker_.CalledOnValidThread());
if (new_state == webrtc::PeerConnectionInterface::kIceConnectionChecking) {
ice_connection_checking_start_ = base::TimeTicks::Now();
} else if (new_state ==
@@ -903,18 +1160,23 @@ void RTCPeerConnectionHandler::OnIceConnectionChange(
GetWebKitIceConnectionState(new_state);
if (peer_connection_tracker_)
peer_connection_tracker_->TrackIceConnectionStateChange(this, state);
- client_->didChangeICEConnectionState(state);
+ if(client_)
+ client_->didChangeICEConnectionState(state);
}
// Called any time the IceGatheringState changes
void RTCPeerConnectionHandler::OnIceGatheringChange(
webrtc::PeerConnectionInterface::IceGatheringState new_state) {
+ DCHECK(thread_checker_.CalledOnValidThread());
TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceGatheringChange");
+
if (new_state == webrtc::PeerConnectionInterface::kIceGatheringComplete) {
// If ICE gathering is completed, generate a NULL ICE candidate,
// to signal end of candidates.
- blink::WebRTCICECandidate null_candidate;
- client_->didGenerateICECandidate(null_candidate);
+ if (client_) {
+ blink::WebRTCICECandidate null_candidate;
+ client_->didGenerateICECandidate(null_candidate);
+ }
UMA_HISTOGRAM_COUNTS_100("WebRTC.PeerConnection.IPv4LocalCandidates",
num_local_candidates_ipv4_);
@@ -933,46 +1195,63 @@ void RTCPeerConnectionHandler::OnIceGatheringChange(
GetWebKitIceGatheringState(new_state);
if (peer_connection_tracker_)
peer_connection_tracker_->TrackIceGatheringStateChange(this, state);
- client_->didChangeICEGatheringState(state);
+ if (client_)
+ client_->didChangeICEGatheringState(state);
}
-void RTCPeerConnectionHandler::OnAddStream(
- webrtc::MediaStreamInterface* stream_interface) {
- TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnAddStream");
- DCHECK(stream_interface);
- DCHECK(remote_streams_.find(stream_interface) == remote_streams_.end());
+void RTCPeerConnectionHandler::OnRenegotiationNeeded() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnRenegotiationNeeded");
+ if (peer_connection_tracker_)
+ peer_connection_tracker_->TrackOnRenegotiationNeeded(this);
+ if (client_)
+ client_->negotiationNeeded();
+}
+
+PeerConnectionTracker* RTCPeerConnectionHandler::peer_connection_tracker() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return peer_connection_tracker_;
+}
- RemoteMediaStreamImpl* remote_stream =
- new RemoteMediaStreamImpl(stream_interface);
+void RTCPeerConnectionHandler::OnAddStream(
+ scoped_ptr<RemoteMediaStreamImpl> stream) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(remote_streams_.find(stream->webrtc_stream().get()) ==
+ remote_streams_.end());
+ DCHECK(stream->webkit_stream().extraData()) << "Initialization not done";
+ TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnAddStreamImpl");
+
+ // Ownership is with remote_streams_ now.
+ RemoteMediaStreamImpl* s = stream.release();
remote_streams_.insert(
std::pair<webrtc::MediaStreamInterface*, RemoteMediaStreamImpl*> (
- stream_interface, remote_stream));
+ s->webrtc_stream().get(), s));
- if (peer_connection_tracker_)
+ if (peer_connection_tracker_) {
peer_connection_tracker_->TrackAddStream(
- this, remote_stream->webkit_stream(),
- PeerConnectionTracker::SOURCE_REMOTE);
+ this, s->webkit_stream(), PeerConnectionTracker::SOURCE_REMOTE);
+ }
PerSessionWebRTCAPIMetrics::GetInstance()->IncrementStreamCounter();
track_metrics_.AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM,
- stream_interface);
-
- client_->didAddRemoteStream(remote_stream->webkit_stream());
+ s->webrtc_stream().get());
+ if (client_)
+ client_->didAddRemoteStream(s->webkit_stream());
}
void RTCPeerConnectionHandler::OnRemoveStream(
- webrtc::MediaStreamInterface* stream_interface) {
- TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnRemoveStream");
- DCHECK(stream_interface);
- RemoteStreamMap::iterator it = remote_streams_.find(stream_interface);
+ const scoped_refptr<webrtc::MediaStreamInterface>& stream) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnRemoveStreamImpl");
+ RemoteStreamMap::iterator it = remote_streams_.find(stream.get());
if (it == remote_streams_.end()) {
NOTREACHED() << "Stream not found";
return;
}
track_metrics_.RemoveStream(MediaStreamTrackMetrics::RECEIVED_STREAM,
- stream_interface);
+ stream.get());
PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter();
scoped_ptr<RemoteMediaStreamImpl> remote_stream(it->second);
@@ -980,67 +1259,56 @@ void RTCPeerConnectionHandler::OnRemoveStream(
DCHECK(!webkit_stream.isNull());
remote_streams_.erase(it);
- if (peer_connection_tracker_)
+ if (peer_connection_tracker_) {
peer_connection_tracker_->TrackRemoveStream(
this, webkit_stream, PeerConnectionTracker::SOURCE_REMOTE);
+ }
- client_->didRemoveRemoteStream(webkit_stream);
+ if (client_)
+ client_->didRemoveRemoteStream(webkit_stream);
}
-void RTCPeerConnectionHandler::OnIceCandidate(
- const webrtc::IceCandidateInterface* candidate) {
- TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceCandidate");
- DCHECK(candidate);
- std::string sdp;
- if (!candidate->ToString(&sdp)) {
- NOTREACHED() << "OnIceCandidate: Could not get SDP string.";
- return;
+void RTCPeerConnectionHandler::OnDataChannel(
+ scoped_ptr<RtcDataChannelHandler> handler) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnDataChannelImpl");
+
+ if (peer_connection_tracker_) {
+ peer_connection_tracker_->TrackCreateDataChannel(
+ this, handler->channel().get(), PeerConnectionTracker::SOURCE_REMOTE);
}
+
+ if (client_)
+ client_->didAddRemoteDataChannel(handler.release());
+}
+
+void RTCPeerConnectionHandler::OnIceCandidate(
+ const std::string& sdp, const std::string& sdp_mid, int sdp_mline_index,
+ int component, int address_family) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceCandidateImpl");
blink::WebRTCICECandidate web_candidate;
web_candidate.initialize(base::UTF8ToUTF16(sdp),
- base::UTF8ToUTF16(candidate->sdp_mid()),
- candidate->sdp_mline_index());
- if (peer_connection_tracker_)
+ base::UTF8ToUTF16(sdp_mid),
+ sdp_mline_index);
+ if (peer_connection_tracker_) {
peer_connection_tracker_->TrackAddIceCandidate(
this, web_candidate, PeerConnectionTracker::SOURCE_LOCAL, true);
+ }
// Only the first m line's first component is tracked to avoid
// miscounting when doing BUNDLE or rtcp mux.
- if (candidate->sdp_mline_index() == 0 &&
- candidate->candidate().component() == 1) {
- if (candidate->candidate().address().family() == AF_INET) {
- num_local_candidates_ipv4_++;
- } else if (candidate->candidate().address().family() == AF_INET6) {
- num_local_candidates_ipv6_++;
+ if (sdp_mline_index == 0 && component == 1) {
+ if (address_family == AF_INET) {
+ ++num_local_candidates_ipv4_;
+ } else if (address_family == AF_INET6) {
+ ++num_local_candidates_ipv6_;
} else {
NOTREACHED();
}
}
- client_->didGenerateICECandidate(web_candidate);
-}
-
-void RTCPeerConnectionHandler::OnDataChannel(
- webrtc::DataChannelInterface* data_channel) {
- TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnDataChannel");
- if (peer_connection_tracker_)
- peer_connection_tracker_->TrackCreateDataChannel(
- this, data_channel, PeerConnectionTracker::SOURCE_REMOTE);
-
- DVLOG(1) << "RTCPeerConnectionHandler::OnDataChannel "
- << data_channel->label();
- client_->didAddRemoteDataChannel(new RtcDataChannelHandler(
- base::ThreadTaskRunnerHandle::Get(), data_channel));
-}
-
-void RTCPeerConnectionHandler::OnRenegotiationNeeded() {
- TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnRenegotiationNeeded");
- if (peer_connection_tracker_)
- peer_connection_tracker_->TrackOnRenegotiationNeeded(this);
- client_->negotiationNeeded();
-}
-
-PeerConnectionTracker* RTCPeerConnectionHandler::peer_connection_tracker() {
- return peer_connection_tracker_;
+ if (client_)
+ client_->didGenerateICECandidate(web_candidate);
}
webrtc::SessionDescriptionInterface*

Powered by Google App Engine
This is Rietveld 408576698