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

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: String update 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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 return 110 return
111 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer; 111 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer;
112 case webrtc::PeerConnectionInterface::kClosed: 112 case webrtc::PeerConnectionInterface::kClosed:
113 return WebRTCPeerConnectionHandlerClient::SignalingStateClosed; 113 return WebRTCPeerConnectionHandlerClient::SignalingStateClosed;
114 default: 114 default:
115 NOTREACHED(); 115 NOTREACHED();
116 return WebRTCPeerConnectionHandlerClient::SignalingStateClosed; 116 return WebRTCPeerConnectionHandlerClient::SignalingStateClosed;
117 } 117 }
118 } 118 }
119 119
120 static blink::WebRTCSessionDescription CreateWebKitSessionDescription(
121 const std::string& sdp, const std::string& type) {
122 blink::WebRTCSessionDescription description;
123 description.initialize(base::UTF8ToUTF16(type), base::UTF8ToUTF16(sdp));
124 return description;
125 }
126
120 static blink::WebRTCSessionDescription 127 static blink::WebRTCSessionDescription
121 CreateWebKitSessionDescription( 128 CreateWebKitSessionDescription(
122 const webrtc::SessionDescriptionInterface* native_desc) { 129 const webrtc::SessionDescriptionInterface* native_desc) {
123 blink::WebRTCSessionDescription description;
124 if (!native_desc) { 130 if (!native_desc) {
125 LOG(ERROR) << "Native session description is null."; 131 LOG(ERROR) << "Native session description is null.";
126 return description; 132 return blink::WebRTCSessionDescription();
127 } 133 }
128 134
129 std::string sdp; 135 std::string sdp;
130 if (!native_desc->ToString(&sdp)) { 136 if (!native_desc->ToString(&sdp)) {
131 LOG(ERROR) << "Failed to get SDP string of native session description."; 137 LOG(ERROR) << "Failed to get SDP string of native session description.";
132 return description; 138 return blink::WebRTCSessionDescription();
133 } 139 }
134 140
135 description.initialize(base::UTF8ToUTF16(native_desc->type()), 141 return CreateWebKitSessionDescription(sdp, native_desc->type());
136 base::UTF8ToUTF16(sdp)); 142 }
137 return description; 143
144 void RunClosureWithTrace(const base::Closure& closure,
perkj_chrome 2014/11/05 10:31:02 static to be consistent with above. Or move all to
tommi (sloooow) - chröme 2014/11/05 10:50:38 Done. Moved all into an anonymous namespace. Had
145 const char* trace_event_name) {
146 TRACE_EVENT0("webrtc", trace_event_name);
147 closure.Run();
148 }
149
150 void RunSynchronousClosure(const base::Closure& closure,
151 const char* trace_event_name,
152 base::WaitableEvent* event) {
153 {
154 TRACE_EVENT0("webrtc", trace_event_name);
155 closure.Run();
156 }
157 event->Signal();
158 }
159
160 template<typename ResultType>
161 void RunSynchronousClosureWithResult(
perkj_chrome 2014/11/05 10:31:02 unused
tommi (sloooow) - chröme 2014/11/05 10:50:39 Done.
162 const base::Callback<ResultType()>& closure,
163 const char* trace_event_name,
164 base::WaitableEvent* event,
165 ResultType* result) {
166 {
167 TRACE_EVENT0("webrtc", trace_event_name);
168 *result = closure.Run();
169 }
170 event->Signal();
171 }
172
173 void RunSynchronousClosureOnThread(
perkj_chrome 2014/11/05 10:31:01 unused
tommi (sloooow) - chröme 2014/11/05 10:50:39 Done.
174 const scoped_refptr<base::SingleThreadTaskRunner>& thread,
175 const base::Closure& closure,
176 const char* trace_event_name) {
177 if (thread->BelongsToCurrentThread()) {
178 TRACE_EVENT0("webrtc", trace_event_name);
179 closure.Run();
180 } else {
181 base::WaitableEvent event(false, false);
182 thread->PostTask(FROM_HERE,
183 base::Bind(&RunSynchronousClosure, closure,
184 base::Unretained(trace_event_name),
185 base::Unretained(&event)));
186 event.Wait();
187 }
188 }
189
190 template<typename ResultType>
191 ResultType RunSynchronousClosureOnThreadWithResultT(
perkj_chrome 2014/11/05 10:31:01 unused?
tommi (sloooow) - chröme 2014/11/05 10:50:38 Done.
192 const scoped_refptr<base::SingleThreadTaskRunner>& thread,
193 const base::Callback<ResultType()>& closure,
194 const char* trace_event_name) {
195 ResultType ret = ResultType();
196 if (!thread.get() || thread->BelongsToCurrentThread()) {
197 TRACE_EVENT0("webrtc", trace_event_name);
198 ret = closure.Run();
199 } else {
200 base::WaitableEvent event(false, false);
201 thread->PostTask(FROM_HERE,
202 base::Bind(&RunSynchronousClosureWithResult<ResultType>, closure,
203 base::Unretained(trace_event_name), base::Unretained(&event),
204 base::Unretained(&ret)));
205 event.Wait();
206 }
207
208 return ret;
209 }
210
211 static void GetSessionDescription(
perkj_chrome 2014/11/05 10:31:02 suggest naming GetSdpAndTypeFromSessionDescription
tommi (sloooow) - chröme 2014/11/05 10:50:39 Done.
212 const webrtc::SessionDescriptionInterface* session_description,
213 std::string* sdp, std::string* type) {
214 if (session_description) {
215 session_description->ToString(sdp);
216 *type = session_description->type();
217 }
218 }
219
220 void GetDescription(
221 const base::Callback<const webrtc::SessionDescriptionInterface*()>&
222 description,
perkj_chrome 2014/11/05 10:31:02 Can we rename |description| to something that indi
tommi (sloooow) - chröme 2014/11/05 10:50:39 Renamed to description_callback
223 std::string* sdp, std::string* type) {
224 GetSessionDescription(description.Run(), sdp, type);
perkj_chrome 2014/11/05 10:31:02 Can you please join GetSessionDescription and GetD
tommi (sloooow) - chröme 2014/11/05 10:50:39 Done.
138 } 225 }
139 226
140 // Converter functions from WebKit types to libjingle types. 227 // Converter functions from WebKit types to libjingle types.
141 228
142 static void GetNativeRtcConfiguration( 229 static void GetNativeRtcConfiguration(
143 const blink::WebRTCConfiguration& server_configuration, 230 const blink::WebRTCConfiguration& server_configuration,
144 webrtc::PeerConnectionInterface::RTCConfiguration* config) { 231 webrtc::PeerConnectionInterface::RTCConfiguration* config) {
145 if (server_configuration.isNull() || !config) 232 if (server_configuration.isNull() || !config)
146 return; 233 return;
147 for (size_t i = 0; i < server_configuration.numberOfServers(); ++i) { 234 for (size_t i = 0; i < server_configuration.numberOfServers(); ++i) {
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 : request_(request.get()), 390 : request_(request.get()),
304 main_thread_(base::ThreadTaskRunnerHandle::Get()) { 391 main_thread_(base::ThreadTaskRunnerHandle::Get()) {
305 // Measure the overall time it takes to satisfy a getStats request. 392 // Measure the overall time it takes to satisfy a getStats request.
306 TRACE_EVENT_ASYNC_BEGIN0("webrtc", "getStats_Native", this); 393 TRACE_EVENT_ASYNC_BEGIN0("webrtc", "getStats_Native", this);
307 signaling_thread_checker_.DetachFromThread(); 394 signaling_thread_checker_.DetachFromThread();
308 } 395 }
309 396
310 void OnComplete(const StatsReports& reports) override { 397 void OnComplete(const StatsReports& reports) override {
311 DCHECK(signaling_thread_checker_.CalledOnValidThread()); 398 DCHECK(signaling_thread_checker_.CalledOnValidThread());
312 TRACE_EVENT0("webrtc", "StatsResponse::OnComplete"); 399 TRACE_EVENT0("webrtc", "StatsResponse::OnComplete");
313 // TODO(tommi): Get rid of these string copies some how. 400 // TODO(tommi): Get rid of these string copies somehow.
314 // We can't use webkit objects directly since they use a single threaded 401 // We can't use webkit objects directly since they use a single threaded
315 // heap allocator. 402 // heap allocator.
316 scoped_ptr<std::vector<StatsReportCopyable>> report_copies( 403 scoped_ptr<std::vector<StatsReportCopyable>> report_copies(
317 new std::vector<StatsReportCopyable>()); 404 new std::vector<StatsReportCopyable>());
318 report_copies->reserve(reports.size()); 405 report_copies->reserve(reports.size());
319 for (auto it : reports) 406 for (auto it : reports)
320 report_copies->push_back(StatsReportCopyable(*it)); 407 report_copies->push_back(StatsReportCopyable(*it));
321 408
322 main_thread_->PostTask(FROM_HERE, 409 main_thread_->PostTask(FROM_HERE,
323 base::Bind(&StatsResponse::DeliverCallback, this, 410 base::Bind(&StatsResponse::DeliverCallback, this,
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 } 697 }
611 } 698 }
612 699
613 private: 700 private:
614 const base::WeakPtr<RTCPeerConnectionHandler> handler_; 701 const base::WeakPtr<RTCPeerConnectionHandler> handler_;
615 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; 702 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
616 }; 703 };
617 704
618 RTCPeerConnectionHandler::RTCPeerConnectionHandler( 705 RTCPeerConnectionHandler::RTCPeerConnectionHandler(
619 blink::WebRTCPeerConnectionHandlerClient* client, 706 blink::WebRTCPeerConnectionHandlerClient* client,
620 PeerConnectionDependencyFactory* dependency_factory, 707 PeerConnectionDependencyFactory* dependency_factory)
621 const scoped_refptr<base::SingleThreadTaskRunner>& signaling_thread)
622 : client_(client), 708 : client_(client),
623 dependency_factory_(dependency_factory), 709 dependency_factory_(dependency_factory),
624 frame_(NULL), 710 frame_(NULL),
625 signaling_thread_(signaling_thread),
626 num_data_channels_created_(0), 711 num_data_channels_created_(0),
627 num_local_candidates_ipv4_(0), 712 num_local_candidates_ipv4_(0),
628 num_local_candidates_ipv6_(0), 713 num_local_candidates_ipv6_(0),
629 weak_factory_(this) { 714 weak_factory_(this) {
630 g_peer_connection_handlers.Get().insert(this); 715 g_peer_connection_handlers.Get().insert(this);
631 } 716 }
632 717
633 RTCPeerConnectionHandler::~RTCPeerConnectionHandler() { 718 RTCPeerConnectionHandler::~RTCPeerConnectionHandler() {
634 DCHECK(thread_checker_.CalledOnValidThread()); 719 DCHECK(thread_checker_.CalledOnValidThread());
635 g_peer_connection_handlers.Get().erase(this); 720 g_peer_connection_handlers.Get().erase(this);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 const blink::WebMediaConstraints& options) { 828 const blink::WebMediaConstraints& options) {
744 DCHECK(thread_checker_.CalledOnValidThread()); 829 DCHECK(thread_checker_.CalledOnValidThread());
745 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createOffer"); 830 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createOffer");
746 831
747 scoped_refptr<CreateSessionDescriptionRequest> description_request( 832 scoped_refptr<CreateSessionDescriptionRequest> description_request(
748 new rtc::RefCountedObject<CreateSessionDescriptionRequest>( 833 new rtc::RefCountedObject<CreateSessionDescriptionRequest>(
749 base::ThreadTaskRunnerHandle::Get(), request, 834 base::ThreadTaskRunnerHandle::Get(), request,
750 weak_factory_.GetWeakPtr(), peer_connection_tracker_, 835 weak_factory_.GetWeakPtr(), peer_connection_tracker_,
751 PeerConnectionTracker::ACTION_CREATE_OFFER)); 836 PeerConnectionTracker::ACTION_CREATE_OFFER));
752 837
838 // TODO(tommi): Do this asynchronously via e.g. PostTaskAndReply.
753 RTCMediaConstraints constraints(options); 839 RTCMediaConstraints constraints(options);
754 native_peer_connection_->CreateOffer(description_request.get(), &constraints); 840 native_peer_connection_->CreateOffer(description_request.get(), &constraints);
755 841
756 if (peer_connection_tracker_) 842 if (peer_connection_tracker_)
757 peer_connection_tracker_->TrackCreateOffer(this, constraints); 843 peer_connection_tracker_->TrackCreateOffer(this, constraints);
758 } 844 }
759 845
760 void RTCPeerConnectionHandler::createOffer( 846 void RTCPeerConnectionHandler::createOffer(
761 const blink::WebRTCSessionDescriptionRequest& request, 847 const blink::WebRTCSessionDescriptionRequest& request,
762 const blink::WebRTCOfferOptions& options) { 848 const blink::WebRTCOfferOptions& options) {
763 DCHECK(thread_checker_.CalledOnValidThread()); 849 DCHECK(thread_checker_.CalledOnValidThread());
764 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createOffer"); 850 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createOffer");
765 851
766 scoped_refptr<CreateSessionDescriptionRequest> description_request( 852 scoped_refptr<CreateSessionDescriptionRequest> description_request(
767 new rtc::RefCountedObject<CreateSessionDescriptionRequest>( 853 new rtc::RefCountedObject<CreateSessionDescriptionRequest>(
768 base::ThreadTaskRunnerHandle::Get(), request, 854 base::ThreadTaskRunnerHandle::Get(), request,
769 weak_factory_.GetWeakPtr(), peer_connection_tracker_, 855 weak_factory_.GetWeakPtr(), peer_connection_tracker_,
770 PeerConnectionTracker::ACTION_CREATE_OFFER)); 856 PeerConnectionTracker::ACTION_CREATE_OFFER));
771 857
858 // TODO(tommi): Do this asynchronously via e.g. PostTaskAndReply.
772 RTCMediaConstraints constraints; 859 RTCMediaConstraints constraints;
773 ConvertOfferOptionsToConstraints(options, &constraints); 860 ConvertOfferOptionsToConstraints(options, &constraints);
774 native_peer_connection_->CreateOffer(description_request.get(), &constraints); 861 native_peer_connection_->CreateOffer(description_request.get(), &constraints);
775 862
776 if (peer_connection_tracker_) 863 if (peer_connection_tracker_)
777 peer_connection_tracker_->TrackCreateOffer(this, constraints); 864 peer_connection_tracker_->TrackCreateOffer(this, constraints);
778 } 865 }
779 866
780 void RTCPeerConnectionHandler::createAnswer( 867 void RTCPeerConnectionHandler::createAnswer(
781 const blink::WebRTCSessionDescriptionRequest& request, 868 const blink::WebRTCSessionDescriptionRequest& request,
782 const blink::WebMediaConstraints& options) { 869 const blink::WebMediaConstraints& options) {
783 DCHECK(thread_checker_.CalledOnValidThread()); 870 DCHECK(thread_checker_.CalledOnValidThread());
784 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createAnswer"); 871 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createAnswer");
785 scoped_refptr<CreateSessionDescriptionRequest> description_request( 872 scoped_refptr<CreateSessionDescriptionRequest> description_request(
786 new rtc::RefCountedObject<CreateSessionDescriptionRequest>( 873 new rtc::RefCountedObject<CreateSessionDescriptionRequest>(
787 base::ThreadTaskRunnerHandle::Get(), request, 874 base::ThreadTaskRunnerHandle::Get(), request,
788 weak_factory_.GetWeakPtr(), peer_connection_tracker_, 875 weak_factory_.GetWeakPtr(), peer_connection_tracker_,
789 PeerConnectionTracker::ACTION_CREATE_ANSWER)); 876 PeerConnectionTracker::ACTION_CREATE_ANSWER));
877 // TODO(tommi): Do this asynchronously via e.g. PostTaskAndReply.
790 RTCMediaConstraints constraints(options); 878 RTCMediaConstraints constraints(options);
791 native_peer_connection_->CreateAnswer(description_request.get(), 879 native_peer_connection_->CreateAnswer(description_request.get(),
792 &constraints); 880 &constraints);
793 881
794 if (peer_connection_tracker_) 882 if (peer_connection_tracker_)
795 peer_connection_tracker_->TrackCreateAnswer(this, constraints); 883 peer_connection_tracker_->TrackCreateAnswer(this, constraints);
796 } 884 }
797 885
798 void RTCPeerConnectionHandler::setLocalDescription( 886 void RTCPeerConnectionHandler::setLocalDescription(
799 const blink::WebRTCVoidRequest& request, 887 const blink::WebRTCVoidRequest& request,
(...skipping 23 matching lines...) Expand all
823 peer_connection_tracker_->TrackSetSessionDescription( 911 peer_connection_tracker_->TrackSetSessionDescription(
824 this, sdp, type, PeerConnectionTracker::SOURCE_LOCAL); 912 this, sdp, type, PeerConnectionTracker::SOURCE_LOCAL);
825 } 913 }
826 914
827 scoped_refptr<SetSessionDescriptionRequest> set_request( 915 scoped_refptr<SetSessionDescriptionRequest> set_request(
828 new rtc::RefCountedObject<SetSessionDescriptionRequest>( 916 new rtc::RefCountedObject<SetSessionDescriptionRequest>(
829 base::ThreadTaskRunnerHandle::Get(), request, 917 base::ThreadTaskRunnerHandle::Get(), request,
830 weak_factory_.GetWeakPtr(), peer_connection_tracker_, 918 weak_factory_.GetWeakPtr(), peer_connection_tracker_,
831 PeerConnectionTracker::ACTION_SET_LOCAL_DESCRIPTION)); 919 PeerConnectionTracker::ACTION_SET_LOCAL_DESCRIPTION));
832 920
833 // TODO(tommi): Run this on the signaling thread. 921 signaling_thread()->PostTask(FROM_HERE,
834 native_peer_connection_->SetLocalDescription(set_request.get(), native_desc); 922 base::Bind(&RunClosureWithTrace,
923 base::Bind(&webrtc::PeerConnectionInterface::SetLocalDescription,
924 native_peer_connection_, set_request,
925 base::Unretained(native_desc)),
926 "SetLocalDescription"));
835 } 927 }
836 928
837 void RTCPeerConnectionHandler::setRemoteDescription( 929 void RTCPeerConnectionHandler::setRemoteDescription(
838 const blink::WebRTCVoidRequest& request, 930 const blink::WebRTCVoidRequest& request,
839 const blink::WebRTCSessionDescription& description) { 931 const blink::WebRTCSessionDescription& description) {
840 DCHECK(thread_checker_.CalledOnValidThread()); 932 DCHECK(thread_checker_.CalledOnValidThread());
841 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::setRemoteDescription"); 933 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::setRemoteDescription");
842 std::string sdp = base::UTF16ToUTF8(description.sdp()); 934 std::string sdp = base::UTF16ToUTF8(description.sdp());
843 std::string type = base::UTF16ToUTF8(description.type()); 935 std::string type = base::UTF16ToUTF8(description.type());
844 936
(...skipping 15 matching lines...) Expand all
860 if (peer_connection_tracker_) { 952 if (peer_connection_tracker_) {
861 peer_connection_tracker_->TrackSetSessionDescription( 953 peer_connection_tracker_->TrackSetSessionDescription(
862 this, sdp, type, PeerConnectionTracker::SOURCE_REMOTE); 954 this, sdp, type, PeerConnectionTracker::SOURCE_REMOTE);
863 } 955 }
864 956
865 scoped_refptr<SetSessionDescriptionRequest> set_request( 957 scoped_refptr<SetSessionDescriptionRequest> set_request(
866 new rtc::RefCountedObject<SetSessionDescriptionRequest>( 958 new rtc::RefCountedObject<SetSessionDescriptionRequest>(
867 base::ThreadTaskRunnerHandle::Get(), request, 959 base::ThreadTaskRunnerHandle::Get(), request,
868 weak_factory_.GetWeakPtr(), peer_connection_tracker_, 960 weak_factory_.GetWeakPtr(), peer_connection_tracker_,
869 PeerConnectionTracker::ACTION_SET_REMOTE_DESCRIPTION)); 961 PeerConnectionTracker::ACTION_SET_REMOTE_DESCRIPTION));
870 // TODO(tommi): Run this on the signaling thread. 962 signaling_thread()->PostTask(FROM_HERE,
871 native_peer_connection_->SetRemoteDescription(set_request.get(), native_desc); 963 base::Bind(&RunClosureWithTrace,
964 base::Bind(&webrtc::PeerConnectionInterface::SetRemoteDescription,
965 native_peer_connection_, set_request,
966 base::Unretained(native_desc)),
967 "SetRemoteDescription"));
872 } 968 }
873 969
874 blink::WebRTCSessionDescription 970 blink::WebRTCSessionDescription
875 RTCPeerConnectionHandler::localDescription() { 971 RTCPeerConnectionHandler::localDescription() {
876 DCHECK(thread_checker_.CalledOnValidThread()); 972 DCHECK(thread_checker_.CalledOnValidThread());
877 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::localDescription"); 973 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::localDescription");
878 const webrtc::SessionDescriptionInterface* native_desc = 974
879 native_peer_connection_->local_description(); 975 // Since local_description returns a pointer to a non-reference-counted object
880 blink::WebRTCSessionDescription description = 976 // that lives on the signaling thread, we cannot fetch a pointer to it and use
881 CreateWebKitSessionDescription(native_desc); 977 // it directly here. Instead, we access the object completely on the signaling
882 return description; 978 // thread.
979 std::string sdp, type;
980 base::Callback<const webrtc::SessionDescriptionInterface*()> description =
perkj_chrome 2014/11/05 10:31:02 name get_description_cb?
tommi (sloooow) - chröme 2014/11/05 10:50:39 Done. changed to description_cb (since the functio
981 base::Bind(&webrtc::PeerConnectionInterface::local_description,
982 native_peer_connection_);
983 RunSynchronousClosureOnThread(
984 base::Bind(&GetDescription, description, base::Unretained(&sdp),
985 base::Unretained(&type)),
986 "localDescription");
987
988 return CreateWebKitSessionDescription(sdp, type);
883 } 989 }
884 990
885 blink::WebRTCSessionDescription 991 blink::WebRTCSessionDescription
886 RTCPeerConnectionHandler::remoteDescription() { 992 RTCPeerConnectionHandler::remoteDescription() {
887 DCHECK(thread_checker_.CalledOnValidThread()); 993 DCHECK(thread_checker_.CalledOnValidThread());
888 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::remoteDescription"); 994 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::remoteDescription");
889 const webrtc::SessionDescriptionInterface* native_desc = 995 // Since local_description returns a pointer to a non-reference-counted object
890 native_peer_connection_->remote_description(); 996 // that lives on the signaling thread, we cannot fetch a pointer to it and use
891 blink::WebRTCSessionDescription description = 997 // it directly here. Instead, we access the object completely on the signaling
892 CreateWebKitSessionDescription(native_desc); 998 // thread.
893 return description; 999 std::string sdp, type;
1000 auto desc = base::Bind(&webrtc::PeerConnectionInterface::remote_description,
perkj_chrome 2014/11/05 10:31:02 please use base::Callback<const webrtc::SessionDes
tommi (sloooow) - chröme 2014/11/05 10:50:39 Done.
1001 native_peer_connection_);
perkj_chrome 2014/11/05 10:31:02 nit: indentation
tommi (sloooow) - chröme 2014/11/05 10:50:39 Done.
1002 RunSynchronousClosureOnThread(
1003 base::Bind(&GetDescription, desc, base::Unretained(&sdp),
1004 base::Unretained(&type)),
1005 "remoteDescription");
1006
1007 return CreateWebKitSessionDescription(sdp, type);
894 } 1008 }
895 1009
896 bool RTCPeerConnectionHandler::updateICE( 1010 bool RTCPeerConnectionHandler::updateICE(
897 const blink::WebRTCConfiguration& server_configuration, 1011 const blink::WebRTCConfiguration& server_configuration,
898 const blink::WebMediaConstraints& options) { 1012 const blink::WebMediaConstraints& options) {
899 DCHECK(thread_checker_.CalledOnValidThread()); 1013 DCHECK(thread_checker_.CalledOnValidThread());
900 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::updateICE"); 1014 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::updateICE");
901 webrtc::PeerConnectionInterface::RTCConfiguration config; 1015 webrtc::PeerConnectionInterface::RTCConfiguration config;
902 GetNativeRtcConfiguration(server_configuration, &config); 1016 GetNativeRtcConfiguration(server_configuration, &config);
903 RTCMediaConstraints constraints(options); 1017 RTCMediaConstraints constraints(options);
904 1018
905 if (peer_connection_tracker_) 1019 if (peer_connection_tracker_)
906 peer_connection_tracker_->TrackUpdateIce(this, config, constraints); 1020 peer_connection_tracker_->TrackUpdateIce(this, config, constraints);
907 1021
908 return native_peer_connection_->UpdateIce(config.servers, &constraints); 1022 return native_peer_connection_->UpdateIce(config.servers, &constraints);
909 } 1023 }
910 1024
911 bool RTCPeerConnectionHandler::addICECandidate( 1025 bool RTCPeerConnectionHandler::addICECandidate(
912 const blink::WebRTCVoidRequest& request, 1026 const blink::WebRTCVoidRequest& request,
913 const blink::WebRTCICECandidate& candidate) { 1027 const blink::WebRTCICECandidate& candidate) {
914 DCHECK(thread_checker_.CalledOnValidThread()); 1028 DCHECK(thread_checker_.CalledOnValidThread());
915 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::addICECandidate"); 1029 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::addICECandidate");
916 // Libjingle currently does not accept callbacks for addICECandidate. 1030 // Libjingle currently does not accept callbacks for addICECandidate.
917 // For that reason we are going to call callbacks from here. 1031 // For that reason we are going to call callbacks from here.
1032
1033 // TODO(tommi): Instead of calling addICECandidate here, we can do a
1034 // PostTaskAndReply kind of a thing.
918 bool result = addICECandidate(candidate); 1035 bool result = addICECandidate(candidate);
919 base::MessageLoop::current()->PostTask( 1036 base::MessageLoop::current()->PostTask(
920 FROM_HERE, 1037 FROM_HERE,
921 base::Bind(&RTCPeerConnectionHandler::OnaddICECandidateResult, 1038 base::Bind(&RTCPeerConnectionHandler::OnaddICECandidateResult,
922 weak_factory_.GetWeakPtr(), request, result)); 1039 weak_factory_.GetWeakPtr(), request, result));
923 // On failure callback will be triggered. 1040 // On failure callback will be triggered.
924 return true; 1041 return true;
925 } 1042 }
926 1043
927 bool RTCPeerConnectionHandler::addICECandidate( 1044 bool RTCPeerConnectionHandler::addICECandidate(
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1007 for (ScopedVector<WebRtcMediaStreamAdapter>::iterator adapter_it = 1124 for (ScopedVector<WebRtcMediaStreamAdapter>::iterator adapter_it =
1008 local_streams_.begin(); adapter_it != local_streams_.end(); 1125 local_streams_.begin(); adapter_it != local_streams_.end();
1009 ++adapter_it) { 1126 ++adapter_it) {
1010 if ((*adapter_it)->IsEqual(stream)) { 1127 if ((*adapter_it)->IsEqual(stream)) {
1011 webrtc_stream = (*adapter_it)->webrtc_media_stream(); 1128 webrtc_stream = (*adapter_it)->webrtc_media_stream();
1012 local_streams_.erase(adapter_it); 1129 local_streams_.erase(adapter_it);
1013 break; 1130 break;
1014 } 1131 }
1015 } 1132 }
1016 DCHECK(webrtc_stream.get()); 1133 DCHECK(webrtc_stream.get());
1134 // TODO(tommi): Make this async (PostTaskAndReply).
1017 native_peer_connection_->RemoveStream(webrtc_stream.get()); 1135 native_peer_connection_->RemoveStream(webrtc_stream.get());
1018 1136
1019 if (peer_connection_tracker_) { 1137 if (peer_connection_tracker_) {
1020 peer_connection_tracker_->TrackRemoveStream( 1138 peer_connection_tracker_->TrackRemoveStream(
1021 this, stream, PeerConnectionTracker::SOURCE_LOCAL); 1139 this, stream, PeerConnectionTracker::SOURCE_LOCAL);
1022 } 1140 }
1023 PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter(); 1141 PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter();
1024 track_metrics_.RemoveStream(MediaStreamTrackMetrics::SENT_STREAM, 1142 track_metrics_.RemoveStream(MediaStreamTrackMetrics::SENT_STREAM,
1025 webrtc_stream.get()); 1143 webrtc_stream.get());
1026 } 1144 }
(...skipping 27 matching lines...) Expand all
1054 track_id, track_type); 1172 track_id, track_type);
1055 } 1173 }
1056 1174
1057 // TODO(tommi): It's weird to have three {g|G}etStats methods. Clean this up. 1175 // TODO(tommi): It's weird to have three {g|G}etStats methods. Clean this up.
1058 void RTCPeerConnectionHandler::GetStats( 1176 void RTCPeerConnectionHandler::GetStats(
1059 webrtc::StatsObserver* observer, 1177 webrtc::StatsObserver* observer,
1060 webrtc::PeerConnectionInterface::StatsOutputLevel level, 1178 webrtc::PeerConnectionInterface::StatsOutputLevel level,
1061 const std::string& track_id, 1179 const std::string& track_id,
1062 blink::WebMediaStreamSource::Type track_type) { 1180 blink::WebMediaStreamSource::Type track_type) {
1063 DCHECK(thread_checker_.CalledOnValidThread()); 1181 DCHECK(thread_checker_.CalledOnValidThread());
1064 signaling_thread_->PostTask(FROM_HERE, 1182 signaling_thread()->PostTask(FROM_HERE,
1065 base::Bind(&GetStatsOnSignalingThread, native_peer_connection_, level, 1183 base::Bind(&GetStatsOnSignalingThread, native_peer_connection_, level,
1066 make_scoped_refptr(observer), track_id, track_type)); 1184 make_scoped_refptr(observer), track_id, track_type));
1067 } 1185 }
1068 1186
1069 void RTCPeerConnectionHandler::CloseClientPeerConnection() { 1187 void RTCPeerConnectionHandler::CloseClientPeerConnection() {
1070 DCHECK(thread_checker_.CalledOnValidThread()); 1188 DCHECK(thread_checker_.CalledOnValidThread());
1071 if (client_) 1189 if (client_)
1072 client_->closePeerConnection(); 1190 client_->closePeerConnection();
1073 } 1191 }
1074 1192
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1113 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createDTMFSender"); 1231 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createDTMFSender");
1114 DVLOG(1) << "createDTMFSender."; 1232 DVLOG(1) << "createDTMFSender.";
1115 1233
1116 MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track); 1234 MediaStreamTrack* native_track = MediaStreamTrack::GetTrack(track);
1117 if (!native_track || !native_track->is_local_track() || 1235 if (!native_track || !native_track->is_local_track() ||
1118 track.source().type() != blink::WebMediaStreamSource::TypeAudio) { 1236 track.source().type() != blink::WebMediaStreamSource::TypeAudio) {
1119 DLOG(ERROR) << "The DTMF sender requires a local audio track."; 1237 DLOG(ERROR) << "The DTMF sender requires a local audio track.";
1120 return nullptr; 1238 return nullptr;
1121 } 1239 }
1122 1240
1123 webrtc::AudioTrackInterface* audio_track = native_track->GetAudioAdapter(); 1241 scoped_refptr<webrtc::AudioTrackInterface> audio_track =
1242 native_track->GetAudioAdapter();
1124 rtc::scoped_refptr<webrtc::DtmfSenderInterface> sender( 1243 rtc::scoped_refptr<webrtc::DtmfSenderInterface> sender(
1125 native_peer_connection_->CreateDtmfSender(audio_track)); 1244 native_peer_connection_->CreateDtmfSender(audio_track.get()));
1126 if (!sender) { 1245 if (!sender) {
1127 DLOG(ERROR) << "Could not create native DTMF sender."; 1246 DLOG(ERROR) << "Could not create native DTMF sender.";
1128 return nullptr; 1247 return nullptr;
1129 } 1248 }
1130 if (peer_connection_tracker_) 1249 if (peer_connection_tracker_)
1131 peer_connection_tracker_->TrackCreateDTMFSender(this, track); 1250 peer_connection_tracker_->TrackCreateDTMFSender(this, track);
1132 1251
1133 return new RtcDtmfSenderHandler(sender); 1252 return new RtcDtmfSenderHandler(sender);
1134 } 1253 }
1135 1254
1136 void RTCPeerConnectionHandler::stop() { 1255 void RTCPeerConnectionHandler::stop() {
1137 DCHECK(thread_checker_.CalledOnValidThread()); 1256 DCHECK(thread_checker_.CalledOnValidThread());
1138 DVLOG(1) << "RTCPeerConnectionHandler::stop"; 1257 DVLOG(1) << "RTCPeerConnectionHandler::stop";
1139 1258
1259 if (!client_)
1260 return; // Already stopped.
1261
1140 if (peer_connection_tracker_) 1262 if (peer_connection_tracker_)
1141 peer_connection_tracker_->TrackStop(this); 1263 peer_connection_tracker_->TrackStop(this);
1264
1142 native_peer_connection_->Close(); 1265 native_peer_connection_->Close();
1266
1143 // The client_ pointer is not considered valid after this point and no further 1267 // The client_ pointer is not considered valid after this point and no further
1144 // callbacks must be made. 1268 // callbacks must be made.
1145 client_ = nullptr; 1269 client_ = nullptr;
1146 } 1270 }
1147 1271
1148 void RTCPeerConnectionHandler::OnSignalingChange( 1272 void RTCPeerConnectionHandler::OnSignalingChange(
1149 webrtc::PeerConnectionInterface::SignalingState new_state) { 1273 webrtc::PeerConnectionInterface::SignalingState new_state) {
1150 DCHECK(thread_checker_.CalledOnValidThread()); 1274 DCHECK(thread_checker_.CalledOnValidThread());
1151 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnSignalingChange"); 1275 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnSignalingChange");
1152 1276
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1332 webrtc::SdpParseError* error) { 1456 webrtc::SdpParseError* error) {
1333 webrtc::SessionDescriptionInterface* native_desc = 1457 webrtc::SessionDescriptionInterface* native_desc =
1334 dependency_factory_->CreateSessionDescription(type, sdp, error); 1458 dependency_factory_->CreateSessionDescription(type, sdp, error);
1335 1459
1336 LOG_IF(ERROR, !native_desc) << "Failed to create native session description." 1460 LOG_IF(ERROR, !native_desc) << "Failed to create native session description."
1337 << " Type: " << type << " SDP: " << sdp; 1461 << " Type: " << type << " SDP: " << sdp;
1338 1462
1339 return native_desc; 1463 return native_desc;
1340 } 1464 }
1341 1465
1466 scoped_refptr<base::SingleThreadTaskRunner>
1467 RTCPeerConnectionHandler::signaling_thread() const {
1468 DCHECK(thread_checker_.CalledOnValidThread());
1469 return dependency_factory_->GetWebRtcSignalingThread();
1470 }
1471
1472 void RTCPeerConnectionHandler::RunSynchronousClosureOnThread(
perkj_chrome 2014/11/05 10:31:01 Name RunSynchronousClosureOnSignalingThread?
tommi (sloooow) - chröme 2014/11/05 10:50:39 Done.
1473 const base::Closure& closure,
1474 const char* trace_event_name) {
1475 DCHECK(thread_checker_.CalledOnValidThread());
1476 scoped_refptr<base::SingleThreadTaskRunner> thread(signaling_thread());
1477 if (!thread.get() || thread->BelongsToCurrentThread()) {
1478 TRACE_EVENT0("webrtc", trace_event_name);
1479 closure.Run();
1480 } else {
1481 base::WaitableEvent event(false, false);
1482 thread->PostTask(FROM_HERE,
1483 base::Bind(&RunSynchronousClosure, closure,
1484 base::Unretained(trace_event_name),
1485 base::Unretained(&event)));
1486 event.Wait();
1487 }
1488 }
1489
1490 bool RTCPeerConnectionHandler::RunSynchronousClosureOnThreadWithResult(
perkj_chrome 2014/11/05 10:31:01 unused?
tommi (sloooow) - chröme 2014/11/05 10:50:38 Removed
1491 const base::Callback<bool()>& closure,
1492 const char* trace_event_name) {
1493 DCHECK(thread_checker_.CalledOnValidThread());
1494 return RunSynchronousClosureOnThreadWithResultT<bool>(signaling_thread(),
1495 closure, trace_event_name);
1496 }
1497
1342 } // namespace content 1498 } // 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