| OLD | NEW |
| 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 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 | 164 |
| 165 template <class Codec, class Options> | 165 template <class Codec, class Options> |
| 166 void RtpSendParametersFromMediaDescription( | 166 void RtpSendParametersFromMediaDescription( |
| 167 const MediaContentDescriptionImpl<Codec>* desc, | 167 const MediaContentDescriptionImpl<Codec>* desc, |
| 168 RtpSendParameters<Codec, Options>* send_params) { | 168 RtpSendParameters<Codec, Options>* send_params) { |
| 169 RtpParametersFromMediaDescription(desc, send_params); | 169 RtpParametersFromMediaDescription(desc, send_params); |
| 170 send_params->max_bandwidth_bps = desc->bandwidth(); | 170 send_params->max_bandwidth_bps = desc->bandwidth(); |
| 171 } | 171 } |
| 172 | 172 |
| 173 BaseChannel::BaseChannel(rtc::Thread* thread, | 173 BaseChannel::BaseChannel(rtc::Thread* thread, |
| 174 MediaChannel* media_channel, BaseSession* session, | 174 MediaChannel* media_channel, |
| 175 const std::string& content_name, bool rtcp) | 175 TransportController* transport_controller, |
| 176 const std::string& content_name, |
| 177 bool rtcp) |
| 176 : worker_thread_(thread), | 178 : worker_thread_(thread), |
| 177 session_(session), | 179 transport_controller_(transport_controller), |
| 178 media_channel_(media_channel), | 180 media_channel_(media_channel), |
| 179 content_name_(content_name), | 181 content_name_(content_name), |
| 180 rtcp_(rtcp), | 182 rtcp_transport_enabled_(rtcp), |
| 181 transport_channel_(NULL), | 183 transport_channel_(nullptr), |
| 182 rtcp_transport_channel_(NULL), | 184 rtcp_transport_channel_(nullptr), |
| 183 enabled_(false), | 185 enabled_(false), |
| 184 writable_(false), | 186 writable_(false), |
| 185 rtp_ready_to_send_(false), | 187 rtp_ready_to_send_(false), |
| 186 rtcp_ready_to_send_(false), | 188 rtcp_ready_to_send_(false), |
| 187 was_ever_writable_(false), | 189 was_ever_writable_(false), |
| 188 local_content_direction_(MD_INACTIVE), | 190 local_content_direction_(MD_INACTIVE), |
| 189 remote_content_direction_(MD_INACTIVE), | 191 remote_content_direction_(MD_INACTIVE), |
| 190 has_received_packet_(false), | 192 has_received_packet_(false), |
| 191 dtls_keyed_(false), | 193 dtls_keyed_(false), |
| 192 secure_required_(false), | 194 secure_required_(false), |
| 193 rtp_abs_sendtime_extn_id_(-1) { | 195 rtp_abs_sendtime_extn_id_(-1) { |
| 194 ASSERT(worker_thread_ == rtc::Thread::Current()); | 196 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 195 LOG(LS_INFO) << "Created channel for " << content_name; | 197 LOG(LS_INFO) << "Created channel for " << content_name; |
| 196 } | 198 } |
| 197 | 199 |
| 198 BaseChannel::~BaseChannel() { | 200 BaseChannel::~BaseChannel() { |
| 199 ASSERT(worker_thread_ == rtc::Thread::Current()); | 201 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 200 Deinit(); | 202 Deinit(); |
| 201 StopConnectionMonitor(); | 203 StopConnectionMonitor(); |
| 202 FlushRtcpMessages(); // Send any outstanding RTCP packets. | 204 FlushRtcpMessages(); // Send any outstanding RTCP packets. |
| 203 worker_thread_->Clear(this); // eats any outstanding messages or packets | 205 worker_thread_->Clear(this); // eats any outstanding messages or packets |
| 204 // We must destroy the media channel before the transport channel, otherwise | 206 // We must destroy the media channel before the transport channel, otherwise |
| 205 // the media channel may try to send on the dead transport channel. NULLing | 207 // the media channel may try to send on the dead transport channel. NULLing |
| 206 // is not an effective strategy since the sends will come on another thread. | 208 // is not an effective strategy since the sends will come on another thread. |
| 207 delete media_channel_; | 209 delete media_channel_; |
| 208 set_transport_channel(nullptr); | 210 // Note that we don't just call set_transport_channel(nullptr) because that |
| 209 set_rtcp_transport_channel(nullptr); | 211 // would call a pure virtual method which we can't do from a destructor. |
| 212 if (transport_channel_) { |
| 213 DisconnectFromTransportChannel(transport_channel_); |
| 214 transport_controller_->DestroyTransportChannel_w( |
| 215 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP); |
| 216 } |
| 217 if (rtcp_transport_channel_) { |
| 218 DisconnectFromTransportChannel(rtcp_transport_channel_); |
| 219 transport_controller_->DestroyTransportChannel_w( |
| 220 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP); |
| 221 } |
| 210 LOG(LS_INFO) << "Destroyed channel"; | 222 LOG(LS_INFO) << "Destroyed channel"; |
| 211 } | 223 } |
| 212 | 224 |
| 213 bool BaseChannel::Init() { | 225 bool BaseChannel::Init() { |
| 214 if (!SetTransportChannels(session(), rtcp())) { | 226 if (!SetTransport(content_name())) { |
| 215 return false; | 227 return false; |
| 216 } | 228 } |
| 217 | 229 |
| 218 if (!SetDtlsSrtpCiphers(transport_channel(), false)) { | 230 if (!SetDtlsSrtpCiphers(transport_channel(), false)) { |
| 219 return false; | 231 return false; |
| 220 } | 232 } |
| 221 if (rtcp() && !SetDtlsSrtpCiphers(rtcp_transport_channel(), true)) { | 233 if (rtcp_transport_enabled() && |
| 234 !SetDtlsSrtpCiphers(rtcp_transport_channel(), true)) { |
| 222 return false; | 235 return false; |
| 223 } | 236 } |
| 224 | 237 |
| 225 // Both RTP and RTCP channels are set, we can call SetInterface on | 238 // Both RTP and RTCP channels are set, we can call SetInterface on |
| 226 // media channel and it can set network options. | 239 // media channel and it can set network options. |
| 227 media_channel_->SetInterface(this); | 240 media_channel_->SetInterface(this); |
| 228 return true; | 241 return true; |
| 229 } | 242 } |
| 230 | 243 |
| 231 void BaseChannel::Deinit() { | 244 void BaseChannel::Deinit() { |
| 232 media_channel_->SetInterface(NULL); | 245 media_channel_->SetInterface(NULL); |
| 233 } | 246 } |
| 234 | 247 |
| 235 bool BaseChannel::SetTransportChannels(BaseSession* session, bool rtcp) { | 248 bool BaseChannel::SetTransport(const std::string& transport_name) { |
| 236 return worker_thread_->Invoke<bool>(Bind( | 249 return worker_thread_->Invoke<bool>( |
| 237 &BaseChannel::SetTransportChannels_w, this, session, rtcp)); | 250 Bind(&BaseChannel::SetTransport_w, this, transport_name)); |
| 238 } | 251 } |
| 239 | 252 |
| 240 bool BaseChannel::SetTransportChannels_w(BaseSession* session, bool rtcp) { | 253 bool BaseChannel::SetTransport_w(const std::string& transport_name) { |
| 241 ASSERT(worker_thread_ == rtc::Thread::Current()); | 254 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 242 | 255 |
| 243 set_transport_channel(session->CreateChannel( | 256 if (transport_name == transport_name_) { |
| 244 content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTP)); | 257 // Nothing to do if transport name isn't changing |
| 258 return true; |
| 259 } |
| 260 |
| 261 set_transport_channel(transport_controller_->CreateTransportChannel_w( |
| 262 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
| 245 if (!transport_channel()) { | 263 if (!transport_channel()) { |
| 246 return false; | 264 return false; |
| 247 } | 265 } |
| 248 if (rtcp) { | 266 if (rtcp_transport_enabled()) { |
| 249 set_rtcp_transport_channel(session->CreateChannel( | 267 LOG(LS_INFO) << "Create RTCP TransportChannel for " << content_name() |
| 250 content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTCP)); | 268 << " on " << transport_name << " transport "; |
| 269 set_rtcp_transport_channel(transport_controller_->CreateTransportChannel_w( |
| 270 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP)); |
| 251 if (!rtcp_transport_channel()) { | 271 if (!rtcp_transport_channel()) { |
| 252 return false; | 272 return false; |
| 253 } | 273 } |
| 254 } else { | |
| 255 set_rtcp_transport_channel(nullptr); | |
| 256 } | 274 } |
| 257 | 275 |
| 276 transport_name_ = transport_name; |
| 258 return true; | 277 return true; |
| 259 } | 278 } |
| 260 | 279 |
| 261 void BaseChannel::set_transport_channel(TransportChannel* new_tc) { | 280 void BaseChannel::set_transport_channel(TransportChannel* new_tc) { |
| 262 ASSERT(worker_thread_ == rtc::Thread::Current()); | 281 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 263 | 282 |
| 264 TransportChannel* old_tc = transport_channel_; | 283 TransportChannel* old_tc = transport_channel_; |
| 265 | 284 if (!old_tc && !new_tc) { |
| 266 if (old_tc == new_tc) { | 285 // Nothing to do |
| 267 return; | 286 return; |
| 268 } | 287 } |
| 288 ASSERT(old_tc != new_tc); |
| 289 |
| 269 if (old_tc) { | 290 if (old_tc) { |
| 270 DisconnectFromTransportChannel(old_tc); | 291 DisconnectFromTransportChannel(old_tc); |
| 271 session()->DestroyChannel( | 292 transport_controller_->DestroyTransportChannel_w( |
| 272 content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTP); | 293 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP); |
| 273 } | 294 } |
| 274 | 295 |
| 275 transport_channel_ = new_tc; | 296 transport_channel_ = new_tc; |
| 276 | 297 |
| 277 if (new_tc) { | 298 if (new_tc) { |
| 278 ConnectToTransportChannel(new_tc); | 299 ConnectToTransportChannel(new_tc); |
| 300 for (const auto& pair : socket_options_) { |
| 301 new_tc->SetOption(pair.first, pair.second); |
| 302 } |
| 279 } | 303 } |
| 304 |
| 305 // Update aggregate writable/ready-to-send state between RTP and RTCP upon |
| 306 // setting new channel |
| 307 UpdateWritableState_w(); |
| 308 SetReadyToSend(false, new_tc && new_tc->writable()); |
| 280 } | 309 } |
| 281 | 310 |
| 282 void BaseChannel::set_rtcp_transport_channel(TransportChannel* new_tc) { | 311 void BaseChannel::set_rtcp_transport_channel(TransportChannel* new_tc) { |
| 283 ASSERT(worker_thread_ == rtc::Thread::Current()); | 312 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 284 | 313 |
| 285 TransportChannel* old_tc = rtcp_transport_channel_; | 314 TransportChannel* old_tc = rtcp_transport_channel_; |
| 286 | 315 if (!old_tc && !new_tc) { |
| 287 if (old_tc == new_tc) { | 316 // Nothing to do |
| 288 return; | 317 return; |
| 289 } | 318 } |
| 319 ASSERT(old_tc != new_tc); |
| 320 |
| 290 if (old_tc) { | 321 if (old_tc) { |
| 291 DisconnectFromTransportChannel(old_tc); | 322 DisconnectFromTransportChannel(old_tc); |
| 292 session()->DestroyChannel( | 323 transport_controller_->DestroyTransportChannel_w( |
| 293 content_name(), cricket::ICE_CANDIDATE_COMPONENT_RTCP); | 324 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP); |
| 294 } | 325 } |
| 295 | 326 |
| 296 rtcp_transport_channel_ = new_tc; | 327 rtcp_transport_channel_ = new_tc; |
| 297 | 328 |
| 298 if (new_tc) { | 329 if (new_tc) { |
| 299 ConnectToTransportChannel(new_tc); | 330 ConnectToTransportChannel(new_tc); |
| 331 for (const auto& pair : rtcp_socket_options_) { |
| 332 new_tc->SetOption(pair.first, pair.second); |
| 333 } |
| 300 } | 334 } |
| 335 |
| 336 // Update aggregate writable/ready-to-send state between RTP and RTCP upon |
| 337 // setting new channel |
| 338 UpdateWritableState_w(); |
| 339 SetReadyToSend(true, new_tc && new_tc->writable()); |
| 301 } | 340 } |
| 302 | 341 |
| 303 void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) { | 342 void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) { |
| 304 ASSERT(worker_thread_ == rtc::Thread::Current()); | 343 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 305 | 344 |
| 306 tc->SignalWritableState.connect(this, &BaseChannel::OnWritableState); | 345 tc->SignalWritableState.connect(this, &BaseChannel::OnWritableState); |
| 307 tc->SignalReadPacket.connect(this, &BaseChannel::OnChannelRead); | 346 tc->SignalReadPacket.connect(this, &BaseChannel::OnChannelRead); |
| 308 tc->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend); | 347 tc->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend); |
| 309 } | 348 } |
| 310 | 349 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 rtc::DiffServCodePoint dscp) { | 448 rtc::DiffServCodePoint dscp) { |
| 410 return SendPacket(true, packet, dscp); | 449 return SendPacket(true, packet, dscp); |
| 411 } | 450 } |
| 412 | 451 |
| 413 int BaseChannel::SetOption(SocketType type, rtc::Socket::Option opt, | 452 int BaseChannel::SetOption(SocketType type, rtc::Socket::Option opt, |
| 414 int value) { | 453 int value) { |
| 415 TransportChannel* channel = NULL; | 454 TransportChannel* channel = NULL; |
| 416 switch (type) { | 455 switch (type) { |
| 417 case ST_RTP: | 456 case ST_RTP: |
| 418 channel = transport_channel_; | 457 channel = transport_channel_; |
| 458 socket_options_.push_back( |
| 459 std::pair<rtc::Socket::Option, int>(opt, value)); |
| 419 break; | 460 break; |
| 420 case ST_RTCP: | 461 case ST_RTCP: |
| 421 channel = rtcp_transport_channel_; | 462 channel = rtcp_transport_channel_; |
| 463 rtcp_socket_options_.push_back( |
| 464 std::pair<rtc::Socket::Option, int>(opt, value)); |
| 422 break; | 465 break; |
| 423 } | 466 } |
| 424 return channel ? channel->SetOption(opt, value) : -1; | 467 return channel ? channel->SetOption(opt, value) : -1; |
| 425 } | 468 } |
| 426 | 469 |
| 427 void BaseChannel::OnWritableState(TransportChannel* channel) { | 470 void BaseChannel::OnWritableState(TransportChannel* channel) { |
| 428 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); | 471 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); |
| 429 if (transport_channel_->writable() | 472 UpdateWritableState_w(); |
| 430 && (!rtcp_transport_channel_ || rtcp_transport_channel_->writable())) { | |
| 431 ChannelWritable_w(); | |
| 432 } else { | |
| 433 ChannelNotWritable_w(); | |
| 434 } | |
| 435 } | 473 } |
| 436 | 474 |
| 437 void BaseChannel::OnChannelRead(TransportChannel* channel, | 475 void BaseChannel::OnChannelRead(TransportChannel* channel, |
| 438 const char* data, size_t len, | 476 const char* data, size_t len, |
| 439 const rtc::PacketTime& packet_time, | 477 const rtc::PacketTime& packet_time, |
| 440 int flags) { | 478 int flags) { |
| 441 // OnChannelRead gets called from P2PSocket; now pass data to MediaEngine | 479 // OnChannelRead gets called from P2PSocket; now pass data to MediaEngine |
| 442 ASSERT(worker_thread_ == rtc::Thread::Current()); | 480 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 443 | 481 |
| 444 // When using RTCP multiplexing we might get RTCP packets on the RTP | 482 // When using RTCP multiplexing we might get RTCP packets on the RTP |
| 445 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. | 483 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. |
| 446 bool rtcp = PacketIsRtcp(channel, data, len); | 484 bool rtcp = PacketIsRtcp(channel, data, len); |
| 447 rtc::Buffer packet(data, len); | 485 rtc::Buffer packet(data, len); |
| 448 HandlePacket(rtcp, &packet, packet_time); | 486 HandlePacket(rtcp, &packet, packet_time); |
| 449 } | 487 } |
| 450 | 488 |
| 451 void BaseChannel::OnReadyToSend(TransportChannel* channel) { | 489 void BaseChannel::OnReadyToSend(TransportChannel* channel) { |
| 452 SetReadyToSend(channel, true); | 490 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); |
| 491 SetReadyToSend(channel == rtcp_transport_channel_, true); |
| 453 } | 492 } |
| 454 | 493 |
| 455 void BaseChannel::SetReadyToSend(TransportChannel* channel, bool ready) { | 494 void BaseChannel::SetReadyToSend(bool rtcp, bool ready) { |
| 456 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); | 495 if (rtcp) { |
| 457 if (channel == transport_channel_) { | 496 rtcp_ready_to_send_ = ready; |
| 497 } else { |
| 458 rtp_ready_to_send_ = ready; | 498 rtp_ready_to_send_ = ready; |
| 459 } | 499 } |
| 460 if (channel == rtcp_transport_channel_) { | |
| 461 rtcp_ready_to_send_ = ready; | |
| 462 } | |
| 463 | 500 |
| 464 if (!ready) { | 501 if (rtp_ready_to_send_ && |
| 502 // In the case of rtcp mux |rtcp_transport_channel_| will be null. |
| 503 (rtcp_ready_to_send_ || !rtcp_transport_channel_)) { |
| 504 // Notify the MediaChannel when both rtp and rtcp channel can send. |
| 505 media_channel_->OnReadyToSend(true); |
| 506 } else { |
| 465 // Notify the MediaChannel when either rtp or rtcp channel can't send. | 507 // Notify the MediaChannel when either rtp or rtcp channel can't send. |
| 466 media_channel_->OnReadyToSend(false); | 508 media_channel_->OnReadyToSend(false); |
| 467 } else if (rtp_ready_to_send_ && | |
| 468 // In the case of rtcp mux |rtcp_transport_channel_| will be null. | |
| 469 (rtcp_ready_to_send_ || !rtcp_transport_channel_)) { | |
| 470 // Notify the MediaChannel when both rtp and rtcp channel can send. | |
| 471 media_channel_->OnReadyToSend(true); | |
| 472 } | 509 } |
| 473 } | 510 } |
| 474 | 511 |
| 475 bool BaseChannel::PacketIsRtcp(const TransportChannel* channel, | 512 bool BaseChannel::PacketIsRtcp(const TransportChannel* channel, |
| 476 const char* data, size_t len) { | 513 const char* data, size_t len) { |
| 477 return (channel == rtcp_transport_channel_ || | 514 return (channel == rtcp_transport_channel_ || |
| 478 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); | 515 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); |
| 479 } | 516 } |
| 480 | 517 |
| 481 bool BaseChannel::SendPacket(bool rtcp, rtc::Buffer* packet, | 518 bool BaseChannel::SendPacket(bool rtcp, rtc::Buffer* packet, |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 583 return false; | 620 return false; |
| 584 } | 621 } |
| 585 | 622 |
| 586 // Bon voyage. | 623 // Bon voyage. |
| 587 int ret = | 624 int ret = |
| 588 channel->SendPacket(packet->data<char>(), packet->size(), options, | 625 channel->SendPacket(packet->data<char>(), packet->size(), options, |
| 589 (secure() && secure_dtls()) ? PF_SRTP_BYPASS : 0); | 626 (secure() && secure_dtls()) ? PF_SRTP_BYPASS : 0); |
| 590 if (ret != static_cast<int>(packet->size())) { | 627 if (ret != static_cast<int>(packet->size())) { |
| 591 if (channel->GetError() == EWOULDBLOCK) { | 628 if (channel->GetError() == EWOULDBLOCK) { |
| 592 LOG(LS_WARNING) << "Got EWOULDBLOCK from socket."; | 629 LOG(LS_WARNING) << "Got EWOULDBLOCK from socket."; |
| 593 SetReadyToSend(channel, false); | 630 SetReadyToSend(rtcp, false); |
| 594 } | 631 } |
| 595 return false; | 632 return false; |
| 596 } | 633 } |
| 597 return true; | 634 return true; |
| 598 } | 635 } |
| 599 | 636 |
| 600 bool BaseChannel::WantsPacket(bool rtcp, rtc::Buffer* packet) { | 637 bool BaseChannel::WantsPacket(bool rtcp, rtc::Buffer* packet) { |
| 601 // Protect ourselves against crazy data. | 638 // Protect ourselves against crazy data. |
| 602 if (!ValidPacket(rtcp, packet)) { | 639 if (!ValidPacket(rtcp, packet)) { |
| 603 LOG(LS_ERROR) << "Dropping incoming " << content_name_ << " " | 640 LOG(LS_ERROR) << "Dropping incoming " << content_name_ << " " |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 muted_streams_.erase(ssrc); | 771 muted_streams_.erase(ssrc); |
| 735 } | 772 } |
| 736 return ret; | 773 return ret; |
| 737 } | 774 } |
| 738 | 775 |
| 739 bool BaseChannel::IsStreamMuted_w(uint32 ssrc) { | 776 bool BaseChannel::IsStreamMuted_w(uint32 ssrc) { |
| 740 ASSERT(worker_thread_ == rtc::Thread::Current()); | 777 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 741 return muted_streams_.find(ssrc) != muted_streams_.end(); | 778 return muted_streams_.find(ssrc) != muted_streams_.end(); |
| 742 } | 779 } |
| 743 | 780 |
| 781 void BaseChannel::UpdateWritableState_w() { |
| 782 if (transport_channel_ && transport_channel_->writable() && |
| 783 (!rtcp_transport_channel_ || rtcp_transport_channel_->writable())) { |
| 784 ChannelWritable_w(); |
| 785 } else { |
| 786 ChannelNotWritable_w(); |
| 787 } |
| 788 } |
| 789 |
| 744 void BaseChannel::ChannelWritable_w() { | 790 void BaseChannel::ChannelWritable_w() { |
| 745 ASSERT(worker_thread_ == rtc::Thread::Current()); | 791 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 746 if (writable_) | 792 if (writable_) |
| 747 return; | 793 return; |
| 748 | 794 |
| 749 LOG(LS_INFO) << "Channel socket writable (" | 795 LOG(LS_INFO) << "Channel writable (" << content_name_ << ")" |
| 750 << transport_channel_->content_name() << ", " | |
| 751 << transport_channel_->component() << ")" | |
| 752 << (was_ever_writable_ ? "" : " for the first time"); | 796 << (was_ever_writable_ ? "" : " for the first time"); |
| 753 | 797 |
| 754 std::vector<ConnectionInfo> infos; | 798 std::vector<ConnectionInfo> infos; |
| 755 transport_channel_->GetStats(&infos); | 799 transport_channel_->GetStats(&infos); |
| 756 for (std::vector<ConnectionInfo>::const_iterator it = infos.begin(); | 800 for (std::vector<ConnectionInfo>::const_iterator it = infos.begin(); |
| 757 it != infos.end(); ++it) { | 801 it != infos.end(); ++it) { |
| 758 if (it->best_connection) { | 802 if (it->best_connection) { |
| 759 LOG(LS_INFO) << "Using " << it->local_candidate.ToSensitiveString() | 803 LOG(LS_INFO) << "Using " << it->local_candidate.ToSensitiveString() |
| 760 << "->" << it->remote_candidate.ToSensitiveString(); | 804 << "->" << it->remote_candidate.ToSensitiveString(); |
| 761 break; | 805 break; |
| 762 } | 806 } |
| 763 } | 807 } |
| 764 | 808 |
| 765 // If we're doing DTLS-SRTP, now is the time. | 809 // If we're doing DTLS-SRTP, now is the time. |
| 766 if (!was_ever_writable_ && ShouldSetupDtlsSrtp()) { | 810 if (!was_ever_writable_ && ShouldSetupDtlsSrtp()) { |
| 767 if (!SetupDtlsSrtp(false)) { | 811 if (!SetupDtlsSrtp(false)) { |
| 768 SignalDtlsSetupFailure(this, false); | 812 SignalDtlsSetupFailure_w(false); |
| 769 return; | 813 return; |
| 770 } | 814 } |
| 771 | 815 |
| 772 if (rtcp_transport_channel_) { | 816 if (rtcp_transport_channel_) { |
| 773 if (!SetupDtlsSrtp(true)) { | 817 if (!SetupDtlsSrtp(true)) { |
| 774 SignalDtlsSetupFailure(this, true); | 818 SignalDtlsSetupFailure_w(true); |
| 775 return; | 819 return; |
| 776 } | 820 } |
| 777 } | 821 } |
| 778 } | 822 } |
| 779 | 823 |
| 780 was_ever_writable_ = true; | 824 was_ever_writable_ = true; |
| 781 writable_ = true; | 825 writable_ = true; |
| 782 ChangeState(); | 826 ChangeState(); |
| 783 } | 827 } |
| 784 | 828 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 807 | 851 |
| 808 bool BaseChannel::ShouldSetupDtlsSrtp() const { | 852 bool BaseChannel::ShouldSetupDtlsSrtp() const { |
| 809 return true; | 853 return true; |
| 810 } | 854 } |
| 811 | 855 |
| 812 // This function returns true if either DTLS-SRTP is not in use | 856 // This function returns true if either DTLS-SRTP is not in use |
| 813 // *or* DTLS-SRTP is successfully set up. | 857 // *or* DTLS-SRTP is successfully set up. |
| 814 bool BaseChannel::SetupDtlsSrtp(bool rtcp_channel) { | 858 bool BaseChannel::SetupDtlsSrtp(bool rtcp_channel) { |
| 815 bool ret = false; | 859 bool ret = false; |
| 816 | 860 |
| 817 TransportChannel *channel = rtcp_channel ? | 861 TransportChannel* channel = |
| 818 rtcp_transport_channel_ : transport_channel_; | 862 rtcp_channel ? rtcp_transport_channel_ : transport_channel_; |
| 819 | 863 |
| 820 // No DTLS | 864 // No DTLS |
| 821 if (!channel->IsDtlsActive()) | 865 if (!channel->IsDtlsActive()) |
| 822 return true; | 866 return true; |
| 823 | 867 |
| 824 std::string selected_cipher; | 868 std::string selected_cipher; |
| 825 | 869 |
| 826 if (!channel->GetSrtpCipher(&selected_cipher)) { | 870 if (!channel->GetSrtpCipher(&selected_cipher)) { |
| 827 LOG(LS_ERROR) << "No DTLS-SRTP selected cipher"; | 871 LOG(LS_ERROR) << "No DTLS-SRTP selected cipher"; |
| 828 return false; | 872 return false; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 903 dtls_keyed_ = true; | 947 dtls_keyed_ = true; |
| 904 | 948 |
| 905 return ret; | 949 return ret; |
| 906 } | 950 } |
| 907 | 951 |
| 908 void BaseChannel::ChannelNotWritable_w() { | 952 void BaseChannel::ChannelNotWritable_w() { |
| 909 ASSERT(worker_thread_ == rtc::Thread::Current()); | 953 ASSERT(worker_thread_ == rtc::Thread::Current()); |
| 910 if (!writable_) | 954 if (!writable_) |
| 911 return; | 955 return; |
| 912 | 956 |
| 913 LOG(LS_INFO) << "Channel socket not writable (" | 957 LOG(LS_INFO) << "Channel not writable (" << content_name_ << ")"; |
| 914 << transport_channel_->content_name() << ", " | |
| 915 << transport_channel_->component() << ")"; | |
| 916 writable_ = false; | 958 writable_ = false; |
| 917 ChangeState(); | 959 ChangeState(); |
| 918 } | 960 } |
| 919 | 961 |
| 920 bool BaseChannel::SetRtpTransportParameters_w( | 962 bool BaseChannel::SetRtpTransportParameters_w( |
| 921 const MediaContentDescription* content, | 963 const MediaContentDescription* content, |
| 922 ContentAction action, | 964 ContentAction action, |
| 923 ContentSource src, | 965 ContentSource src, |
| 924 std::string* error_desc) { | 966 std::string* error_desc) { |
| 925 if (action == CA_UPDATE) { | 967 if (action == CA_UPDATE) { |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1004 } | 1046 } |
| 1005 | 1047 |
| 1006 void BaseChannel::ActivateRtcpMux() { | 1048 void BaseChannel::ActivateRtcpMux() { |
| 1007 worker_thread_->Invoke<void>(Bind( | 1049 worker_thread_->Invoke<void>(Bind( |
| 1008 &BaseChannel::ActivateRtcpMux_w, this)); | 1050 &BaseChannel::ActivateRtcpMux_w, this)); |
| 1009 } | 1051 } |
| 1010 | 1052 |
| 1011 void BaseChannel::ActivateRtcpMux_w() { | 1053 void BaseChannel::ActivateRtcpMux_w() { |
| 1012 if (!rtcp_mux_filter_.IsActive()) { | 1054 if (!rtcp_mux_filter_.IsActive()) { |
| 1013 rtcp_mux_filter_.SetActive(); | 1055 rtcp_mux_filter_.SetActive(); |
| 1014 set_rtcp_transport_channel(NULL); | 1056 set_rtcp_transport_channel(nullptr); |
| 1057 rtcp_transport_enabled_ = false; |
| 1015 } | 1058 } |
| 1016 } | 1059 } |
| 1017 | 1060 |
| 1018 bool BaseChannel::SetRtcpMux_w(bool enable, ContentAction action, | 1061 bool BaseChannel::SetRtcpMux_w(bool enable, ContentAction action, |
| 1019 ContentSource src, | 1062 ContentSource src, |
| 1020 std::string* error_desc) { | 1063 std::string* error_desc) { |
| 1021 bool ret = false; | 1064 bool ret = false; |
| 1022 switch (action) { | 1065 switch (action) { |
| 1023 case CA_OFFER: | 1066 case CA_OFFER: |
| 1024 ret = rtcp_mux_filter_.SetOffer(enable, src); | 1067 ret = rtcp_mux_filter_.SetOffer(enable, src); |
| 1025 break; | 1068 break; |
| 1026 case CA_PRANSWER: | 1069 case CA_PRANSWER: |
| 1027 ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src); | 1070 ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src); |
| 1028 break; | 1071 break; |
| 1029 case CA_ANSWER: | 1072 case CA_ANSWER: |
| 1030 ret = rtcp_mux_filter_.SetAnswer(enable, src); | 1073 ret = rtcp_mux_filter_.SetAnswer(enable, src); |
| 1031 if (ret && rtcp_mux_filter_.IsActive()) { | 1074 if (ret && rtcp_mux_filter_.IsActive()) { |
| 1032 // We activated RTCP mux, close down the RTCP transport. | 1075 // We activated RTCP mux, close down the RTCP transport. |
| 1033 set_rtcp_transport_channel(NULL); | 1076 LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name() |
| 1077 << " by destroying RTCP transport channel for " |
| 1078 << transport_name(); |
| 1079 set_rtcp_transport_channel(nullptr); |
| 1080 rtcp_transport_enabled_ = false; |
| 1034 } | 1081 } |
| 1035 break; | 1082 break; |
| 1036 case CA_UPDATE: | 1083 case CA_UPDATE: |
| 1037 // No RTCP mux info. | 1084 // No RTCP mux info. |
| 1038 ret = true; | 1085 ret = true; |
| 1039 break; | 1086 break; |
| 1040 default: | 1087 default: |
| 1041 break; | 1088 break; |
| 1042 } | 1089 } |
| 1043 if (!ret) { | 1090 if (!ret) { |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1250 worker_thread_->Clear(this, MSG_RTCPPACKET, &rtcp_messages); | 1297 worker_thread_->Clear(this, MSG_RTCPPACKET, &rtcp_messages); |
| 1251 for (rtc::MessageList::iterator it = rtcp_messages.begin(); | 1298 for (rtc::MessageList::iterator it = rtcp_messages.begin(); |
| 1252 it != rtcp_messages.end(); ++it) { | 1299 it != rtcp_messages.end(); ++it) { |
| 1253 worker_thread_->Send(this, MSG_RTCPPACKET, it->pdata); | 1300 worker_thread_->Send(this, MSG_RTCPPACKET, it->pdata); |
| 1254 } | 1301 } |
| 1255 } | 1302 } |
| 1256 | 1303 |
| 1257 VoiceChannel::VoiceChannel(rtc::Thread* thread, | 1304 VoiceChannel::VoiceChannel(rtc::Thread* thread, |
| 1258 MediaEngineInterface* media_engine, | 1305 MediaEngineInterface* media_engine, |
| 1259 VoiceMediaChannel* media_channel, | 1306 VoiceMediaChannel* media_channel, |
| 1260 BaseSession* session, | 1307 TransportController* transport_controller, |
| 1261 const std::string& content_name, | 1308 const std::string& content_name, |
| 1262 bool rtcp) | 1309 bool rtcp) |
| 1263 : BaseChannel(thread, media_channel, session, content_name, | 1310 : BaseChannel(thread, |
| 1311 media_channel, |
| 1312 transport_controller, |
| 1313 content_name, |
| 1264 rtcp), | 1314 rtcp), |
| 1265 media_engine_(media_engine), | 1315 media_engine_(media_engine), |
| 1266 received_media_(false) { | 1316 received_media_(false) { |
| 1267 } | 1317 } |
| 1268 | 1318 |
| 1269 VoiceChannel::~VoiceChannel() { | 1319 VoiceChannel::~VoiceChannel() { |
| 1270 StopAudioMonitor(); | 1320 StopAudioMonitor(); |
| 1271 StopMediaMonitor(); | 1321 StopMediaMonitor(); |
| 1272 // this can't be done in the base class, since it calls a virtual | 1322 // this can't be done in the base class, since it calls a virtual |
| 1273 DisableMedia_w(); | 1323 DisableMedia_w(); |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1649 break; | 1699 break; |
| 1650 } | 1700 } |
| 1651 } | 1701 } |
| 1652 | 1702 |
| 1653 void VoiceChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const { | 1703 void VoiceChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const { |
| 1654 GetSupportedAudioCryptoSuites(ciphers); | 1704 GetSupportedAudioCryptoSuites(ciphers); |
| 1655 } | 1705 } |
| 1656 | 1706 |
| 1657 VideoChannel::VideoChannel(rtc::Thread* thread, | 1707 VideoChannel::VideoChannel(rtc::Thread* thread, |
| 1658 VideoMediaChannel* media_channel, | 1708 VideoMediaChannel* media_channel, |
| 1659 BaseSession* session, | 1709 TransportController* transport_controller, |
| 1660 const std::string& content_name, | 1710 const std::string& content_name, |
| 1661 bool rtcp) | 1711 bool rtcp) |
| 1662 : BaseChannel(thread, media_channel, session, content_name, | 1712 : BaseChannel(thread, |
| 1713 media_channel, |
| 1714 transport_controller, |
| 1715 content_name, |
| 1663 rtcp), | 1716 rtcp), |
| 1664 renderer_(NULL), | 1717 renderer_(NULL), |
| 1665 previous_we_(rtc::WE_CLOSE) { | 1718 previous_we_(rtc::WE_CLOSE) { |
| 1666 } | 1719 } |
| 1667 | 1720 |
| 1668 bool VideoChannel::Init() { | 1721 bool VideoChannel::Init() { |
| 1669 if (!BaseChannel::Init()) { | 1722 if (!BaseChannel::Init()) { |
| 1670 return false; | 1723 return false; |
| 1671 } | 1724 } |
| 1672 media_channel()->SignalMediaError.connect( | 1725 media_channel()->SignalMediaError.connect( |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2087 } | 2140 } |
| 2088 } | 2141 } |
| 2089 | 2142 |
| 2090 | 2143 |
| 2091 void VideoChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const { | 2144 void VideoChannel::GetSrtpCiphers(std::vector<std::string>* ciphers) const { |
| 2092 GetSupportedVideoCryptoSuites(ciphers); | 2145 GetSupportedVideoCryptoSuites(ciphers); |
| 2093 } | 2146 } |
| 2094 | 2147 |
| 2095 DataChannel::DataChannel(rtc::Thread* thread, | 2148 DataChannel::DataChannel(rtc::Thread* thread, |
| 2096 DataMediaChannel* media_channel, | 2149 DataMediaChannel* media_channel, |
| 2097 BaseSession* session, | 2150 TransportController* transport_controller, |
| 2098 const std::string& content_name, | 2151 const std::string& content_name, |
| 2099 bool rtcp) | 2152 bool rtcp) |
| 2100 : BaseChannel(thread, media_channel, session, content_name, rtcp), | 2153 : BaseChannel(thread, |
| 2154 media_channel, |
| 2155 transport_controller, |
| 2156 content_name, |
| 2157 rtcp), |
| 2101 data_channel_type_(cricket::DCT_NONE), | 2158 data_channel_type_(cricket::DCT_NONE), |
| 2102 ready_to_send_data_(false) { | 2159 ready_to_send_data_(false) { |
| 2103 } | 2160 } |
| 2104 | 2161 |
| 2105 DataChannel::~DataChannel() { | 2162 DataChannel::~DataChannel() { |
| 2106 StopMediaMonitor(); | 2163 StopMediaMonitor(); |
| 2107 // this can't be done in the base class, since it calls a virtual | 2164 // this can't be done in the base class, since it calls a virtual |
| 2108 DisableMedia_w(); | 2165 DisableMedia_w(); |
| 2109 | 2166 |
| 2110 Deinit(); | 2167 Deinit(); |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2428 return (data_channel_type_ == DCT_RTP); | 2485 return (data_channel_type_ == DCT_RTP); |
| 2429 } | 2486 } |
| 2430 | 2487 |
| 2431 void DataChannel::OnStreamClosedRemotely(uint32 sid) { | 2488 void DataChannel::OnStreamClosedRemotely(uint32 sid) { |
| 2432 rtc::TypedMessageData<uint32>* message = | 2489 rtc::TypedMessageData<uint32>* message = |
| 2433 new rtc::TypedMessageData<uint32>(sid); | 2490 new rtc::TypedMessageData<uint32>(sid); |
| 2434 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); | 2491 signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message); |
| 2435 } | 2492 } |
| 2436 | 2493 |
| 2437 } // namespace cricket | 2494 } // namespace cricket |
| OLD | NEW |