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

Side by Side Diff: webrtc/pc/channel.cc

Issue 1903393004: Added network thread to rtc::BaseChannel (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: fix flakiness of WebRtcSessionTest.TestPacketOptionsAndOnPacketSent Created 4 years, 7 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 unified diff | Download patch
« no previous file with comments | « webrtc/pc/channel.h ('k') | webrtc/pc/channel_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2004 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 19 matching lines...) Expand all
30 using rtc::Bind; 30 using rtc::Bind;
31 31
32 namespace { 32 namespace {
33 // See comment below for why we need to use a pointer to a unique_ptr. 33 // See comment below for why we need to use a pointer to a unique_ptr.
34 bool SetRawAudioSink_w(VoiceMediaChannel* channel, 34 bool SetRawAudioSink_w(VoiceMediaChannel* channel,
35 uint32_t ssrc, 35 uint32_t ssrc,
36 std::unique_ptr<webrtc::AudioSinkInterface>* sink) { 36 std::unique_ptr<webrtc::AudioSinkInterface>* sink) {
37 channel->SetRawAudioSink(ssrc, std::move(*sink)); 37 channel->SetRawAudioSink(ssrc, std::move(*sink));
38 return true; 38 return true;
39 } 39 }
40
41 struct SendPacketMessageData : public rtc::MessageData {
42 rtc::CopyOnWriteBuffer packet;
43 rtc::PacketOptions options;
44 };
45
40 } // namespace 46 } // namespace
41 47
42 enum { 48 enum {
43 MSG_EARLYMEDIATIMEOUT = 1, 49 MSG_EARLYMEDIATIMEOUT = 1,
44 MSG_RTPPACKET, 50 MSG_SEND_RTP_PACKET,
45 MSG_RTCPPACKET, 51 MSG_SEND_RTCP_PACKET,
46 MSG_CHANNEL_ERROR, 52 MSG_CHANNEL_ERROR,
47 MSG_READYTOSENDDATA, 53 MSG_READYTOSENDDATA,
48 MSG_DATARECEIVED, 54 MSG_DATARECEIVED,
49 MSG_FIRSTPACKETRECEIVED, 55 MSG_FIRSTPACKETRECEIVED,
50 MSG_STREAMCLOSEDREMOTELY, 56 MSG_STREAMCLOSEDREMOTELY,
51 }; 57 };
52 58
53 // Value specified in RFC 5764. 59 // Value specified in RFC 5764.
54 static const char kDtlsSrtpExporterLabel[] = "EXTRACTOR-dtls_srtp"; 60 static const char kDtlsSrtpExporterLabel[] = "EXTRACTOR-dtls_srtp";
55 61
56 static const int kAgcMinus10db = -10; 62 static const int kAgcMinus10db = -10;
57 63
58 static void SafeSetError(const std::string& message, std::string* error_desc) { 64 static void SafeSetError(const std::string& message, std::string* error_desc) {
59 if (error_desc) { 65 if (error_desc) {
60 *error_desc = message; 66 *error_desc = message;
61 } 67 }
62 } 68 }
63 69
64 struct PacketMessageData : public rtc::MessageData {
65 rtc::CopyOnWriteBuffer packet;
66 rtc::PacketOptions options;
67 };
68
69 struct VoiceChannelErrorMessageData : public rtc::MessageData { 70 struct VoiceChannelErrorMessageData : public rtc::MessageData {
70 VoiceChannelErrorMessageData(uint32_t in_ssrc, 71 VoiceChannelErrorMessageData(uint32_t in_ssrc,
71 VoiceMediaChannel::Error in_error) 72 VoiceMediaChannel::Error in_error)
72 : ssrc(in_ssrc), error(in_error) {} 73 : ssrc(in_ssrc), error(in_error) {}
73 uint32_t ssrc; 74 uint32_t ssrc;
74 VoiceMediaChannel::Error error; 75 VoiceMediaChannel::Error error;
75 }; 76 };
76 77
77 struct VideoChannelErrorMessageData : public rtc::MessageData { 78 struct VideoChannelErrorMessageData : public rtc::MessageData {
78 VideoChannelErrorMessageData(uint32_t in_ssrc, 79 VideoChannelErrorMessageData(uint32_t in_ssrc,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 } 136 }
136 137
137 template <class Codec> 138 template <class Codec>
138 void RtpSendParametersFromMediaDescription( 139 void RtpSendParametersFromMediaDescription(
139 const MediaContentDescriptionImpl<Codec>* desc, 140 const MediaContentDescriptionImpl<Codec>* desc,
140 RtpSendParameters<Codec>* send_params) { 141 RtpSendParameters<Codec>* send_params) {
141 RtpParametersFromMediaDescription(desc, send_params); 142 RtpParametersFromMediaDescription(desc, send_params);
142 send_params->max_bandwidth_bps = desc->bandwidth(); 143 send_params->max_bandwidth_bps = desc->bandwidth();
143 } 144 }
144 145
145 BaseChannel::BaseChannel(rtc::Thread* thread, 146 BaseChannel::BaseChannel(rtc::Thread* worker_thread,
147 rtc::Thread* network_thread,
146 MediaChannel* media_channel, 148 MediaChannel* media_channel,
147 TransportController* transport_controller, 149 TransportController* transport_controller,
148 const std::string& content_name, 150 const std::string& content_name,
149 bool rtcp) 151 bool rtcp)
150 : worker_thread_(thread), 152 : worker_thread_(worker_thread),
153 network_thread_(network_thread),
154
155 content_name_(content_name),
156
151 transport_controller_(transport_controller), 157 transport_controller_(transport_controller),
152 media_channel_(media_channel),
153 content_name_(content_name),
154 rtcp_transport_enabled_(rtcp), 158 rtcp_transport_enabled_(rtcp),
155 transport_channel_(nullptr), 159 transport_channel_(nullptr),
156 rtcp_transport_channel_(nullptr), 160 rtcp_transport_channel_(nullptr),
157 enabled_(false),
158 writable_(false),
159 rtp_ready_to_send_(false), 161 rtp_ready_to_send_(false),
160 rtcp_ready_to_send_(false), 162 rtcp_ready_to_send_(false),
163 writable_(false),
161 was_ever_writable_(false), 164 was_ever_writable_(false),
162 local_content_direction_(MD_INACTIVE),
163 remote_content_direction_(MD_INACTIVE),
164 has_received_packet_(false), 165 has_received_packet_(false),
165 dtls_keyed_(false), 166 dtls_keyed_(false),
166 secure_required_(false), 167 secure_required_(false),
167 rtp_abs_sendtime_extn_id_(-1) { 168 rtp_abs_sendtime_extn_id_(-1),
169
170 media_channel_(media_channel),
171 enabled_(false),
172 local_content_direction_(MD_INACTIVE),
173 remote_content_direction_(MD_INACTIVE) {
168 ASSERT(worker_thread_ == rtc::Thread::Current()); 174 ASSERT(worker_thread_ == rtc::Thread::Current());
175 if (transport_controller) {
176 RTC_DCHECK_EQ(network_thread, transport_controller->worker_thread());
177 }
169 LOG(LS_INFO) << "Created channel for " << content_name; 178 LOG(LS_INFO) << "Created channel for " << content_name;
170 } 179 }
171 180
172 BaseChannel::~BaseChannel() { 181 BaseChannel::~BaseChannel() {
173 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel"); 182 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel");
174 ASSERT(worker_thread_ == rtc::Thread::Current()); 183 ASSERT(worker_thread_ == rtc::Thread::Current());
175 Deinit(); 184 Deinit();
176 StopConnectionMonitor(); 185 StopConnectionMonitor();
177 FlushRtcpMessages(); // Send any outstanding RTCP packets. 186 // Send any outstanding RTCP packets.
178 worker_thread_->Clear(this); // eats any outstanding messages or packets 187 network_thread_->Invoke<void>(Bind(&BaseChannel::FlushRtcpMessages_n, this));
188 // Eats any outstanding messages or packets.
189 worker_thread_->Clear(&invoker_);
190 worker_thread_->Clear(this);
179 // We must destroy the media channel before the transport channel, otherwise 191 // We must destroy the media channel before the transport channel, otherwise
180 // the media channel may try to send on the dead transport channel. NULLing 192 // the media channel may try to send on the dead transport channel. NULLing
181 // is not an effective strategy since the sends will come on another thread. 193 // is not an effective strategy since the sends will come on another thread.
182 delete media_channel_; 194 delete media_channel_;
183 // Note that we don't just call set_transport_channel(nullptr) because that 195 // Note that we don't just call SetTransportChannel_n(nullptr) because that
184 // would call a pure virtual method which we can't do from a destructor. 196 // would call a pure virtual method which we can't do from a destructor.
197 network_thread_->Invoke<void>(Bind(&BaseChannel::DeinitNetwork_n, this));
198 LOG(LS_INFO) << "Destroyed channel";
199 }
200
201 void BaseChannel::DeinitNetwork_n() {
185 if (transport_channel_) { 202 if (transport_channel_) {
186 DisconnectFromTransportChannel(transport_channel_); 203 DisconnectFromTransportChannel(transport_channel_);
187 transport_controller_->DestroyTransportChannel_w( 204 transport_controller_->DestroyTransportChannel_w(
188 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP); 205 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP);
189 } 206 }
190 if (rtcp_transport_channel_) { 207 if (rtcp_transport_channel_) {
191 DisconnectFromTransportChannel(rtcp_transport_channel_); 208 DisconnectFromTransportChannel(rtcp_transport_channel_);
192 transport_controller_->DestroyTransportChannel_w( 209 transport_controller_->DestroyTransportChannel_w(
193 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP); 210 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
194 } 211 }
195 LOG(LS_INFO) << "Destroyed channel"; 212 network_thread_->Clear(this);
196 } 213 }
197 214
198 bool BaseChannel::Init() { 215 bool BaseChannel::Init_w() {
199 if (!SetTransport(content_name())) { 216 if (!network_thread_->Invoke<bool>(Bind(&BaseChannel::InitNetwork_n, this))) {
200 return false;
201 }
202
203 if (!SetDtlsSrtpCryptoSuites(transport_channel(), false)) {
204 return false;
205 }
206 if (rtcp_transport_enabled() &&
207 !SetDtlsSrtpCryptoSuites(rtcp_transport_channel(), true)) {
208 return false; 217 return false;
209 } 218 }
210 219
211 // Both RTP and RTCP channels are set, we can call SetInterface on 220 // Both RTP and RTCP channels are set, we can call SetInterface on
212 // media channel and it can set network options. 221 // media channel and it can set network options.
222 RTC_DCHECK(worker_thread_->IsCurrent());
213 media_channel_->SetInterface(this); 223 media_channel_->SetInterface(this);
214 return true; 224 return true;
215 } 225 }
216 226
227 bool BaseChannel::InitNetwork_n() {
228 RTC_DCHECK(network_thread_->IsCurrent());
229 if (!SetTransport_n(content_name())) {
230 return false;
231 }
232
233 if (!SetDtlsSrtpCryptoSuites_n(transport_channel_, false)) {
234 return false;
235 }
236 if (rtcp_transport_enabled() &&
237 !SetDtlsSrtpCryptoSuites_n(rtcp_transport_channel_, true)) {
238 return false;
239 }
240 return true;
241 }
242
217 void BaseChannel::Deinit() { 243 void BaseChannel::Deinit() {
244 RTC_DCHECK(worker_thread_->IsCurrent());
218 media_channel_->SetInterface(NULL); 245 media_channel_->SetInterface(NULL);
219 } 246 }
220 247
221 bool BaseChannel::SetTransport(const std::string& transport_name) { 248 bool BaseChannel::SetTransport(const std::string& transport_name) {
222 return worker_thread_->Invoke<bool>( 249 return network_thread_->Invoke<bool>(
223 Bind(&BaseChannel::SetTransport_w, this, transport_name)); 250 Bind(&BaseChannel::SetTransport_n, this, transport_name));
224 } 251 }
225 252
226 bool BaseChannel::SetTransport_w(const std::string& transport_name) { 253 bool BaseChannel::SetTransport_n(const std::string& transport_name) {
227 ASSERT(worker_thread_ == rtc::Thread::Current()); 254 RTC_DCHECK(network_thread_->IsCurrent());
228 255
229 if (transport_name == transport_name_) { 256 if (transport_name == transport_name_) {
230 // Nothing to do if transport name isn't changing 257 // Nothing to do if transport name isn't changing
231 return true; 258 return true;
232 } 259 }
233 260
234 // When using DTLS-SRTP, we must reset the SrtpFilter every time the transport 261 // When using DTLS-SRTP, we must reset the SrtpFilter every time the transport
235 // changes and wait until the DTLS handshake is complete to set the newly 262 // changes and wait until the DTLS handshake is complete to set the newly
236 // negotiated parameters. 263 // negotiated parameters.
237 if (ShouldSetupDtlsSrtp()) { 264 if (ShouldSetupDtlsSrtp_n()) {
238 // Set |writable_| to false such that UpdateWritableState_w can set up 265 // Set |writable_| to false such that UpdateWritableState_w can set up
239 // DTLS-SRTP when the writable_ becomes true again. 266 // DTLS-SRTP when the writable_ becomes true again.
240 writable_ = false; 267 writable_ = false;
241 srtp_filter_.ResetParams(); 268 srtp_filter_.ResetParams();
242 } 269 }
243 270
244 // TODO(guoweis): Remove this grossness when we remove non-muxed RTCP. 271 // TODO(guoweis): Remove this grossness when we remove non-muxed RTCP.
245 if (rtcp_transport_enabled()) { 272 if (rtcp_transport_enabled()) {
246 LOG(LS_INFO) << "Create RTCP TransportChannel for " << content_name() 273 LOG(LS_INFO) << "Create RTCP TransportChannel for " << content_name()
247 << " on " << transport_name << " transport "; 274 << " on " << transport_name << " transport ";
248 set_rtcp_transport_channel( 275 SetRtcpTransportChannel_n(
249 transport_controller_->CreateTransportChannel_w( 276 transport_controller_->CreateTransportChannel_w(
250 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP), 277 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP),
251 false /* update_writablity */); 278 false /* update_writablity */);
252 if (!rtcp_transport_channel()) { 279 if (!rtcp_transport_channel_) {
253 return false; 280 return false;
254 } 281 }
255 } 282 }
256 283
257 // We're not updating the writablity during the transition state. 284 // We're not updating the writablity during the transition state.
258 set_transport_channel(transport_controller_->CreateTransportChannel_w( 285 SetTransportChannel_n(transport_controller_->CreateTransportChannel_w(
259 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP)); 286 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP));
260 if (!transport_channel()) { 287 if (!transport_channel_) {
261 return false; 288 return false;
262 } 289 }
263 290
264 // TODO(guoweis): Remove this grossness when we remove non-muxed RTCP. 291 // TODO(guoweis): Remove this grossness when we remove non-muxed RTCP.
265 if (rtcp_transport_enabled()) { 292 if (rtcp_transport_enabled()) {
266 // We can only update the RTCP ready to send after set_transport_channel has 293 // We can only update the RTCP ready to send after set_transport_channel has
267 // handled channel writability. 294 // handled channel writability.
268 SetReadyToSend( 295 SetReadyToSend(
269 true, rtcp_transport_channel() && rtcp_transport_channel()->writable()); 296 true, rtcp_transport_channel_ && rtcp_transport_channel_->writable());
270 } 297 }
271 transport_name_ = transport_name; 298 transport_name_ = transport_name;
272 return true; 299 return true;
273 } 300 }
274 301
275 void BaseChannel::set_transport_channel(TransportChannel* new_tc) { 302 void BaseChannel::SetTransportChannel_n(TransportChannel* new_tc) {
276 ASSERT(worker_thread_ == rtc::Thread::Current()); 303 RTC_DCHECK(network_thread_->IsCurrent());
277 304
278 TransportChannel* old_tc = transport_channel_; 305 TransportChannel* old_tc = transport_channel_;
279 if (!old_tc && !new_tc) { 306 if (!old_tc && !new_tc) {
280 // Nothing to do 307 // Nothing to do
281 return; 308 return;
282 } 309 }
283 ASSERT(old_tc != new_tc); 310 ASSERT(old_tc != new_tc);
284 311
285 if (old_tc) { 312 if (old_tc) {
286 DisconnectFromTransportChannel(old_tc); 313 DisconnectFromTransportChannel(old_tc);
287 transport_controller_->DestroyTransportChannel_w( 314 transport_controller_->DestroyTransportChannel_w(
288 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP); 315 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP);
289 } 316 }
290 317
291 transport_channel_ = new_tc; 318 transport_channel_ = new_tc;
292 319
293 if (new_tc) { 320 if (new_tc) {
294 ConnectToTransportChannel(new_tc); 321 ConnectToTransportChannel(new_tc);
295 for (const auto& pair : socket_options_) { 322 for (const auto& pair : socket_options_) {
296 new_tc->SetOption(pair.first, pair.second); 323 new_tc->SetOption(pair.first, pair.second);
297 } 324 }
298 } 325 }
299 326
300 // Update aggregate writable/ready-to-send state between RTP and RTCP upon 327 // Update aggregate writable/ready-to-send state between RTP and RTCP upon
301 // setting new channel 328 // setting new channel
302 UpdateWritableState_w(); 329 UpdateWritableState_n();
303 SetReadyToSend(false, new_tc && new_tc->writable()); 330 SetReadyToSend(false, new_tc && new_tc->writable());
304 } 331 }
305 332
306 void BaseChannel::set_rtcp_transport_channel(TransportChannel* new_tc, 333 void BaseChannel::SetRtcpTransportChannel_n(TransportChannel* new_tc,
307 bool update_writablity) { 334 bool update_writablity) {
308 ASSERT(worker_thread_ == rtc::Thread::Current()); 335 RTC_DCHECK(network_thread_->IsCurrent());
309 336
310 TransportChannel* old_tc = rtcp_transport_channel_; 337 TransportChannel* old_tc = rtcp_transport_channel_;
311 if (!old_tc && !new_tc) { 338 if (!old_tc && !new_tc) {
312 // Nothing to do 339 // Nothing to do
313 return; 340 return;
314 } 341 }
315 ASSERT(old_tc != new_tc); 342 ASSERT(old_tc != new_tc);
316 343
317 if (old_tc) { 344 if (old_tc) {
318 DisconnectFromTransportChannel(old_tc); 345 DisconnectFromTransportChannel(old_tc);
319 transport_controller_->DestroyTransportChannel_w( 346 transport_controller_->DestroyTransportChannel_w(
320 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP); 347 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
321 } 348 }
322 349
323 rtcp_transport_channel_ = new_tc; 350 rtcp_transport_channel_ = new_tc;
324 351
325 if (new_tc) { 352 if (new_tc) {
326 RTC_CHECK(!(ShouldSetupDtlsSrtp() && srtp_filter_.IsActive())) 353 RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_filter_.IsActive()))
327 << "Setting RTCP for DTLS/SRTP after SrtpFilter is active " 354 << "Setting RTCP for DTLS/SRTP after SrtpFilter is active "
328 << "should never happen."; 355 << "should never happen.";
329 ConnectToTransportChannel(new_tc); 356 ConnectToTransportChannel(new_tc);
330 for (const auto& pair : rtcp_socket_options_) { 357 for (const auto& pair : rtcp_socket_options_) {
331 new_tc->SetOption(pair.first, pair.second); 358 new_tc->SetOption(pair.first, pair.second);
332 } 359 }
333 } 360 }
334 361
335 if (update_writablity) { 362 if (update_writablity) {
336 // Update aggregate writable/ready-to-send state between RTP and RTCP upon 363 // Update aggregate writable/ready-to-send state between RTP and RTCP upon
337 // setting new channel 364 // setting new channel
338 UpdateWritableState_w(); 365 UpdateWritableState_n();
339 SetReadyToSend(true, new_tc && new_tc->writable()); 366 SetReadyToSend(true, new_tc && new_tc->writable());
340 } 367 }
341 } 368 }
342 369
343 void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) { 370 void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) {
344 ASSERT(worker_thread_ == rtc::Thread::Current()); 371 RTC_DCHECK(network_thread_->IsCurrent());
345 372
346 tc->SignalWritableState.connect(this, &BaseChannel::OnWritableState); 373 tc->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
347 tc->SignalReadPacket.connect(this, &BaseChannel::OnChannelRead); 374 tc->SignalReadPacket.connect(this, &BaseChannel::OnChannelRead);
348 tc->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend); 375 tc->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend);
349 tc->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState); 376 tc->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState);
350 tc->SignalSelectedCandidatePairChanged.connect( 377 tc->SignalSelectedCandidatePairChanged.connect(
351 this, &BaseChannel::OnSelectedCandidatePairChanged); 378 this, &BaseChannel::OnSelectedCandidatePairChanged);
379 tc->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n);
352 } 380 }
353 381
354 void BaseChannel::DisconnectFromTransportChannel(TransportChannel* tc) { 382 void BaseChannel::DisconnectFromTransportChannel(TransportChannel* tc) {
355 ASSERT(worker_thread_ == rtc::Thread::Current()); 383 RTC_DCHECK(network_thread_->IsCurrent());
356 384
357 tc->SignalWritableState.disconnect(this); 385 tc->SignalWritableState.disconnect(this);
358 tc->SignalReadPacket.disconnect(this); 386 tc->SignalReadPacket.disconnect(this);
359 tc->SignalReadyToSend.disconnect(this); 387 tc->SignalReadyToSend.disconnect(this);
360 tc->SignalDtlsState.disconnect(this); 388 tc->SignalDtlsState.disconnect(this);
389 tc->SignalSelectedCandidatePairChanged.disconnect(this);
390 tc->SignalSentPacket.disconnect(this);
361 } 391 }
362 392
363 bool BaseChannel::Enable(bool enable) { 393 bool BaseChannel::Enable(bool enable) {
364 worker_thread_->Invoke<void>(Bind( 394 worker_thread_->Invoke<void>(Bind(
365 enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w, 395 enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w,
366 this)); 396 this));
367 return true; 397 return true;
368 } 398 }
369 399
370 bool BaseChannel::AddRecvStream(const StreamParams& sp) { 400 bool BaseChannel::AddRecvStream(const StreamParams& sp) {
(...skipping 27 matching lines...) Expand all
398 std::string* error_desc) { 428 std::string* error_desc) {
399 TRACE_EVENT0("webrtc", "BaseChannel::SetRemoteContent"); 429 TRACE_EVENT0("webrtc", "BaseChannel::SetRemoteContent");
400 return InvokeOnWorker(Bind(&BaseChannel::SetRemoteContent_w, 430 return InvokeOnWorker(Bind(&BaseChannel::SetRemoteContent_w,
401 this, content, action, error_desc)); 431 this, content, action, error_desc));
402 } 432 }
403 433
404 void BaseChannel::StartConnectionMonitor(int cms) { 434 void BaseChannel::StartConnectionMonitor(int cms) {
405 // We pass in the BaseChannel instead of the transport_channel_ 435 // We pass in the BaseChannel instead of the transport_channel_
406 // because if the transport_channel_ changes, the ConnectionMonitor 436 // because if the transport_channel_ changes, the ConnectionMonitor
407 // would be pointing to the wrong TransportChannel. 437 // would be pointing to the wrong TransportChannel.
408 connection_monitor_.reset(new ConnectionMonitor( 438 // We pass in the network thread because on that thread connection monitor
409 this, worker_thread(), rtc::Thread::Current())); 439 // will call BaseChannel::GetConnectionStats which must be called on the
440 // network thread.
441 connection_monitor_.reset(
442 new ConnectionMonitor(this, network_thread(), rtc::Thread::Current()));
410 connection_monitor_->SignalUpdate.connect( 443 connection_monitor_->SignalUpdate.connect(
411 this, &BaseChannel::OnConnectionMonitorUpdate); 444 this, &BaseChannel::OnConnectionMonitorUpdate);
412 connection_monitor_->Start(cms); 445 connection_monitor_->Start(cms);
413 } 446 }
414 447
415 void BaseChannel::StopConnectionMonitor() { 448 void BaseChannel::StopConnectionMonitor() {
416 if (connection_monitor_) { 449 if (connection_monitor_) {
417 connection_monitor_->Stop(); 450 connection_monitor_->Stop();
418 connection_monitor_.reset(); 451 connection_monitor_.reset();
419 } 452 }
420 } 453 }
421 454
422 bool BaseChannel::GetConnectionStats(ConnectionInfos* infos) { 455 bool BaseChannel::GetConnectionStats(ConnectionInfos* infos) {
423 ASSERT(worker_thread_ == rtc::Thread::Current()); 456 RTC_DCHECK(network_thread_->IsCurrent());
424 return transport_channel_->GetStats(infos); 457 return transport_channel_->GetStats(infos);
425 } 458 }
426 459
427 bool BaseChannel::IsReadyToReceive() const { 460 bool BaseChannel::IsReadyToReceive_w() const {
428 // Receive data if we are enabled and have local content, 461 // Receive data if we are enabled and have local content,
429 return enabled() && IsReceiveContentDirection(local_content_direction_); 462 return enabled() && IsReceiveContentDirection(local_content_direction_);
430 } 463 }
431 464
432 bool BaseChannel::IsReadyToSend() const { 465 bool BaseChannel::IsReadyToSend_w() const {
433 // Send outgoing data if we are enabled, have local and remote content, 466 // Send outgoing data if we are enabled, have local and remote content,
434 // and we have had some form of connectivity. 467 // and we have had some form of connectivity.
435 return enabled() && IsReceiveContentDirection(remote_content_direction_) && 468 return enabled() && IsReceiveContentDirection(remote_content_direction_) &&
436 IsSendContentDirection(local_content_direction_) && 469 IsSendContentDirection(local_content_direction_) &&
437 was_ever_writable() && 470 network_thread_->Invoke<bool>(
438 (srtp_filter_.IsActive() || !ShouldSetupDtlsSrtp()); 471 Bind(&BaseChannel::IsTransportReadyToSend_n, this));
472 }
473
474 bool BaseChannel::IsTransportReadyToSend_n() const {
475 return was_ever_writable() &&
476 (srtp_filter_.IsActive() || !ShouldSetupDtlsSrtp_n());
439 } 477 }
440 478
441 bool BaseChannel::SendPacket(rtc::CopyOnWriteBuffer* packet, 479 bool BaseChannel::SendPacket(rtc::CopyOnWriteBuffer* packet,
442 const rtc::PacketOptions& options) { 480 const rtc::PacketOptions& options) {
443 return SendPacket(false, packet, options); 481 return SendPacket(false, packet, options);
444 } 482 }
445 483
446 bool BaseChannel::SendRtcp(rtc::CopyOnWriteBuffer* packet, 484 bool BaseChannel::SendRtcp(rtc::CopyOnWriteBuffer* packet,
447 const rtc::PacketOptions& options) { 485 const rtc::PacketOptions& options) {
448 return SendPacket(true, packet, options); 486 return SendPacket(true, packet, options);
449 } 487 }
450 488
451 int BaseChannel::SetOption(SocketType type, rtc::Socket::Option opt, 489 int BaseChannel::SetOption(SocketType type, rtc::Socket::Option opt,
452 int value) { 490 int value) {
453 TransportChannel* channel = NULL; 491 return network_thread_->Invoke<int>(
492 Bind(&BaseChannel::SetOption_n, this, type, opt, value));
493 }
494
495 int BaseChannel::SetOption_n(SocketType type,
496 rtc::Socket::Option opt,
497 int value) {
498 RTC_DCHECK(network_thread_->IsCurrent());
499 TransportChannel* channel = nullptr;
454 switch (type) { 500 switch (type) {
455 case ST_RTP: 501 case ST_RTP:
456 channel = transport_channel_; 502 channel = transport_channel_;
457 socket_options_.push_back( 503 socket_options_.push_back(
458 std::pair<rtc::Socket::Option, int>(opt, value)); 504 std::pair<rtc::Socket::Option, int>(opt, value));
459 break; 505 break;
460 case ST_RTCP: 506 case ST_RTCP:
461 channel = rtcp_transport_channel_; 507 channel = rtcp_transport_channel_;
462 rtcp_socket_options_.push_back( 508 rtcp_socket_options_.push_back(
463 std::pair<rtc::Socket::Option, int>(opt, value)); 509 std::pair<rtc::Socket::Option, int>(opt, value));
464 break; 510 break;
465 } 511 }
466 return channel ? channel->SetOption(opt, value) : -1; 512 return channel ? channel->SetOption(opt, value) : -1;
467 } 513 }
468 514
469 void BaseChannel::OnWritableState(TransportChannel* channel) { 515 void BaseChannel::OnWritableState(TransportChannel* channel) {
470 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); 516 RTC_DCHECK(channel == transport_channel_ ||
471 UpdateWritableState_w(); 517 channel == rtcp_transport_channel_);
518 RTC_DCHECK(network_thread_->IsCurrent());
519 UpdateWritableState_n();
472 } 520 }
473 521
474 void BaseChannel::OnChannelRead(TransportChannel* channel, 522 void BaseChannel::OnChannelRead(TransportChannel* channel,
475 const char* data, size_t len, 523 const char* data, size_t len,
476 const rtc::PacketTime& packet_time, 524 const rtc::PacketTime& packet_time,
477 int flags) { 525 int flags) {
478 TRACE_EVENT0("webrtc", "BaseChannel::OnChannelRead"); 526 TRACE_EVENT0("webrtc", "BaseChannel::OnChannelRead");
479 // OnChannelRead gets called from P2PSocket; now pass data to MediaEngine 527 // OnChannelRead gets called from P2PSocket; now pass data to MediaEngine
480 ASSERT(worker_thread_ == rtc::Thread::Current()); 528 RTC_DCHECK(network_thread_->IsCurrent());
481 529
482 // When using RTCP multiplexing we might get RTCP packets on the RTP 530 // When using RTCP multiplexing we might get RTCP packets on the RTP
483 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. 531 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP.
484 bool rtcp = PacketIsRtcp(channel, data, len); 532 bool rtcp = PacketIsRtcp(channel, data, len);
485 rtc::CopyOnWriteBuffer packet(data, len); 533 rtc::CopyOnWriteBuffer packet(data, len);
486 HandlePacket(rtcp, &packet, packet_time); 534 HandlePacket(rtcp, &packet, packet_time);
487 } 535 }
488 536
489 void BaseChannel::OnReadyToSend(TransportChannel* channel) { 537 void BaseChannel::OnReadyToSend(TransportChannel* channel) {
490 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); 538 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_);
491 SetReadyToSend(channel == rtcp_transport_channel_, true); 539 SetReadyToSend(channel == rtcp_transport_channel_, true);
492 } 540 }
493 541
494 void BaseChannel::OnDtlsState(TransportChannel* channel, 542 void BaseChannel::OnDtlsState(TransportChannel* channel,
495 DtlsTransportState state) { 543 DtlsTransportState state) {
496 if (!ShouldSetupDtlsSrtp()) { 544 if (!ShouldSetupDtlsSrtp_n()) {
497 return; 545 return;
498 } 546 }
499 547
500 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED 548 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED
501 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to 549 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to
502 // cover other scenarios like the whole channel is writable (not just this 550 // cover other scenarios like the whole channel is writable (not just this
503 // TransportChannel) or when TransportChannel is attached after DTLS is 551 // TransportChannel) or when TransportChannel is attached after DTLS is
504 // negotiated. 552 // negotiated.
505 if (state != DTLS_TRANSPORT_CONNECTED) { 553 if (state != DTLS_TRANSPORT_CONNECTED) {
506 srtp_filter_.ResetParams(); 554 srtp_filter_.ResetParams();
507 } 555 }
508 } 556 }
509 557
510 void BaseChannel::OnSelectedCandidatePairChanged( 558 void BaseChannel::OnSelectedCandidatePairChanged(
511 TransportChannel* channel, 559 TransportChannel* channel,
512 CandidatePairInterface* selected_candidate_pair, 560 CandidatePairInterface* selected_candidate_pair,
513 int last_sent_packet_id) { 561 int last_sent_packet_id) {
514 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); 562 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_);
563 RTC_DCHECK(network_thread_->IsCurrent());
564 std::string transport_name = channel->transport_name();
515 rtc::NetworkRoute network_route; 565 rtc::NetworkRoute network_route;
516 if (selected_candidate_pair) { 566 if (selected_candidate_pair) {
517 network_route = rtc::NetworkRoute( 567 network_route = rtc::NetworkRoute(
518 selected_candidate_pair->local_candidate().network_id(), 568 selected_candidate_pair->local_candidate().network_id(),
519 selected_candidate_pair->remote_candidate().network_id(), 569 selected_candidate_pair->remote_candidate().network_id(),
520 last_sent_packet_id); 570 last_sent_packet_id);
521 } 571 }
522 media_channel()->OnNetworkRouteChanged(channel->transport_name(), 572 invoker_.AsyncInvoke<void>(
523 network_route); 573 worker_thread_, Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_,
574 transport_name, network_route));
524 } 575 }
525 576
526 void BaseChannel::SetReadyToSend(bool rtcp, bool ready) { 577 void BaseChannel::SetReadyToSend(bool rtcp, bool ready) {
578 RTC_DCHECK(network_thread_->IsCurrent());
527 if (rtcp) { 579 if (rtcp) {
528 rtcp_ready_to_send_ = ready; 580 rtcp_ready_to_send_ = ready;
529 } else { 581 } else {
530 rtp_ready_to_send_ = ready; 582 rtp_ready_to_send_ = ready;
531 } 583 }
532 584
533 if (rtp_ready_to_send_ && 585 bool ready_to_send =
534 // In the case of rtcp mux |rtcp_transport_channel_| will be null. 586 (rtp_ready_to_send_ &&
535 (rtcp_ready_to_send_ || !rtcp_transport_channel_)) { 587 // In the case of rtcp mux |rtcp_transport_channel_| will be null.
536 // Notify the MediaChannel when both rtp and rtcp channel can send. 588 (rtcp_ready_to_send_ || !rtcp_transport_channel_));
537 media_channel_->OnReadyToSend(true); 589
538 } else { 590 invoker_.AsyncInvoke<void>(
539 // Notify the MediaChannel when either rtp or rtcp channel can't send. 591 worker_thread_,
540 media_channel_->OnReadyToSend(false); 592 Bind(&MediaChannel::OnReadyToSend, media_channel_, ready_to_send));
541 }
542 } 593 }
543 594
544 bool BaseChannel::PacketIsRtcp(const TransportChannel* channel, 595 bool BaseChannel::PacketIsRtcp(const TransportChannel* channel,
545 const char* data, size_t len) { 596 const char* data, size_t len) {
546 return (channel == rtcp_transport_channel_ || 597 return (channel == rtcp_transport_channel_ ||
547 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); 598 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len)));
548 } 599 }
549 600
550 bool BaseChannel::SendPacket(bool rtcp, 601 bool BaseChannel::SendPacket(bool rtcp,
551 rtc::CopyOnWriteBuffer* packet, 602 rtc::CopyOnWriteBuffer* packet,
552 const rtc::PacketOptions& options) { 603 const rtc::PacketOptions& options) {
553 // SendPacket gets called from MediaEngine, typically on an encoder thread. 604 // SendPacket gets called from MediaEngine, on a pacer or an encoder thread.
554 // If the thread is not our worker thread, we will post to our worker 605 // If the thread is not our network thread, we will post to our network
555 // so that the real work happens on our worker. This avoids us having to 606 // so that the real work happens on our network. This avoids us having to
556 // synchronize access to all the pieces of the send path, including 607 // synchronize access to all the pieces of the send path, including
557 // SRTP and the inner workings of the transport channels. 608 // SRTP and the inner workings of the transport channels.
558 // The only downside is that we can't return a proper failure code if 609 // The only downside is that we can't return a proper failure code if
559 // needed. Since UDP is unreliable anyway, this should be a non-issue. 610 // needed. Since UDP is unreliable anyway, this should be a non-issue.
560 if (rtc::Thread::Current() != worker_thread_) { 611 if (!network_thread_->IsCurrent()) {
561 // Avoid a copy by transferring the ownership of the packet data. 612 // Avoid a copy by transferring the ownership of the packet data.
562 int message_id = (!rtcp) ? MSG_RTPPACKET : MSG_RTCPPACKET; 613 int message_id = rtcp ? MSG_SEND_RTCP_PACKET : MSG_SEND_RTP_PACKET;
563 PacketMessageData* data = new PacketMessageData; 614 SendPacketMessageData* data = new SendPacketMessageData;
564 data->packet = std::move(*packet); 615 data->packet = std::move(*packet);
565 data->options = options; 616 data->options = options;
566 worker_thread_->Post(this, message_id, data); 617 network_thread_->Post(this, message_id, data);
567 return true; 618 return true;
568 } 619 }
620 TRACE_EVENT0("webrtc", "BaseChannel::SendPacket");
569 621
570 // Now that we are on the correct thread, ensure we have a place to send this 622 // Now that we are on the correct thread, ensure we have a place to send this
571 // packet before doing anything. (We might get RTCP packets that we don't 623 // packet before doing anything. (We might get RTCP packets that we don't
572 // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP 624 // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP
573 // transport. 625 // transport.
574 TransportChannel* channel = (!rtcp || rtcp_mux_filter_.IsActive()) ? 626 TransportChannel* channel = (!rtcp || rtcp_mux_filter_.IsActive()) ?
575 transport_channel_ : rtcp_transport_channel_; 627 transport_channel_ : rtcp_transport_channel_;
576 if (!channel || !channel->writable()) { 628 if (!channel || !channel->writable()) {
577 return false; 629 return false;
578 } 630 }
579 631
580 // Protect ourselves against crazy data. 632 // Protect ourselves against crazy data.
581 if (!ValidPacket(rtcp, packet)) { 633 if (!ValidPacket(rtcp, packet)) {
582 LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " " 634 LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " "
583 << PacketType(rtcp) 635 << PacketType(rtcp)
584 << " packet: wrong size=" << packet->size(); 636 << " packet: wrong size=" << packet->size();
585 return false; 637 return false;
586 } 638 }
587 639
588 rtc::PacketOptions updated_options; 640 rtc::PacketOptions updated_options;
589 updated_options = options; 641 updated_options = options;
590 // Protect if needed. 642 // Protect if needed.
591 if (srtp_filter_.IsActive()) { 643 if (srtp_filter_.IsActive()) {
644 TRACE_EVENT0("webrtc", "SRTP Encode");
592 bool res; 645 bool res;
593 uint8_t* data = packet->data(); 646 uint8_t* data = packet->data();
594 int len = static_cast<int>(packet->size()); 647 int len = static_cast<int>(packet->size());
595 if (!rtcp) { 648 if (!rtcp) {
596 // If ENABLE_EXTERNAL_AUTH flag is on then packet authentication is not done 649 // If ENABLE_EXTERNAL_AUTH flag is on then packet authentication is not done
597 // inside libsrtp for a RTP packet. A external HMAC module will be writing 650 // inside libsrtp for a RTP packet. A external HMAC module will be writing
598 // a fake HMAC value. This is ONLY done for a RTP packet. 651 // a fake HMAC value. This is ONLY done for a RTP packet.
599 // Socket layer will update rtp sendtime extension header if present in 652 // Socket layer will update rtp sendtime extension header if present in
600 // packet with current time before updating the HMAC. 653 // packet with current time before updating the HMAC.
601 #if !defined(ENABLE_EXTERNAL_AUTH) 654 #if !defined(ENABLE_EXTERNAL_AUTH)
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 } else if (secure_required_) { 702 } else if (secure_required_) {
650 // This is a double check for something that supposedly can't happen. 703 // This is a double check for something that supposedly can't happen.
651 LOG(LS_ERROR) << "Can't send outgoing " << PacketType(rtcp) 704 LOG(LS_ERROR) << "Can't send outgoing " << PacketType(rtcp)
652 << " packet when SRTP is inactive and crypto is required"; 705 << " packet when SRTP is inactive and crypto is required";
653 706
654 ASSERT(false); 707 ASSERT(false);
655 return false; 708 return false;
656 } 709 }
657 710
658 // Bon voyage. 711 // Bon voyage.
659 int ret = 712 int flags = (secure() && secure_dtls()) ? PF_SRTP_BYPASS : PF_NORMAL;
660 channel->SendPacket(packet->data<char>(), packet->size(), updated_options, 713 int ret = channel->SendPacket(packet->data<char>(), packet->size(),
661 (secure() && secure_dtls()) ? PF_SRTP_BYPASS : 0); 714 updated_options, flags);
662 if (ret != static_cast<int>(packet->size())) { 715 if (ret != static_cast<int>(packet->size())) {
663 if (channel->GetError() == EWOULDBLOCK) { 716 if (channel->GetError() == EWOULDBLOCK) {
664 LOG(LS_WARNING) << "Got EWOULDBLOCK from socket."; 717 LOG(LS_WARNING) << "Got EWOULDBLOCK from socket.";
665 SetReadyToSend(rtcp, false); 718 SetReadyToSend(rtcp, false);
666 } 719 }
667 return false; 720 return false;
668 } 721 }
669 return true; 722 return true;
670 } 723 }
671 724
672 bool BaseChannel::WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) { 725 bool BaseChannel::WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) {
673 // Protect ourselves against crazy data. 726 // Protect ourselves against crazy data.
674 if (!ValidPacket(rtcp, packet)) { 727 if (!ValidPacket(rtcp, packet)) {
675 LOG(LS_ERROR) << "Dropping incoming " << content_name_ << " " 728 LOG(LS_ERROR) << "Dropping incoming " << content_name_ << " "
676 << PacketType(rtcp) 729 << PacketType(rtcp)
677 << " packet: wrong size=" << packet->size(); 730 << " packet: wrong size=" << packet->size();
678 return false; 731 return false;
679 } 732 }
680 if (rtcp) { 733 if (rtcp) {
681 // Permit all (seemingly valid) RTCP packets. 734 // Permit all (seemingly valid) RTCP packets.
682 return true; 735 return true;
683 } 736 }
684 // Check whether we handle this payload. 737 // Check whether we handle this payload.
685 return bundle_filter_.DemuxPacket(packet->data(), packet->size()); 738 return bundle_filter_.DemuxPacket(packet->data(), packet->size());
686 } 739 }
687 740
688 void BaseChannel::HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet, 741 void BaseChannel::HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet,
689 const rtc::PacketTime& packet_time) { 742 const rtc::PacketTime& packet_time) {
743 RTC_DCHECK(network_thread_->IsCurrent());
690 if (!WantsPacket(rtcp, packet)) { 744 if (!WantsPacket(rtcp, packet)) {
691 return; 745 return;
692 } 746 }
693 747
694 // We are only interested in the first rtp packet because that 748 // We are only interested in the first rtp packet because that
695 // indicates the media has started flowing. 749 // indicates the media has started flowing.
696 if (!has_received_packet_ && !rtcp) { 750 if (!has_received_packet_ && !rtcp) {
697 has_received_packet_ = true; 751 has_received_packet_ = true;
698 signaling_thread()->Post(this, MSG_FIRSTPACKETRECEIVED); 752 signaling_thread()->Post(this, MSG_FIRSTPACKETRECEIVED);
699 } 753 }
700 754
701 // Unprotect the packet, if needed. 755 // Unprotect the packet, if needed.
702 if (srtp_filter_.IsActive()) { 756 if (srtp_filter_.IsActive()) {
757 TRACE_EVENT0("webrtc", "SRTP Decode");
703 char* data = packet->data<char>(); 758 char* data = packet->data<char>();
704 int len = static_cast<int>(packet->size()); 759 int len = static_cast<int>(packet->size());
705 bool res; 760 bool res;
706 if (!rtcp) { 761 if (!rtcp) {
707 res = srtp_filter_.UnprotectRtp(data, len, &len); 762 res = srtp_filter_.UnprotectRtp(data, len, &len);
708 if (!res) { 763 if (!res) {
709 int seq_num = -1; 764 int seq_num = -1;
710 uint32_t ssrc = 0; 765 uint32_t ssrc = 0;
711 GetRtpSeqNum(data, len, &seq_num); 766 GetRtpSeqNum(data, len, &seq_num);
712 GetRtpSsrc(data, len, &ssrc); 767 GetRtpSsrc(data, len, &ssrc);
(...skipping 23 matching lines...) Expand all
736 // channels, so we haven't yet extracted keys, even if DTLS did complete 791 // channels, so we haven't yet extracted keys, even if DTLS did complete
737 // on the channel that the packets are being sent on. It's really good 792 // on the channel that the packets are being sent on. It's really good
738 // practice to wait for both RTP and RTCP to be good to go before sending 793 // practice to wait for both RTP and RTCP to be good to go before sending
739 // media, to prevent weird failure modes, so it's fine for us to just eat 794 // media, to prevent weird failure modes, so it's fine for us to just eat
740 // packets here. This is all sidestepped if RTCP mux is used anyway. 795 // packets here. This is all sidestepped if RTCP mux is used anyway.
741 LOG(LS_WARNING) << "Can't process incoming " << PacketType(rtcp) 796 LOG(LS_WARNING) << "Can't process incoming " << PacketType(rtcp)
742 << " packet when SRTP is inactive and crypto is required"; 797 << " packet when SRTP is inactive and crypto is required";
743 return; 798 return;
744 } 799 }
745 800
746 // Push it down to the media channel. 801 invoker_.AsyncInvoke<void>(
747 if (!rtcp) { 802 worker_thread_,
748 media_channel_->OnPacketReceived(packet, packet_time); 803 Bind(&BaseChannel::OnPacketReceived, this, rtcp, *packet, packet_time));
804 }
805
806 void BaseChannel::OnPacketReceived(bool rtcp,
807 const rtc::CopyOnWriteBuffer& packet,
808 const rtc::PacketTime& packet_time) {
809 RTC_DCHECK(worker_thread_->IsCurrent());
810 // Need to copy variable because OnRtcpReceived/OnPacketReceived
811 // requires non-const pointer to buffer. This doesn't memcpy the actual data.
812 rtc::CopyOnWriteBuffer data(packet);
813 if (rtcp) {
814 media_channel_->OnRtcpReceived(&data, packet_time);
749 } else { 815 } else {
750 media_channel_->OnRtcpReceived(packet, packet_time); 816 media_channel_->OnPacketReceived(&data, packet_time);
751 } 817 }
752 } 818 }
753 819
754 bool BaseChannel::PushdownLocalDescription( 820 bool BaseChannel::PushdownLocalDescription(
755 const SessionDescription* local_desc, ContentAction action, 821 const SessionDescription* local_desc, ContentAction action,
756 std::string* error_desc) { 822 std::string* error_desc) {
757 const ContentInfo* content_info = GetFirstContent(local_desc); 823 const ContentInfo* content_info = GetFirstContent(local_desc);
758 const MediaContentDescription* content_desc = 824 const MediaContentDescription* content_desc =
759 GetContentDescription(content_info); 825 GetContentDescription(content_info);
760 if (content_desc && content_info && !content_info->rejected && 826 if (content_desc && content_info && !content_info->rejected &&
(...skipping 18 matching lines...) Expand all
779 return true; 845 return true;
780 } 846 }
781 847
782 void BaseChannel::EnableMedia_w() { 848 void BaseChannel::EnableMedia_w() {
783 ASSERT(worker_thread_ == rtc::Thread::Current()); 849 ASSERT(worker_thread_ == rtc::Thread::Current());
784 if (enabled_) 850 if (enabled_)
785 return; 851 return;
786 852
787 LOG(LS_INFO) << "Channel enabled"; 853 LOG(LS_INFO) << "Channel enabled";
788 enabled_ = true; 854 enabled_ = true;
789 ChangeState(); 855 ChangeState_w();
790 } 856 }
791 857
792 void BaseChannel::DisableMedia_w() { 858 void BaseChannel::DisableMedia_w() {
793 ASSERT(worker_thread_ == rtc::Thread::Current()); 859 ASSERT(worker_thread_ == rtc::Thread::Current());
794 if (!enabled_) 860 if (!enabled_)
795 return; 861 return;
796 862
797 LOG(LS_INFO) << "Channel disabled"; 863 LOG(LS_INFO) << "Channel disabled";
798 enabled_ = false; 864 enabled_ = false;
799 ChangeState(); 865 ChangeState_w();
800 } 866 }
801 867
802 void BaseChannel::UpdateWritableState_w() { 868 void BaseChannel::UpdateWritableState_n() {
803 if (transport_channel_ && transport_channel_->writable() && 869 if (transport_channel_ && transport_channel_->writable() &&
804 (!rtcp_transport_channel_ || rtcp_transport_channel_->writable())) { 870 (!rtcp_transport_channel_ || rtcp_transport_channel_->writable())) {
805 ChannelWritable_w(); 871 ChannelWritable_n();
806 } else { 872 } else {
807 ChannelNotWritable_w(); 873 ChannelNotWritable_n();
808 } 874 }
809 } 875 }
810 876
811 void BaseChannel::ChannelWritable_w() { 877 void BaseChannel::ChannelWritable_n() {
812 ASSERT(worker_thread_ == rtc::Thread::Current()); 878 RTC_DCHECK(network_thread_->IsCurrent());
813 if (writable_) { 879 if (writable_) {
814 return; 880 return;
815 } 881 }
816 882
817 LOG(LS_INFO) << "Channel writable (" << content_name_ << ")" 883 LOG(LS_INFO) << "Channel writable (" << content_name_ << ")"
818 << (was_ever_writable_ ? "" : " for the first time"); 884 << (was_ever_writable_ ? "" : " for the first time");
819 885
820 std::vector<ConnectionInfo> infos; 886 std::vector<ConnectionInfo> infos;
821 transport_channel_->GetStats(&infos); 887 transport_channel_->GetStats(&infos);
822 for (std::vector<ConnectionInfo>::const_iterator it = infos.begin(); 888 for (std::vector<ConnectionInfo>::const_iterator it = infos.begin();
823 it != infos.end(); ++it) { 889 it != infos.end(); ++it) {
824 if (it->best_connection) { 890 if (it->best_connection) {
825 LOG(LS_INFO) << "Using " << it->local_candidate.ToSensitiveString() 891 LOG(LS_INFO) << "Using " << it->local_candidate.ToSensitiveString()
826 << "->" << it->remote_candidate.ToSensitiveString(); 892 << "->" << it->remote_candidate.ToSensitiveString();
827 break; 893 break;
828 } 894 }
829 } 895 }
830 896
831 was_ever_writable_ = true; 897 was_ever_writable_ = true;
832 MaybeSetupDtlsSrtp_w(); 898 MaybeSetupDtlsSrtp_n();
833 writable_ = true; 899 writable_ = true;
834 ChangeState(); 900 ChangeState();
835 } 901 }
836 902
837 void BaseChannel::SignalDtlsSetupFailure_w(bool rtcp) { 903 void BaseChannel::SignalDtlsSetupFailure_n(bool rtcp) {
838 ASSERT(worker_thread() == rtc::Thread::Current()); 904 RTC_DCHECK(network_thread_->IsCurrent());
839 signaling_thread()->Invoke<void>(Bind( 905 invoker_.AsyncInvoke<void>(
840 &BaseChannel::SignalDtlsSetupFailure_s, this, rtcp)); 906 signaling_thread(),
907 Bind(&BaseChannel::SignalDtlsSetupFailure_s, this, rtcp));
841 } 908 }
842 909
843 void BaseChannel::SignalDtlsSetupFailure_s(bool rtcp) { 910 void BaseChannel::SignalDtlsSetupFailure_s(bool rtcp) {
844 ASSERT(signaling_thread() == rtc::Thread::Current()); 911 ASSERT(signaling_thread() == rtc::Thread::Current());
845 SignalDtlsSetupFailure(this, rtcp); 912 SignalDtlsSetupFailure(this, rtcp);
846 } 913 }
847 914
848 bool BaseChannel::SetDtlsSrtpCryptoSuites(TransportChannel* tc, bool rtcp) { 915 bool BaseChannel::SetDtlsSrtpCryptoSuites_n(TransportChannel* tc, bool rtcp) {
849 std::vector<int> crypto_suites; 916 std::vector<int> crypto_suites;
850 // We always use the default SRTP crypto suites for RTCP, but we may use 917 // We always use the default SRTP crypto suites for RTCP, but we may use
851 // different crypto suites for RTP depending on the media type. 918 // different crypto suites for RTP depending on the media type.
852 if (!rtcp) { 919 if (!rtcp) {
853 GetSrtpCryptoSuites(&crypto_suites); 920 GetSrtpCryptoSuites_n(&crypto_suites);
854 } else { 921 } else {
855 GetDefaultSrtpCryptoSuites(&crypto_suites); 922 GetDefaultSrtpCryptoSuites(&crypto_suites);
856 } 923 }
857 return tc->SetSrtpCryptoSuites(crypto_suites); 924 return tc->SetSrtpCryptoSuites(crypto_suites);
858 } 925 }
859 926
860 bool BaseChannel::ShouldSetupDtlsSrtp() const { 927 bool BaseChannel::ShouldSetupDtlsSrtp_n() const {
861 // Since DTLS is applied to all channels, checking RTP should be enough. 928 // Since DTLS is applied to all channels, checking RTP should be enough.
862 return transport_channel_ && transport_channel_->IsDtlsActive(); 929 return transport_channel_ && transport_channel_->IsDtlsActive();
863 } 930 }
864 931
865 // This function returns true if either DTLS-SRTP is not in use 932 // This function returns true if either DTLS-SRTP is not in use
866 // *or* DTLS-SRTP is successfully set up. 933 // *or* DTLS-SRTP is successfully set up.
867 bool BaseChannel::SetupDtlsSrtp(bool rtcp_channel) { 934 bool BaseChannel::SetupDtlsSrtp_n(bool rtcp_channel) {
935 RTC_DCHECK(network_thread_->IsCurrent());
868 bool ret = false; 936 bool ret = false;
869 937
870 TransportChannel* channel = 938 TransportChannel* channel =
871 rtcp_channel ? rtcp_transport_channel_ : transport_channel_; 939 rtcp_channel ? rtcp_transport_channel_ : transport_channel_;
872 940
873 RTC_DCHECK(channel->IsDtlsActive()); 941 RTC_DCHECK(channel->IsDtlsActive());
874 942
875 int selected_crypto_suite; 943 int selected_crypto_suite;
876 944
877 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) { 945 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
943 } 1011 }
944 1012
945 if (!ret) 1013 if (!ret)
946 LOG(LS_WARNING) << "DTLS-SRTP key installation failed"; 1014 LOG(LS_WARNING) << "DTLS-SRTP key installation failed";
947 else 1015 else
948 dtls_keyed_ = true; 1016 dtls_keyed_ = true;
949 1017
950 return ret; 1018 return ret;
951 } 1019 }
952 1020
953 void BaseChannel::MaybeSetupDtlsSrtp_w() { 1021 void BaseChannel::MaybeSetupDtlsSrtp_n() {
954 if (srtp_filter_.IsActive()) { 1022 if (srtp_filter_.IsActive()) {
955 return; 1023 return;
956 } 1024 }
957 1025
958 if (!ShouldSetupDtlsSrtp()) { 1026 if (!ShouldSetupDtlsSrtp_n()) {
959 return; 1027 return;
960 } 1028 }
961 1029
962 if (!SetupDtlsSrtp(false)) { 1030 if (!SetupDtlsSrtp_n(false)) {
963 SignalDtlsSetupFailure_w(false); 1031 SignalDtlsSetupFailure_n(false);
964 return; 1032 return;
965 } 1033 }
966 1034
967 if (rtcp_transport_channel_) { 1035 if (rtcp_transport_channel_) {
968 if (!SetupDtlsSrtp(true)) { 1036 if (!SetupDtlsSrtp_n(true)) {
969 SignalDtlsSetupFailure_w(true); 1037 SignalDtlsSetupFailure_n(true);
970 return; 1038 return;
971 } 1039 }
972 } 1040 }
973 } 1041 }
974 1042
975 void BaseChannel::ChannelNotWritable_w() { 1043 void BaseChannel::ChannelNotWritable_n() {
976 ASSERT(worker_thread_ == rtc::Thread::Current()); 1044 RTC_DCHECK(network_thread_->IsCurrent());
977 if (!writable_) 1045 if (!writable_)
978 return; 1046 return;
979 1047
980 LOG(LS_INFO) << "Channel not writable (" << content_name_ << ")"; 1048 LOG(LS_INFO) << "Channel not writable (" << content_name_ << ")";
981 writable_ = false; 1049 writable_ = false;
982 ChangeState(); 1050 ChangeState();
983 } 1051 }
984 1052
985 bool BaseChannel::SetRtpTransportParameters_w( 1053 bool BaseChannel::SetRtpTransportParameters(
986 const MediaContentDescription* content, 1054 const MediaContentDescription* content,
987 ContentAction action, 1055 ContentAction action,
988 ContentSource src, 1056 ContentSource src,
989 std::string* error_desc) { 1057 std::string* error_desc) {
990 if (action == CA_UPDATE) { 1058 if (action == CA_UPDATE) {
991 // These parameters never get changed by a CA_UDPATE. 1059 // These parameters never get changed by a CA_UDPATE.
992 return true; 1060 return true;
993 } 1061 }
994 1062
995 // Cache secure_required_ for belt and suspenders check on SendPacket 1063 // Cache secure_required_ for belt and suspenders check on SendPacket
1064 return network_thread_->Invoke<bool>(
1065 Bind(&BaseChannel::SetRtpTransportParameters_n, this, content, action,
1066 src, error_desc));
1067 }
1068
1069 bool BaseChannel::SetRtpTransportParameters_n(
1070 const MediaContentDescription* content,
1071 ContentAction action,
1072 ContentSource src,
1073 std::string* error_desc) {
1074 RTC_DCHECK(network_thread_->IsCurrent());
1075
996 if (src == CS_LOCAL) { 1076 if (src == CS_LOCAL) {
997 set_secure_required(content->crypto_required() != CT_NONE); 1077 set_secure_required(content->crypto_required() != CT_NONE);
998 } 1078 }
999 1079
1000 if (!SetSrtp_w(content->cryptos(), action, src, error_desc)) { 1080 if (!SetSrtp_n(content->cryptos(), action, src, error_desc)) {
1001 return false; 1081 return false;
1002 } 1082 }
1003 1083
1004 if (!SetRtcpMux_w(content->rtcp_mux(), action, src, error_desc)) { 1084 if (!SetRtcpMux_n(content->rtcp_mux(), action, src, error_desc)) {
1005 return false; 1085 return false;
1006 } 1086 }
1007 1087
1008 return true; 1088 return true;
1009 } 1089 }
1010 1090
1011 // |dtls| will be set to true if DTLS is active for transport channel and 1091 // |dtls| will be set to true if DTLS is active for transport channel and
1012 // crypto is empty. 1092 // crypto is empty.
1013 bool BaseChannel::CheckSrtpConfig(const std::vector<CryptoParams>& cryptos, 1093 bool BaseChannel::CheckSrtpConfig_n(const std::vector<CryptoParams>& cryptos,
1014 bool* dtls, 1094 bool* dtls,
1015 std::string* error_desc) { 1095 std::string* error_desc) {
1016 *dtls = transport_channel_->IsDtlsActive(); 1096 *dtls = transport_channel_->IsDtlsActive();
1017 if (*dtls && !cryptos.empty()) { 1097 if (*dtls && !cryptos.empty()) {
1018 SafeSetError("Cryptos must be empty when DTLS is active.", 1098 SafeSetError("Cryptos must be empty when DTLS is active.", error_desc);
1019 error_desc);
1020 return false; 1099 return false;
1021 } 1100 }
1022 return true; 1101 return true;
1023 } 1102 }
1024 1103
1025 bool BaseChannel::SetSrtp_w(const std::vector<CryptoParams>& cryptos, 1104 bool BaseChannel::SetSrtp_n(const std::vector<CryptoParams>& cryptos,
1026 ContentAction action, 1105 ContentAction action,
1027 ContentSource src, 1106 ContentSource src,
1028 std::string* error_desc) { 1107 std::string* error_desc) {
1029 TRACE_EVENT0("webrtc", "BaseChannel::SetSrtp_w"); 1108 TRACE_EVENT0("webrtc", "BaseChannel::SetSrtp_w");
1030 if (action == CA_UPDATE) { 1109 if (action == CA_UPDATE) {
1031 // no crypto params. 1110 // no crypto params.
1032 return true; 1111 return true;
1033 } 1112 }
1034 bool ret = false; 1113 bool ret = false;
1035 bool dtls = false; 1114 bool dtls = false;
1036 ret = CheckSrtpConfig(cryptos, &dtls, error_desc); 1115 ret = CheckSrtpConfig_n(cryptos, &dtls, error_desc);
1037 if (!ret) { 1116 if (!ret) {
1038 return false; 1117 return false;
1039 } 1118 }
1040 switch (action) { 1119 switch (action) {
1041 case CA_OFFER: 1120 case CA_OFFER:
1042 // If DTLS is already active on the channel, we could be renegotiating 1121 // If DTLS is already active on the channel, we could be renegotiating
1043 // here. We don't update the srtp filter. 1122 // here. We don't update the srtp filter.
1044 if (!dtls) { 1123 if (!dtls) {
1045 ret = srtp_filter_.SetOffer(cryptos, src); 1124 ret = srtp_filter_.SetOffer(cryptos, src);
1046 } 1125 }
(...skipping 16 matching lines...) Expand all
1063 break; 1142 break;
1064 } 1143 }
1065 if (!ret) { 1144 if (!ret) {
1066 SafeSetError("Failed to setup SRTP filter.", error_desc); 1145 SafeSetError("Failed to setup SRTP filter.", error_desc);
1067 return false; 1146 return false;
1068 } 1147 }
1069 return true; 1148 return true;
1070 } 1149 }
1071 1150
1072 void BaseChannel::ActivateRtcpMux() { 1151 void BaseChannel::ActivateRtcpMux() {
1073 worker_thread_->Invoke<void>(Bind( 1152 network_thread_->Invoke<void>(Bind(&BaseChannel::ActivateRtcpMux_n, this));
1074 &BaseChannel::ActivateRtcpMux_w, this));
1075 } 1153 }
1076 1154
1077 void BaseChannel::ActivateRtcpMux_w() { 1155 void BaseChannel::ActivateRtcpMux_n() {
1078 if (!rtcp_mux_filter_.IsActive()) { 1156 if (!rtcp_mux_filter_.IsActive()) {
1079 rtcp_mux_filter_.SetActive(); 1157 rtcp_mux_filter_.SetActive();
1080 set_rtcp_transport_channel(nullptr, true); 1158 SetRtcpTransportChannel_n(nullptr, true);
1081 rtcp_transport_enabled_ = false; 1159 rtcp_transport_enabled_ = false;
1082 } 1160 }
1083 } 1161 }
1084 1162
1085 bool BaseChannel::SetRtcpMux_w(bool enable, ContentAction action, 1163 bool BaseChannel::SetRtcpMux_n(bool enable,
1164 ContentAction action,
1086 ContentSource src, 1165 ContentSource src,
1087 std::string* error_desc) { 1166 std::string* error_desc) {
1088 bool ret = false; 1167 bool ret = false;
1089 switch (action) { 1168 switch (action) {
1090 case CA_OFFER: 1169 case CA_OFFER:
1091 ret = rtcp_mux_filter_.SetOffer(enable, src); 1170 ret = rtcp_mux_filter_.SetOffer(enable, src);
1092 break; 1171 break;
1093 case CA_PRANSWER: 1172 case CA_PRANSWER:
1094 ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src); 1173 ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src);
1095 break; 1174 break;
1096 case CA_ANSWER: 1175 case CA_ANSWER:
1097 ret = rtcp_mux_filter_.SetAnswer(enable, src); 1176 ret = rtcp_mux_filter_.SetAnswer(enable, src);
1098 if (ret && rtcp_mux_filter_.IsActive()) { 1177 if (ret && rtcp_mux_filter_.IsActive()) {
1099 // We activated RTCP mux, close down the RTCP transport. 1178 // We activated RTCP mux, close down the RTCP transport.
1100 LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name() 1179 LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name()
1101 << " by destroying RTCP transport channel for " 1180 << " by destroying RTCP transport channel for "
1102 << transport_name(); 1181 << transport_name();
1103 set_rtcp_transport_channel(nullptr, true); 1182 SetRtcpTransportChannel_n(nullptr, true);
1104 rtcp_transport_enabled_ = false; 1183 rtcp_transport_enabled_ = false;
1105 } 1184 }
1106 break; 1185 break;
1107 case CA_UPDATE: 1186 case CA_UPDATE:
1108 // No RTCP mux info. 1187 // No RTCP mux info.
1109 ret = true; 1188 ret = true;
1110 break; 1189 break;
1111 default: 1190 default:
1112 break; 1191 break;
1113 } 1192 }
1114 if (!ret) { 1193 if (!ret) {
1115 SafeSetError("Failed to setup RTCP mux filter.", error_desc); 1194 SafeSetError("Failed to setup RTCP mux filter.", error_desc);
1116 return false; 1195 return false;
1117 } 1196 }
1118 // |rtcp_mux_filter_| can be active if |action| is CA_PRANSWER or 1197 // |rtcp_mux_filter_| can be active if |action| is CA_PRANSWER or
1119 // CA_ANSWER, but we only want to tear down the RTCP transport channel if we 1198 // CA_ANSWER, but we only want to tear down the RTCP transport channel if we
1120 // received a final answer. 1199 // received a final answer.
1121 if (rtcp_mux_filter_.IsActive()) { 1200 if (rtcp_mux_filter_.IsActive()) {
1122 // If the RTP transport is already writable, then so are we. 1201 // If the RTP transport is already writable, then so are we.
1123 if (transport_channel_->writable()) { 1202 if (transport_channel_->writable()) {
1124 ChannelWritable_w(); 1203 ChannelWritable_n();
1125 } 1204 }
1126 } 1205 }
1127 1206
1128 return true; 1207 return true;
1129 } 1208 }
1130 1209
1131 bool BaseChannel::AddRecvStream_w(const StreamParams& sp) { 1210 bool BaseChannel::AddRecvStream_w(const StreamParams& sp) {
1132 ASSERT(worker_thread() == rtc::Thread::Current()); 1211 ASSERT(worker_thread() == rtc::Thread::Current());
1133 return media_channel()->AddRecvStream(sp); 1212 return media_channel()->AddRecvStream(sp);
1134 } 1213 }
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 desc << "Failed to add remote stream ssrc: " << it->first_ssrc(); 1357 desc << "Failed to add remote stream ssrc: " << it->first_ssrc();
1279 SafeSetError(desc.str(), error_desc); 1358 SafeSetError(desc.str(), error_desc);
1280 ret = false; 1359 ret = false;
1281 } 1360 }
1282 } 1361 }
1283 } 1362 }
1284 remote_streams_ = streams; 1363 remote_streams_ = streams;
1285 return ret; 1364 return ret;
1286 } 1365 }
1287 1366
1288 void BaseChannel::MaybeCacheRtpAbsSendTimeHeaderExtension( 1367 void BaseChannel::MaybeCacheRtpAbsSendTimeHeaderExtension_w(
1289 const std::vector<RtpHeaderExtension>& extensions) { 1368 const std::vector<RtpHeaderExtension>& extensions) {
1369 // Absolute Send Time extension id is used only with external auth,
1370 // so do not bother searching for it and making asyncronious call to set
1371 // something that is not used.
1372 #if defined(ENABLE_EXTERNAL_AUTH)
1290 const RtpHeaderExtension* send_time_extension = 1373 const RtpHeaderExtension* send_time_extension =
1291 FindHeaderExtension(extensions, kRtpAbsoluteSenderTimeHeaderExtension); 1374 FindHeaderExtension(extensions, kRtpAbsoluteSenderTimeHeaderExtension);
1292 rtp_abs_sendtime_extn_id_ = 1375 int rtp_abs_sendtime_extn_id =
1293 send_time_extension ? send_time_extension->id : -1; 1376 send_time_extension ? send_time_extension->id : -1;
1377 invoker_.AsyncInvoke<void>(
1378 network_thread_, Bind(&BaseChannel::CacheRtpAbsSendTimeHeaderExtension_n,
1379 this, rtp_abs_sendtime_extn_id));
1380 #endif
1381 }
1382
1383 void BaseChannel::CacheRtpAbsSendTimeHeaderExtension_n(
1384 int rtp_abs_sendtime_extn_id) {
1385 rtp_abs_sendtime_extn_id_ = rtp_abs_sendtime_extn_id;
1294 } 1386 }
1295 1387
1296 void BaseChannel::OnMessage(rtc::Message *pmsg) { 1388 void BaseChannel::OnMessage(rtc::Message *pmsg) {
1297 TRACE_EVENT0("webrtc", "BaseChannel::OnMessage"); 1389 TRACE_EVENT0("webrtc", "BaseChannel::OnMessage");
1298 switch (pmsg->message_id) { 1390 switch (pmsg->message_id) {
1299 case MSG_RTPPACKET: 1391 case MSG_SEND_RTP_PACKET:
1300 case MSG_RTCPPACKET: { 1392 case MSG_SEND_RTCP_PACKET: {
1301 PacketMessageData* data = static_cast<PacketMessageData*>(pmsg->pdata); 1393 RTC_DCHECK(network_thread_->IsCurrent());
1302 SendPacket(pmsg->message_id == MSG_RTCPPACKET, &data->packet, 1394 SendPacketMessageData* data =
1303 data->options); 1395 static_cast<SendPacketMessageData*>(pmsg->pdata);
1304 delete data; // because it is Posted 1396 bool rtcp = pmsg->message_id == MSG_SEND_RTCP_PACKET;
1397 SendPacket(rtcp, &data->packet, data->options);
1398 delete data;
1305 break; 1399 break;
1306 } 1400 }
1307 case MSG_FIRSTPACKETRECEIVED: { 1401 case MSG_FIRSTPACKETRECEIVED: {
1308 SignalFirstPacketReceived(this); 1402 SignalFirstPacketReceived(this);
1309 break; 1403 break;
1310 } 1404 }
1311 } 1405 }
1312 } 1406 }
1313 1407
1314 void BaseChannel::FlushRtcpMessages() { 1408 void BaseChannel::FlushRtcpMessages_n() {
1315 // Flush all remaining RTCP messages. This should only be called in 1409 // Flush all remaining RTCP messages. This should only be called in
1316 // destructor. 1410 // destructor.
1317 ASSERT(rtc::Thread::Current() == worker_thread_); 1411 RTC_DCHECK(network_thread_->IsCurrent());
1318 rtc::MessageList rtcp_messages; 1412 rtc::MessageList rtcp_messages;
1319 worker_thread_->Clear(this, MSG_RTCPPACKET, &rtcp_messages); 1413 network_thread_->Clear(this, MSG_SEND_RTCP_PACKET, &rtcp_messages);
1320 for (rtc::MessageList::iterator it = rtcp_messages.begin(); 1414 for (const auto& message : rtcp_messages) {
1321 it != rtcp_messages.end(); ++it) { 1415 network_thread_->Send(this, MSG_SEND_RTCP_PACKET, message.pdata);
1322 worker_thread_->Send(this, MSG_RTCPPACKET, it->pdata);
1323 } 1416 }
1324 } 1417 }
1325 1418
1326 VoiceChannel::VoiceChannel(rtc::Thread* thread, 1419 void BaseChannel::SignalSentPacket_n(TransportChannel* /* channel */,
1420 const rtc::SentPacket& sent_packet) {
1421 RTC_DCHECK(network_thread_->IsCurrent());
1422 invoker_.AsyncInvoke<void>(
1423 worker_thread_,
1424 rtc::Bind(&BaseChannel::SignalSentPacket_w, this, sent_packet));
1425 }
1426
1427 void BaseChannel::SignalSentPacket_w(const rtc::SentPacket& sent_packet) {
1428 RTC_DCHECK(worker_thread_->IsCurrent());
1429 SignalSentPacket(sent_packet);
1430 }
1431
1432 VoiceChannel::VoiceChannel(rtc::Thread* worker_thread,
1433 rtc::Thread* network_thread,
1327 MediaEngineInterface* media_engine, 1434 MediaEngineInterface* media_engine,
1328 VoiceMediaChannel* media_channel, 1435 VoiceMediaChannel* media_channel,
1329 TransportController* transport_controller, 1436 TransportController* transport_controller,
1330 const std::string& content_name, 1437 const std::string& content_name,
1331 bool rtcp) 1438 bool rtcp)
1332 : BaseChannel(thread, 1439 : BaseChannel(worker_thread,
1440 network_thread,
1333 media_channel, 1441 media_channel,
1334 transport_controller, 1442 transport_controller,
1335 content_name, 1443 content_name,
1336 rtcp), 1444 rtcp),
1337 media_engine_(media_engine), 1445 media_engine_(media_engine),
1338 received_media_(false) {} 1446 received_media_(false) {}
1339 1447
1340 VoiceChannel::~VoiceChannel() { 1448 VoiceChannel::~VoiceChannel() {
1341 TRACE_EVENT0("webrtc", "VoiceChannel::~VoiceChannel"); 1449 TRACE_EVENT0("webrtc", "VoiceChannel::~VoiceChannel");
1342 StopAudioMonitor(); 1450 StopAudioMonitor();
1343 StopMediaMonitor(); 1451 StopMediaMonitor();
1344 // this can't be done in the base class, since it calls a virtual 1452 // this can't be done in the base class, since it calls a virtual
1345 DisableMedia_w(); 1453 DisableMedia_w();
1346 Deinit(); 1454 Deinit();
1347 } 1455 }
1348 1456
1349 bool VoiceChannel::Init() { 1457 bool VoiceChannel::Init_w() {
1350 if (!BaseChannel::Init()) { 1458 if (!BaseChannel::Init_w()) {
1351 return false; 1459 return false;
1352 } 1460 }
1353 return true; 1461 return true;
1354 } 1462 }
1355 1463
1356 bool VoiceChannel::SetAudioSend(uint32_t ssrc, 1464 bool VoiceChannel::SetAudioSend(uint32_t ssrc,
1357 bool enable, 1465 bool enable,
1358 const AudioOptions* options, 1466 const AudioOptions* options,
1359 AudioSource* source) { 1467 AudioSource* source) {
1360 return InvokeOnWorker(Bind(&VoiceMediaChannel::SetAudioSend, media_channel(), 1468 return InvokeOnWorker(Bind(&VoiceMediaChannel::SetAudioSend, media_channel(),
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1480 int flags) { 1588 int flags) {
1481 BaseChannel::OnChannelRead(channel, data, len, packet_time, flags); 1589 BaseChannel::OnChannelRead(channel, data, len, packet_time, flags);
1482 1590
1483 // Set a flag when we've received an RTP packet. If we're waiting for early 1591 // Set a flag when we've received an RTP packet. If we're waiting for early
1484 // media, this will disable the timeout. 1592 // media, this will disable the timeout.
1485 if (!received_media_ && !PacketIsRtcp(channel, data, len)) { 1593 if (!received_media_ && !PacketIsRtcp(channel, data, len)) {
1486 received_media_ = true; 1594 received_media_ = true;
1487 } 1595 }
1488 } 1596 }
1489 1597
1490 void VoiceChannel::ChangeState() { 1598 void BaseChannel::ChangeState() {
1599 RTC_DCHECK(network_thread_->IsCurrent());
1600 invoker_.AsyncInvoke<void>(worker_thread_,
1601 Bind(&BaseChannel::ChangeState_w, this));
1602 }
1603
1604 void VoiceChannel::ChangeState_w() {
1491 // Render incoming data if we're the active call, and we have the local 1605 // Render incoming data if we're the active call, and we have the local
1492 // content. We receive data on the default channel and multiplexed streams. 1606 // content. We receive data on the default channel and multiplexed streams.
1493 bool recv = IsReadyToReceive(); 1607 bool recv = IsReadyToReceive_w();
1494 media_channel()->SetPlayout(recv); 1608 media_channel()->SetPlayout(recv);
1495 1609
1496 // Send outgoing data if we're the active call, we have the remote content, 1610 // Send outgoing data if we're the active call, we have the remote content,
1497 // and we have had some form of connectivity. 1611 // and we have had some form of connectivity.
1498 bool send = IsReadyToSend(); 1612 bool send = IsReadyToSend_w();
1499 media_channel()->SetSend(send); 1613 media_channel()->SetSend(send);
1500 1614
1501 LOG(LS_INFO) << "Changing voice state, recv=" << recv << " send=" << send; 1615 LOG(LS_INFO) << "Changing voice state, recv=" << recv << " send=" << send;
1502 } 1616 }
1503 1617
1504 const ContentInfo* VoiceChannel::GetFirstContent( 1618 const ContentInfo* VoiceChannel::GetFirstContent(
1505 const SessionDescription* sdesc) { 1619 const SessionDescription* sdesc) {
1506 return GetFirstAudioContent(sdesc); 1620 return GetFirstAudioContent(sdesc);
1507 } 1621 }
1508 1622
1509 bool VoiceChannel::SetLocalContent_w(const MediaContentDescription* content, 1623 bool VoiceChannel::SetLocalContent_w(const MediaContentDescription* content,
1510 ContentAction action, 1624 ContentAction action,
1511 std::string* error_desc) { 1625 std::string* error_desc) {
1512 TRACE_EVENT0("webrtc", "VoiceChannel::SetLocalContent_w"); 1626 TRACE_EVENT0("webrtc", "VoiceChannel::SetLocalContent_w");
1513 ASSERT(worker_thread() == rtc::Thread::Current()); 1627 ASSERT(worker_thread() == rtc::Thread::Current());
1514 LOG(LS_INFO) << "Setting local voice description"; 1628 LOG(LS_INFO) << "Setting local voice description";
1515 1629
1516 const AudioContentDescription* audio = 1630 const AudioContentDescription* audio =
1517 static_cast<const AudioContentDescription*>(content); 1631 static_cast<const AudioContentDescription*>(content);
1518 ASSERT(audio != NULL); 1632 ASSERT(audio != NULL);
1519 if (!audio) { 1633 if (!audio) {
1520 SafeSetError("Can't find audio content in local description.", error_desc); 1634 SafeSetError("Can't find audio content in local description.", error_desc);
1521 return false; 1635 return false;
1522 } 1636 }
1523 1637
1524 if (!SetRtpTransportParameters_w(content, action, CS_LOCAL, error_desc)) { 1638 if (!SetRtpTransportParameters(content, action, CS_LOCAL, error_desc)) {
1525 return false; 1639 return false;
1526 } 1640 }
1527 1641
1528 AudioRecvParameters recv_params = last_recv_params_; 1642 AudioRecvParameters recv_params = last_recv_params_;
1529 RtpParametersFromMediaDescription(audio, &recv_params); 1643 RtpParametersFromMediaDescription(audio, &recv_params);
1530 if (!media_channel()->SetRecvParameters(recv_params)) { 1644 if (!media_channel()->SetRecvParameters(recv_params)) {
1531 SafeSetError("Failed to set local audio description recv parameters.", 1645 SafeSetError("Failed to set local audio description recv parameters.",
1532 error_desc); 1646 error_desc);
1533 return false; 1647 return false;
1534 } 1648 }
1535 for (const AudioCodec& codec : audio->codecs()) { 1649 for (const AudioCodec& codec : audio->codecs()) {
1536 bundle_filter()->AddPayloadType(codec.id); 1650 bundle_filter()->AddPayloadType(codec.id);
1537 } 1651 }
1538 last_recv_params_ = recv_params; 1652 last_recv_params_ = recv_params;
1539 1653
1540 // TODO(pthatcher): Move local streams into AudioSendParameters, and 1654 // TODO(pthatcher): Move local streams into AudioSendParameters, and
1541 // only give it to the media channel once we have a remote 1655 // only give it to the media channel once we have a remote
1542 // description too (without a remote description, we won't be able 1656 // description too (without a remote description, we won't be able
1543 // to send them anyway). 1657 // to send them anyway).
1544 if (!UpdateLocalStreams_w(audio->streams(), action, error_desc)) { 1658 if (!UpdateLocalStreams_w(audio->streams(), action, error_desc)) {
1545 SafeSetError("Failed to set local audio description streams.", error_desc); 1659 SafeSetError("Failed to set local audio description streams.", error_desc);
1546 return false; 1660 return false;
1547 } 1661 }
1548 1662
1549 set_local_content_direction(content->direction()); 1663 set_local_content_direction(content->direction());
1550 ChangeState(); 1664 ChangeState_w();
1551 return true; 1665 return true;
1552 } 1666 }
1553 1667
1554 bool VoiceChannel::SetRemoteContent_w(const MediaContentDescription* content, 1668 bool VoiceChannel::SetRemoteContent_w(const MediaContentDescription* content,
1555 ContentAction action, 1669 ContentAction action,
1556 std::string* error_desc) { 1670 std::string* error_desc) {
1557 TRACE_EVENT0("webrtc", "VoiceChannel::SetRemoteContent_w"); 1671 TRACE_EVENT0("webrtc", "VoiceChannel::SetRemoteContent_w");
1558 ASSERT(worker_thread() == rtc::Thread::Current()); 1672 ASSERT(worker_thread() == rtc::Thread::Current());
1559 LOG(LS_INFO) << "Setting remote voice description"; 1673 LOG(LS_INFO) << "Setting remote voice description";
1560 1674
1561 const AudioContentDescription* audio = 1675 const AudioContentDescription* audio =
1562 static_cast<const AudioContentDescription*>(content); 1676 static_cast<const AudioContentDescription*>(content);
1563 ASSERT(audio != NULL); 1677 ASSERT(audio != NULL);
1564 if (!audio) { 1678 if (!audio) {
1565 SafeSetError("Can't find audio content in remote description.", error_desc); 1679 SafeSetError("Can't find audio content in remote description.", error_desc);
1566 return false; 1680 return false;
1567 } 1681 }
1568 1682
1569 if (!SetRtpTransportParameters_w(content, action, CS_REMOTE, error_desc)) { 1683 if (!SetRtpTransportParameters(content, action, CS_REMOTE, error_desc)) {
1570 return false; 1684 return false;
1571 } 1685 }
1572 1686
1573 AudioSendParameters send_params = last_send_params_; 1687 AudioSendParameters send_params = last_send_params_;
1574 RtpSendParametersFromMediaDescription(audio, &send_params); 1688 RtpSendParametersFromMediaDescription(audio, &send_params);
1575 if (audio->agc_minus_10db()) { 1689 if (audio->agc_minus_10db()) {
1576 send_params.options.adjust_agc_delta = rtc::Optional<int>(kAgcMinus10db); 1690 send_params.options.adjust_agc_delta = rtc::Optional<int>(kAgcMinus10db);
1577 } 1691 }
1578 1692
1579 bool parameters_applied = media_channel()->SetSendParameters(send_params); 1693 bool parameters_applied = media_channel()->SetSendParameters(send_params);
1580 if (!parameters_applied) { 1694 if (!parameters_applied) {
1581 SafeSetError("Failed to set remote audio description send parameters.", 1695 SafeSetError("Failed to set remote audio description send parameters.",
1582 error_desc); 1696 error_desc);
1583 return false; 1697 return false;
1584 } 1698 }
1585 last_send_params_ = send_params; 1699 last_send_params_ = send_params;
1586 1700
1587 // TODO(pthatcher): Move remote streams into AudioRecvParameters, 1701 // TODO(pthatcher): Move remote streams into AudioRecvParameters,
1588 // and only give it to the media channel once we have a local 1702 // and only give it to the media channel once we have a local
1589 // description too (without a local description, we won't be able to 1703 // description too (without a local description, we won't be able to
1590 // recv them anyway). 1704 // recv them anyway).
1591 if (!UpdateRemoteStreams_w(audio->streams(), action, error_desc)) { 1705 if (!UpdateRemoteStreams_w(audio->streams(), action, error_desc)) {
1592 SafeSetError("Failed to set remote audio description streams.", error_desc); 1706 SafeSetError("Failed to set remote audio description streams.", error_desc);
1593 return false; 1707 return false;
1594 } 1708 }
1595 1709
1596 if (audio->rtp_header_extensions_set()) { 1710 if (audio->rtp_header_extensions_set()) {
1597 MaybeCacheRtpAbsSendTimeHeaderExtension(audio->rtp_header_extensions()); 1711 MaybeCacheRtpAbsSendTimeHeaderExtension_w(audio->rtp_header_extensions());
1598 } 1712 }
1599 1713
1600 set_remote_content_direction(content->direction()); 1714 set_remote_content_direction(content->direction());
1601 ChangeState(); 1715 ChangeState_w();
1602 return true; 1716 return true;
1603 } 1717 }
1604 1718
1605 void VoiceChannel::HandleEarlyMediaTimeout() { 1719 void VoiceChannel::HandleEarlyMediaTimeout() {
1606 // This occurs on the main thread, not the worker thread. 1720 // This occurs on the main thread, not the worker thread.
1607 if (!received_media_) { 1721 if (!received_media_) {
1608 LOG(LS_INFO) << "No early media received before timeout"; 1722 LOG(LS_INFO) << "No early media received before timeout";
1609 SignalEarlyMediaTimeout(this); 1723 SignalEarlyMediaTimeout(this);
1610 } 1724 }
1611 } 1725 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1645 VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) { 1759 VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) {
1646 ASSERT(media_channel == this->media_channel()); 1760 ASSERT(media_channel == this->media_channel());
1647 SignalMediaMonitor(this, info); 1761 SignalMediaMonitor(this, info);
1648 } 1762 }
1649 1763
1650 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor, 1764 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor,
1651 const AudioInfo& info) { 1765 const AudioInfo& info) {
1652 SignalAudioMonitor(this, info); 1766 SignalAudioMonitor(this, info);
1653 } 1767 }
1654 1768
1655 void VoiceChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { 1769 void VoiceChannel::GetSrtpCryptoSuites_n(
1770 std::vector<int>* crypto_suites) const {
1656 GetSupportedAudioCryptoSuites(crypto_suites); 1771 GetSupportedAudioCryptoSuites(crypto_suites);
1657 } 1772 }
1658 1773
1659 VideoChannel::VideoChannel(rtc::Thread* thread, 1774 VideoChannel::VideoChannel(rtc::Thread* worker_thread,
1775 rtc::Thread* network_thread,
1660 VideoMediaChannel* media_channel, 1776 VideoMediaChannel* media_channel,
1661 TransportController* transport_controller, 1777 TransportController* transport_controller,
1662 const std::string& content_name, 1778 const std::string& content_name,
1663 bool rtcp) 1779 bool rtcp)
1664 : BaseChannel(thread, 1780 : BaseChannel(worker_thread,
1781 network_thread,
1665 media_channel, 1782 media_channel,
1666 transport_controller, 1783 transport_controller,
1667 content_name, 1784 content_name,
1668 rtcp) {} 1785 rtcp) {}
1669 1786
1670 bool VideoChannel::Init() { 1787 bool VideoChannel::Init_w() {
1671 if (!BaseChannel::Init()) { 1788 if (!BaseChannel::Init_w()) {
1672 return false; 1789 return false;
1673 } 1790 }
1674 return true; 1791 return true;
1675 } 1792 }
1676 1793
1677 VideoChannel::~VideoChannel() { 1794 VideoChannel::~VideoChannel() {
1678 TRACE_EVENT0("webrtc", "VideoChannel::~VideoChannel"); 1795 TRACE_EVENT0("webrtc", "VideoChannel::~VideoChannel");
1679 StopMediaMonitor(); 1796 StopMediaMonitor();
1680 // this can't be done in the base class, since it calls a virtual 1797 // this can't be done in the base class, since it calls a virtual
1681 DisableMedia_w(); 1798 DisableMedia_w();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1716 bool VideoChannel::SetRtpParameters(uint32_t ssrc, 1833 bool VideoChannel::SetRtpParameters(uint32_t ssrc,
1717 const webrtc::RtpParameters& parameters) { 1834 const webrtc::RtpParameters& parameters) {
1718 return InvokeOnWorker( 1835 return InvokeOnWorker(
1719 Bind(&VideoChannel::SetRtpParameters_w, this, ssrc, parameters)); 1836 Bind(&VideoChannel::SetRtpParameters_w, this, ssrc, parameters));
1720 } 1837 }
1721 1838
1722 bool VideoChannel::SetRtpParameters_w(uint32_t ssrc, 1839 bool VideoChannel::SetRtpParameters_w(uint32_t ssrc,
1723 webrtc::RtpParameters parameters) { 1840 webrtc::RtpParameters parameters) {
1724 return media_channel()->SetRtpParameters(ssrc, parameters); 1841 return media_channel()->SetRtpParameters(ssrc, parameters);
1725 } 1842 }
1726 void VideoChannel::ChangeState() { 1843
1844 void VideoChannel::ChangeState_w() {
1727 // Send outgoing data if we're the active call, we have the remote content, 1845 // Send outgoing data if we're the active call, we have the remote content,
1728 // and we have had some form of connectivity. 1846 // and we have had some form of connectivity.
1729 bool send = IsReadyToSend(); 1847 bool send = IsReadyToSend_w();
1730 if (!media_channel()->SetSend(send)) { 1848 if (!media_channel()->SetSend(send)) {
1731 LOG(LS_ERROR) << "Failed to SetSend on video channel"; 1849 LOG(LS_ERROR) << "Failed to SetSend on video channel";
1732 // TODO(gangji): Report error back to server. 1850 // TODO(gangji): Report error back to server.
1733 } 1851 }
1734 1852
1735 LOG(LS_INFO) << "Changing video state, send=" << send; 1853 LOG(LS_INFO) << "Changing video state, send=" << send;
1736 } 1854 }
1737 1855
1738 bool VideoChannel::GetStats(VideoMediaInfo* stats) { 1856 bool VideoChannel::GetStats(VideoMediaInfo* stats) {
1739 return InvokeOnWorker( 1857 return InvokeOnWorker(
(...skipping 28 matching lines...) Expand all
1768 LOG(LS_INFO) << "Setting local video description"; 1886 LOG(LS_INFO) << "Setting local video description";
1769 1887
1770 const VideoContentDescription* video = 1888 const VideoContentDescription* video =
1771 static_cast<const VideoContentDescription*>(content); 1889 static_cast<const VideoContentDescription*>(content);
1772 ASSERT(video != NULL); 1890 ASSERT(video != NULL);
1773 if (!video) { 1891 if (!video) {
1774 SafeSetError("Can't find video content in local description.", error_desc); 1892 SafeSetError("Can't find video content in local description.", error_desc);
1775 return false; 1893 return false;
1776 } 1894 }
1777 1895
1778 if (!SetRtpTransportParameters_w(content, action, CS_LOCAL, error_desc)) { 1896 if (!SetRtpTransportParameters(content, action, CS_LOCAL, error_desc)) {
1779 return false; 1897 return false;
1780 } 1898 }
1781 1899
1782 VideoRecvParameters recv_params = last_recv_params_; 1900 VideoRecvParameters recv_params = last_recv_params_;
1783 RtpParametersFromMediaDescription(video, &recv_params); 1901 RtpParametersFromMediaDescription(video, &recv_params);
1784 if (!media_channel()->SetRecvParameters(recv_params)) { 1902 if (!media_channel()->SetRecvParameters(recv_params)) {
1785 SafeSetError("Failed to set local video description recv parameters.", 1903 SafeSetError("Failed to set local video description recv parameters.",
1786 error_desc); 1904 error_desc);
1787 return false; 1905 return false;
1788 } 1906 }
1789 for (const VideoCodec& codec : video->codecs()) { 1907 for (const VideoCodec& codec : video->codecs()) {
1790 bundle_filter()->AddPayloadType(codec.id); 1908 bundle_filter()->AddPayloadType(codec.id);
1791 } 1909 }
1792 last_recv_params_ = recv_params; 1910 last_recv_params_ = recv_params;
1793 1911
1794 // TODO(pthatcher): Move local streams into VideoSendParameters, and 1912 // TODO(pthatcher): Move local streams into VideoSendParameters, and
1795 // only give it to the media channel once we have a remote 1913 // only give it to the media channel once we have a remote
1796 // description too (without a remote description, we won't be able 1914 // description too (without a remote description, we won't be able
1797 // to send them anyway). 1915 // to send them anyway).
1798 if (!UpdateLocalStreams_w(video->streams(), action, error_desc)) { 1916 if (!UpdateLocalStreams_w(video->streams(), action, error_desc)) {
1799 SafeSetError("Failed to set local video description streams.", error_desc); 1917 SafeSetError("Failed to set local video description streams.", error_desc);
1800 return false; 1918 return false;
1801 } 1919 }
1802 1920
1803 set_local_content_direction(content->direction()); 1921 set_local_content_direction(content->direction());
1804 ChangeState(); 1922 ChangeState_w();
1805 return true; 1923 return true;
1806 } 1924 }
1807 1925
1808 bool VideoChannel::SetRemoteContent_w(const MediaContentDescription* content, 1926 bool VideoChannel::SetRemoteContent_w(const MediaContentDescription* content,
1809 ContentAction action, 1927 ContentAction action,
1810 std::string* error_desc) { 1928 std::string* error_desc) {
1811 TRACE_EVENT0("webrtc", "VideoChannel::SetRemoteContent_w"); 1929 TRACE_EVENT0("webrtc", "VideoChannel::SetRemoteContent_w");
1812 ASSERT(worker_thread() == rtc::Thread::Current()); 1930 ASSERT(worker_thread() == rtc::Thread::Current());
1813 LOG(LS_INFO) << "Setting remote video description"; 1931 LOG(LS_INFO) << "Setting remote video description";
1814 1932
1815 const VideoContentDescription* video = 1933 const VideoContentDescription* video =
1816 static_cast<const VideoContentDescription*>(content); 1934 static_cast<const VideoContentDescription*>(content);
1817 ASSERT(video != NULL); 1935 ASSERT(video != NULL);
1818 if (!video) { 1936 if (!video) {
1819 SafeSetError("Can't find video content in remote description.", error_desc); 1937 SafeSetError("Can't find video content in remote description.", error_desc);
1820 return false; 1938 return false;
1821 } 1939 }
1822 1940
1823 1941 if (!SetRtpTransportParameters(content, action, CS_REMOTE, error_desc)) {
1824 if (!SetRtpTransportParameters_w(content, action, CS_REMOTE, error_desc)) {
1825 return false; 1942 return false;
1826 } 1943 }
1827 1944
1828 VideoSendParameters send_params = last_send_params_; 1945 VideoSendParameters send_params = last_send_params_;
1829 RtpSendParametersFromMediaDescription(video, &send_params); 1946 RtpSendParametersFromMediaDescription(video, &send_params);
1830 if (video->conference_mode()) { 1947 if (video->conference_mode()) {
1831 send_params.conference_mode = true; 1948 send_params.conference_mode = true;
1832 } 1949 }
1833 1950
1834 bool parameters_applied = media_channel()->SetSendParameters(send_params); 1951 bool parameters_applied = media_channel()->SetSendParameters(send_params);
1835 1952
1836 if (!parameters_applied) { 1953 if (!parameters_applied) {
1837 SafeSetError("Failed to set remote video description send parameters.", 1954 SafeSetError("Failed to set remote video description send parameters.",
1838 error_desc); 1955 error_desc);
1839 return false; 1956 return false;
1840 } 1957 }
1841 last_send_params_ = send_params; 1958 last_send_params_ = send_params;
1842 1959
1843 // TODO(pthatcher): Move remote streams into VideoRecvParameters, 1960 // TODO(pthatcher): Move remote streams into VideoRecvParameters,
1844 // and only give it to the media channel once we have a local 1961 // and only give it to the media channel once we have a local
1845 // description too (without a local description, we won't be able to 1962 // description too (without a local description, we won't be able to
1846 // recv them anyway). 1963 // recv them anyway).
1847 if (!UpdateRemoteStreams_w(video->streams(), action, error_desc)) { 1964 if (!UpdateRemoteStreams_w(video->streams(), action, error_desc)) {
1848 SafeSetError("Failed to set remote video description streams.", error_desc); 1965 SafeSetError("Failed to set remote video description streams.", error_desc);
1849 return false; 1966 return false;
1850 } 1967 }
1851 1968
1852 if (video->rtp_header_extensions_set()) { 1969 if (video->rtp_header_extensions_set()) {
1853 MaybeCacheRtpAbsSendTimeHeaderExtension(video->rtp_header_extensions()); 1970 MaybeCacheRtpAbsSendTimeHeaderExtension_w(video->rtp_header_extensions());
1854 } 1971 }
1855 1972
1856 set_remote_content_direction(content->direction()); 1973 set_remote_content_direction(content->direction());
1857 ChangeState(); 1974 ChangeState_w();
1858 return true; 1975 return true;
1859 } 1976 }
1860 1977
1861 void VideoChannel::OnMessage(rtc::Message *pmsg) { 1978 void VideoChannel::OnMessage(rtc::Message *pmsg) {
1862 switch (pmsg->message_id) { 1979 switch (pmsg->message_id) {
1863 case MSG_CHANNEL_ERROR: { 1980 case MSG_CHANNEL_ERROR: {
1864 const VideoChannelErrorMessageData* data = 1981 const VideoChannelErrorMessageData* data =
1865 static_cast<VideoChannelErrorMessageData*>(pmsg->pdata); 1982 static_cast<VideoChannelErrorMessageData*>(pmsg->pdata);
1866 delete data; 1983 delete data;
1867 break; 1984 break;
(...skipping 10 matching lines...) Expand all
1878 } 1995 }
1879 1996
1880 // TODO(pthatcher): Look into removing duplicate code between 1997 // TODO(pthatcher): Look into removing duplicate code between
1881 // audio, video, and data, perhaps by using templates. 1998 // audio, video, and data, perhaps by using templates.
1882 void VideoChannel::OnMediaMonitorUpdate( 1999 void VideoChannel::OnMediaMonitorUpdate(
1883 VideoMediaChannel* media_channel, const VideoMediaInfo &info) { 2000 VideoMediaChannel* media_channel, const VideoMediaInfo &info) {
1884 ASSERT(media_channel == this->media_channel()); 2001 ASSERT(media_channel == this->media_channel());
1885 SignalMediaMonitor(this, info); 2002 SignalMediaMonitor(this, info);
1886 } 2003 }
1887 2004
1888 void VideoChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { 2005 void VideoChannel::GetSrtpCryptoSuites_n(
2006 std::vector<int>* crypto_suites) const {
1889 GetSupportedVideoCryptoSuites(crypto_suites); 2007 GetSupportedVideoCryptoSuites(crypto_suites);
1890 } 2008 }
1891 2009
1892 DataChannel::DataChannel(rtc::Thread* thread, 2010 DataChannel::DataChannel(rtc::Thread* worker_thread,
2011 rtc::Thread* network_thread,
1893 DataMediaChannel* media_channel, 2012 DataMediaChannel* media_channel,
1894 TransportController* transport_controller, 2013 TransportController* transport_controller,
1895 const std::string& content_name, 2014 const std::string& content_name,
1896 bool rtcp) 2015 bool rtcp)
1897 : BaseChannel(thread, 2016 : BaseChannel(worker_thread,
2017 network_thread,
1898 media_channel, 2018 media_channel,
1899 transport_controller, 2019 transport_controller,
1900 content_name, 2020 content_name,
1901 rtcp), 2021 rtcp),
1902 data_channel_type_(cricket::DCT_NONE), 2022 data_channel_type_(cricket::DCT_NONE),
1903 ready_to_send_data_(false) {} 2023 ready_to_send_data_(false) {}
1904 2024
1905 DataChannel::~DataChannel() { 2025 DataChannel::~DataChannel() {
1906 TRACE_EVENT0("webrtc", "DataChannel::~DataChannel"); 2026 TRACE_EVENT0("webrtc", "DataChannel::~DataChannel");
1907 StopMediaMonitor(); 2027 StopMediaMonitor();
1908 // this can't be done in the base class, since it calls a virtual 2028 // this can't be done in the base class, since it calls a virtual
1909 DisableMedia_w(); 2029 DisableMedia_w();
1910 2030
1911 Deinit(); 2031 Deinit();
1912 } 2032 }
1913 2033
1914 bool DataChannel::Init() { 2034 bool DataChannel::Init_w() {
1915 if (!BaseChannel::Init()) { 2035 if (!BaseChannel::Init_w()) {
1916 return false; 2036 return false;
1917 } 2037 }
1918 media_channel()->SignalDataReceived.connect( 2038 media_channel()->SignalDataReceived.connect(
1919 this, &DataChannel::OnDataReceived); 2039 this, &DataChannel::OnDataReceived);
1920 media_channel()->SignalReadyToSend.connect( 2040 media_channel()->SignalReadyToSend.connect(
1921 this, &DataChannel::OnDataChannelReadyToSend); 2041 this, &DataChannel::OnDataChannelReadyToSend);
1922 media_channel()->SignalStreamClosedRemotely.connect( 2042 media_channel()->SignalStreamClosedRemotely.connect(
1923 this, &DataChannel::OnStreamClosedRemotely); 2043 this, &DataChannel::OnStreamClosedRemotely);
1924 return true; 2044 return true;
1925 } 2045 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1991 if (!data) { 2111 if (!data) {
1992 SafeSetError("Can't find data content in local description.", error_desc); 2112 SafeSetError("Can't find data content in local description.", error_desc);
1993 return false; 2113 return false;
1994 } 2114 }
1995 2115
1996 if (!SetDataChannelTypeFromContent(data, error_desc)) { 2116 if (!SetDataChannelTypeFromContent(data, error_desc)) {
1997 return false; 2117 return false;
1998 } 2118 }
1999 2119
2000 if (data_channel_type_ == DCT_RTP) { 2120 if (data_channel_type_ == DCT_RTP) {
2001 if (!SetRtpTransportParameters_w(content, action, CS_LOCAL, error_desc)) { 2121 if (!SetRtpTransportParameters(content, action, CS_LOCAL, error_desc)) {
2002 return false; 2122 return false;
2003 } 2123 }
2004 } 2124 }
2005 2125
2006 // FYI: We send the SCTP port number (not to be confused with the 2126 // FYI: We send the SCTP port number (not to be confused with the
2007 // underlying UDP port number) as a codec parameter. So even SCTP 2127 // underlying UDP port number) as a codec parameter. So even SCTP
2008 // data channels need codecs. 2128 // data channels need codecs.
2009 DataRecvParameters recv_params = last_recv_params_; 2129 DataRecvParameters recv_params = last_recv_params_;
2010 RtpParametersFromMediaDescription(data, &recv_params); 2130 RtpParametersFromMediaDescription(data, &recv_params);
2011 if (!media_channel()->SetRecvParameters(recv_params)) { 2131 if (!media_channel()->SetRecvParameters(recv_params)) {
(...skipping 11 matching lines...) Expand all
2023 // TODO(pthatcher): Move local streams into DataSendParameters, and 2143 // TODO(pthatcher): Move local streams into DataSendParameters, and
2024 // only give it to the media channel once we have a remote 2144 // only give it to the media channel once we have a remote
2025 // description too (without a remote description, we won't be able 2145 // description too (without a remote description, we won't be able
2026 // to send them anyway). 2146 // to send them anyway).
2027 if (!UpdateLocalStreams_w(data->streams(), action, error_desc)) { 2147 if (!UpdateLocalStreams_w(data->streams(), action, error_desc)) {
2028 SafeSetError("Failed to set local data description streams.", error_desc); 2148 SafeSetError("Failed to set local data description streams.", error_desc);
2029 return false; 2149 return false;
2030 } 2150 }
2031 2151
2032 set_local_content_direction(content->direction()); 2152 set_local_content_direction(content->direction());
2033 ChangeState(); 2153 ChangeState_w();
2034 return true; 2154 return true;
2035 } 2155 }
2036 2156
2037 bool DataChannel::SetRemoteContent_w(const MediaContentDescription* content, 2157 bool DataChannel::SetRemoteContent_w(const MediaContentDescription* content,
2038 ContentAction action, 2158 ContentAction action,
2039 std::string* error_desc) { 2159 std::string* error_desc) {
2040 TRACE_EVENT0("webrtc", "DataChannel::SetRemoteContent_w"); 2160 TRACE_EVENT0("webrtc", "DataChannel::SetRemoteContent_w");
2041 ASSERT(worker_thread() == rtc::Thread::Current()); 2161 ASSERT(worker_thread() == rtc::Thread::Current());
2042 2162
2043 const DataContentDescription* data = 2163 const DataContentDescription* data =
2044 static_cast<const DataContentDescription*>(content); 2164 static_cast<const DataContentDescription*>(content);
2045 ASSERT(data != NULL); 2165 ASSERT(data != NULL);
2046 if (!data) { 2166 if (!data) {
2047 SafeSetError("Can't find data content in remote description.", error_desc); 2167 SafeSetError("Can't find data content in remote description.", error_desc);
2048 return false; 2168 return false;
2049 } 2169 }
2050 2170
2051 // If the remote data doesn't have codecs and isn't an update, it 2171 // If the remote data doesn't have codecs and isn't an update, it
2052 // must be empty, so ignore it. 2172 // must be empty, so ignore it.
2053 if (!data->has_codecs() && action != CA_UPDATE) { 2173 if (!data->has_codecs() && action != CA_UPDATE) {
2054 return true; 2174 return true;
2055 } 2175 }
2056 2176
2057 if (!SetDataChannelTypeFromContent(data, error_desc)) { 2177 if (!SetDataChannelTypeFromContent(data, error_desc)) {
2058 return false; 2178 return false;
2059 } 2179 }
2060 2180
2061 LOG(LS_INFO) << "Setting remote data description"; 2181 LOG(LS_INFO) << "Setting remote data description";
2062 if (data_channel_type_ == DCT_RTP && 2182 if (data_channel_type_ == DCT_RTP &&
2063 !SetRtpTransportParameters_w(content, action, CS_REMOTE, error_desc)) { 2183 !SetRtpTransportParameters(content, action, CS_REMOTE, error_desc)) {
2064 return false; 2184 return false;
2065 } 2185 }
2066 2186
2067 2187
2068 DataSendParameters send_params = last_send_params_; 2188 DataSendParameters send_params = last_send_params_;
2069 RtpSendParametersFromMediaDescription<DataCodec>(data, &send_params); 2189 RtpSendParametersFromMediaDescription<DataCodec>(data, &send_params);
2070 if (!media_channel()->SetSendParameters(send_params)) { 2190 if (!media_channel()->SetSendParameters(send_params)) {
2071 SafeSetError("Failed to set remote data description send parameters.", 2191 SafeSetError("Failed to set remote data description send parameters.",
2072 error_desc); 2192 error_desc);
2073 return false; 2193 return false;
2074 } 2194 }
2075 last_send_params_ = send_params; 2195 last_send_params_ = send_params;
2076 2196
2077 // TODO(pthatcher): Move remote streams into DataRecvParameters, 2197 // TODO(pthatcher): Move remote streams into DataRecvParameters,
2078 // and only give it to the media channel once we have a local 2198 // and only give it to the media channel once we have a local
2079 // description too (without a local description, we won't be able to 2199 // description too (without a local description, we won't be able to
2080 // recv them anyway). 2200 // recv them anyway).
2081 if (!UpdateRemoteStreams_w(data->streams(), action, error_desc)) { 2201 if (!UpdateRemoteStreams_w(data->streams(), action, error_desc)) {
2082 SafeSetError("Failed to set remote data description streams.", 2202 SafeSetError("Failed to set remote data description streams.",
2083 error_desc); 2203 error_desc);
2084 return false; 2204 return false;
2085 } 2205 }
2086 2206
2087 set_remote_content_direction(content->direction()); 2207 set_remote_content_direction(content->direction());
2088 ChangeState(); 2208 ChangeState_w();
2089 return true; 2209 return true;
2090 } 2210 }
2091 2211
2092 void DataChannel::ChangeState() { 2212 void DataChannel::ChangeState_w() {
2093 // Render incoming data if we're the active call, and we have the local 2213 // Render incoming data if we're the active call, and we have the local
2094 // content. We receive data on the default channel and multiplexed streams. 2214 // content. We receive data on the default channel and multiplexed streams.
2095 bool recv = IsReadyToReceive(); 2215 bool recv = IsReadyToReceive_w();
2096 if (!media_channel()->SetReceive(recv)) { 2216 if (!media_channel()->SetReceive(recv)) {
2097 LOG(LS_ERROR) << "Failed to SetReceive on data channel"; 2217 LOG(LS_ERROR) << "Failed to SetReceive on data channel";
2098 } 2218 }
2099 2219
2100 // Send outgoing data if we're the active call, we have the remote content, 2220 // Send outgoing data if we're the active call, we have the remote content,
2101 // and we have had some form of connectivity. 2221 // and we have had some form of connectivity.
2102 bool send = IsReadyToSend(); 2222 bool send = IsReadyToSend_w();
2103 if (!media_channel()->SetSend(send)) { 2223 if (!media_channel()->SetSend(send)) {
2104 LOG(LS_ERROR) << "Failed to SetSend on data channel"; 2224 LOG(LS_ERROR) << "Failed to SetSend on data channel";
2105 } 2225 }
2106 2226
2107 // Trigger SignalReadyToSendData asynchronously. 2227 // Trigger SignalReadyToSendData asynchronously.
2108 OnDataChannelReadyToSend(send); 2228 OnDataChannelReadyToSend(send);
2109 2229
2110 LOG(LS_INFO) << "Changing data state, recv=" << recv << " send=" << send; 2230 LOG(LS_INFO) << "Changing data state, recv=" << recv << " send=" << send;
2111 } 2231 }
2112 2232
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2188 } 2308 }
2189 2309
2190 void DataChannel::OnDataChannelReadyToSend(bool writable) { 2310 void DataChannel::OnDataChannelReadyToSend(bool writable) {
2191 // This is usded for congestion control to indicate that the stream is ready 2311 // This is usded for congestion control to indicate that the stream is ready
2192 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates 2312 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates
2193 // that the transport channel is ready. 2313 // that the transport channel is ready.
2194 signaling_thread()->Post(this, MSG_READYTOSENDDATA, 2314 signaling_thread()->Post(this, MSG_READYTOSENDDATA,
2195 new DataChannelReadyToSendMessageData(writable)); 2315 new DataChannelReadyToSendMessageData(writable));
2196 } 2316 }
2197 2317
2198 void DataChannel::GetSrtpCryptoSuites(std::vector<int>* crypto_suites) const { 2318 void DataChannel::GetSrtpCryptoSuites_n(std::vector<int>* crypto_suites) const {
2199 GetSupportedDataCryptoSuites(crypto_suites); 2319 GetSupportedDataCryptoSuites(crypto_suites);
2200 } 2320 }
2201 2321
2202 bool DataChannel::ShouldSetupDtlsSrtp() const { 2322 bool DataChannel::ShouldSetupDtlsSrtp_n() const {
2203 return (data_channel_type_ == DCT_RTP) && BaseChannel::ShouldSetupDtlsSrtp(); 2323 return data_channel_type_ == DCT_RTP && BaseChannel::ShouldSetupDtlsSrtp_n();
2204 } 2324 }
2205 2325
2206 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { 2326 void DataChannel::OnStreamClosedRemotely(uint32_t sid) {
2207 rtc::TypedMessageData<uint32_t>* message = 2327 rtc::TypedMessageData<uint32_t>* message =
2208 new rtc::TypedMessageData<uint32_t>(sid); 2328 new rtc::TypedMessageData<uint32_t>(sid);
2209 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); 2329 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message);
2210 } 2330 }
2211 2331
2212 } // namespace cricket 2332 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/pc/channel.h ('k') | webrtc/pc/channel_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698