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

Side by Side Diff: content/renderer/media/rtc_peer_connection_handler.cc

Issue 680393003: Make setRemoteDescription, setLocalDescription et al async. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments Created 6 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/rtc_peer_connection_handler.h" 5 #include "content/renderer/media/rtc_peer_connection_handler.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 using webrtc::DataChannelInterface; 43 using webrtc::DataChannelInterface;
44 using webrtc::IceCandidateInterface; 44 using webrtc::IceCandidateInterface;
45 using webrtc::MediaStreamInterface; 45 using webrtc::MediaStreamInterface;
46 using webrtc::PeerConnectionInterface; 46 using webrtc::PeerConnectionInterface;
47 using webrtc::PeerConnectionObserver; 47 using webrtc::PeerConnectionObserver;
48 using webrtc::StatsReport; 48 using webrtc::StatsReport;
49 using webrtc::StatsReportCopyable; 49 using webrtc::StatsReportCopyable;
50 using webrtc::StatsReports; 50 using webrtc::StatsReports;
51 51
52 namespace content { 52 namespace content {
53 namespace {
53 54
54 // Converter functions from libjingle types to WebKit types. 55 // Converter functions from libjingle types to WebKit types.
55 blink::WebRTCPeerConnectionHandlerClient::ICEGatheringState 56 blink::WebRTCPeerConnectionHandlerClient::ICEGatheringState
56 GetWebKitIceGatheringState( 57 GetWebKitIceGatheringState(
57 webrtc::PeerConnectionInterface::IceGatheringState state) { 58 webrtc::PeerConnectionInterface::IceGatheringState state) {
58 using blink::WebRTCPeerConnectionHandlerClient; 59 using blink::WebRTCPeerConnectionHandlerClient;
59 switch (state) { 60 switch (state) {
60 case webrtc::PeerConnectionInterface::kIceGatheringNew: 61 case webrtc::PeerConnectionInterface::kIceGatheringNew:
61 return WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew; 62 return WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew;
62 case webrtc::PeerConnectionInterface::kIceGatheringGathering: 63 case webrtc::PeerConnectionInterface::kIceGatheringGathering:
63 return WebRTCPeerConnectionHandlerClient::ICEGatheringStateGathering; 64 return WebRTCPeerConnectionHandlerClient::ICEGatheringStateGathering;
64 case webrtc::PeerConnectionInterface::kIceGatheringComplete: 65 case webrtc::PeerConnectionInterface::kIceGatheringComplete:
65 return WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete; 66 return WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete;
66 default: 67 default:
67 NOTREACHED(); 68 NOTREACHED();
68 return WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew; 69 return WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew;
69 } 70 }
70 } 71 }
71 72
72 static blink::WebRTCPeerConnectionHandlerClient::ICEConnectionState 73 blink::WebRTCPeerConnectionHandlerClient::ICEConnectionState
73 GetWebKitIceConnectionState( 74 GetWebKitIceConnectionState(
74 webrtc::PeerConnectionInterface::IceConnectionState ice_state) { 75 webrtc::PeerConnectionInterface::IceConnectionState ice_state) {
75 using blink::WebRTCPeerConnectionHandlerClient; 76 using blink::WebRTCPeerConnectionHandlerClient;
76 switch (ice_state) { 77 switch (ice_state) {
77 case webrtc::PeerConnectionInterface::kIceConnectionNew: 78 case webrtc::PeerConnectionInterface::kIceConnectionNew:
78 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateStarting; 79 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateStarting;
79 case webrtc::PeerConnectionInterface::kIceConnectionChecking: 80 case webrtc::PeerConnectionInterface::kIceConnectionChecking:
80 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateChecking; 81 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateChecking;
81 case webrtc::PeerConnectionInterface::kIceConnectionConnected: 82 case webrtc::PeerConnectionInterface::kIceConnectionConnected:
82 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateConnected; 83 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateConnected;
83 case webrtc::PeerConnectionInterface::kIceConnectionCompleted: 84 case webrtc::PeerConnectionInterface::kIceConnectionCompleted:
84 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted; 85 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted;
85 case webrtc::PeerConnectionInterface::kIceConnectionFailed: 86 case webrtc::PeerConnectionInterface::kIceConnectionFailed:
86 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateFailed; 87 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateFailed;
87 case webrtc::PeerConnectionInterface::kIceConnectionDisconnected: 88 case webrtc::PeerConnectionInterface::kIceConnectionDisconnected:
88 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateDisconnected; 89 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateDisconnected;
89 case webrtc::PeerConnectionInterface::kIceConnectionClosed: 90 case webrtc::PeerConnectionInterface::kIceConnectionClosed:
90 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed; 91 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed;
91 default: 92 default:
92 NOTREACHED(); 93 NOTREACHED();
93 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed; 94 return WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed;
94 } 95 }
95 } 96 }
96 97
97 static blink::WebRTCPeerConnectionHandlerClient::SignalingState 98 blink::WebRTCPeerConnectionHandlerClient::SignalingState
98 GetWebKitSignalingState(webrtc::PeerConnectionInterface::SignalingState state) { 99 GetWebKitSignalingState(webrtc::PeerConnectionInterface::SignalingState state) {
99 using blink::WebRTCPeerConnectionHandlerClient; 100 using blink::WebRTCPeerConnectionHandlerClient;
100 switch (state) { 101 switch (state) {
101 case webrtc::PeerConnectionInterface::kStable: 102 case webrtc::PeerConnectionInterface::kStable:
102 return WebRTCPeerConnectionHandlerClient::SignalingStateStable; 103 return WebRTCPeerConnectionHandlerClient::SignalingStateStable;
103 case webrtc::PeerConnectionInterface::kHaveLocalOffer: 104 case webrtc::PeerConnectionInterface::kHaveLocalOffer:
104 return WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalOffer; 105 return WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalOffer;
105 case webrtc::PeerConnectionInterface::kHaveLocalPrAnswer: 106 case webrtc::PeerConnectionInterface::kHaveLocalPrAnswer:
106 return WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalPrAnswer; 107 return WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalPrAnswer;
107 case webrtc::PeerConnectionInterface::kHaveRemoteOffer: 108 case webrtc::PeerConnectionInterface::kHaveRemoteOffer:
108 return WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer; 109 return WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer;
109 case webrtc::PeerConnectionInterface::kHaveRemotePrAnswer: 110 case webrtc::PeerConnectionInterface::kHaveRemotePrAnswer:
110 return 111 return
111 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer; 112 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer;
112 case webrtc::PeerConnectionInterface::kClosed: 113 case webrtc::PeerConnectionInterface::kClosed:
113 return WebRTCPeerConnectionHandlerClient::SignalingStateClosed; 114 return WebRTCPeerConnectionHandlerClient::SignalingStateClosed;
114 default: 115 default:
115 NOTREACHED(); 116 NOTREACHED();
116 return WebRTCPeerConnectionHandlerClient::SignalingStateClosed; 117 return WebRTCPeerConnectionHandlerClient::SignalingStateClosed;
117 } 118 }
118 } 119 }
119 120
120 static blink::WebRTCSessionDescription 121 blink::WebRTCSessionDescription CreateWebKitSessionDescription(
122 const std::string& sdp, const std::string& type) {
123 blink::WebRTCSessionDescription description;
124 description.initialize(base::UTF8ToUTF16(type), base::UTF8ToUTF16(sdp));
125 return description;
126 }
127
128 blink::WebRTCSessionDescription
121 CreateWebKitSessionDescription( 129 CreateWebKitSessionDescription(
122 const webrtc::SessionDescriptionInterface* native_desc) { 130 const webrtc::SessionDescriptionInterface* native_desc) {
123 blink::WebRTCSessionDescription description;
124 if (!native_desc) { 131 if (!native_desc) {
125 LOG(ERROR) << "Native session description is null."; 132 LOG(ERROR) << "Native session description is null.";
126 return description; 133 return blink::WebRTCSessionDescription();
127 } 134 }
128 135
129 std::string sdp; 136 std::string sdp;
130 if (!native_desc->ToString(&sdp)) { 137 if (!native_desc->ToString(&sdp)) {
131 LOG(ERROR) << "Failed to get SDP string of native session description."; 138 LOG(ERROR) << "Failed to get SDP string of native session description.";
132 return description; 139 return blink::WebRTCSessionDescription();
133 } 140 }
134 141
135 description.initialize(base::UTF8ToUTF16(native_desc->type()), 142 return CreateWebKitSessionDescription(sdp, native_desc->type());
136 base::UTF8ToUTF16(sdp)); 143 }
137 return description; 144
145 void RunClosureWithTrace(const base::Closure& closure,
146 const char* trace_event_name) {
147 TRACE_EVENT0("webrtc", trace_event_name);
148 closure.Run();
149 }
150
151 void RunSynchronousClosure(const base::Closure& closure,
152 const char* trace_event_name,
153 base::WaitableEvent* event) {
154 {
155 TRACE_EVENT0("webrtc", trace_event_name);
156 closure.Run();
157 }
158 event->Signal();
159 }
160
161 void GetSdpAndTypeFromSessionDescription(
162 const base::Callback<const webrtc::SessionDescriptionInterface*()>&
163 description_callback,
164 std::string* sdp, std::string* type) {
165 const webrtc::SessionDescriptionInterface* description =
166 description_callback.Run();
167 if (description) {
168 description->ToString(sdp);
169 *type = description->type();
170 }
138 } 171 }
139 172
140 // Converter functions from WebKit types to libjingle types. 173 // Converter functions from WebKit types to libjingle types.
141 174
142 static void GetNativeRtcConfiguration( 175 void GetNativeRtcConfiguration(
143 const blink::WebRTCConfiguration& server_configuration, 176 const blink::WebRTCConfiguration& server_configuration,
144 webrtc::PeerConnectionInterface::RTCConfiguration* config) { 177 webrtc::PeerConnectionInterface::RTCConfiguration* config) {
145 if (server_configuration.isNull() || !config) 178 if (server_configuration.isNull() || !config)
146 return; 179 return;
147 for (size_t i = 0; i < server_configuration.numberOfServers(); ++i) { 180 for (size_t i = 0; i < server_configuration.numberOfServers(); ++i) {
148 webrtc::PeerConnectionInterface::IceServer server; 181 webrtc::PeerConnectionInterface::IceServer server;
149 const blink::WebRTCICEServer& webkit_server = 182 const blink::WebRTCICEServer& webkit_server =
150 server_configuration.server(i); 183 server_configuration.server(i);
151 server.username = base::UTF16ToUTF8(webkit_server.username()); 184 server.username = base::UTF16ToUTF8(webkit_server.username());
152 server.password = base::UTF16ToUTF8(webkit_server.credential()); 185 server.password = base::UTF16ToUTF8(webkit_server.credential());
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 : request_(request.get()), 336 : request_(request.get()),
304 main_thread_(base::ThreadTaskRunnerHandle::Get()) { 337 main_thread_(base::ThreadTaskRunnerHandle::Get()) {
305 // Measure the overall time it takes to satisfy a getStats request. 338 // Measure the overall time it takes to satisfy a getStats request.
306 TRACE_EVENT_ASYNC_BEGIN0("webrtc", "getStats_Native", this); 339 TRACE_EVENT_ASYNC_BEGIN0("webrtc", "getStats_Native", this);
307 signaling_thread_checker_.DetachFromThread(); 340 signaling_thread_checker_.DetachFromThread();
308 } 341 }
309 342
310 void OnComplete(const StatsReports& reports) override { 343 void OnComplete(const StatsReports& reports) override {
311 DCHECK(signaling_thread_checker_.CalledOnValidThread()); 344 DCHECK(signaling_thread_checker_.CalledOnValidThread());
312 TRACE_EVENT0("webrtc", "StatsResponse::OnComplete"); 345 TRACE_EVENT0("webrtc", "StatsResponse::OnComplete");
313 // TODO(tommi): Get rid of these string copies some how. 346 // TODO(tommi): Get rid of these string copies somehow.
314 // We can't use webkit objects directly since they use a single threaded 347 // We can't use webkit objects directly since they use a single threaded
315 // heap allocator. 348 // heap allocator.
316 scoped_ptr<std::vector<StatsReportCopyable>> report_copies( 349 scoped_ptr<std::vector<StatsReportCopyable>> report_copies(
317 new std::vector<StatsReportCopyable>()); 350 new std::vector<StatsReportCopyable>());
318 report_copies->reserve(reports.size()); 351 report_copies->reserve(reports.size());
319 for (auto it : reports) 352 for (auto it : reports)
320 report_copies->push_back(StatsReportCopyable(*it)); 353 report_copies->push_back(StatsReportCopyable(*it));
321 354
322 main_thread_->PostTask(FROM_HERE, 355 main_thread_->PostTask(FROM_HERE,
323 base::Bind(&StatsResponse::DeliverCallback, this, 356 base::Bind(&StatsResponse::DeliverCallback, this,
(...skipping 28 matching lines...) Expand all
352 blink::WebString::fromUTF8(value.display_name()), 385 blink::WebString::fromUTF8(value.display_name()),
353 blink::WebString::fromUTF8(value.value)); 386 blink::WebString::fromUTF8(value.value));
354 } 387 }
355 } 388 }
356 389
357 rtc::scoped_refptr<LocalRTCStatsRequest> request_; 390 rtc::scoped_refptr<LocalRTCStatsRequest> request_;
358 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; 391 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
359 base::ThreadChecker signaling_thread_checker_; 392 base::ThreadChecker signaling_thread_checker_;
360 }; 393 };
361 394
362 // Implementation of LocalRTCStatsRequest.
363 LocalRTCStatsRequest::LocalRTCStatsRequest(blink::WebRTCStatsRequest impl)
364 : impl_(impl) {
365 }
366
367 LocalRTCStatsRequest::LocalRTCStatsRequest() {}
368 LocalRTCStatsRequest::~LocalRTCStatsRequest() {}
369
370 bool LocalRTCStatsRequest::hasSelector() const {
371 return impl_.hasSelector();
372 }
373
374 blink::WebMediaStreamTrack LocalRTCStatsRequest::component() const {
375 return impl_.component();
376 }
377
378 scoped_refptr<LocalRTCStatsResponse> LocalRTCStatsRequest::createResponse() {
379 return scoped_refptr<LocalRTCStatsResponse>(
380 new rtc::RefCountedObject<LocalRTCStatsResponse>(impl_.createResponse()));
381 }
382
383 void LocalRTCStatsRequest::requestSucceeded(
384 const LocalRTCStatsResponse* response) {
385 impl_.requestSucceeded(response->webKitStatsResponse());
386 }
387
388 // Implementation of LocalRTCStatsResponse.
389 blink::WebRTCStatsResponse LocalRTCStatsResponse::webKitStatsResponse() const {
390 return impl_;
391 }
392
393 size_t LocalRTCStatsResponse::addReport(blink::WebString type,
394 blink::WebString id,
395 double timestamp) {
396 return impl_.addReport(type, id, timestamp);
397 }
398
399 void LocalRTCStatsResponse::addStatistic(size_t report,
400 blink::WebString name,
401 blink::WebString value) {
402 impl_.addStatistic(report, name, value);
403 }
404
405 namespace {
406
407 void GetStatsOnSignalingThread( 395 void GetStatsOnSignalingThread(
408 const scoped_refptr<webrtc::PeerConnectionInterface>& pc, 396 const scoped_refptr<webrtc::PeerConnectionInterface>& pc,
409 webrtc::PeerConnectionInterface::StatsOutputLevel level, 397 webrtc::PeerConnectionInterface::StatsOutputLevel level,
410 const scoped_refptr<webrtc::StatsObserver>& observer, 398 const scoped_refptr<webrtc::StatsObserver>& observer,
411 const std::string track_id, blink::WebMediaStreamSource::Type track_type) { 399 const std::string track_id, blink::WebMediaStreamSource::Type track_type) {
412 TRACE_EVENT0("webrtc", "GetStatsOnSignalingThread"); 400 TRACE_EVENT0("webrtc", "GetStatsOnSignalingThread");
413 401
414 scoped_refptr<webrtc::MediaStreamTrackInterface> track; 402 scoped_refptr<webrtc::MediaStreamTrackInterface> track;
415 if (!track_id.empty()) { 403 if (!track_id.empty()) {
416 if (track_type == blink::WebMediaStreamSource::TypeAudio) { 404 if (track_type == blink::WebMediaStreamSource::TypeAudio) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 NOTREACHED(); 459 NOTREACHED();
472 } 460 }
473 } 461 }
474 }; 462 };
475 463
476 base::LazyInstance<std::set<RTCPeerConnectionHandler*> >::Leaky 464 base::LazyInstance<std::set<RTCPeerConnectionHandler*> >::Leaky
477 g_peer_connection_handlers = LAZY_INSTANCE_INITIALIZER; 465 g_peer_connection_handlers = LAZY_INSTANCE_INITIALIZER;
478 466
479 } // namespace 467 } // namespace
480 468
469 // Implementation of LocalRTCStatsRequest.
470 LocalRTCStatsRequest::LocalRTCStatsRequest(blink::WebRTCStatsRequest impl)
471 : impl_(impl) {
472 }
473
474 LocalRTCStatsRequest::LocalRTCStatsRequest() {}
475 LocalRTCStatsRequest::~LocalRTCStatsRequest() {}
476
477 bool LocalRTCStatsRequest::hasSelector() const {
478 return impl_.hasSelector();
479 }
480
481 blink::WebMediaStreamTrack LocalRTCStatsRequest::component() const {
482 return impl_.component();
483 }
484
485 scoped_refptr<LocalRTCStatsResponse> LocalRTCStatsRequest::createResponse() {
486 return scoped_refptr<LocalRTCStatsResponse>(
487 new rtc::RefCountedObject<LocalRTCStatsResponse>(impl_.createResponse()));
488 }
489
490 void LocalRTCStatsRequest::requestSucceeded(
491 const LocalRTCStatsResponse* response) {
492 impl_.requestSucceeded(response->webKitStatsResponse());
493 }
494
495 // Implementation of LocalRTCStatsResponse.
496 blink::WebRTCStatsResponse LocalRTCStatsResponse::webKitStatsResponse() const {
497 return impl_;
498 }
499
500 size_t LocalRTCStatsResponse::addReport(blink::WebString type,
501 blink::WebString id,
502 double timestamp) {
503 return impl_.addReport(type, id, timestamp);
504 }
505
506 void LocalRTCStatsResponse::addStatistic(size_t report,
507 blink::WebString name,
508 blink::WebString value) {
509 impl_.addStatistic(report, name, value);
510 }
511
481 // Receives notifications from a PeerConnection object about state changes, 512 // Receives notifications from a PeerConnection object about state changes,
482 // track addition/removal etc. The callbacks we receive here come on the 513 // track addition/removal etc. The callbacks we receive here come on the
483 // signaling thread, so this class takes care of delivering them to an 514 // signaling thread, so this class takes care of delivering them to an
484 // RTCPeerConnectionHandler instance on the main thread. 515 // RTCPeerConnectionHandler instance on the main thread.
485 // In order to do safe PostTask-ing, the class is reference counted and 516 // In order to do safe PostTask-ing, the class is reference counted and
486 // checks for the existence of the RTCPeerConnectionHandler instance before 517 // checks for the existence of the RTCPeerConnectionHandler instance before
487 // delivering callbacks on the main thread. 518 // delivering callbacks on the main thread.
488 class RTCPeerConnectionHandler::Observer 519 class RTCPeerConnectionHandler::Observer
489 : public base::RefCountedThreadSafe<RTCPeerConnectionHandler::Observer>, 520 : public base::RefCountedThreadSafe<RTCPeerConnectionHandler::Observer>,
490 public PeerConnectionObserver { 521 public PeerConnectionObserver {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 } 641 }
611 } 642 }
612 643
613 private: 644 private:
614 const base::WeakPtr<RTCPeerConnectionHandler> handler_; 645 const base::WeakPtr<RTCPeerConnectionHandler> handler_;
615 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; 646 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
616 }; 647 };
617 648
618 RTCPeerConnectionHandler::RTCPeerConnectionHandler( 649 RTCPeerConnectionHandler::RTCPeerConnectionHandler(
619 blink::WebRTCPeerConnectionHandlerClient* client, 650 blink::WebRTCPeerConnectionHandlerClient* client,
620 PeerConnectionDependencyFactory* dependency_factory, 651 PeerConnectionDependencyFactory* dependency_factory)
621 const scoped_refptr<base::SingleThreadTaskRunner>& signaling_thread)
622 : client_(client), 652 : client_(client),
623 dependency_factory_(dependency_factory), 653 dependency_factory_(dependency_factory),
624 frame_(NULL), 654 frame_(NULL),
625 signaling_thread_(signaling_thread),
626 num_data_channels_created_(0), 655 num_data_channels_created_(0),
627 num_local_candidates_ipv4_(0), 656 num_local_candidates_ipv4_(0),
628 num_local_candidates_ipv6_(0), 657 num_local_candidates_ipv6_(0),
629 weak_factory_(this) { 658 weak_factory_(this) {
630 g_peer_connection_handlers.Get().insert(this); 659 g_peer_connection_handlers.Get().insert(this);
631 } 660 }
632 661
633 RTCPeerConnectionHandler::~RTCPeerConnectionHandler() { 662 RTCPeerConnectionHandler::~RTCPeerConnectionHandler() {
634 DCHECK(thread_checker_.CalledOnValidThread()); 663 DCHECK(thread_checker_.CalledOnValidThread());
635 g_peer_connection_handlers.Get().erase(this); 664 g_peer_connection_handlers.Get().erase(this);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 const blink::WebMediaConstraints& options) { 772 const blink::WebMediaConstraints& options) {
744 DCHECK(thread_checker_.CalledOnValidThread()); 773 DCHECK(thread_checker_.CalledOnValidThread());
745 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createOffer"); 774 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createOffer");
746 775
747 scoped_refptr<CreateSessionDescriptionRequest> description_request( 776 scoped_refptr<CreateSessionDescriptionRequest> description_request(
748 new rtc::RefCountedObject<CreateSessionDescriptionRequest>( 777 new rtc::RefCountedObject<CreateSessionDescriptionRequest>(
749 base::ThreadTaskRunnerHandle::Get(), request, 778 base::ThreadTaskRunnerHandle::Get(), request,
750 weak_factory_.GetWeakPtr(), peer_connection_tracker_, 779 weak_factory_.GetWeakPtr(), peer_connection_tracker_,
751 PeerConnectionTracker::ACTION_CREATE_OFFER)); 780 PeerConnectionTracker::ACTION_CREATE_OFFER));
752 781
782 // TODO(tommi): Do this asynchronously via e.g. PostTaskAndReply.
753 RTCMediaConstraints constraints(options); 783 RTCMediaConstraints constraints(options);
754 native_peer_connection_->CreateOffer(description_request.get(), &constraints); 784 native_peer_connection_->CreateOffer(description_request.get(), &constraints);
755 785
756 if (peer_connection_tracker_) 786 if (peer_connection_tracker_)
757 peer_connection_tracker_->TrackCreateOffer(this, constraints); 787 peer_connection_tracker_->TrackCreateOffer(this, constraints);
758 } 788 }
759 789
760 void RTCPeerConnectionHandler::createOffer( 790 void RTCPeerConnectionHandler::createOffer(
761 const blink::WebRTCSessionDescriptionRequest& request, 791 const blink::WebRTCSessionDescriptionRequest& request,
762 const blink::WebRTCOfferOptions& options) { 792 const blink::WebRTCOfferOptions& options) {
763 DCHECK(thread_checker_.CalledOnValidThread()); 793 DCHECK(thread_checker_.CalledOnValidThread());
764 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createOffer"); 794 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createOffer");
765 795
766 scoped_refptr<CreateSessionDescriptionRequest> description_request( 796 scoped_refptr<CreateSessionDescriptionRequest> description_request(
767 new rtc::RefCountedObject<CreateSessionDescriptionRequest>( 797 new rtc::RefCountedObject<CreateSessionDescriptionRequest>(
768 base::ThreadTaskRunnerHandle::Get(), request, 798 base::ThreadTaskRunnerHandle::Get(), request,
769 weak_factory_.GetWeakPtr(), peer_connection_tracker_, 799 weak_factory_.GetWeakPtr(), peer_connection_tracker_,
770 PeerConnectionTracker::ACTION_CREATE_OFFER)); 800 PeerConnectionTracker::ACTION_CREATE_OFFER));
771 801
802 // TODO(tommi): Do this asynchronously via e.g. PostTaskAndReply.
772 RTCMediaConstraints constraints; 803 RTCMediaConstraints constraints;
773 ConvertOfferOptionsToConstraints(options, &constraints); 804 ConvertOfferOptionsToConstraints(options, &constraints);
774 native_peer_connection_->CreateOffer(description_request.get(), &constraints); 805 native_peer_connection_->CreateOffer(description_request.get(), &constraints);
775 806
776 if (peer_connection_tracker_) 807 if (peer_connection_tracker_)
777 peer_connection_tracker_->TrackCreateOffer(this, constraints); 808 peer_connection_tracker_->TrackCreateOffer(this, constraints);
778 } 809 }
779 810
780 void RTCPeerConnectionHandler::createAnswer( 811 void RTCPeerConnectionHandler::createAnswer(
781 const blink::WebRTCSessionDescriptionRequest& request, 812 const blink::WebRTCSessionDescriptionRequest& request,
782 const blink::WebMediaConstraints& options) { 813 const blink::WebMediaConstraints& options) {
783 DCHECK(thread_checker_.CalledOnValidThread()); 814 DCHECK(thread_checker_.CalledOnValidThread());
784 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createAnswer"); 815 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createAnswer");
785 scoped_refptr<CreateSessionDescriptionRequest> description_request( 816 scoped_refptr<CreateSessionDescriptionRequest> description_request(
786 new rtc::RefCountedObject<CreateSessionDescriptionRequest>( 817 new rtc::RefCountedObject<CreateSessionDescriptionRequest>(
787 base::ThreadTaskRunnerHandle::Get(), request, 818 base::ThreadTaskRunnerHandle::Get(), request,
788 weak_factory_.GetWeakPtr(), peer_connection_tracker_, 819 weak_factory_.GetWeakPtr(), peer_connection_tracker_,
789 PeerConnectionTracker::ACTION_CREATE_ANSWER)); 820 PeerConnectionTracker::ACTION_CREATE_ANSWER));
821 // TODO(tommi): Do this asynchronously via e.g. PostTaskAndReply.
790 RTCMediaConstraints constraints(options); 822 RTCMediaConstraints constraints(options);
791 native_peer_connection_->CreateAnswer(description_request.get(), 823 native_peer_connection_->CreateAnswer(description_request.get(),
792 &constraints); 824 &constraints);
793 825
794 if (peer_connection_tracker_) 826 if (peer_connection_tracker_)
795 peer_connection_tracker_->TrackCreateAnswer(this, constraints); 827 peer_connection_tracker_->TrackCreateAnswer(this, constraints);
796 } 828 }
797 829
798 void RTCPeerConnectionHandler::setLocalDescription( 830 void RTCPeerConnectionHandler::setLocalDescription(
799 const blink::WebRTCVoidRequest& request, 831 const blink::WebRTCVoidRequest& request,
(...skipping 23 matching lines...) Expand all
823 peer_connection_tracker_->TrackSetSessionDescription( 855 peer_connection_tracker_->TrackSetSessionDescription(
824 this, sdp, type, PeerConnectionTracker::SOURCE_LOCAL); 856 this, sdp, type, PeerConnectionTracker::SOURCE_LOCAL);
825 } 857 }
826 858
827 scoped_refptr<SetSessionDescriptionRequest> set_request( 859 scoped_refptr<SetSessionDescriptionRequest> set_request(
828 new rtc::RefCountedObject<SetSessionDescriptionRequest>( 860 new rtc::RefCountedObject<SetSessionDescriptionRequest>(
829 base::ThreadTaskRunnerHandle::Get(), request, 861 base::ThreadTaskRunnerHandle::Get(), request,
830 weak_factory_.GetWeakPtr(), peer_connection_tracker_, 862 weak_factory_.GetWeakPtr(), peer_connection_tracker_,
831 PeerConnectionTracker::ACTION_SET_LOCAL_DESCRIPTION)); 863 PeerConnectionTracker::ACTION_SET_LOCAL_DESCRIPTION));
832 864
833 // TODO(tommi): Run this on the signaling thread. 865 signaling_thread()->PostTask(FROM_HERE,
834 native_peer_connection_->SetLocalDescription(set_request.get(), native_desc); 866 base::Bind(&RunClosureWithTrace,
867 base::Bind(&webrtc::PeerConnectionInterface::SetLocalDescription,
868 native_peer_connection_, set_request,
869 base::Unretained(native_desc)),
870 "SetLocalDescription"));
835 } 871 }
836 872
837 void RTCPeerConnectionHandler::setRemoteDescription( 873 void RTCPeerConnectionHandler::setRemoteDescription(
838 const blink::WebRTCVoidRequest& request, 874 const blink::WebRTCVoidRequest& request,
839 const blink::WebRTCSessionDescription& description) { 875 const blink::WebRTCSessionDescription& description) {
840 DCHECK(thread_checker_.CalledOnValidThread()); 876 DCHECK(thread_checker_.CalledOnValidThread());
841 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::setRemoteDescription"); 877 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::setRemoteDescription");
842 std::string sdp = base::UTF16ToUTF8(description.sdp()); 878 std::string sdp = base::UTF16ToUTF8(description.sdp());
843 std::string type = base::UTF16ToUTF8(description.type()); 879 std::string type = base::UTF16ToUTF8(description.type());
844 880
(...skipping 15 matching lines...) Expand all
860 if (peer_connection_tracker_) { 896 if (peer_connection_tracker_) {
861 peer_connection_tracker_->TrackSetSessionDescription( 897 peer_connection_tracker_->TrackSetSessionDescription(
862 this, sdp, type, PeerConnectionTracker::SOURCE_REMOTE); 898 this, sdp, type, PeerConnectionTracker::SOURCE_REMOTE);
863 } 899 }
864 900
865 scoped_refptr<SetSessionDescriptionRequest> set_request( 901 scoped_refptr<SetSessionDescriptionRequest> set_request(
866 new rtc::RefCountedObject<SetSessionDescriptionRequest>( 902 new rtc::RefCountedObject<SetSessionDescriptionRequest>(
867 base::ThreadTaskRunnerHandle::Get(), request, 903 base::ThreadTaskRunnerHandle::Get(), request,
868 weak_factory_.GetWeakPtr(), peer_connection_tracker_, 904 weak_factory_.GetWeakPtr(), peer_connection_tracker_,
869 PeerConnectionTracker::ACTION_SET_REMOTE_DESCRIPTION)); 905 PeerConnectionTracker::ACTION_SET_REMOTE_DESCRIPTION));
870 // TODO(tommi): Run this on the signaling thread. 906 signaling_thread()->PostTask(FROM_HERE,
871 native_peer_connection_->SetRemoteDescription(set_request.get(), native_desc); 907 base::Bind(&RunClosureWithTrace,
908 base::Bind(&webrtc::PeerConnectionInterface::SetRemoteDescription,
909 native_peer_connection_, set_request,
910 base::Unretained(native_desc)),
911 "SetRemoteDescription"));
872 } 912 }
873 913
874 blink::WebRTCSessionDescription 914 blink::WebRTCSessionDescription
875 RTCPeerConnectionHandler::localDescription() { 915 RTCPeerConnectionHandler::localDescription() {
876 DCHECK(thread_checker_.CalledOnValidThread()); 916 DCHECK(thread_checker_.CalledOnValidThread());
877 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::localDescription"); 917 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::localDescription");
878 const webrtc::SessionDescriptionInterface* native_desc = 918
879 native_peer_connection_->local_description(); 919 // Since local_description returns a pointer to a non-reference-counted object
880 blink::WebRTCSessionDescription description = 920 // that lives on the signaling thread, we cannot fetch a pointer to it and use
881 CreateWebKitSessionDescription(native_desc); 921 // it directly here. Instead, we access the object completely on the signaling
882 return description; 922 // thread.
923 std::string sdp, type;
924 base::Callback<const webrtc::SessionDescriptionInterface*()> description_cb =
925 base::Bind(&webrtc::PeerConnectionInterface::local_description,
926 native_peer_connection_);
927 RunSynchronousClosureOnSignalingThread(
928 base::Bind(&GetSdpAndTypeFromSessionDescription, description_cb,
929 base::Unretained(&sdp), base::Unretained(&type)),
930 "localDescription");
931
932 return CreateWebKitSessionDescription(sdp, type);
883 } 933 }
884 934
885 blink::WebRTCSessionDescription 935 blink::WebRTCSessionDescription
886 RTCPeerConnectionHandler::remoteDescription() { 936 RTCPeerConnectionHandler::remoteDescription() {
887 DCHECK(thread_checker_.CalledOnValidThread()); 937 DCHECK(thread_checker_.CalledOnValidThread());
888 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::remoteDescription"); 938 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::remoteDescription");
889 const webrtc::SessionDescriptionInterface* native_desc = 939 // Since local_description returns a pointer to a non-reference-counted object
890 native_peer_connection_->remote_description(); 940 // that lives on the signaling thread, we cannot fetch a pointer to it and use
891 blink::WebRTCSessionDescription description = 941 // it directly here. Instead, we access the object completely on the signaling
892 CreateWebKitSessionDescription(native_desc); 942 // thread.
893 return description; 943 std::string sdp, type;
944 base::Callback<const webrtc::SessionDescriptionInterface*()> description_cb =
945 base::Bind(&webrtc::PeerConnectionInterface::remote_description,
946 native_peer_connection_);
947 RunSynchronousClosureOnSignalingThread(
948 base::Bind(&GetSdpAndTypeFromSessionDescription, description_cb,
949 base::Unretained(&sdp), base::Unretained(&type)),
950 "remoteDescription");
951
952 return CreateWebKitSessionDescription(sdp, type);
894 } 953 }
895 954
896 bool RTCPeerConnectionHandler::updateICE( 955 bool RTCPeerConnectionHandler::updateICE(
897 const blink::WebRTCConfiguration& server_configuration, 956 const blink::WebRTCConfiguration& server_configuration,
898 const blink::WebMediaConstraints& options) { 957 const blink::WebMediaConstraints& options) {
899 DCHECK(thread_checker_.CalledOnValidThread()); 958 DCHECK(thread_checker_.CalledOnValidThread());
900 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::updateICE"); 959 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::updateICE");
901 webrtc::PeerConnectionInterface::RTCConfiguration config; 960 webrtc::PeerConnectionInterface::RTCConfiguration config;
902 GetNativeRtcConfiguration(server_configuration, &config); 961 GetNativeRtcConfiguration(server_configuration, &config);
903 RTCMediaConstraints constraints(options); 962 RTCMediaConstraints constraints(options);
904 963
905 if (peer_connection_tracker_) 964 if (peer_connection_tracker_)
906 peer_connection_tracker_->TrackUpdateIce(this, config, constraints); 965 peer_connection_tracker_->TrackUpdateIce(this, config, constraints);
907 966
908 return native_peer_connection_->UpdateIce(config.servers, &constraints); 967 return native_peer_connection_->UpdateIce(config.servers, &constraints);
909 } 968 }
910 969
911 bool RTCPeerConnectionHandler::addICECandidate( 970 bool RTCPeerConnectionHandler::addICECandidate(
912 const blink::WebRTCVoidRequest& request, 971 const blink::WebRTCVoidRequest& request,
913 const blink::WebRTCICECandidate& candidate) { 972 const blink::WebRTCICECandidate& candidate) {
914 DCHECK(thread_checker_.CalledOnValidThread()); 973 DCHECK(thread_checker_.CalledOnValidThread());
915 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::addICECandidate"); 974 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::addICECandidate");
916 // Libjingle currently does not accept callbacks for addICECandidate. 975 // Libjingle currently does not accept callbacks for addICECandidate.
917 // For that reason we are going to call callbacks from here. 976 // For that reason we are going to call callbacks from here.
977
978 // TODO(tommi): Instead of calling addICECandidate here, we can do a
979 // PostTaskAndReply kind of a thing.
918 bool result = addICECandidate(candidate); 980 bool result = addICECandidate(candidate);
919 base::MessageLoop::current()->PostTask( 981 base::MessageLoop::current()->PostTask(
920 FROM_HERE, 982 FROM_HERE,
921 base::Bind(&RTCPeerConnectionHandler::OnaddICECandidateResult, 983 base::Bind(&RTCPeerConnectionHandler::OnaddICECandidateResult,
922 weak_factory_.GetWeakPtr(), request, result)); 984 weak_factory_.GetWeakPtr(), request, result));
923 // On failure callback will be triggered. 985 // On failure callback will be triggered.
924 return true; 986 return true;
925 } 987 }
926 988
927 bool RTCPeerConnectionHandler::addICECandidate( 989 bool RTCPeerConnectionHandler::addICECandidate(
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1007 for (ScopedVector<WebRtcMediaStreamAdapter>::iterator adapter_it = 1069 for (ScopedVector<WebRtcMediaStreamAdapter>::iterator adapter_it =
1008 local_streams_.begin(); adapter_it != local_streams_.end(); 1070 local_streams_.begin(); adapter_it != local_streams_.end();
1009 ++adapter_it) { 1071 ++adapter_it) {
1010 if ((*adapter_it)->IsEqual(stream)) { 1072 if ((*adapter_it)->IsEqual(stream)) {
1011 webrtc_stream = (*adapter_it)->webrtc_media_stream(); 1073 webrtc_stream = (*adapter_it)->webrtc_media_stream();
1012 local_streams_.erase(adapter_it); 1074 local_streams_.erase(adapter_it);
1013 break; 1075 break;
1014 } 1076 }
1015 } 1077 }
1016 DCHECK(webrtc_stream.get()); 1078 DCHECK(webrtc_stream.get());
1079 // TODO(tommi): Make this async (PostTaskAndReply).
1017 native_peer_connection_->RemoveStream(webrtc_stream.get()); 1080 native_peer_connection_->RemoveStream(webrtc_stream.get());
1018 1081
1019 if (peer_connection_tracker_) { 1082 if (peer_connection_tracker_) {
1020 peer_connection_tracker_->TrackRemoveStream( 1083 peer_connection_tracker_->TrackRemoveStream(
1021 this, stream, PeerConnectionTracker::SOURCE_LOCAL); 1084 this, stream, PeerConnectionTracker::SOURCE_LOCAL);
1022 } 1085 }
1023 PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter(); 1086 PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter();
1024 track_metrics_.RemoveStream(MediaStreamTrackMetrics::SENT_STREAM, 1087 track_metrics_.RemoveStream(MediaStreamTrackMetrics::SENT_STREAM,
1025 webrtc_stream.get()); 1088 webrtc_stream.get());
1026 } 1089 }
(...skipping 27 matching lines...) Expand all
1054 track_id, track_type); 1117 track_id, track_type);
1055 } 1118 }
1056 1119
1057 // TODO(tommi): It's weird to have three {g|G}etStats methods. Clean this up. 1120 // TODO(tommi): It's weird to have three {g|G}etStats methods. Clean this up.
1058 void RTCPeerConnectionHandler::GetStats( 1121 void RTCPeerConnectionHandler::GetStats(
1059 webrtc::StatsObserver* observer, 1122 webrtc::StatsObserver* observer,
1060 webrtc::PeerConnectionInterface::StatsOutputLevel level, 1123 webrtc::PeerConnectionInterface::StatsOutputLevel level,
1061 const std::string& track_id, 1124 const std::string& track_id,
1062 blink::WebMediaStreamSource::Type track_type) { 1125 blink::WebMediaStreamSource::Type track_type) {
1063 DCHECK(thread_checker_.CalledOnValidThread()); 1126 DCHECK(thread_checker_.CalledOnValidThread());
1064 signaling_thread_->PostTask(FROM_HERE, 1127 signaling_thread()->PostTask(FROM_HERE,
1065 base::Bind(&GetStatsOnSignalingThread, native_peer_connection_, level, 1128 base::Bind(&GetStatsOnSignalingThread, native_peer_connection_, level,
1066 make_scoped_refptr(observer), track_id, track_type)); 1129 make_scoped_refptr(observer), track_id, track_type));
1067 } 1130 }
1068 1131
1069 void RTCPeerConnectionHandler::CloseClientPeerConnection() { 1132 void RTCPeerConnectionHandler::CloseClientPeerConnection() {
1070 DCHECK(thread_checker_.CalledOnValidThread()); 1133 DCHECK(thread_checker_.CalledOnValidThread());
1071 if (client_) 1134 if (client_)
1072 client_->closePeerConnection(); 1135 client_->closePeerConnection();
1073 } 1136 }
1074 1137
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1113 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createDTMFSender"); 1176 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createDTMFSender");
1114 DVLOG(1) << "createDTMFSender."; 1177 DVLOG(1) << "createDTMFSender.";
1115 1178
1116 MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track); 1179 MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track);
1117 if (!native_track || !native_track->is_local_track() || 1180 if (!native_track || !native_track->is_local_track() ||
1118 track.source().type() != blink::WebMediaStreamSource::TypeAudio) { 1181 track.source().type() != blink::WebMediaStreamSource::TypeAudio) {
1119 DLOG(ERROR) << "The DTMF sender requires a local audio track."; 1182 DLOG(ERROR) << "The DTMF sender requires a local audio track.";
1120 return nullptr; 1183 return nullptr;
1121 } 1184 }
1122 1185
1123 webrtc::AudioTrackInterface* audio_track = native_track->GetAudioAdapter(); 1186 scoped_refptr<webrtc::AudioTrackInterface> audio_track =
1187 native_track->GetAudioAdapter();
1124 rtc::scoped_refptr<webrtc::DtmfSenderInterface> sender( 1188 rtc::scoped_refptr<webrtc::DtmfSenderInterface> sender(
1125 native_peer_connection_->CreateDtmfSender(audio_track)); 1189 native_peer_connection_->CreateDtmfSender(audio_track.get()));
1126 if (!sender) { 1190 if (!sender) {
1127 DLOG(ERROR) << "Could not create native DTMF sender."; 1191 DLOG(ERROR) << "Could not create native DTMF sender.";
1128 return nullptr; 1192 return nullptr;
1129 } 1193 }
1130 if (peer_connection_tracker_) 1194 if (peer_connection_tracker_)
1131 peer_connection_tracker_->TrackCreateDTMFSender(this, track); 1195 peer_connection_tracker_->TrackCreateDTMFSender(this, track);
1132 1196
1133 return new RtcDtmfSenderHandler(sender); 1197 return new RtcDtmfSenderHandler(sender);
1134 } 1198 }
1135 1199
1136 void RTCPeerConnectionHandler::stop() { 1200 void RTCPeerConnectionHandler::stop() {
1137 DCHECK(thread_checker_.CalledOnValidThread()); 1201 DCHECK(thread_checker_.CalledOnValidThread());
1138 DVLOG(1) << "RTCPeerConnectionHandler::stop"; 1202 DVLOG(1) << "RTCPeerConnectionHandler::stop";
1139 1203
1204 if (!client_)
1205 return; // Already stopped.
1206
1140 if (peer_connection_tracker_) 1207 if (peer_connection_tracker_)
1141 peer_connection_tracker_->TrackStop(this); 1208 peer_connection_tracker_->TrackStop(this);
1209
1142 native_peer_connection_->Close(); 1210 native_peer_connection_->Close();
1211
1143 // The client_ pointer is not considered valid after this point and no further 1212 // The client_ pointer is not considered valid after this point and no further
1144 // callbacks must be made. 1213 // callbacks must be made.
1145 client_ = nullptr; 1214 client_ = nullptr;
1146 } 1215 }
1147 1216
1148 void RTCPeerConnectionHandler::OnSignalingChange( 1217 void RTCPeerConnectionHandler::OnSignalingChange(
1149 webrtc::PeerConnectionInterface::SignalingState new_state) { 1218 webrtc::PeerConnectionInterface::SignalingState new_state) {
1150 DCHECK(thread_checker_.CalledOnValidThread()); 1219 DCHECK(thread_checker_.CalledOnValidThread());
1151 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnSignalingChange"); 1220 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnSignalingChange");
1152 1221
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1332 webrtc::SdpParseError* error) { 1401 webrtc::SdpParseError* error) {
1333 webrtc::SessionDescriptionInterface* native_desc = 1402 webrtc::SessionDescriptionInterface* native_desc =
1334 dependency_factory_->CreateSessionDescription(type, sdp, error); 1403 dependency_factory_->CreateSessionDescription(type, sdp, error);
1335 1404
1336 LOG_IF(ERROR, !native_desc) << "Failed to create native session description." 1405 LOG_IF(ERROR, !native_desc) << "Failed to create native session description."
1337 << " Type: " << type << " SDP: " << sdp; 1406 << " Type: " << type << " SDP: " << sdp;
1338 1407
1339 return native_desc; 1408 return native_desc;
1340 } 1409 }
1341 1410
1411 scoped_refptr<base::SingleThreadTaskRunner>
1412 RTCPeerConnectionHandler::signaling_thread() const {
1413 DCHECK(thread_checker_.CalledOnValidThread());
1414 return dependency_factory_->GetWebRtcSignalingThread();
1415 }
1416
1417 void RTCPeerConnectionHandler::RunSynchronousClosureOnSignalingThread(
1418 const base::Closure& closure,
1419 const char* trace_event_name) {
1420 DCHECK(thread_checker_.CalledOnValidThread());
1421 scoped_refptr<base::SingleThreadTaskRunner> thread(signaling_thread());
1422 if (!thread.get() || thread->BelongsToCurrentThread()) {
1423 TRACE_EVENT0("webrtc", trace_event_name);
1424 closure.Run();
1425 } else {
1426 base::WaitableEvent event(false, false);
1427 thread->PostTask(FROM_HERE,
1428 base::Bind(&RunSynchronousClosure, closure,
1429 base::Unretained(trace_event_name),
1430 base::Unretained(&event)));
1431 event.Wait();
1432 }
1433 }
1434
1342 } // namespace content 1435 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/rtc_peer_connection_handler.h ('k') | content/renderer/media/rtc_peer_connection_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698