Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 154 template <class Codec> | 154 template <class Codec> |
| 155 void RtpSendParametersFromMediaDescription( | 155 void RtpSendParametersFromMediaDescription( |
| 156 const MediaContentDescriptionImpl<Codec>* desc, | 156 const MediaContentDescriptionImpl<Codec>* desc, |
| 157 RtpSendParameters<Codec>* send_params) { | 157 RtpSendParameters<Codec>* send_params) { |
| 158 RtpParametersFromMediaDescription(desc, send_params); | 158 RtpParametersFromMediaDescription(desc, send_params); |
| 159 send_params->max_bandwidth_bps = desc->bandwidth(); | 159 send_params->max_bandwidth_bps = desc->bandwidth(); |
| 160 } | 160 } |
| 161 | 161 |
| 162 BaseChannel::BaseChannel(rtc::Thread* worker_thread, | 162 BaseChannel::BaseChannel(rtc::Thread* worker_thread, |
| 163 rtc::Thread* network_thread, | 163 rtc::Thread* network_thread, |
| 164 rtc::Thread* signaling_thread, | |
| 164 MediaChannel* media_channel, | 165 MediaChannel* media_channel, |
| 165 TransportController* transport_controller, | |
| 166 const std::string& content_name, | 166 const std::string& content_name, |
| 167 bool rtcp, | 167 bool rtcp, |
| 168 bool srtp_required) | 168 bool srtp_required) |
| 169 : worker_thread_(worker_thread), | 169 : worker_thread_(worker_thread), |
| 170 network_thread_(network_thread), | 170 network_thread_(network_thread), |
| 171 | 171 signaling_thread_(signaling_thread), |
| 172 content_name_(content_name), | 172 content_name_(content_name), |
| 173 | |
| 174 transport_controller_(transport_controller), | |
| 175 rtcp_enabled_(rtcp), | 173 rtcp_enabled_(rtcp), |
| 176 srtp_required_(srtp_required), | 174 srtp_required_(srtp_required), |
| 177 media_channel_(media_channel), | 175 media_channel_(media_channel), |
| 178 selected_candidate_pair_(nullptr) { | 176 selected_candidate_pair_(nullptr) { |
| 179 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); | 177 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); |
| 180 if (transport_controller) { | |
| 181 RTC_DCHECK_EQ(network_thread, transport_controller->network_thread()); | |
| 182 } | |
| 183 LOG(LS_INFO) << "Created channel for " << content_name; | 178 LOG(LS_INFO) << "Created channel for " << content_name; |
| 184 } | 179 } |
| 185 | 180 |
| 186 BaseChannel::~BaseChannel() { | 181 BaseChannel::~BaseChannel() { |
| 187 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel"); | 182 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel"); |
| 188 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); | 183 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); |
| 189 Deinit(); | 184 Deinit(); |
| 190 StopConnectionMonitor(); | 185 StopConnectionMonitor(); |
| 191 // Eats any outstanding messages or packets. | 186 // Eats any outstanding messages or packets. |
| 192 worker_thread_->Clear(&invoker_); | 187 worker_thread_->Clear(&invoker_); |
| 193 worker_thread_->Clear(this); | 188 worker_thread_->Clear(this); |
| 194 // We must destroy the media channel before the transport channel, otherwise | 189 // We must destroy the media channel before the transport channel, otherwise |
| 195 // the media channel may try to send on the dead transport channel. NULLing | 190 // the media channel may try to send on the dead transport channel. NULLing |
| 196 // is not an effective strategy since the sends will come on another thread. | 191 // is not an effective strategy since the sends will come on another thread. |
| 197 delete media_channel_; | 192 delete media_channel_; |
| 198 // Note that we don't just call SetTransportChannel_n(nullptr) because that | 193 // Note that we don't just call SetTransportChannel_n(nullptr) because that |
| 199 // would call a pure virtual method which we can't do from a destructor. | 194 // would call a pure virtual method which we can't do from a destructor. |
| 200 network_thread_->Invoke<void>( | 195 network_thread_->Invoke<void>( |
| 201 RTC_FROM_HERE, Bind(&BaseChannel::DestroyTransportChannels_n, this)); | 196 RTC_FROM_HERE, Bind(&BaseChannel::DestroyTransportChannels_n, this)); |
| 202 LOG(LS_INFO) << "Destroyed channel"; | 197 LOG(LS_INFO) << "Destroyed channel"; |
| 203 } | 198 } |
| 204 | 199 |
| 205 void BaseChannel::DisconnectTransportChannels_n() { | 200 void BaseChannel::DisconnectTransportChannels_n() { |
| 206 // Send any outstanding RTCP packets. | 201 // Send any outstanding RTCP packets. |
| 207 FlushRtcpMessages_n(); | 202 FlushRtcpMessages_n(); |
| 208 | 203 |
| 209 // Stop signals from transport channels, but keep them alive because | 204 // Stop signals from transport channels, but keep them alive because |
| 210 // media_channel may use them from a different thread. | 205 // media_channel may use them from a different thread. |
| 211 if (transport_channel_) { | 206 if (rtp_transport_) { |
| 212 DisconnectFromTransportChannel(transport_channel_); | 207 DisconnectFromTransportChannel(rtp_transport_); |
| 213 } | 208 } |
| 214 if (rtcp_transport_channel_) { | 209 if (rtcp_transport_) { |
| 215 DisconnectFromTransportChannel(rtcp_transport_channel_); | 210 DisconnectFromTransportChannel(rtcp_transport_); |
| 216 } | 211 } |
| 217 | 212 |
| 218 // Clear pending read packets/messages. | 213 // Clear pending read packets/messages. |
| 219 network_thread_->Clear(&invoker_); | 214 network_thread_->Clear(&invoker_); |
| 220 network_thread_->Clear(this); | 215 network_thread_->Clear(this); |
| 221 } | 216 } |
| 222 | 217 |
| 223 void BaseChannel::DestroyTransportChannels_n() { | 218 void BaseChannel::DestroyTransportChannels_n() { |
| 224 if (transport_channel_) { | 219 if (rtp_transport_) { |
| 225 transport_controller_->DestroyTransportChannel_n( | 220 SignalDestroyTransport(transport_name_, |
| 226 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP); | 221 cricket::ICE_CANDIDATE_COMPONENT_RTP); |
| 227 } | 222 } |
| 228 if (rtcp_transport_channel_) { | 223 if (rtcp_transport_) { |
| 229 transport_controller_->DestroyTransportChannel_n( | 224 SignalDestroyTransport(transport_name_, |
| 230 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP); | 225 cricket::ICE_CANDIDATE_COMPONENT_RTCP); |
| 231 } | 226 } |
| 232 // Clear pending send packets/messages. | 227 // Clear pending send packets/messages. |
| 233 network_thread_->Clear(&invoker_); | 228 network_thread_->Clear(&invoker_); |
| 234 network_thread_->Clear(this); | 229 network_thread_->Clear(this); |
| 235 } | 230 } |
| 236 | 231 |
| 237 bool BaseChannel::Init_w(const std::string* bundle_transport_name) { | 232 bool BaseChannel::Init_w(TransportChannel* rtp_transport, |
| 233 TransportChannel* rtcp_transport) { | |
| 238 if (!network_thread_->Invoke<bool>( | 234 if (!network_thread_->Invoke<bool>( |
| 239 RTC_FROM_HERE, | 235 RTC_FROM_HERE, Bind(&BaseChannel::InitNetwork_n, this, rtp_transport, |
| 240 Bind(&BaseChannel::InitNetwork_n, this, bundle_transport_name))) { | 236 rtcp_transport))) { |
| 241 return false; | 237 return false; |
| 242 } | 238 } |
| 243 | 239 |
| 244 // Both RTP and RTCP channels are set, we can call SetInterface on | 240 // Both RTP and RTCP channels are set, we can call SetInterface on |
| 245 // media channel and it can set network options. | 241 // media channel and it can set network options. |
| 246 RTC_DCHECK(worker_thread_->IsCurrent()); | 242 RTC_DCHECK(worker_thread_->IsCurrent()); |
| 247 media_channel_->SetInterface(this); | 243 media_channel_->SetInterface(this); |
| 248 return true; | 244 return true; |
| 249 } | 245 } |
| 250 | 246 |
| 251 bool BaseChannel::InitNetwork_n(const std::string* bundle_transport_name) { | 247 bool BaseChannel::InitNetwork_n(TransportChannel* rtp_transport, |
| 248 TransportChannel* rtcp_transport) { | |
| 252 RTC_DCHECK(network_thread_->IsCurrent()); | 249 RTC_DCHECK(network_thread_->IsCurrent()); |
| 253 const std::string& transport_name = | 250 // const std::string& transport_name = |
| 254 (bundle_transport_name ? *bundle_transport_name : content_name()); | 251 // (bundle_transport_name ? *bundle_transport_name : content_name()); |
| 255 if (!SetTransport_n(transport_name)) { | 252 if (!SetTransport_n(rtp_transport, rtcp_transport)) { |
| 256 return false; | 253 return false; |
| 257 } | 254 } |
| 258 | 255 |
| 259 if (!SetDtlsSrtpCryptoSuites_n(transport_channel_, false)) { | 256 if (!SetDtlsSrtpCryptoSuites_n(rtp_transport_, false)) { |
| 260 return false; | 257 return false; |
| 261 } | 258 } |
| 262 if (rtcp_transport_channel_ && | 259 if (rtcp_transport_ && !SetDtlsSrtpCryptoSuites_n(rtcp_transport_, true)) { |
| 263 !SetDtlsSrtpCryptoSuites_n(rtcp_transport_channel_, true)) { | |
| 264 return false; | 260 return false; |
| 265 } | 261 } |
| 266 return true; | 262 return true; |
| 267 } | 263 } |
| 268 | 264 |
| 269 void BaseChannel::Deinit() { | 265 void BaseChannel::Deinit() { |
| 270 RTC_DCHECK(worker_thread_->IsCurrent()); | 266 RTC_DCHECK(worker_thread_->IsCurrent()); |
| 271 media_channel_->SetInterface(NULL); | 267 media_channel_->SetInterface(NULL); |
| 272 // Packets arrive on the network thread, processing packets calls virtual | 268 // Packets arrive on the network thread, processing packets calls virtual |
| 273 // functions, so need to stop this process in Deinit that is called in | 269 // functions, so need to stop this process in Deinit that is called in |
| 274 // derived classes destructor. | 270 // derived classes destructor. |
| 275 network_thread_->Invoke<void>( | 271 network_thread_->Invoke<void>( |
| 276 RTC_FROM_HERE, Bind(&BaseChannel::DisconnectTransportChannels_n, this)); | 272 RTC_FROM_HERE, Bind(&BaseChannel::DisconnectTransportChannels_n, this)); |
| 277 } | 273 } |
| 278 | 274 |
| 279 bool BaseChannel::SetTransport(const std::string& transport_name) { | 275 bool BaseChannel::SetTransport(TransportChannel* rtp_transport, |
| 276 TransportChannel* rtcp_transport) { | |
| 280 return network_thread_->Invoke<bool>( | 277 return network_thread_->Invoke<bool>( |
| 281 RTC_FROM_HERE, Bind(&BaseChannel::SetTransport_n, this, transport_name)); | 278 RTC_FROM_HERE, |
| 279 Bind(&BaseChannel::SetTransport_n, this, rtp_transport, rtcp_transport)); | |
| 282 } | 280 } |
| 283 | 281 |
| 284 bool BaseChannel::SetTransport_n(const std::string& transport_name) { | 282 bool BaseChannel::SetTransport_n(TransportChannel* rtp_transport, |
| 283 TransportChannel* rtcp_transport) { | |
| 285 RTC_DCHECK(network_thread_->IsCurrent()); | 284 RTC_DCHECK(network_thread_->IsCurrent()); |
| 285 if (!rtp_transport && rtcp_transport) { | |
| 286 LOG(LS_WARNING) << "Setting nullptr to RTP Transport and RTCP Transport."; | |
|
Taylor Brandstetter
2017/01/09 22:50:42
It seems like this should never happen. Change log
Zhi Huang
2017/01/12 03:47:46
Done.
| |
| 287 return true; | |
| 288 } | |
| 286 | 289 |
| 287 if (transport_name == transport_name_) { | 290 if (rtcp_transport) { |
| 291 RTC_DCHECK(rtp_transport->transport_name() == | |
| 292 rtcp_transport->transport_name()); | |
|
Taylor Brandstetter
2017/01/09 22:50:42
Could also RTC_DCHECK that ShouldCreateRtcpTranspo
Zhi Huang
2017/01/12 03:47:46
Done.
| |
| 293 } | |
| 294 | |
| 295 if (rtp_transport->transport_name() == transport_name_) { | |
| 288 // Nothing to do if transport name isn't changing. | 296 // Nothing to do if transport name isn't changing. |
| 289 return true; | 297 return true; |
| 290 } | 298 } |
| 291 | 299 |
| 292 // When using DTLS-SRTP, we must reset the SrtpFilter every time the transport | 300 // When using DTLS-SRTP, we must reset the SrtpFilter every time the transport |
| 293 // changes and wait until the DTLS handshake is complete to set the newly | 301 // changes and wait until the DTLS handshake is complete to set the newly |
| 294 // negotiated parameters. | 302 // negotiated parameters. |
| 295 if (ShouldSetupDtlsSrtp_n()) { | 303 if (ShouldSetupDtlsSrtp_n()) { |
| 296 // Set |writable_| to false such that UpdateWritableState_w can set up | 304 // Set |writable_| to false such that UpdateWritableState_w can set up |
| 297 // DTLS-SRTP when |writable_| becomes true again. | 305 // DTLS-SRTP when |writable_| becomes true again. |
| 298 writable_ = false; | 306 writable_ = false; |
| 299 srtp_filter_.ResetParams(); | 307 srtp_filter_.ResetParams(); |
| 300 } | 308 } |
| 301 | 309 |
| 302 // If this BaseChannel uses RTCP and we haven't fully negotiated RTCP mux, | 310 // If this BaseChannel uses RTCP and we haven't fully negotiated RTCP mux, |
| 303 // we need an RTCP channel. | 311 // we need an RTCP channel. |
| 304 if (rtcp_enabled_ && !rtcp_mux_filter_.IsFullyActive()) { | 312 if (ShouldCreateRtcpTransport()) { |
| 305 LOG(LS_INFO) << "Create RTCP TransportChannel for " << content_name() | 313 LOG(LS_INFO) << "Create RTCP Transport for " << content_name() << " on " |
|
Taylor Brandstetter
2017/01/09 22:50:42
Should update log statements; is now "setting" ins
Zhi Huang
2017/01/12 03:47:46
Done.
| |
| 306 << " on " << transport_name << " transport "; | 314 << transport_name() << " transport "; |
| 307 SetTransportChannel_n( | 315 SetTransportChannel_n(true, rtcp_transport); |
| 308 true, transport_controller_->CreateTransportChannel_n( | 316 if (!rtcp_transport_) { |
| 309 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP)); | |
| 310 if (!rtcp_transport_channel_) { | |
| 311 return false; | 317 return false; |
| 312 } | 318 } |
| 313 } | 319 } |
| 314 | 320 |
| 315 LOG(LS_INFO) << "Create non-RTCP TransportChannel for " << content_name() | 321 LOG(LS_INFO) << "Create non-RTCP TransportChannel for " << content_name() |
| 316 << " on " << transport_name << " transport "; | 322 << " on " << transport_name() << " transport "; |
| 317 SetTransportChannel_n( | 323 SetTransportChannel_n(false, rtp_transport); |
| 318 false, transport_controller_->CreateTransportChannel_n( | 324 if (!rtp_transport_) { |
| 319 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP)); | |
| 320 if (!transport_channel_) { | |
| 321 return false; | 325 return false; |
| 322 } | 326 } |
| 323 | 327 |
| 324 transport_name_ = transport_name; | 328 transport_name_ = rtp_transport->transport_name(); |
| 325 | 329 |
| 326 // Update aggregate writable/ready-to-send state between RTP and RTCP upon | 330 // Update aggregate writable/ready-to-send state between RTP and RTCP upon |
| 327 // setting new transport channels. | 331 // setting new transport channels. |
| 328 UpdateWritableState_n(); | 332 UpdateWritableState_n(); |
| 329 // We can only update ready-to-send after updating writability. | 333 // We can only update ready-to-send after updating writability. |
| 330 // | 334 // |
| 331 // On setting a new channel, assume it's ready to send if it's writable, | 335 // On setting a new channel, assume it's ready to send if it's writable, |
| 332 // because we have no way of knowing otherwise (the channel doesn't give us | 336 // because we have no way of knowing otherwise (the channel doesn't give us |
| 333 // "was last send successful?"). | 337 // "was last send successful?"). |
| 334 // | 338 // |
| 335 // This won't always be accurate (the last SendPacket call from another | 339 // This won't always be accurate (the last SendPacket call from another |
| 336 // BaseChannel could have resulted in an error), but even so, we'll just | 340 // BaseChannel could have resulted in an error), but even so, we'll just |
| 337 // encounter the error again and update "ready to send" accordingly. | 341 // encounter the error again and update "ready to send" accordingly. |
| 342 SetTransportChannelReadyToSend(false, | |
| 343 rtp_transport_ && rtp_transport_->writable()); | |
| 338 SetTransportChannelReadyToSend( | 344 SetTransportChannelReadyToSend( |
| 339 false, transport_channel_ && transport_channel_->writable()); | 345 true, rtcp_transport_ && rtcp_transport_->writable()); |
| 340 SetTransportChannelReadyToSend( | |
| 341 true, rtcp_transport_channel_ && rtcp_transport_channel_->writable()); | |
| 342 return true; | 346 return true; |
| 343 } | 347 } |
| 344 | 348 |
| 345 void BaseChannel::SetTransportChannel_n(bool rtcp, | 349 void BaseChannel::SetTransportChannel_n(bool rtcp, |
| 346 TransportChannel* new_channel) { | 350 TransportChannel* new_transport) { |
| 347 RTC_DCHECK(network_thread_->IsCurrent()); | 351 RTC_DCHECK(network_thread_->IsCurrent()); |
| 348 TransportChannel*& old_channel = | 352 TransportChannel*& old_transport = rtcp ? rtcp_transport_ : rtp_transport_; |
| 349 rtcp ? rtcp_transport_channel_ : transport_channel_; | |
| 350 | 353 |
| 351 if (!old_channel && !new_channel) { | 354 if (!old_transport && !new_transport) { |
| 352 // Nothing to do. | 355 // Nothing to do. |
| 353 return; | 356 return; |
| 354 } | 357 } |
| 355 RTC_DCHECK(old_channel != new_channel); | 358 RTC_DCHECK(old_transport != new_transport); |
| 356 | 359 |
| 357 if (old_channel) { | 360 if (old_transport) { |
| 358 DisconnectFromTransportChannel(old_channel); | 361 DisconnectFromTransportChannel(old_transport); |
| 359 transport_controller_->DestroyTransportChannel_n( | 362 SignalDestroyTransport(transport_name_, |
| 360 transport_name_, rtcp ? cricket::ICE_CANDIDATE_COMPONENT_RTCP | 363 rtcp ? cricket::ICE_CANDIDATE_COMPONENT_RTCP |
| 361 : cricket::ICE_CANDIDATE_COMPONENT_RTP); | 364 : cricket::ICE_CANDIDATE_COMPONENT_RTP); |
| 362 } | 365 } |
| 363 | 366 |
| 364 old_channel = new_channel; | 367 old_transport = new_transport; |
| 365 | 368 |
| 366 if (new_channel) { | 369 if (new_transport) { |
| 367 if (rtcp) { | 370 if (rtcp) { |
| 368 RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_filter_.IsActive())) | 371 RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_filter_.IsActive())) |
| 369 << "Setting RTCP for DTLS/SRTP after SrtpFilter is active " | 372 << "Setting RTCP for DTLS/SRTP after SrtpFilter is active " |
| 370 << "should never happen."; | 373 << "should never happen."; |
| 371 } | 374 } |
| 372 ConnectToTransportChannel(new_channel); | 375 ConnectToTransportChannel(new_transport); |
| 373 auto& socket_options = rtcp ? rtcp_socket_options_ : socket_options_; | 376 auto& socket_options = rtcp ? rtcp_socket_options_ : socket_options_; |
| 374 for (const auto& pair : socket_options) { | 377 for (const auto& pair : socket_options) { |
| 375 new_channel->SetOption(pair.first, pair.second); | 378 new_transport->SetOption(pair.first, pair.second); |
| 376 } | 379 } |
| 377 } | 380 } |
| 378 } | 381 } |
| 379 | 382 |
| 380 void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) { | 383 void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) { |
| 381 RTC_DCHECK(network_thread_->IsCurrent()); | 384 RTC_DCHECK(network_thread_->IsCurrent()); |
| 382 | 385 |
| 383 tc->SignalWritableState.connect(this, &BaseChannel::OnWritableState); | 386 tc->SignalWritableState.connect(this, &BaseChannel::OnWritableState); |
| 384 tc->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); | 387 tc->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); |
| 385 tc->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend); | 388 tc->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 439 | 442 |
| 440 bool BaseChannel::SetRemoteContent(const MediaContentDescription* content, | 443 bool BaseChannel::SetRemoteContent(const MediaContentDescription* content, |
| 441 ContentAction action, | 444 ContentAction action, |
| 442 std::string* error_desc) { | 445 std::string* error_desc) { |
| 443 TRACE_EVENT0("webrtc", "BaseChannel::SetRemoteContent"); | 446 TRACE_EVENT0("webrtc", "BaseChannel::SetRemoteContent"); |
| 444 return InvokeOnWorker(RTC_FROM_HERE, Bind(&BaseChannel::SetRemoteContent_w, | 447 return InvokeOnWorker(RTC_FROM_HERE, Bind(&BaseChannel::SetRemoteContent_w, |
| 445 this, content, action, error_desc)); | 448 this, content, action, error_desc)); |
| 446 } | 449 } |
| 447 | 450 |
| 448 void BaseChannel::StartConnectionMonitor(int cms) { | 451 void BaseChannel::StartConnectionMonitor(int cms) { |
| 449 // We pass in the BaseChannel instead of the transport_channel_ | 452 // We pass in the BaseChannel instead of the rtp_transport_ |
| 450 // because if the transport_channel_ changes, the ConnectionMonitor | 453 // because if the rtp_transport_ changes, the ConnectionMonitor |
| 451 // would be pointing to the wrong TransportChannel. | 454 // would be pointing to the wrong TransportChannel. |
| 452 // We pass in the network thread because on that thread connection monitor | 455 // We pass in the network thread because on that thread connection monitor |
| 453 // will call BaseChannel::GetConnectionStats which must be called on the | 456 // will call BaseChannel::GetConnectionStats which must be called on the |
| 454 // network thread. | 457 // network thread. |
| 455 connection_monitor_.reset( | 458 connection_monitor_.reset( |
| 456 new ConnectionMonitor(this, network_thread(), rtc::Thread::Current())); | 459 new ConnectionMonitor(this, network_thread(), rtc::Thread::Current())); |
| 457 connection_monitor_->SignalUpdate.connect( | 460 connection_monitor_->SignalUpdate.connect( |
| 458 this, &BaseChannel::OnConnectionMonitorUpdate); | 461 this, &BaseChannel::OnConnectionMonitorUpdate); |
| 459 connection_monitor_->Start(cms); | 462 connection_monitor_->Start(cms); |
| 460 } | 463 } |
| 461 | 464 |
| 462 void BaseChannel::StopConnectionMonitor() { | 465 void BaseChannel::StopConnectionMonitor() { |
| 463 if (connection_monitor_) { | 466 if (connection_monitor_) { |
| 464 connection_monitor_->Stop(); | 467 connection_monitor_->Stop(); |
| 465 connection_monitor_.reset(); | 468 connection_monitor_.reset(); |
| 466 } | 469 } |
| 467 } | 470 } |
| 468 | 471 |
| 469 bool BaseChannel::GetConnectionStats(ConnectionInfos* infos) { | 472 bool BaseChannel::GetConnectionStats(ConnectionInfos* infos) { |
| 470 RTC_DCHECK(network_thread_->IsCurrent()); | 473 RTC_DCHECK(network_thread_->IsCurrent()); |
| 471 return transport_channel_->GetStats(infos); | 474 return rtp_transport_->GetStats(infos); |
| 475 } | |
| 476 | |
| 477 bool BaseChannel::ShouldCreateRtcpTransport() { | |
|
Taylor Brandstetter
2017/01/09 22:50:42
nit: Would "NeedsRtcpTransport" be a more fitting
Zhi Huang
2017/01/12 03:47:46
Done.
| |
| 478 return rtcp_enabled_ && !rtcp_mux_filter_.IsFullyActive(); | |
| 472 } | 479 } |
| 473 | 480 |
| 474 bool BaseChannel::IsReadyToReceiveMedia_w() const { | 481 bool BaseChannel::IsReadyToReceiveMedia_w() const { |
| 475 // Receive data if we are enabled and have local content, | 482 // Receive data if we are enabled and have local content, |
| 476 return enabled() && IsReceiveContentDirection(local_content_direction_); | 483 return enabled() && IsReceiveContentDirection(local_content_direction_); |
| 477 } | 484 } |
| 478 | 485 |
| 479 bool BaseChannel::IsReadyToSendMedia_w() const { | 486 bool BaseChannel::IsReadyToSendMedia_w() const { |
| 480 // Need to access some state updated on the network thread. | 487 // Need to access some state updated on the network thread. |
| 481 return network_thread_->Invoke<bool>( | 488 return network_thread_->Invoke<bool>( |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 507 RTC_FROM_HERE, Bind(&BaseChannel::SetOption_n, this, type, opt, value)); | 514 RTC_FROM_HERE, Bind(&BaseChannel::SetOption_n, this, type, opt, value)); |
| 508 } | 515 } |
| 509 | 516 |
| 510 int BaseChannel::SetOption_n(SocketType type, | 517 int BaseChannel::SetOption_n(SocketType type, |
| 511 rtc::Socket::Option opt, | 518 rtc::Socket::Option opt, |
| 512 int value) { | 519 int value) { |
| 513 RTC_DCHECK(network_thread_->IsCurrent()); | 520 RTC_DCHECK(network_thread_->IsCurrent()); |
| 514 TransportChannel* channel = nullptr; | 521 TransportChannel* channel = nullptr; |
| 515 switch (type) { | 522 switch (type) { |
| 516 case ST_RTP: | 523 case ST_RTP: |
| 517 channel = transport_channel_; | 524 channel = rtp_transport_; |
| 518 socket_options_.push_back( | 525 socket_options_.push_back( |
| 519 std::pair<rtc::Socket::Option, int>(opt, value)); | 526 std::pair<rtc::Socket::Option, int>(opt, value)); |
| 520 break; | 527 break; |
| 521 case ST_RTCP: | 528 case ST_RTCP: |
| 522 channel = rtcp_transport_channel_; | 529 channel = rtcp_transport_; |
| 523 rtcp_socket_options_.push_back( | 530 rtcp_socket_options_.push_back( |
| 524 std::pair<rtc::Socket::Option, int>(opt, value)); | 531 std::pair<rtc::Socket::Option, int>(opt, value)); |
| 525 break; | 532 break; |
| 526 } | 533 } |
| 527 return channel ? channel->SetOption(opt, value) : -1; | 534 return channel ? channel->SetOption(opt, value) : -1; |
| 528 } | 535 } |
| 529 | 536 |
| 530 bool BaseChannel::SetCryptoOptions(const rtc::CryptoOptions& crypto_options) { | 537 bool BaseChannel::SetCryptoOptions(const rtc::CryptoOptions& crypto_options) { |
| 531 crypto_options_ = crypto_options; | 538 crypto_options_ = crypto_options; |
| 532 return true; | 539 return true; |
| 533 } | 540 } |
| 534 | 541 |
| 535 void BaseChannel::OnWritableState(rtc::PacketTransportInterface* transport) { | 542 void BaseChannel::OnWritableState(rtc::PacketTransportInterface* transport) { |
| 536 RTC_DCHECK(transport == transport_channel_ || | 543 RTC_DCHECK(transport == rtp_transport_ || transport == rtcp_transport_); |
| 537 transport == rtcp_transport_channel_); | |
| 538 RTC_DCHECK(network_thread_->IsCurrent()); | 544 RTC_DCHECK(network_thread_->IsCurrent()); |
| 539 UpdateWritableState_n(); | 545 UpdateWritableState_n(); |
| 540 } | 546 } |
| 541 | 547 |
| 542 void BaseChannel::OnPacketRead(rtc::PacketTransportInterface* transport, | 548 void BaseChannel::OnPacketRead(rtc::PacketTransportInterface* transport, |
| 543 const char* data, | 549 const char* data, |
| 544 size_t len, | 550 size_t len, |
| 545 const rtc::PacketTime& packet_time, | 551 const rtc::PacketTime& packet_time, |
| 546 int flags) { | 552 int flags) { |
| 547 TRACE_EVENT0("webrtc", "BaseChannel::OnPacketRead"); | 553 TRACE_EVENT0("webrtc", "BaseChannel::OnPacketRead"); |
| 548 // OnPacketRead gets called from P2PSocket; now pass data to MediaEngine | 554 // OnPacketRead gets called from P2PSocket; now pass data to MediaEngine |
| 549 RTC_DCHECK(network_thread_->IsCurrent()); | 555 RTC_DCHECK(network_thread_->IsCurrent()); |
| 550 | 556 |
| 551 // When using RTCP multiplexing we might get RTCP packets on the RTP | 557 // When using RTCP multiplexing we might get RTCP packets on the RTP |
| 552 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. | 558 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. |
| 553 bool rtcp = PacketIsRtcp(transport, data, len); | 559 bool rtcp = PacketIsRtcp(transport, data, len); |
| 554 rtc::CopyOnWriteBuffer packet(data, len); | 560 rtc::CopyOnWriteBuffer packet(data, len); |
| 555 HandlePacket(rtcp, &packet, packet_time); | 561 HandlePacket(rtcp, &packet, packet_time); |
| 556 } | 562 } |
| 557 | 563 |
| 558 void BaseChannel::OnReadyToSend(rtc::PacketTransportInterface* transport) { | 564 void BaseChannel::OnReadyToSend(rtc::PacketTransportInterface* transport) { |
| 559 RTC_DCHECK(transport == transport_channel_ || | 565 RTC_DCHECK(transport == rtp_transport_ || transport == rtcp_transport_); |
| 560 transport == rtcp_transport_channel_); | 566 SetTransportChannelReadyToSend(transport == rtcp_transport_, true); |
| 561 SetTransportChannelReadyToSend(transport == rtcp_transport_channel_, true); | |
| 562 } | 567 } |
| 563 | 568 |
| 564 void BaseChannel::OnDtlsState(TransportChannel* channel, | 569 void BaseChannel::OnDtlsState(TransportChannel* channel, |
| 565 DtlsTransportState state) { | 570 DtlsTransportState state) { |
| 566 if (!ShouldSetupDtlsSrtp_n()) { | 571 if (!ShouldSetupDtlsSrtp_n()) { |
| 567 return; | 572 return; |
| 568 } | 573 } |
| 569 | 574 |
| 570 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED | 575 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED |
| 571 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to | 576 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to |
| 572 // cover other scenarios like the whole channel is writable (not just this | 577 // cover other scenarios like the whole channel is writable (not just this |
| 573 // TransportChannel) or when TransportChannel is attached after DTLS is | 578 // TransportChannel) or when TransportChannel is attached after DTLS is |
| 574 // negotiated. | 579 // negotiated. |
| 575 if (state != DTLS_TRANSPORT_CONNECTED) { | 580 if (state != DTLS_TRANSPORT_CONNECTED) { |
| 576 srtp_filter_.ResetParams(); | 581 srtp_filter_.ResetParams(); |
| 577 } | 582 } |
| 578 } | 583 } |
| 579 | 584 |
| 580 void BaseChannel::OnSelectedCandidatePairChanged( | 585 void BaseChannel::OnSelectedCandidatePairChanged( |
| 581 TransportChannel* channel, | 586 TransportChannel* channel, |
| 582 CandidatePairInterface* selected_candidate_pair, | 587 CandidatePairInterface* selected_candidate_pair, |
| 583 int last_sent_packet_id, | 588 int last_sent_packet_id, |
| 584 bool ready_to_send) { | 589 bool ready_to_send) { |
| 585 RTC_DCHECK(channel == transport_channel_ || | 590 RTC_DCHECK(channel == rtp_transport_ || channel == rtcp_transport_); |
| 586 channel == rtcp_transport_channel_); | |
| 587 RTC_DCHECK(network_thread_->IsCurrent()); | 591 RTC_DCHECK(network_thread_->IsCurrent()); |
| 588 selected_candidate_pair_ = selected_candidate_pair; | 592 selected_candidate_pair_ = selected_candidate_pair; |
| 589 std::string transport_name = channel->transport_name(); | 593 std::string transport_name = channel->transport_name(); |
| 590 rtc::NetworkRoute network_route; | 594 rtc::NetworkRoute network_route; |
| 591 if (selected_candidate_pair) { | 595 if (selected_candidate_pair) { |
| 592 network_route = rtc::NetworkRoute( | 596 network_route = rtc::NetworkRoute( |
| 593 ready_to_send, selected_candidate_pair->local_candidate().network_id(), | 597 ready_to_send, selected_candidate_pair->local_candidate().network_id(), |
| 594 selected_candidate_pair->remote_candidate().network_id(), | 598 selected_candidate_pair->remote_candidate().network_id(), |
| 595 last_sent_packet_id); | 599 last_sent_packet_id); |
| 596 | 600 |
| 597 UpdateTransportOverhead(); | 601 UpdateTransportOverhead(); |
| 598 } | 602 } |
| 599 invoker_.AsyncInvoke<void>( | 603 invoker_.AsyncInvoke<void>( |
| 600 RTC_FROM_HERE, worker_thread_, | 604 RTC_FROM_HERE, worker_thread_, |
| 601 Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_, transport_name, | 605 Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_, transport_name, |
| 602 network_route)); | 606 network_route)); |
| 603 } | 607 } |
| 604 | 608 |
| 605 void BaseChannel::SetTransportChannelReadyToSend(bool rtcp, bool ready) { | 609 void BaseChannel::SetTransportChannelReadyToSend(bool rtcp, bool ready) { |
| 606 RTC_DCHECK(network_thread_->IsCurrent()); | 610 RTC_DCHECK(network_thread_->IsCurrent()); |
| 607 if (rtcp) { | 611 if (rtcp) { |
| 608 rtcp_ready_to_send_ = ready; | 612 rtcp_ready_to_send_ = ready; |
| 609 } else { | 613 } else { |
| 610 rtp_ready_to_send_ = ready; | 614 rtp_ready_to_send_ = ready; |
| 611 } | 615 } |
| 612 | 616 |
| 613 bool ready_to_send = | 617 bool ready_to_send = |
| 614 (rtp_ready_to_send_ && | 618 (rtp_ready_to_send_ && |
| 615 // In the case of rtcp mux |rtcp_transport_channel_| will be null. | 619 // In the case of rtcp mux |rtcp_transport_| will be null. |
| 616 (rtcp_ready_to_send_ || !rtcp_transport_channel_)); | 620 (rtcp_ready_to_send_ || !rtcp_transport_)); |
| 617 | 621 |
| 618 invoker_.AsyncInvoke<void>( | 622 invoker_.AsyncInvoke<void>( |
| 619 RTC_FROM_HERE, worker_thread_, | 623 RTC_FROM_HERE, worker_thread_, |
| 620 Bind(&MediaChannel::OnReadyToSend, media_channel_, ready_to_send)); | 624 Bind(&MediaChannel::OnReadyToSend, media_channel_, ready_to_send)); |
| 621 } | 625 } |
| 622 | 626 |
| 623 bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInterface* transport, | 627 bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInterface* transport, |
| 624 const char* data, | 628 const char* data, |
| 625 size_t len) { | 629 size_t len) { |
| 626 return (transport == rtcp_transport_channel_ || | 630 return (transport == rtcp_transport_ || |
| 627 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); | 631 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); |
| 628 } | 632 } |
| 629 | 633 |
| 630 bool BaseChannel::SendPacket(bool rtcp, | 634 bool BaseChannel::SendPacket(bool rtcp, |
| 631 rtc::CopyOnWriteBuffer* packet, | 635 rtc::CopyOnWriteBuffer* packet, |
| 632 const rtc::PacketOptions& options) { | 636 const rtc::PacketOptions& options) { |
| 633 // SendPacket gets called from MediaEngine, on a pacer or an encoder thread. | 637 // SendPacket gets called from MediaEngine, on a pacer or an encoder thread. |
| 634 // If the thread is not our network thread, we will post to our network | 638 // If the thread is not our network thread, we will post to our network |
| 635 // so that the real work happens on our network. This avoids us having to | 639 // so that the real work happens on our network. This avoids us having to |
| 636 // synchronize access to all the pieces of the send path, including | 640 // synchronize access to all the pieces of the send path, including |
| 637 // SRTP and the inner workings of the transport channels. | 641 // SRTP and the inner workings of the transport channels. |
| 638 // The only downside is that we can't return a proper failure code if | 642 // The only downside is that we can't return a proper failure code if |
| 639 // needed. Since UDP is unreliable anyway, this should be a non-issue. | 643 // needed. Since UDP is unreliable anyway, this should be a non-issue. |
| 640 if (!network_thread_->IsCurrent()) { | 644 if (!network_thread_->IsCurrent()) { |
| 641 // Avoid a copy by transferring the ownership of the packet data. | 645 // Avoid a copy by transferring the ownership of the packet data. |
| 642 int message_id = rtcp ? MSG_SEND_RTCP_PACKET : MSG_SEND_RTP_PACKET; | 646 int message_id = rtcp ? MSG_SEND_RTCP_PACKET : MSG_SEND_RTP_PACKET; |
| 643 SendPacketMessageData* data = new SendPacketMessageData; | 647 SendPacketMessageData* data = new SendPacketMessageData; |
| 644 data->packet = std::move(*packet); | 648 data->packet = std::move(*packet); |
| 645 data->options = options; | 649 data->options = options; |
| 646 network_thread_->Post(RTC_FROM_HERE, this, message_id, data); | 650 network_thread_->Post(RTC_FROM_HERE, this, message_id, data); |
| 647 return true; | 651 return true; |
| 648 } | 652 } |
| 649 TRACE_EVENT0("webrtc", "BaseChannel::SendPacket"); | 653 TRACE_EVENT0("webrtc", "BaseChannel::SendPacket"); |
| 650 | 654 |
| 651 // Now that we are on the correct thread, ensure we have a place to send this | 655 // Now that we are on the correct thread, ensure we have a place to send this |
| 652 // packet before doing anything. (We might get RTCP packets that we don't | 656 // packet before doing anything. (We might get RTCP packets that we don't |
| 653 // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP | 657 // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP |
| 654 // transport. | 658 // transport. |
| 655 TransportChannel* channel = (!rtcp || rtcp_mux_filter_.IsActive()) ? | 659 TransportChannel* channel = |
| 656 transport_channel_ : rtcp_transport_channel_; | 660 (!rtcp || rtcp_mux_filter_.IsActive()) ? rtp_transport_ : rtcp_transport_; |
| 657 if (!channel || !channel->writable()) { | 661 if (!channel || !channel->writable()) { |
| 658 return false; | 662 return false; |
| 659 } | 663 } |
| 660 | 664 |
| 661 // Protect ourselves against crazy data. | 665 // Protect ourselves against crazy data. |
| 662 if (!ValidPacket(rtcp, packet)) { | 666 if (!ValidPacket(rtcp, packet)) { |
| 663 LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " " | 667 LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " " |
| 664 << PacketType(rtcp) | 668 << PacketType(rtcp) |
| 665 << " packet: wrong size=" << packet->size(); | 669 << " packet: wrong size=" << packet->size(); |
| 666 return false; | 670 return false; |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 894 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); | 898 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); |
| 895 if (!enabled_) | 899 if (!enabled_) |
| 896 return; | 900 return; |
| 897 | 901 |
| 898 LOG(LS_INFO) << "Channel disabled"; | 902 LOG(LS_INFO) << "Channel disabled"; |
| 899 enabled_ = false; | 903 enabled_ = false; |
| 900 UpdateMediaSendRecvState_w(); | 904 UpdateMediaSendRecvState_w(); |
| 901 } | 905 } |
| 902 | 906 |
| 903 void BaseChannel::UpdateWritableState_n() { | 907 void BaseChannel::UpdateWritableState_n() { |
| 904 if (transport_channel_ && transport_channel_->writable() && | 908 if (rtp_transport_ && rtp_transport_->writable() && |
| 905 (!rtcp_transport_channel_ || rtcp_transport_channel_->writable())) { | 909 (!rtcp_transport_ || rtcp_transport_->writable())) { |
| 906 ChannelWritable_n(); | 910 ChannelWritable_n(); |
| 907 } else { | 911 } else { |
| 908 ChannelNotWritable_n(); | 912 ChannelNotWritable_n(); |
| 909 } | 913 } |
| 910 } | 914 } |
| 911 | 915 |
| 912 void BaseChannel::ChannelWritable_n() { | 916 void BaseChannel::ChannelWritable_n() { |
| 913 RTC_DCHECK(network_thread_->IsCurrent()); | 917 RTC_DCHECK(network_thread_->IsCurrent()); |
| 914 if (writable_) { | 918 if (writable_) { |
| 915 return; | 919 return; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 950 if (!rtcp) { | 954 if (!rtcp) { |
| 951 GetSrtpCryptoSuites_n(&crypto_suites); | 955 GetSrtpCryptoSuites_n(&crypto_suites); |
| 952 } else { | 956 } else { |
| 953 GetDefaultSrtpCryptoSuites(crypto_options(), &crypto_suites); | 957 GetDefaultSrtpCryptoSuites(crypto_options(), &crypto_suites); |
| 954 } | 958 } |
| 955 return tc->SetSrtpCryptoSuites(crypto_suites); | 959 return tc->SetSrtpCryptoSuites(crypto_suites); |
| 956 } | 960 } |
| 957 | 961 |
| 958 bool BaseChannel::ShouldSetupDtlsSrtp_n() const { | 962 bool BaseChannel::ShouldSetupDtlsSrtp_n() const { |
| 959 // Since DTLS is applied to all channels, checking RTP should be enough. | 963 // Since DTLS is applied to all channels, checking RTP should be enough. |
| 960 return transport_channel_ && transport_channel_->IsDtlsActive(); | 964 return rtp_transport_ && rtp_transport_->IsDtlsActive(); |
| 961 } | 965 } |
| 962 | 966 |
| 963 // This function returns true if either DTLS-SRTP is not in use | 967 // This function returns true if either DTLS-SRTP is not in use |
| 964 // *or* DTLS-SRTP is successfully set up. | 968 // *or* DTLS-SRTP is successfully set up. |
| 965 bool BaseChannel::SetupDtlsSrtp_n(bool rtcp_channel) { | 969 bool BaseChannel::SetupDtlsSrtp_n(bool rtcp_channel) { |
| 966 RTC_DCHECK(network_thread_->IsCurrent()); | 970 RTC_DCHECK(network_thread_->IsCurrent()); |
| 967 bool ret = false; | 971 bool ret = false; |
| 968 | 972 |
| 969 TransportChannel* channel = | 973 TransportChannel* channel = rtcp_channel ? rtcp_transport_ : rtp_transport_; |
| 970 rtcp_channel ? rtcp_transport_channel_ : transport_channel_; | |
| 971 | 974 |
| 972 RTC_DCHECK(channel->IsDtlsActive()); | 975 RTC_DCHECK(channel->IsDtlsActive()); |
| 973 | 976 |
| 974 int selected_crypto_suite; | 977 int selected_crypto_suite; |
| 975 | 978 |
| 976 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) { | 979 if (!channel->GetSrtpCryptoSuite(&selected_crypto_suite)) { |
| 977 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite"; | 980 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite"; |
| 978 return false; | 981 return false; |
| 979 } | 982 } |
| 980 | 983 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1058 | 1061 |
| 1059 if (!ShouldSetupDtlsSrtp_n()) { | 1062 if (!ShouldSetupDtlsSrtp_n()) { |
| 1060 return; | 1063 return; |
| 1061 } | 1064 } |
| 1062 | 1065 |
| 1063 if (!SetupDtlsSrtp_n(false)) { | 1066 if (!SetupDtlsSrtp_n(false)) { |
| 1064 SignalDtlsSetupFailure_n(false); | 1067 SignalDtlsSetupFailure_n(false); |
| 1065 return; | 1068 return; |
| 1066 } | 1069 } |
| 1067 | 1070 |
| 1068 if (rtcp_transport_channel_) { | 1071 if (rtcp_transport_) { |
| 1069 if (!SetupDtlsSrtp_n(true)) { | 1072 if (!SetupDtlsSrtp_n(true)) { |
| 1070 SignalDtlsSetupFailure_n(true); | 1073 SignalDtlsSetupFailure_n(true); |
| 1071 return; | 1074 return; |
| 1072 } | 1075 } |
| 1073 } | 1076 } |
| 1074 } | 1077 } |
| 1075 | 1078 |
| 1076 void BaseChannel::ChannelNotWritable_n() { | 1079 void BaseChannel::ChannelNotWritable_n() { |
| 1077 RTC_DCHECK(network_thread_->IsCurrent()); | 1080 RTC_DCHECK(network_thread_->IsCurrent()); |
| 1078 if (!writable_) | 1081 if (!writable_) |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1115 } | 1118 } |
| 1116 | 1119 |
| 1117 return true; | 1120 return true; |
| 1118 } | 1121 } |
| 1119 | 1122 |
| 1120 // |dtls| will be set to true if DTLS is active for transport channel and | 1123 // |dtls| will be set to true if DTLS is active for transport channel and |
| 1121 // crypto is empty. | 1124 // crypto is empty. |
| 1122 bool BaseChannel::CheckSrtpConfig_n(const std::vector<CryptoParams>& cryptos, | 1125 bool BaseChannel::CheckSrtpConfig_n(const std::vector<CryptoParams>& cryptos, |
| 1123 bool* dtls, | 1126 bool* dtls, |
| 1124 std::string* error_desc) { | 1127 std::string* error_desc) { |
| 1125 *dtls = transport_channel_->IsDtlsActive(); | 1128 *dtls = rtp_transport_->IsDtlsActive(); |
| 1126 if (*dtls && !cryptos.empty()) { | 1129 if (*dtls && !cryptos.empty()) { |
| 1127 SafeSetError("Cryptos must be empty when DTLS is active.", error_desc); | 1130 SafeSetError("Cryptos must be empty when DTLS is active.", error_desc); |
| 1128 return false; | 1131 return false; |
| 1129 } | 1132 } |
| 1130 return true; | 1133 return true; |
| 1131 } | 1134 } |
| 1132 | 1135 |
| 1133 bool BaseChannel::SetSrtp_n(const std::vector<CryptoParams>& cryptos, | 1136 bool BaseChannel::SetSrtp_n(const std::vector<CryptoParams>& cryptos, |
| 1134 ContentAction action, | 1137 ContentAction action, |
| 1135 ContentSource src, | 1138 ContentSource src, |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1228 } | 1231 } |
| 1229 if (!ret) { | 1232 if (!ret) { |
| 1230 SafeSetError("Failed to setup RTCP mux filter.", error_desc); | 1233 SafeSetError("Failed to setup RTCP mux filter.", error_desc); |
| 1231 return false; | 1234 return false; |
| 1232 } | 1235 } |
| 1233 // |rtcp_mux_filter_| can be active if |action| is CA_PRANSWER or | 1236 // |rtcp_mux_filter_| can be active if |action| is CA_PRANSWER or |
| 1234 // CA_ANSWER, but we only want to tear down the RTCP transport channel if we | 1237 // CA_ANSWER, but we only want to tear down the RTCP transport channel if we |
| 1235 // received a final answer. | 1238 // received a final answer. |
| 1236 if (rtcp_mux_filter_.IsActive()) { | 1239 if (rtcp_mux_filter_.IsActive()) { |
| 1237 // If the RTP transport is already writable, then so are we. | 1240 // If the RTP transport is already writable, then so are we. |
| 1238 if (transport_channel_->writable()) { | 1241 if (rtp_transport_->writable()) { |
| 1239 ChannelWritable_n(); | 1242 ChannelWritable_n(); |
| 1240 } | 1243 } |
| 1241 } | 1244 } |
| 1242 | 1245 |
| 1243 return true; | 1246 return true; |
| 1244 } | 1247 } |
| 1245 | 1248 |
| 1246 bool BaseChannel::AddRecvStream_w(const StreamParams& sp) { | 1249 bool BaseChannel::AddRecvStream_w(const StreamParams& sp) { |
| 1247 RTC_DCHECK(worker_thread() == rtc::Thread::Current()); | 1250 RTC_DCHECK(worker_thread() == rtc::Thread::Current()); |
| 1248 return media_channel()->AddRecvStream(sp); | 1251 return media_channel()->AddRecvStream(sp); |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1463 rtc::Bind(&BaseChannel::SignalSentPacket_w, this, sent_packet)); | 1466 rtc::Bind(&BaseChannel::SignalSentPacket_w, this, sent_packet)); |
| 1464 } | 1467 } |
| 1465 | 1468 |
| 1466 void BaseChannel::SignalSentPacket_w(const rtc::SentPacket& sent_packet) { | 1469 void BaseChannel::SignalSentPacket_w(const rtc::SentPacket& sent_packet) { |
| 1467 RTC_DCHECK(worker_thread_->IsCurrent()); | 1470 RTC_DCHECK(worker_thread_->IsCurrent()); |
| 1468 SignalSentPacket(sent_packet); | 1471 SignalSentPacket(sent_packet); |
| 1469 } | 1472 } |
| 1470 | 1473 |
| 1471 VoiceChannel::VoiceChannel(rtc::Thread* worker_thread, | 1474 VoiceChannel::VoiceChannel(rtc::Thread* worker_thread, |
| 1472 rtc::Thread* network_thread, | 1475 rtc::Thread* network_thread, |
| 1476 rtc::Thread* signaling_thread, | |
| 1473 MediaEngineInterface* media_engine, | 1477 MediaEngineInterface* media_engine, |
| 1474 VoiceMediaChannel* media_channel, | 1478 VoiceMediaChannel* media_channel, |
| 1475 TransportController* transport_controller, | |
| 1476 const std::string& content_name, | 1479 const std::string& content_name, |
| 1477 bool rtcp, | 1480 bool rtcp, |
| 1478 bool srtp_required) | 1481 bool srtp_required) |
| 1479 : BaseChannel(worker_thread, | 1482 : BaseChannel(worker_thread, |
| 1480 network_thread, | 1483 network_thread, |
| 1484 signaling_thread, | |
| 1481 media_channel, | 1485 media_channel, |
| 1482 transport_controller, | |
| 1483 content_name, | 1486 content_name, |
| 1484 rtcp, | 1487 rtcp, |
| 1485 srtp_required), | 1488 srtp_required), |
| 1486 media_engine_(media_engine), | 1489 media_engine_(media_engine), |
| 1487 received_media_(false) {} | 1490 received_media_(false) {} |
| 1488 | 1491 |
| 1489 VoiceChannel::~VoiceChannel() { | 1492 VoiceChannel::~VoiceChannel() { |
| 1490 TRACE_EVENT0("webrtc", "VoiceChannel::~VoiceChannel"); | 1493 TRACE_EVENT0("webrtc", "VoiceChannel::~VoiceChannel"); |
| 1491 StopAudioMonitor(); | 1494 StopAudioMonitor(); |
| 1492 StopMediaMonitor(); | 1495 StopMediaMonitor(); |
| 1493 // this can't be done in the base class, since it calls a virtual | 1496 // this can't be done in the base class, since it calls a virtual |
| 1494 DisableMedia_w(); | 1497 DisableMedia_w(); |
| 1495 Deinit(); | 1498 Deinit(); |
| 1496 } | 1499 } |
| 1497 | 1500 |
| 1498 bool VoiceChannel::Init_w(const std::string* bundle_transport_name) { | 1501 bool VoiceChannel::Init_w(TransportChannel* rtp_transport, |
| 1499 if (!BaseChannel::Init_w(bundle_transport_name)) { | 1502 TransportChannel* rtcp_transport) { |
| 1500 return false; | 1503 return BaseChannel::Init_w(rtp_transport, rtcp_transport); |
| 1501 } | |
| 1502 return true; | |
| 1503 } | 1504 } |
| 1504 | 1505 |
| 1505 bool VoiceChannel::SetAudioSend(uint32_t ssrc, | 1506 bool VoiceChannel::SetAudioSend(uint32_t ssrc, |
| 1506 bool enable, | 1507 bool enable, |
| 1507 const AudioOptions* options, | 1508 const AudioOptions* options, |
| 1508 AudioSource* source) { | 1509 AudioSource* source) { |
| 1509 return InvokeOnWorker(RTC_FROM_HERE, | 1510 return InvokeOnWorker(RTC_FROM_HERE, |
| 1510 Bind(&VoiceMediaChannel::SetAudioSend, media_channel(), | 1511 Bind(&VoiceMediaChannel::SetAudioSend, media_channel(), |
| 1511 ssrc, enable, options, source)); | 1512 ssrc, enable, options, source)); |
| 1512 } | 1513 } |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1879 SignalAudioMonitor(this, info); | 1880 SignalAudioMonitor(this, info); |
| 1880 } | 1881 } |
| 1881 | 1882 |
| 1882 void VoiceChannel::GetSrtpCryptoSuites_n( | 1883 void VoiceChannel::GetSrtpCryptoSuites_n( |
| 1883 std::vector<int>* crypto_suites) const { | 1884 std::vector<int>* crypto_suites) const { |
| 1884 GetSupportedAudioCryptoSuites(crypto_options(), crypto_suites); | 1885 GetSupportedAudioCryptoSuites(crypto_options(), crypto_suites); |
| 1885 } | 1886 } |
| 1886 | 1887 |
| 1887 VideoChannel::VideoChannel(rtc::Thread* worker_thread, | 1888 VideoChannel::VideoChannel(rtc::Thread* worker_thread, |
| 1888 rtc::Thread* network_thread, | 1889 rtc::Thread* network_thread, |
| 1890 rtc::Thread* signaling_thread, | |
| 1889 VideoMediaChannel* media_channel, | 1891 VideoMediaChannel* media_channel, |
| 1890 TransportController* transport_controller, | |
| 1891 const std::string& content_name, | 1892 const std::string& content_name, |
| 1892 bool rtcp, | 1893 bool rtcp, |
| 1893 bool srtp_required) | 1894 bool srtp_required) |
| 1894 : BaseChannel(worker_thread, | 1895 : BaseChannel(worker_thread, |
| 1895 network_thread, | 1896 network_thread, |
| 1897 signaling_thread, | |
| 1896 media_channel, | 1898 media_channel, |
| 1897 transport_controller, | |
| 1898 content_name, | 1899 content_name, |
| 1899 rtcp, | 1900 rtcp, |
| 1900 srtp_required) {} | 1901 srtp_required) {} |
| 1901 | 1902 |
| 1902 bool VideoChannel::Init_w(const std::string* bundle_transport_name) { | 1903 bool VideoChannel::Init_w(TransportChannel* rtp_transport, |
| 1903 if (!BaseChannel::Init_w(bundle_transport_name)) { | 1904 TransportChannel* rtcp_transport) { |
| 1904 return false; | 1905 return BaseChannel::Init_w(rtp_transport, rtcp_transport); |
| 1905 } | |
| 1906 return true; | |
| 1907 } | 1906 } |
| 1908 | 1907 |
| 1909 VideoChannel::~VideoChannel() { | 1908 VideoChannel::~VideoChannel() { |
| 1910 TRACE_EVENT0("webrtc", "VideoChannel::~VideoChannel"); | 1909 TRACE_EVENT0("webrtc", "VideoChannel::~VideoChannel"); |
| 1911 StopMediaMonitor(); | 1910 StopMediaMonitor(); |
| 1912 // this can't be done in the base class, since it calls a virtual | 1911 // this can't be done in the base class, since it calls a virtual |
| 1913 DisableMedia_w(); | 1912 DisableMedia_w(); |
| 1914 | 1913 |
| 1915 Deinit(); | 1914 Deinit(); |
| 1916 } | 1915 } |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2142 SignalMediaMonitor(this, info); | 2141 SignalMediaMonitor(this, info); |
| 2143 } | 2142 } |
| 2144 | 2143 |
| 2145 void VideoChannel::GetSrtpCryptoSuites_n( | 2144 void VideoChannel::GetSrtpCryptoSuites_n( |
| 2146 std::vector<int>* crypto_suites) const { | 2145 std::vector<int>* crypto_suites) const { |
| 2147 GetSupportedVideoCryptoSuites(crypto_options(), crypto_suites); | 2146 GetSupportedVideoCryptoSuites(crypto_options(), crypto_suites); |
| 2148 } | 2147 } |
| 2149 | 2148 |
| 2150 DataChannel::DataChannel(rtc::Thread* worker_thread, | 2149 DataChannel::DataChannel(rtc::Thread* worker_thread, |
| 2151 rtc::Thread* network_thread, | 2150 rtc::Thread* network_thread, |
| 2151 rtc::Thread* signaling_thread, | |
| 2152 DataMediaChannel* media_channel, | 2152 DataMediaChannel* media_channel, |
| 2153 TransportController* transport_controller, | |
| 2154 const std::string& content_name, | 2153 const std::string& content_name, |
| 2155 bool rtcp, | 2154 bool rtcp, |
| 2156 bool srtp_required) | 2155 bool srtp_required) |
| 2157 : BaseChannel(worker_thread, | 2156 : BaseChannel(worker_thread, |
| 2158 network_thread, | 2157 network_thread, |
| 2158 signaling_thread, | |
| 2159 media_channel, | 2159 media_channel, |
| 2160 transport_controller, | |
| 2161 content_name, | 2160 content_name, |
| 2162 rtcp, | 2161 rtcp, |
| 2163 srtp_required), | 2162 srtp_required), |
| 2164 data_channel_type_(cricket::DCT_NONE), | 2163 data_channel_type_(cricket::DCT_NONE), |
| 2165 ready_to_send_data_(false) {} | 2164 ready_to_send_data_(false) {} |
| 2166 | 2165 |
| 2167 DataChannel::~DataChannel() { | 2166 DataChannel::~DataChannel() { |
| 2168 TRACE_EVENT0("webrtc", "DataChannel::~DataChannel"); | 2167 TRACE_EVENT0("webrtc", "DataChannel::~DataChannel"); |
| 2169 StopMediaMonitor(); | 2168 StopMediaMonitor(); |
| 2170 // this can't be done in the base class, since it calls a virtual | 2169 // this can't be done in the base class, since it calls a virtual |
| 2171 DisableMedia_w(); | 2170 DisableMedia_w(); |
| 2172 | 2171 |
| 2173 Deinit(); | 2172 Deinit(); |
| 2174 } | 2173 } |
| 2175 | 2174 |
| 2176 bool DataChannel::Init_w(const std::string* bundle_transport_name) { | 2175 bool DataChannel::Init_w(TransportChannel* rtp_transport, |
| 2177 if (!BaseChannel::Init_w(bundle_transport_name)) { | 2176 TransportChannel* rtcp_transport) { |
| 2177 if (!BaseChannel::Init_w(rtp_transport, rtcp_transport)) { | |
| 2178 return false; | 2178 return false; |
| 2179 } | 2179 } |
| 2180 media_channel()->SignalDataReceived.connect( | 2180 media_channel()->SignalDataReceived.connect( |
| 2181 this, &DataChannel::OnDataReceived); | 2181 this, &DataChannel::OnDataReceived); |
| 2182 media_channel()->SignalReadyToSend.connect( | 2182 media_channel()->SignalReadyToSend.connect( |
| 2183 this, &DataChannel::OnDataChannelReadyToSend); | 2183 this, &DataChannel::OnDataChannelReadyToSend); |
| 2184 media_channel()->SignalStreamClosedRemotely.connect( | 2184 media_channel()->SignalStreamClosedRemotely.connect( |
| 2185 this, &DataChannel::OnStreamClosedRemotely); | 2185 this, &DataChannel::OnStreamClosedRemotely); |
| 2186 return true; | 2186 return true; |
| 2187 } | 2187 } |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2467 } | 2467 } |
| 2468 | 2468 |
| 2469 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { | 2469 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { |
| 2470 rtc::TypedMessageData<uint32_t>* message = | 2470 rtc::TypedMessageData<uint32_t>* message = |
| 2471 new rtc::TypedMessageData<uint32_t>(sid); | 2471 new rtc::TypedMessageData<uint32_t>(sid); |
| 2472 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_STREAMCLOSEDREMOTELY, | 2472 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_STREAMCLOSEDREMOTELY, |
| 2473 message); | 2473 message); |
| 2474 } | 2474 } |
| 2475 | 2475 |
| 2476 } // namespace cricket | 2476 } // namespace cricket |
| OLD | NEW |