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

Side by Side Diff: talk/session/media/channel.cc

Issue 1246913005: TransportController refactoring (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixed bugs with ICE connection state that occur when destroying transports Created 5 years, 3 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
OLDNEW
1 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2004 Google Inc. 3 * Copyright 2004 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 163
164 template <class Codec, class Options> 164 template <class Codec, class Options>
165 void RtpSendParametersFromMediaDescription( 165 void RtpSendParametersFromMediaDescription(
166 const MediaContentDescriptionImpl<Codec>* desc, 166 const MediaContentDescriptionImpl<Codec>* desc,
167 RtpSendParameters<Codec, Options>* send_params) { 167 RtpSendParameters<Codec, Options>* send_params) {
168 RtpParametersFromMediaDescription(desc, send_params); 168 RtpParametersFromMediaDescription(desc, send_params);
169 send_params->max_bandwidth_bps = desc->bandwidth(); 169 send_params->max_bandwidth_bps = desc->bandwidth();
170 } 170 }
171 171
172 BaseChannel::BaseChannel(rtc::Thread* thread, 172 BaseChannel::BaseChannel(rtc::Thread* thread,
173 MediaChannel* media_channel, BaseSession* session, 173 MediaChannel* media_channel,
174 const std::string& content_name, bool rtcp) 174 TransportController* transport_controller,
175 const std::string& content_name,
176 bool rtcp)
175 : worker_thread_(thread), 177 : worker_thread_(thread),
176 session_(session), 178 transport_controller_(transport_controller),
177 media_channel_(media_channel), 179 media_channel_(media_channel),
178 content_name_(content_name), 180 content_name_(content_name),
179 rtcp_(rtcp), 181 rtcp_transport_enabled_(rtcp),
180 transport_channel_(NULL), 182 transport_channel_(nullptr),
181 rtcp_transport_channel_(NULL), 183 rtcp_transport_channel_(nullptr),
182 enabled_(false), 184 enabled_(false),
183 writable_(false), 185 writable_(false),
184 rtp_ready_to_send_(false), 186 rtp_ready_to_send_(false),
185 rtcp_ready_to_send_(false), 187 rtcp_ready_to_send_(false),
186 was_ever_writable_(false), 188 was_ever_writable_(false),
187 local_content_direction_(MD_INACTIVE), 189 local_content_direction_(MD_INACTIVE),
188 remote_content_direction_(MD_INACTIVE), 190 remote_content_direction_(MD_INACTIVE),
189 has_received_packet_(false), 191 has_received_packet_(false),
190 dtls_keyed_(false), 192 dtls_keyed_(false),
191 secure_required_(false), 193 secure_required_(false),
192 rtp_abs_sendtime_extn_id_(-1) { 194 rtp_abs_sendtime_extn_id_(-1) {
193 ASSERT(worker_thread_ == rtc::Thread::Current()); 195 ASSERT(worker_thread_ == rtc::Thread::Current());
194 LOG(LS_INFO) << "Created channel for " << content_name; 196 LOG(LS_INFO) << "Created channel for " << content_name;
195 } 197 }
196 198
197 BaseChannel::~BaseChannel() { 199 BaseChannel::~BaseChannel() {
198 ASSERT(worker_thread_ == rtc::Thread::Current()); 200 ASSERT(worker_thread_ == rtc::Thread::Current());
199 Deinit(); 201 Deinit();
200 StopConnectionMonitor(); 202 StopConnectionMonitor();
201 FlushRtcpMessages(); // Send any outstanding RTCP packets. 203 FlushRtcpMessages(); // Send any outstanding RTCP packets.
202 worker_thread_->Clear(this); // eats any outstanding messages or packets 204 worker_thread_->Clear(this); // eats any outstanding messages or packets
203 // We must destroy the media channel before the transport channel, otherwise 205 // We must destroy the media channel before the transport channel, otherwise
204 // the media channel may try to send on the dead transport channel. NULLing 206 // the media channel may try to send on the dead transport channel. NULLing
205 // is not an effective strategy since the sends will come on another thread. 207 // is not an effective strategy since the sends will come on another thread.
206 delete media_channel_; 208 delete media_channel_;
207 set_transport_channel(nullptr); 209 // Note that we don't just call set_transport_channel(nullptr) because that
208 set_rtcp_transport_channel(nullptr); 210 // would call a pure virtual method which we can't do from a destructor.
211 if (transport_channel_) {
212 DisconnectFromTransportChannel(transport_channel_);
213 transport_controller_->DestroyTransportChannel_w(
214 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP);
215 }
216 if (rtcp_transport_channel_) {
217 DisconnectFromTransportChannel(rtcp_transport_channel_);
218 transport_controller_->DestroyTransportChannel_w(
219 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
220 }
209 LOG(LS_INFO) << "Destroyed channel"; 221 LOG(LS_INFO) << "Destroyed channel";
210 } 222 }
211 223
212 bool BaseChannel::Init() { 224 bool BaseChannel::Init() {
213 if (!SetTransportChannels(session(), rtcp())) { 225 if (!SetTransport(content_name())) {
214 return false; 226 return false;
215 } 227 }
216 228
217 if (!SetDtlsSrtpCiphers(transport_channel(), false)) { 229 if (!SetDtlsSrtpCiphers(transport_channel(), false)) {
218 return false; 230 return false;
219 } 231 }
220 if (rtcp() && !SetDtlsSrtpCiphers(rtcp_transport_channel(), true)) { 232 if (rtcp_transport_enabled() &&
233 !SetDtlsSrtpCiphers(rtcp_transport_channel(), true)) {
221 return false; 234 return false;
222 } 235 }
223 236
224 // Both RTP and RTCP channels are set, we can call SetInterface on 237 // Both RTP and RTCP channels are set, we can call SetInterface on
225 // media channel and it can set network options. 238 // media channel and it can set network options.
226 media_channel_->SetInterface(this); 239 media_channel_->SetInterface(this);
227 return true; 240 return true;
228 } 241 }
229 242
230 void BaseChannel::Deinit() { 243 void BaseChannel::Deinit() {
231 media_channel_->SetInterface(NULL); 244 media_channel_->SetInterface(NULL);
232 } 245 }
233 246
234 bool BaseChannel::SetTransportChannels(BaseSession* session, bool rtcp) { 247 bool BaseChannel::SetTransport(const std::string& transport_name) {
235 return worker_thread_->Invoke<bool>(Bind( 248 return worker_thread_->Invoke<bool>(
236 &BaseChannel::SetTransportChannels_w, this, session, rtcp)); 249 Bind(&BaseChannel::SetTransport_w, this, transport_name));
237 } 250 }
238 251
239 bool BaseChannel::SetTransportChannels_w(BaseSession* session, bool rtcp) { 252 bool BaseChannel::SetTransport_w(const std::string& transport_name) {
240 ASSERT(worker_thread_ == rtc::Thread::Current()); 253 ASSERT(worker_thread_ == rtc::Thread::Current());
241 254
242 set_transport_channel(session->CreateChannel( 255 if (transport_name == transport_name_) {
243 content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTP)); 256 // Nothing to do if transport name isn't changing
257 return true;
258 }
259
260 set_transport_channel(transport_controller_->CreateTransportChannel_w(
261 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP));
244 if (!transport_channel()) { 262 if (!transport_channel()) {
245 return false; 263 return false;
246 } 264 }
247 if (rtcp) { 265 if (rtcp_transport_enabled()) {
248 set_rtcp_transport_channel(session->CreateChannel( 266 LOG(LS_INFO) << "Create RTCP TransportChannel for " << content_name()
249 content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTCP)); 267 << " on " << transport_name << " transport ";
268 set_rtcp_transport_channel(transport_controller_->CreateTransportChannel_w(
269 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP));
250 if (!rtcp_transport_channel()) { 270 if (!rtcp_transport_channel()) {
251 return false; 271 return false;
252 } 272 }
253 } else {
254 set_rtcp_transport_channel(nullptr);
255 } 273 }
256 274
275 transport_name_ = transport_name;
257 return true; 276 return true;
258 } 277 }
259 278
260 void BaseChannel::set_transport_channel(TransportChannel* new_tc) { 279 void BaseChannel::set_transport_channel(TransportChannel* new_tc) {
261 ASSERT(worker_thread_ == rtc::Thread::Current()); 280 ASSERT(worker_thread_ == rtc::Thread::Current());
262 281
263 TransportChannel* old_tc = transport_channel_; 282 TransportChannel* old_tc = transport_channel_;
264 283 if (!old_tc && !new_tc) {
265 if (old_tc == new_tc) { 284 // Nothing to do
266 return; 285 return;
267 } 286 }
287 ASSERT(old_tc != new_tc);
288
268 if (old_tc) { 289 if (old_tc) {
269 DisconnectFromTransportChannel(old_tc); 290 DisconnectFromTransportChannel(old_tc);
270 session()->DestroyChannel( 291 transport_controller_->DestroyTransportChannel_w(
271 content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTP); 292 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP);
272 } 293 }
273 294
274 transport_channel_ = new_tc; 295 transport_channel_ = new_tc;
275 296
276 if (new_tc) { 297 if (new_tc) {
277 ConnectToTransportChannel(new_tc); 298 ConnectToTransportChannel(new_tc);
299 for (const auto& pair : socket_options_) {
300 new_tc->SetOption(pair.first, pair.second);
301 }
278 } 302 }
303
304 // Update aggregate writable/ready-to-send state between RTP and RTCP upon
305 // setting new channel
306 UpdateWritableState_w();
307 SetReadyToSend(false, new_tc && new_tc->writable());
279 } 308 }
280 309
281 void BaseChannel::set_rtcp_transport_channel(TransportChannel* new_tc) { 310 void BaseChannel::set_rtcp_transport_channel(TransportChannel* new_tc) {
282 ASSERT(worker_thread_ == rtc::Thread::Current()); 311 ASSERT(worker_thread_ == rtc::Thread::Current());
283 312
284 TransportChannel* old_tc = rtcp_transport_channel_; 313 TransportChannel* old_tc = rtcp_transport_channel_;
285 314 if (!old_tc && !new_tc) {
286 if (old_tc == new_tc) { 315 // Nothing to do
287 return; 316 return;
288 } 317 }
318 ASSERT(old_tc != new_tc);
319
289 if (old_tc) { 320 if (old_tc) {
290 DisconnectFromTransportChannel(old_tc); 321 DisconnectFromTransportChannel(old_tc);
291 session()->DestroyChannel( 322 transport_controller_->DestroyTransportChannel_w(
292 content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTCP); 323 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
293 } 324 }
294 325
295 rtcp_transport_channel_ = new_tc; 326 rtcp_transport_channel_ = new_tc;
296 327
297 if (new_tc) { 328 if (new_tc) {
298 ConnectToTransportChannel(new_tc); 329 ConnectToTransportChannel(new_tc);
330 for (const auto& pair : rtcp_socket_options_) {
331 new_tc->SetOption(pair.first, pair.second);
332 }
299 } 333 }
334
335 // Update aggregate writable/ready-to-send state between RTP and RTCP upon
336 // setting new channel
337 UpdateWritableState_w();
338 SetReadyToSend(true, new_tc && new_tc->writable());
300 } 339 }
301 340
302 void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) { 341 void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) {
303 ASSERT(worker_thread_ == rtc::Thread::Current()); 342 ASSERT(worker_thread_ == rtc::Thread::Current());
304 343
305 tc->SignalWritableState.connect(this, &BaseChannel::OnWritableState); 344 tc->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
306 tc->SignalReadPacket.connect(this, &BaseChannel::OnChannelRead); 345 tc->SignalReadPacket.connect(this, &BaseChannel::OnChannelRead);
307 tc->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend); 346 tc->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend);
308 } 347 }
309 348
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 rtc::DiffServCodePoint dscp) { 447 rtc::DiffServCodePoint dscp) {
409 return SendPacket(true, packet, dscp); 448 return SendPacket(true, packet, dscp);
410 } 449 }
411 450
412 int BaseChannel::SetOption(SocketType type, rtc::Socket::Option opt, 451 int BaseChannel::SetOption(SocketType type, rtc::Socket::Option opt,
413 int value) { 452 int value) {
414 TransportChannel* channel = NULL; 453 TransportChannel* channel = NULL;
415 switch (type) { 454 switch (type) {
416 case ST_RTP: 455 case ST_RTP:
417 channel = transport_channel_; 456 channel = transport_channel_;
457 socket_options_.push_back(
458 std::pair<rtc::Socket::Option, int>(opt, value));
418 break; 459 break;
419 case ST_RTCP: 460 case ST_RTCP:
420 channel = rtcp_transport_channel_; 461 channel = rtcp_transport_channel_;
462 rtcp_socket_options_.push_back(
463 std::pair<rtc::Socket::Option, int>(opt, value));
421 break; 464 break;
422 } 465 }
423 return channel ? channel->SetOption(opt, value) : -1; 466 return channel ? channel->SetOption(opt, value) : -1;
424 } 467 }
425 468
426 void BaseChannel::OnWritableState(TransportChannel* channel) { 469 void BaseChannel::OnWritableState(TransportChannel* channel) {
427 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); 470 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_);
428 if (transport_channel_->writable() 471 UpdateWritableState_w();
429 && (!rtcp_transport_channel_ || rtcp_transport_channel_->writable())) {
430 ChannelWritable_w();
431 } else {
432 ChannelNotWritable_w();
433 }
434 } 472 }
435 473
436 void BaseChannel::OnChannelRead(TransportChannel* channel, 474 void BaseChannel::OnChannelRead(TransportChannel* channel,
437 const char* data, size_t len, 475 const char* data, size_t len,
438 const rtc::PacketTime& packet_time, 476 const rtc::PacketTime& packet_time,
439 int flags) { 477 int flags) {
440 // OnChannelRead gets called from P2PSocket; now pass data to MediaEngine 478 // OnChannelRead gets called from P2PSocket; now pass data to MediaEngine
441 ASSERT(worker_thread_ == rtc::Thread::Current()); 479 ASSERT(worker_thread_ == rtc::Thread::Current());
442 480
443 // When using RTCP multiplexing we might get RTCP packets on the RTP 481 // When using RTCP multiplexing we might get RTCP packets on the RTP
444 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. 482 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP.
445 bool rtcp = PacketIsRtcp(channel, data, len); 483 bool rtcp = PacketIsRtcp(channel, data, len);
446 rtc::Buffer packet(data, len); 484 rtc::Buffer packet(data, len);
447 HandlePacket(rtcp, &packet, packet_time); 485 HandlePacket(rtcp, &packet, packet_time);
448 } 486 }
449 487
450 void BaseChannel::OnReadyToSend(TransportChannel* channel) { 488 void BaseChannel::OnReadyToSend(TransportChannel* channel) {
451 SetReadyToSend(channel, true); 489 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_);
490 SetReadyToSend(channel == rtcp_transport_channel_, true);
452 } 491 }
453 492
454 void BaseChannel::SetReadyToSend(TransportChannel* channel, bool ready) { 493 void BaseChannel::SetReadyToSend(bool rtcp, bool ready) {
455 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); 494 if (rtcp) {
456 if (channel == transport_channel_) { 495 rtcp_ready_to_send_ = ready;
496 } else {
457 rtp_ready_to_send_ = ready; 497 rtp_ready_to_send_ = ready;
458 } 498 }
459 if (channel == rtcp_transport_channel_) {
460 rtcp_ready_to_send_ = ready;
461 }
462 499
463 if (!ready) { 500 if (rtp_ready_to_send_ &&
501 // In the case of rtcp mux |rtcp_transport_channel_| will be null.
502 (rtcp_ready_to_send_ || !rtcp_transport_channel_)) {
503 // Notify the MediaChannel when both rtp and rtcp channel can send.
504 media_channel_->OnReadyToSend(true);
505 } else {
464 // Notify the MediaChannel when either rtp or rtcp channel can't send. 506 // Notify the MediaChannel when either rtp or rtcp channel can't send.
465 media_channel_->OnReadyToSend(false); 507 media_channel_->OnReadyToSend(false);
466 } else if (rtp_ready_to_send_ &&
467 // In the case of rtcp mux |rtcp_transport_channel_| will be null.
468 (rtcp_ready_to_send_ || !rtcp_transport_channel_)) {
469 // Notify the MediaChannel when both rtp and rtcp channel can send.
470 media_channel_->OnReadyToSend(true);
471 } 508 }
472 } 509 }
473 510
474 bool BaseChannel::PacketIsRtcp(const TransportChannel* channel, 511 bool BaseChannel::PacketIsRtcp(const TransportChannel* channel,
475 const char* data, size_t len) { 512 const char* data, size_t len) {
476 return (channel == rtcp_transport_channel_ || 513 return (channel == rtcp_transport_channel_ ||
477 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); 514 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len)));
478 } 515 }
479 516
480 bool BaseChannel::SendPacket(bool rtcp, rtc::Buffer* packet, 517 bool BaseChannel::SendPacket(bool rtcp, rtc::Buffer* packet,
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 return false; 619 return false;
583 } 620 }
584 621
585 // Bon voyage. 622 // Bon voyage.
586 int ret = 623 int ret =
587 channel->SendPacket(packet->data<char>(), packet->size(), options, 624 channel->SendPacket(packet->data<char>(), packet->size(), options,
588 (secure() && secure_dtls()) ? PF_SRTP_BYPASS : 0); 625 (secure() && secure_dtls()) ? PF_SRTP_BYPASS : 0);
589 if (ret != static_cast<int>(packet->size())) { 626 if (ret != static_cast<int>(packet->size())) {
590 if (channel->GetError() == EWOULDBLOCK) { 627 if (channel->GetError() == EWOULDBLOCK) {
591 LOG(LS_WARNING) << "Got EWOULDBLOCK from socket."; 628 LOG(LS_WARNING) << "Got EWOULDBLOCK from socket.";
592 SetReadyToSend(channel, false); 629 SetReadyToSend(rtcp, false);
593 } 630 }
594 return false; 631 return false;
595 } 632 }
596 return true; 633 return true;
597 } 634 }
598 635
599 bool BaseChannel::WantsPacket(bool rtcp, rtc::Buffer* packet) { 636 bool BaseChannel::WantsPacket(bool rtcp, rtc::Buffer* packet) {
600 // Protect ourselves against crazy data. 637 // Protect ourselves against crazy data.
601 if (!ValidPacket(rtcp, packet)) { 638 if (!ValidPacket(rtcp, packet)) {
602 LOG(LS_ERROR) << "Dropping incoming " << content_name_ << " " 639 LOG(LS_ERROR) << "Dropping incoming " << content_name_ << " "
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 muted_streams_.erase(ssrc); 770 muted_streams_.erase(ssrc);
734 } 771 }
735 return ret; 772 return ret;
736 } 773 }
737 774
738 bool BaseChannel::IsStreamMuted_w(uint32 ssrc) { 775 bool BaseChannel::IsStreamMuted_w(uint32 ssrc) {
739 ASSERT(worker_thread_ == rtc::Thread::Current()); 776 ASSERT(worker_thread_ == rtc::Thread::Current());
740 return muted_streams_.find(ssrc) != muted_streams_.end(); 777 return muted_streams_.find(ssrc) != muted_streams_.end();
741 } 778 }
742 779
780 void BaseChannel::UpdateWritableState_w() {
781 if (transport_channel_ && transport_channel_->writable() &&
782 (!rtcp_transport_channel_ || rtcp_transport_channel_->writable())) {
783 ChannelWritable_w();
784 } else {
785 ChannelNotWritable_w();
786 }
787 }
788
743 void BaseChannel::ChannelWritable_w() { 789 void BaseChannel::ChannelWritable_w() {
744 ASSERT(worker_thread_ == rtc::Thread::Current()); 790 ASSERT(worker_thread_ == rtc::Thread::Current());
745 if (writable_) 791 if (writable_)
746 return; 792 return;
747 793
748 LOG(LS_INFO) << "Channel socket writable (" 794 LOG(LS_INFO) << "Channel writable (" << content_name_ << ")"
749 << transport_channel_->content_name() << ", "
750 << transport_channel_->component() << ")"
751 << (was_ever_writable_ ? "" : " for the first time"); 795 << (was_ever_writable_ ? "" : " for the first time");
752 796
753 std::vector<ConnectionInfo> infos; 797 std::vector<ConnectionInfo> infos;
754 transport_channel_->GetStats(&infos); 798 transport_channel_->GetStats(&infos);
755 for (std::vector<ConnectionInfo>::const_iterator it = infos.begin(); 799 for (std::vector<ConnectionInfo>::const_iterator it = infos.begin();
756 it != infos.end(); ++it) { 800 it != infos.end(); ++it) {
757 if (it->best_connection) { 801 if (it->best_connection) {
758 LOG(LS_INFO) << "Using " << it->local_candidate.ToSensitiveString() 802 LOG(LS_INFO) << "Using " << it->local_candidate.ToSensitiveString()
759 << "->" << it->remote_candidate.ToSensitiveString(); 803 << "->" << it->remote_candidate.ToSensitiveString();
760 break; 804 break;
761 } 805 }
762 } 806 }
763 807
764 // If we're doing DTLS-SRTP, now is the time. 808 // If we're doing DTLS-SRTP, now is the time.
765 if (!was_ever_writable_ && ShouldSetupDtlsSrtp()) { 809 if (!was_ever_writable_ && ShouldSetupDtlsSrtp()) {
766 if (!SetupDtlsSrtp(false)) { 810 if (!SetupDtlsSrtp(false)) {
767 SignalDtlsSetupFailure(this, false); 811 SignalDtlsSetupFailure_w(false);
768 return; 812 return;
769 } 813 }
770 814
771 if (rtcp_transport_channel_) { 815 if (rtcp_transport_channel_) {
772 if (!SetupDtlsSrtp(true)) { 816 if (!SetupDtlsSrtp(true)) {
773 SignalDtlsSetupFailure(this, true); 817 SignalDtlsSetupFailure_w(true);
774 return; 818 return;
775 } 819 }
776 } 820 }
777 } 821 }
778 822
779 was_ever_writable_ = true; 823 was_ever_writable_ = true;
780 writable_ = true; 824 writable_ = true;
781 ChangeState(); 825 ChangeState();
782 } 826 }
783 827
(...skipping 22 matching lines...) Expand all
806 850
807 bool BaseChannel::ShouldSetupDtlsSrtp() const { 851 bool BaseChannel::ShouldSetupDtlsSrtp() const {
808 return true; 852 return true;
809 } 853 }
810 854
811 // This function returns true if either DTLS-SRTP is not in use 855 // This function returns true if either DTLS-SRTP is not in use
812 // *or* DTLS-SRTP is successfully set up. 856 // *or* DTLS-SRTP is successfully set up.
813 bool BaseChannel::SetupDtlsSrtp(bool rtcp_channel) { 857 bool BaseChannel::SetupDtlsSrtp(bool rtcp_channel) {
814 bool ret = false; 858 bool ret = false;
815 859
816 TransportChannel *channel = rtcp_channel ? 860 TransportChannel* channel =
817 rtcp_transport_channel_ : transport_channel_; 861 rtcp_channel ? rtcp_transport_channel_ : transport_channel_;
818 862
819 // No DTLS 863 // No DTLS
820 if (!channel->IsDtlsActive()) 864 if (!channel->IsDtlsActive())
821 return true; 865 return true;
822 866
823 std::string selected_cipher; 867 std::string selected_cipher;
824 868
825 if (!channel->GetSrtpCipher(&selected_cipher)) { 869 if (!channel->GetSrtpCipher(&selected_cipher)) {
826 LOG(LS_ERROR) << "No DTLS-SRTP selected cipher"; 870 LOG(LS_ERROR) << "No DTLS-SRTP selected cipher";
827 return false; 871 return false;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 dtls_keyed_ = true; 946 dtls_keyed_ = true;
903 947
904 return ret; 948 return ret;
905 } 949 }
906 950
907 void BaseChannel::ChannelNotWritable_w() { 951 void BaseChannel::ChannelNotWritable_w() {
908 ASSERT(worker_thread_ == rtc::Thread::Current()); 952 ASSERT(worker_thread_ == rtc::Thread::Current());
909 if (!writable_) 953 if (!writable_)
910 return; 954 return;
911 955
912 LOG(LS_INFO) << "Channel socket not writable (" 956 LOG(LS_INFO) << "Channel not writable (" << content_name_ << ")";
913 << transport_channel_->content_name() << ", "
914 << transport_channel_->component() << ")";
915 writable_ = false; 957 writable_ = false;
916 ChangeState(); 958 ChangeState();
917 } 959 }
918 960
919 bool BaseChannel::SetRtpTransportParameters_w( 961 bool BaseChannel::SetRtpTransportParameters_w(
920 const MediaContentDescription* content, 962 const MediaContentDescription* content,
921 ContentAction action, 963 ContentAction action,
922 ContentSource src, 964 ContentSource src,
923 std::string* error_desc) { 965 std::string* error_desc) {
924 if (action == CA_UPDATE) { 966 if (action == CA_UPDATE) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 } 1045 }
1004 1046
1005 void BaseChannel::ActivateRtcpMux() { 1047 void BaseChannel::ActivateRtcpMux() {
1006 worker_thread_->Invoke<void>(Bind( 1048 worker_thread_->Invoke<void>(Bind(
1007 &BaseChannel::ActivateRtcpMux_w, this)); 1049 &BaseChannel::ActivateRtcpMux_w, this));
1008 } 1050 }
1009 1051
1010 void BaseChannel::ActivateRtcpMux_w() { 1052 void BaseChannel::ActivateRtcpMux_w() {
1011 if (!rtcp_mux_filter_.IsActive()) { 1053 if (!rtcp_mux_filter_.IsActive()) {
1012 rtcp_mux_filter_.SetActive(); 1054 rtcp_mux_filter_.SetActive();
1013 set_rtcp_transport_channel(NULL); 1055 set_rtcp_transport_channel(nullptr);
1056 rtcp_transport_enabled_ = false;
1014 } 1057 }
1015 } 1058 }
1016 1059
1017 bool BaseChannel::SetRtcpMux_w(bool enable, ContentAction action, 1060 bool BaseChannel::SetRtcpMux_w(bool enable, ContentAction action,
1018 ContentSource src, 1061 ContentSource src,
1019 std::string* error_desc) { 1062 std::string* error_desc) {
1020 bool ret = false; 1063 bool ret = false;
1021 switch (action) { 1064 switch (action) {
1022 case CA_OFFER: 1065 case CA_OFFER:
1023 ret = rtcp_mux_filter_.SetOffer(enable, src); 1066 ret = rtcp_mux_filter_.SetOffer(enable, src);
1024 break; 1067 break;
1025 case CA_PRANSWER: 1068 case CA_PRANSWER:
1026 ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src); 1069 ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src);
1027 break; 1070 break;
1028 case CA_ANSWER: 1071 case CA_ANSWER:
1029 ret = rtcp_mux_filter_.SetAnswer(enable, src); 1072 ret = rtcp_mux_filter_.SetAnswer(enable, src);
1030 if (ret && rtcp_mux_filter_.IsActive()) { 1073 if (ret && rtcp_mux_filter_.IsActive()) {
1031 // We activated RTCP mux, close down the RTCP transport. 1074 // We activated RTCP mux, close down the RTCP transport.
1032 set_rtcp_transport_channel(NULL); 1075 LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name()
1076 << " by destroying RTCP transport channel for "
1077 << transport_name();
1078 set_rtcp_transport_channel(nullptr);
1079 rtcp_transport_enabled_ = false;
1033 } 1080 }
1034 break; 1081 break;
1035 case CA_UPDATE: 1082 case CA_UPDATE:
1036 // No RTCP mux info. 1083 // No RTCP mux info.
1037 ret = true; 1084 ret = true;
1038 break; 1085 break;
1039 default: 1086 default:
1040 break; 1087 break;
1041 } 1088 }
1042 if (!ret) { 1089 if (!ret) {
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
1249 worker_thread_->Clear(this, MSG_RTCPPACKET, &rtcp_messages); 1296 worker_thread_->Clear(this, MSG_RTCPPACKET, &rtcp_messages);
1250 for (rtc::MessageList::iterator it = rtcp_messages.begin(); 1297 for (rtc::MessageList::iterator it = rtcp_messages.begin();
1251 it != rtcp_messages.end(); ++it) { 1298 it != rtcp_messages.end(); ++it) {
1252 worker_thread_->Send(this, MSG_RTCPPACKET, it->pdata); 1299 worker_thread_->Send(this, MSG_RTCPPACKET, it->pdata);
1253 } 1300 }
1254 } 1301 }
1255 1302
1256 VoiceChannel::VoiceChannel(rtc::Thread* thread, 1303 VoiceChannel::VoiceChannel(rtc::Thread* thread,
1257 MediaEngineInterface* media_engine, 1304 MediaEngineInterface* media_engine,
1258 VoiceMediaChannel* media_channel, 1305 VoiceMediaChannel* media_channel,
1259 BaseSession* session, 1306 TransportController* transport_controller,
1260 const std::string& content_name, 1307 const std::string& content_name,
1261 bool rtcp) 1308 bool rtcp)
1262 : BaseChannel(thread, media_channel, session, content_name, 1309 : BaseChannel(thread,
1310 media_channel,
1311 transport_controller,
1312 content_name,
1263 rtcp), 1313 rtcp),
1264 media_engine_(media_engine), 1314 media_engine_(media_engine),
1265 received_media_(false) { 1315 received_media_(false) {
1266 } 1316 }
1267 1317
1268 VoiceChannel::~VoiceChannel() { 1318 VoiceChannel::~VoiceChannel() {
1269 StopAudioMonitor(); 1319 StopAudioMonitor();
1270 StopMediaMonitor(); 1320 StopMediaMonitor();
1271 // this can't be done in the base class, since it calls a virtual 1321 // this can't be done in the base class, since it calls a virtual
1272 DisableMedia_w(); 1322 DisableMedia_w();
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after
1628 break; 1678 break;
1629 } 1679 }
1630 } 1680 }
1631 1681
1632 void VoiceChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const { 1682 void VoiceChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const {
1633 GetSupportedAudioCryptoSuites(ciphers); 1683 GetSupportedAudioCryptoSuites(ciphers);
1634 } 1684 }
1635 1685
1636 VideoChannel::VideoChannel(rtc::Thread* thread, 1686 VideoChannel::VideoChannel(rtc::Thread* thread,
1637 VideoMediaChannel* media_channel, 1687 VideoMediaChannel* media_channel,
1638 BaseSession* session, 1688 TransportController* transport_controller,
1639 const std::string& content_name, 1689 const std::string& content_name,
1640 bool rtcp) 1690 bool rtcp)
1641 : BaseChannel(thread, media_channel, session, content_name, 1691 : BaseChannel(thread,
1692 media_channel,
1693 transport_controller,
1694 content_name,
1642 rtcp), 1695 rtcp),
1643 renderer_(NULL), 1696 renderer_(NULL),
1644 previous_we_(rtc::WE_CLOSE) { 1697 previous_we_(rtc::WE_CLOSE) {
1645 } 1698 }
1646 1699
1647 bool VideoChannel::Init() { 1700 bool VideoChannel::Init() {
1648 if (!BaseChannel::Init()) { 1701 if (!BaseChannel::Init()) {
1649 return false; 1702 return false;
1650 } 1703 }
1651 media_channel()->SignalMediaError.connect( 1704 media_channel()->SignalMediaError.connect(
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
2066 } 2119 }
2067 } 2120 }
2068 2121
2069 2122
2070 void VideoChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const { 2123 void VideoChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const {
2071 GetSupportedVideoCryptoSuites(ciphers); 2124 GetSupportedVideoCryptoSuites(ciphers);
2072 } 2125 }
2073 2126
2074 DataChannel::DataChannel(rtc::Thread* thread, 2127 DataChannel::DataChannel(rtc::Thread* thread,
2075 DataMediaChannel* media_channel, 2128 DataMediaChannel* media_channel,
2076 BaseSession* session, 2129 TransportController* transport_controller,
2077 const std::string& content_name, 2130 const std::string& content_name,
2078 bool rtcp) 2131 bool rtcp)
2079 : BaseChannel(thread, media_channel, session, content_name, rtcp), 2132 : BaseChannel(thread,
2133 media_channel,
2134 transport_controller,
2135 content_name,
2136 rtcp),
2080 data_channel_type_(cricket::DCT_NONE), 2137 data_channel_type_(cricket::DCT_NONE),
2081 ready_to_send_data_(false) { 2138 ready_to_send_data_(false) {
2082 } 2139 }
2083 2140
2084 DataChannel::~DataChannel() { 2141 DataChannel::~DataChannel() {
2085 StopMediaMonitor(); 2142 StopMediaMonitor();
2086 // this can't be done in the base class, since it calls a virtual 2143 // this can't be done in the base class, since it calls a virtual
2087 DisableMedia_w(); 2144 DisableMedia_w();
2088 2145
2089 Deinit(); 2146 Deinit();
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
2407 return (data_channel_type_ == DCT_RTP); 2464 return (data_channel_type_ == DCT_RTP);
2408 } 2465 }
2409 2466
2410 void DataChannel::OnStreamClosedRemotely(uint32 sid) { 2467 void DataChannel::OnStreamClosedRemotely(uint32 sid) {
2411 rtc::TypedMessageData<uint32>* message = 2468 rtc::TypedMessageData<uint32>* message =
2412 new rtc::TypedMessageData<uint32>(sid); 2469 new rtc::TypedMessageData<uint32>(sid);
2413 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); 2470 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message);
2414 } 2471 }
2415 2472
2416 } // namespace cricket 2473 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698