| 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 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |