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 |
11 #include <algorithm> | 11 #include <algorithm> |
12 #include <iterator> | 12 #include <iterator> |
13 #include <utility> | 13 #include <utility> |
14 | 14 |
15 #include "webrtc/pc/channel.h" | 15 #include "webrtc/pc/channel.h" |
16 | 16 |
17 #include "webrtc/api/call/audio_sink.h" | 17 #include "webrtc/api/call/audio_sink.h" |
18 #include "webrtc/media/base/mediaconstants.h" | 18 #include "webrtc/media/base/mediaconstants.h" |
19 #include "webrtc/media/base/rtputils.h" | 19 #include "webrtc/media/base/rtputils.h" |
20 #include "webrtc/rtc_base/bind.h" | 20 #include "webrtc/rtc_base/bind.h" |
21 #include "webrtc/rtc_base/byteorder.h" | 21 #include "webrtc/rtc_base/byteorder.h" |
22 #include "webrtc/rtc_base/checks.h" | 22 #include "webrtc/rtc_base/checks.h" |
23 #include "webrtc/rtc_base/copyonwritebuffer.h" | 23 #include "webrtc/rtc_base/copyonwritebuffer.h" |
24 #include "webrtc/rtc_base/dscp.h" | 24 #include "webrtc/rtc_base/dscp.h" |
25 #include "webrtc/rtc_base/logging.h" | 25 #include "webrtc/rtc_base/logging.h" |
26 #include "webrtc/rtc_base/networkroute.h" | 26 #include "webrtc/rtc_base/networkroute.h" |
| 27 #include "webrtc/rtc_base/ptr_util.h" |
27 #include "webrtc/rtc_base/trace_event.h" | 28 #include "webrtc/rtc_base/trace_event.h" |
28 // Adding 'nogncheck' to disable the gn include headers check to support modular | 29 // Adding 'nogncheck' to disable the gn include headers check to support modular |
29 // WebRTC build targets. | 30 // WebRTC build targets. |
30 #include "webrtc/media/engine/webrtcvoiceengine.h" // nogncheck | 31 #include "webrtc/media/engine/webrtcvoiceengine.h" // nogncheck |
31 #include "webrtc/p2p/base/packettransportinternal.h" | 32 #include "webrtc/p2p/base/packettransportinternal.h" |
32 #include "webrtc/pc/channelmanager.h" | 33 #include "webrtc/pc/channelmanager.h" |
33 | 34 |
34 namespace cricket { | 35 namespace cricket { |
35 using rtc::Bind; | 36 using rtc::Bind; |
36 | 37 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 rtc::Thread* signaling_thread, | 149 rtc::Thread* signaling_thread, |
149 MediaChannel* media_channel, | 150 MediaChannel* media_channel, |
150 const std::string& content_name, | 151 const std::string& content_name, |
151 bool rtcp_mux_required, | 152 bool rtcp_mux_required, |
152 bool srtp_required) | 153 bool srtp_required) |
153 : worker_thread_(worker_thread), | 154 : worker_thread_(worker_thread), |
154 network_thread_(network_thread), | 155 network_thread_(network_thread), |
155 signaling_thread_(signaling_thread), | 156 signaling_thread_(signaling_thread), |
156 content_name_(content_name), | 157 content_name_(content_name), |
157 rtcp_mux_required_(rtcp_mux_required), | 158 rtcp_mux_required_(rtcp_mux_required), |
158 rtp_transport_(rtcp_mux_required), | 159 rtp_transport_(rtc::MakeUnique<webrtc::RtpTransport>(rtcp_mux_required)), |
159 srtp_required_(srtp_required), | 160 srtp_required_(srtp_required), |
160 media_channel_(media_channel), | 161 media_channel_(media_channel), |
161 selected_candidate_pair_(nullptr) { | 162 selected_candidate_pair_(nullptr) { |
162 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); | 163 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); |
163 #if defined(ENABLE_EXTERNAL_AUTH) | 164 #if defined(ENABLE_EXTERNAL_AUTH) |
164 srtp_filter_.EnableExternalAuth(); | 165 srtp_filter_.EnableExternalAuth(); |
165 #endif | 166 #endif |
166 rtp_transport_.SignalReadyToSend.connect( | 167 rtp_transport_->SignalReadyToSend.connect( |
167 this, &BaseChannel::OnTransportReadyToSend); | 168 this, &BaseChannel::OnTransportReadyToSend); |
168 // TODO(zstein): RtpTransport::SignalPacketReceived will probably be replaced | 169 // TODO(zstein): RtpTransport::SignalPacketReceived will probably be replaced |
169 // with a callback interface later so that the demuxer can select which | 170 // with a callback interface later so that the demuxer can select which |
170 // channel to signal. | 171 // channel to signal. |
171 rtp_transport_.SignalPacketReceived.connect(this, | 172 rtp_transport_->SignalPacketReceived.connect(this, |
172 &BaseChannel::OnPacketReceived); | 173 &BaseChannel::OnPacketReceived); |
173 LOG(LS_INFO) << "Created channel for " << content_name; | 174 LOG(LS_INFO) << "Created channel for " << content_name; |
174 } | 175 } |
175 | 176 |
176 BaseChannel::~BaseChannel() { | 177 BaseChannel::~BaseChannel() { |
177 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel"); | 178 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel"); |
178 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); | 179 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); |
179 Deinit(); | 180 Deinit(); |
180 StopConnectionMonitor(); | 181 StopConnectionMonitor(); |
181 // Eats any outstanding messages or packets. | 182 // Eats any outstanding messages or packets. |
182 worker_thread_->Clear(&invoker_); | 183 worker_thread_->Clear(&invoker_); |
183 worker_thread_->Clear(this); | 184 worker_thread_->Clear(this); |
184 // We must destroy the media channel before the transport channel, otherwise | 185 // We must destroy the media channel before the transport channel, otherwise |
185 // the media channel may try to send on the dead transport channel. NULLing | 186 // the media channel may try to send on the dead transport channel. NULLing |
186 // is not an effective strategy since the sends will come on another thread. | 187 // is not an effective strategy since the sends will come on another thread. |
187 delete media_channel_; | 188 delete media_channel_; |
188 LOG(LS_INFO) << "Destroyed channel: " << content_name_; | 189 LOG(LS_INFO) << "Destroyed channel: " << content_name_; |
189 } | 190 } |
190 | 191 |
191 void BaseChannel::DisconnectTransportChannels_n() { | 192 void BaseChannel::DisconnectTransportChannels_n() { |
192 // Send any outstanding RTCP packets. | 193 // Send any outstanding RTCP packets. |
193 FlushRtcpMessages_n(); | 194 FlushRtcpMessages_n(); |
194 | 195 |
195 // Stop signals from transport channels, but keep them alive because | 196 // Stop signals from transport channels, but keep them alive because |
196 // media_channel may use them from a different thread. | 197 // media_channel may use them from a different thread. |
197 if (rtp_dtls_transport_) { | 198 if (rtp_dtls_transport_) { |
198 DisconnectFromDtlsTransport(rtp_dtls_transport_); | 199 DisconnectFromDtlsTransport(rtp_dtls_transport_); |
199 } else if (rtp_transport_.rtp_packet_transport()) { | 200 } else if (rtp_transport_->rtp_packet_transport()) { |
200 DisconnectFromPacketTransport(rtp_transport_.rtp_packet_transport()); | 201 DisconnectFromPacketTransport(rtp_transport_->rtp_packet_transport()); |
201 } | 202 } |
202 if (rtcp_dtls_transport_) { | 203 if (rtcp_dtls_transport_) { |
203 DisconnectFromDtlsTransport(rtcp_dtls_transport_); | 204 DisconnectFromDtlsTransport(rtcp_dtls_transport_); |
204 } else if (rtp_transport_.rtcp_packet_transport()) { | 205 } else if (rtp_transport_->rtcp_packet_transport()) { |
205 DisconnectFromPacketTransport(rtp_transport_.rtcp_packet_transport()); | 206 DisconnectFromPacketTransport(rtp_transport_->rtcp_packet_transport()); |
206 } | 207 } |
207 | 208 |
208 rtp_transport_.SetRtpPacketTransport(nullptr); | 209 rtp_transport_->SetRtpPacketTransport(nullptr); |
209 rtp_transport_.SetRtcpPacketTransport(nullptr); | 210 rtp_transport_->SetRtcpPacketTransport(nullptr); |
210 | 211 |
211 // Clear pending read packets/messages. | 212 // Clear pending read packets/messages. |
212 network_thread_->Clear(&invoker_); | 213 network_thread_->Clear(&invoker_); |
213 network_thread_->Clear(this); | 214 network_thread_->Clear(this); |
214 } | 215 } |
215 | 216 |
216 bool BaseChannel::Init_w(DtlsTransportInternal* rtp_dtls_transport, | 217 bool BaseChannel::Init_w(DtlsTransportInternal* rtp_dtls_transport, |
217 DtlsTransportInternal* rtcp_dtls_transport, | 218 DtlsTransportInternal* rtcp_dtls_transport, |
218 rtc::PacketTransportInternal* rtp_packet_transport, | 219 rtc::PacketTransportInternal* rtp_packet_transport, |
219 rtc::PacketTransportInternal* rtcp_packet_transport) { | 220 rtc::PacketTransportInternal* rtcp_packet_transport) { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 rtc::PacketTransportInternal* rtcp_packet_transport) { | 279 rtc::PacketTransportInternal* rtcp_packet_transport) { |
279 RTC_DCHECK(network_thread_->IsCurrent()); | 280 RTC_DCHECK(network_thread_->IsCurrent()); |
280 // Validate some assertions about the input. | 281 // Validate some assertions about the input. |
281 RTC_DCHECK(rtp_packet_transport); | 282 RTC_DCHECK(rtp_packet_transport); |
282 RTC_DCHECK_EQ(NeedsRtcpTransport(), rtcp_packet_transport != nullptr); | 283 RTC_DCHECK_EQ(NeedsRtcpTransport(), rtcp_packet_transport != nullptr); |
283 if (rtp_dtls_transport || rtcp_dtls_transport) { | 284 if (rtp_dtls_transport || rtcp_dtls_transport) { |
284 // DTLS/non-DTLS pointers should be to the same object. | 285 // DTLS/non-DTLS pointers should be to the same object. |
285 RTC_DCHECK(rtp_dtls_transport == rtp_packet_transport); | 286 RTC_DCHECK(rtp_dtls_transport == rtp_packet_transport); |
286 RTC_DCHECK(rtcp_dtls_transport == rtcp_packet_transport); | 287 RTC_DCHECK(rtcp_dtls_transport == rtcp_packet_transport); |
287 // Can't go from non-DTLS to DTLS. | 288 // Can't go from non-DTLS to DTLS. |
288 RTC_DCHECK(!rtp_transport_.rtp_packet_transport() || rtp_dtls_transport_); | 289 RTC_DCHECK(!rtp_transport_->rtp_packet_transport() || rtp_dtls_transport_); |
289 } else { | 290 } else { |
290 // Can't go from DTLS to non-DTLS. | 291 // Can't go from DTLS to non-DTLS. |
291 RTC_DCHECK(!rtp_dtls_transport_); | 292 RTC_DCHECK(!rtp_dtls_transport_); |
292 } | 293 } |
293 // Transport names should be the same. | 294 // Transport names should be the same. |
294 if (rtp_dtls_transport && rtcp_dtls_transport) { | 295 if (rtp_dtls_transport && rtcp_dtls_transport) { |
295 RTC_DCHECK(rtp_dtls_transport->transport_name() == | 296 RTC_DCHECK(rtp_dtls_transport->transport_name() == |
296 rtcp_dtls_transport->transport_name()); | 297 rtcp_dtls_transport->transport_name()); |
297 } | 298 } |
298 std::string debug_name; | 299 std::string debug_name; |
299 if (rtp_dtls_transport) { | 300 if (rtp_dtls_transport) { |
300 transport_name_ = rtp_dtls_transport->transport_name(); | 301 transport_name_ = rtp_dtls_transport->transport_name(); |
301 debug_name = transport_name_; | 302 debug_name = transport_name_; |
302 } else { | 303 } else { |
303 debug_name = rtp_packet_transport->debug_name(); | 304 debug_name = rtp_packet_transport->debug_name(); |
304 } | 305 } |
305 if (rtp_packet_transport == rtp_transport_.rtp_packet_transport()) { | 306 if (rtp_packet_transport == rtp_transport_->rtp_packet_transport()) { |
306 // Nothing to do if transport isn't changing. | 307 // Nothing to do if transport isn't changing. |
307 return; | 308 return; |
308 } | 309 } |
309 | 310 |
310 // When using DTLS-SRTP, we must reset the SrtpFilter every time the transport | 311 // When using DTLS-SRTP, we must reset the SrtpFilter every time the transport |
311 // changes and wait until the DTLS handshake is complete to set the newly | 312 // changes and wait until the DTLS handshake is complete to set the newly |
312 // negotiated parameters. | 313 // negotiated parameters. |
313 if (ShouldSetupDtlsSrtp_n()) { | 314 if (ShouldSetupDtlsSrtp_n()) { |
314 // Set |writable_| to false such that UpdateWritableState_w can set up | 315 // Set |writable_| to false such that UpdateWritableState_w can set up |
315 // DTLS-SRTP when |writable_| becomes true again. | 316 // DTLS-SRTP when |writable_| becomes true again. |
(...skipping 19 matching lines...) Expand all Loading... |
335 } | 336 } |
336 | 337 |
337 void BaseChannel::SetTransport_n( | 338 void BaseChannel::SetTransport_n( |
338 bool rtcp, | 339 bool rtcp, |
339 DtlsTransportInternal* new_dtls_transport, | 340 DtlsTransportInternal* new_dtls_transport, |
340 rtc::PacketTransportInternal* new_packet_transport) { | 341 rtc::PacketTransportInternal* new_packet_transport) { |
341 RTC_DCHECK(network_thread_->IsCurrent()); | 342 RTC_DCHECK(network_thread_->IsCurrent()); |
342 DtlsTransportInternal*& old_dtls_transport = | 343 DtlsTransportInternal*& old_dtls_transport = |
343 rtcp ? rtcp_dtls_transport_ : rtp_dtls_transport_; | 344 rtcp ? rtcp_dtls_transport_ : rtp_dtls_transport_; |
344 rtc::PacketTransportInternal* old_packet_transport = | 345 rtc::PacketTransportInternal* old_packet_transport = |
345 rtcp ? rtp_transport_.rtcp_packet_transport() | 346 rtcp ? rtp_transport_->rtcp_packet_transport() |
346 : rtp_transport_.rtp_packet_transport(); | 347 : rtp_transport_->rtp_packet_transport(); |
347 | 348 |
348 if (!old_packet_transport && !new_packet_transport) { | 349 if (!old_packet_transport && !new_packet_transport) { |
349 // Nothing to do. | 350 // Nothing to do. |
350 return; | 351 return; |
351 } | 352 } |
352 | 353 |
353 RTC_DCHECK(old_packet_transport != new_packet_transport); | 354 RTC_DCHECK(old_packet_transport != new_packet_transport); |
354 if (old_dtls_transport) { | 355 if (old_dtls_transport) { |
355 DisconnectFromDtlsTransport(old_dtls_transport); | 356 DisconnectFromDtlsTransport(old_dtls_transport); |
356 } else if (old_packet_transport) { | 357 } else if (old_packet_transport) { |
357 DisconnectFromPacketTransport(old_packet_transport); | 358 DisconnectFromPacketTransport(old_packet_transport); |
358 } | 359 } |
359 | 360 |
360 if (rtcp) { | 361 if (rtcp) { |
361 rtp_transport_.SetRtcpPacketTransport(new_packet_transport); | 362 rtp_transport_->SetRtcpPacketTransport(new_packet_transport); |
362 } else { | 363 } else { |
363 rtp_transport_.SetRtpPacketTransport(new_packet_transport); | 364 rtp_transport_->SetRtpPacketTransport(new_packet_transport); |
364 } | 365 } |
365 old_dtls_transport = new_dtls_transport; | 366 old_dtls_transport = new_dtls_transport; |
366 | 367 |
367 // If there's no new transport, we're done after disconnecting from old one. | 368 // If there's no new transport, we're done after disconnecting from old one. |
368 if (!new_packet_transport) { | 369 if (!new_packet_transport) { |
369 return; | 370 return; |
370 } | 371 } |
371 | 372 |
372 if (rtcp && new_dtls_transport) { | 373 if (rtcp && new_dtls_transport) { |
373 RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_filter_.IsActive())) | 374 RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_filter_.IsActive())) |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 RTC_FROM_HERE, Bind(&BaseChannel::SetOption_n, this, type, opt, value)); | 543 RTC_FROM_HERE, Bind(&BaseChannel::SetOption_n, this, type, opt, value)); |
543 } | 544 } |
544 | 545 |
545 int BaseChannel::SetOption_n(SocketType type, | 546 int BaseChannel::SetOption_n(SocketType type, |
546 rtc::Socket::Option opt, | 547 rtc::Socket::Option opt, |
547 int value) { | 548 int value) { |
548 RTC_DCHECK(network_thread_->IsCurrent()); | 549 RTC_DCHECK(network_thread_->IsCurrent()); |
549 rtc::PacketTransportInternal* transport = nullptr; | 550 rtc::PacketTransportInternal* transport = nullptr; |
550 switch (type) { | 551 switch (type) { |
551 case ST_RTP: | 552 case ST_RTP: |
552 transport = rtp_transport_.rtp_packet_transport(); | 553 transport = rtp_transport_->rtp_packet_transport(); |
553 socket_options_.push_back( | 554 socket_options_.push_back( |
554 std::pair<rtc::Socket::Option, int>(opt, value)); | 555 std::pair<rtc::Socket::Option, int>(opt, value)); |
555 break; | 556 break; |
556 case ST_RTCP: | 557 case ST_RTCP: |
557 transport = rtp_transport_.rtcp_packet_transport(); | 558 transport = rtp_transport_->rtcp_packet_transport(); |
558 rtcp_socket_options_.push_back( | 559 rtcp_socket_options_.push_back( |
559 std::pair<rtc::Socket::Option, int>(opt, value)); | 560 std::pair<rtc::Socket::Option, int>(opt, value)); |
560 break; | 561 break; |
561 } | 562 } |
562 return transport ? transport->SetOption(opt, value) : -1; | 563 return transport ? transport->SetOption(opt, value) : -1; |
563 } | 564 } |
564 | 565 |
565 void BaseChannel::OnWritableState(rtc::PacketTransportInternal* transport) { | 566 void BaseChannel::OnWritableState(rtc::PacketTransportInternal* transport) { |
566 RTC_DCHECK(transport == rtp_transport_.rtp_packet_transport() || | 567 RTC_DCHECK(transport == rtp_transport_->rtp_packet_transport() || |
567 transport == rtp_transport_.rtcp_packet_transport()); | 568 transport == rtp_transport_->rtcp_packet_transport()); |
568 RTC_DCHECK(network_thread_->IsCurrent()); | 569 RTC_DCHECK(network_thread_->IsCurrent()); |
569 UpdateWritableState_n(); | 570 UpdateWritableState_n(); |
570 } | 571 } |
571 | 572 |
572 void BaseChannel::OnDtlsState(DtlsTransportInternal* transport, | 573 void BaseChannel::OnDtlsState(DtlsTransportInternal* transport, |
573 DtlsTransportState state) { | 574 DtlsTransportState state) { |
574 if (!ShouldSetupDtlsSrtp_n()) { | 575 if (!ShouldSetupDtlsSrtp_n()) { |
575 return; | 576 return; |
576 } | 577 } |
577 | 578 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 data->options = options; | 637 data->options = options; |
637 network_thread_->Post(RTC_FROM_HERE, this, message_id, data); | 638 network_thread_->Post(RTC_FROM_HERE, this, message_id, data); |
638 return true; | 639 return true; |
639 } | 640 } |
640 TRACE_EVENT0("webrtc", "BaseChannel::SendPacket"); | 641 TRACE_EVENT0("webrtc", "BaseChannel::SendPacket"); |
641 | 642 |
642 // Now that we are on the correct thread, ensure we have a place to send this | 643 // Now that we are on the correct thread, ensure we have a place to send this |
643 // packet before doing anything. (We might get RTCP packets that we don't | 644 // packet before doing anything. (We might get RTCP packets that we don't |
644 // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP | 645 // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP |
645 // transport. | 646 // transport. |
646 if (!rtp_transport_.IsWritable(rtcp)) { | 647 if (!rtp_transport_->IsWritable(rtcp)) { |
647 return false; | 648 return false; |
648 } | 649 } |
649 | 650 |
650 // Protect ourselves against crazy data. | 651 // Protect ourselves against crazy data. |
651 if (!ValidPacket(rtcp, packet)) { | 652 if (!ValidPacket(rtcp, packet)) { |
652 LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " " | 653 LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " " |
653 << RtpRtcpStringLiteral(rtcp) | 654 << RtpRtcpStringLiteral(rtcp) |
654 << " packet: wrong size=" << packet->size(); | 655 << " packet: wrong size=" << packet->size(); |
655 return false; | 656 return false; |
656 } | 657 } |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 // However, there shouldn't be any RTP packets sent before SRTP is set up | 733 // However, there shouldn't be any RTP packets sent before SRTP is set up |
733 // (and SetSend(true) is called). | 734 // (and SetSend(true) is called). |
734 LOG(LS_ERROR) << "Can't send outgoing RTP packet when SRTP is inactive" | 735 LOG(LS_ERROR) << "Can't send outgoing RTP packet when SRTP is inactive" |
735 << " and crypto is required"; | 736 << " and crypto is required"; |
736 RTC_NOTREACHED(); | 737 RTC_NOTREACHED(); |
737 return false; | 738 return false; |
738 } | 739 } |
739 | 740 |
740 // Bon voyage. | 741 // Bon voyage. |
741 int flags = (secure() && secure_dtls()) ? PF_SRTP_BYPASS : PF_NORMAL; | 742 int flags = (secure() && secure_dtls()) ? PF_SRTP_BYPASS : PF_NORMAL; |
742 return rtp_transport_.SendPacket(rtcp, packet, updated_options, flags); | 743 return rtp_transport_->SendPacket(rtcp, packet, updated_options, flags); |
743 } | 744 } |
744 | 745 |
745 bool BaseChannel::HandlesPayloadType(int packet_type) const { | 746 bool BaseChannel::HandlesPayloadType(int packet_type) const { |
746 return rtp_transport_.HandlesPayloadType(packet_type); | 747 return rtp_transport_->HandlesPayloadType(packet_type); |
747 } | 748 } |
748 | 749 |
749 void BaseChannel::OnPacketReceived(bool rtcp, | 750 void BaseChannel::OnPacketReceived(bool rtcp, |
750 rtc::CopyOnWriteBuffer& packet, | 751 rtc::CopyOnWriteBuffer& packet, |
751 const rtc::PacketTime& packet_time) { | 752 const rtc::PacketTime& packet_time) { |
752 if (!has_received_packet_ && !rtcp) { | 753 if (!has_received_packet_ && !rtcp) { |
753 has_received_packet_ = true; | 754 has_received_packet_ = true; |
754 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_FIRSTPACKETRECEIVED); | 755 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_FIRSTPACKETRECEIVED); |
755 } | 756 } |
756 | 757 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
864 if (!enabled_) | 865 if (!enabled_) |
865 return; | 866 return; |
866 | 867 |
867 LOG(LS_INFO) << "Channel disabled"; | 868 LOG(LS_INFO) << "Channel disabled"; |
868 enabled_ = false; | 869 enabled_ = false; |
869 UpdateMediaSendRecvState_w(); | 870 UpdateMediaSendRecvState_w(); |
870 } | 871 } |
871 | 872 |
872 void BaseChannel::UpdateWritableState_n() { | 873 void BaseChannel::UpdateWritableState_n() { |
873 rtc::PacketTransportInternal* rtp_packet_transport = | 874 rtc::PacketTransportInternal* rtp_packet_transport = |
874 rtp_transport_.rtp_packet_transport(); | 875 rtp_transport_->rtp_packet_transport(); |
875 rtc::PacketTransportInternal* rtcp_packet_transport = | 876 rtc::PacketTransportInternal* rtcp_packet_transport = |
876 rtp_transport_.rtcp_packet_transport(); | 877 rtp_transport_->rtcp_packet_transport(); |
877 if (rtp_packet_transport && rtp_packet_transport->writable() && | 878 if (rtp_packet_transport && rtp_packet_transport->writable() && |
878 (!rtcp_packet_transport || rtcp_packet_transport->writable())) { | 879 (!rtcp_packet_transport || rtcp_packet_transport->writable())) { |
879 ChannelWritable_n(); | 880 ChannelWritable_n(); |
880 } else { | 881 } else { |
881 ChannelNotWritable_n(); | 882 ChannelNotWritable_n(); |
882 } | 883 } |
883 } | 884 } |
884 | 885 |
885 void BaseChannel::ChannelWritable_n() { | 886 void BaseChannel::ChannelWritable_n() { |
886 RTC_DCHECK(network_thread_->IsCurrent()); | 887 RTC_DCHECK(network_thread_->IsCurrent()); |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1195 // because the final answer may deactivate it. | 1196 // because the final answer may deactivate it. |
1196 ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src); | 1197 ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src); |
1197 break; | 1198 break; |
1198 case CA_ANSWER: | 1199 case CA_ANSWER: |
1199 ret = rtcp_mux_filter_.SetAnswer(enable, src); | 1200 ret = rtcp_mux_filter_.SetAnswer(enable, src); |
1200 if (ret && rtcp_mux_filter_.IsActive()) { | 1201 if (ret && rtcp_mux_filter_.IsActive()) { |
1201 // We permanently activated RTCP muxing; signal that we no longer need | 1202 // We permanently activated RTCP muxing; signal that we no longer need |
1202 // the RTCP transport. | 1203 // the RTCP transport. |
1203 std::string debug_name = | 1204 std::string debug_name = |
1204 transport_name_.empty() | 1205 transport_name_.empty() |
1205 ? rtp_transport_.rtp_packet_transport()->debug_name() | 1206 ? rtp_transport_->rtp_packet_transport()->debug_name() |
1206 : transport_name_; | 1207 : transport_name_; |
1207 ; | 1208 ; |
1208 LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name() | 1209 LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name() |
1209 << "; no longer need RTCP transport for " << debug_name; | 1210 << "; no longer need RTCP transport for " << debug_name; |
1210 if (rtp_transport_.rtcp_packet_transport()) { | 1211 if (rtp_transport_->rtcp_packet_transport()) { |
1211 SetTransport_n(true, nullptr, nullptr); | 1212 SetTransport_n(true, nullptr, nullptr); |
1212 SignalRtcpMuxFullyActive(transport_name_); | 1213 SignalRtcpMuxFullyActive(transport_name_); |
1213 } | 1214 } |
1214 UpdateWritableState_n(); | 1215 UpdateWritableState_n(); |
1215 } | 1216 } |
1216 break; | 1217 break; |
1217 case CA_UPDATE: | 1218 case CA_UPDATE: |
1218 // No RTCP mux info. | 1219 // No RTCP mux info. |
1219 ret = true; | 1220 ret = true; |
1220 break; | 1221 break; |
1221 default: | 1222 default: |
1222 break; | 1223 break; |
1223 } | 1224 } |
1224 if (!ret) { | 1225 if (!ret) { |
1225 SafeSetError("Failed to setup RTCP mux filter.", error_desc); | 1226 SafeSetError("Failed to setup RTCP mux filter.", error_desc); |
1226 return false; | 1227 return false; |
1227 } | 1228 } |
1228 rtp_transport_.SetRtcpMuxEnabled(rtcp_mux_filter_.IsActive()); | 1229 rtp_transport_->SetRtcpMuxEnabled(rtcp_mux_filter_.IsActive()); |
1229 // |rtcp_mux_filter_| can be active if |action| is CA_PRANSWER or | 1230 // |rtcp_mux_filter_| can be active if |action| is CA_PRANSWER or |
1230 // CA_ANSWER, but we only want to tear down the RTCP transport if we received | 1231 // CA_ANSWER, but we only want to tear down the RTCP transport if we received |
1231 // a final answer. | 1232 // a final answer. |
1232 if (rtcp_mux_filter_.IsActive()) { | 1233 if (rtcp_mux_filter_.IsActive()) { |
1233 // If the RTP transport is already writable, then so are we. | 1234 // If the RTP transport is already writable, then so are we. |
1234 if (rtp_transport_.rtp_packet_transport()->writable()) { | 1235 if (rtp_transport_->rtp_packet_transport()->writable()) { |
1235 ChannelWritable_n(); | 1236 ChannelWritable_n(); |
1236 } | 1237 } |
1237 } | 1238 } |
1238 | 1239 |
1239 return true; | 1240 return true; |
1240 } | 1241 } |
1241 | 1242 |
1242 bool BaseChannel::AddRecvStream_w(const StreamParams& sp) { | 1243 bool BaseChannel::AddRecvStream_w(const StreamParams& sp) { |
1243 RTC_DCHECK(worker_thread() == rtc::Thread::Current()); | 1244 RTC_DCHECK(worker_thread() == rtc::Thread::Current()); |
1244 return media_channel()->AddRecvStream(sp); | 1245 return media_channel()->AddRecvStream(sp); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1450 break; | 1451 break; |
1451 } | 1452 } |
1452 case MSG_FIRSTPACKETRECEIVED: { | 1453 case MSG_FIRSTPACKETRECEIVED: { |
1453 SignalFirstPacketReceived(this); | 1454 SignalFirstPacketReceived(this); |
1454 break; | 1455 break; |
1455 } | 1456 } |
1456 } | 1457 } |
1457 } | 1458 } |
1458 | 1459 |
1459 void BaseChannel::AddHandledPayloadType(int payload_type) { | 1460 void BaseChannel::AddHandledPayloadType(int payload_type) { |
1460 rtp_transport_.AddHandledPayloadType(payload_type); | 1461 rtp_transport_->AddHandledPayloadType(payload_type); |
1461 } | 1462 } |
1462 | 1463 |
1463 void BaseChannel::FlushRtcpMessages_n() { | 1464 void BaseChannel::FlushRtcpMessages_n() { |
1464 // Flush all remaining RTCP messages. This should only be called in | 1465 // Flush all remaining RTCP messages. This should only be called in |
1465 // destructor. | 1466 // destructor. |
1466 RTC_DCHECK(network_thread_->IsCurrent()); | 1467 RTC_DCHECK(network_thread_->IsCurrent()); |
1467 rtc::MessageList rtcp_messages; | 1468 rtc::MessageList rtcp_messages; |
1468 network_thread_->Clear(this, MSG_SEND_RTCP_PACKET, &rtcp_messages); | 1469 network_thread_->Clear(this, MSG_SEND_RTCP_PACKET, &rtcp_messages); |
1469 for (const auto& message : rtcp_messages) { | 1470 for (const auto& message : rtcp_messages) { |
1470 network_thread_->Send(RTC_FROM_HERE, this, MSG_SEND_RTCP_PACKET, | 1471 network_thread_->Send(RTC_FROM_HERE, this, MSG_SEND_RTCP_PACKET, |
(...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2447 | 2448 |
2448 void RtpDataChannel::OnDataChannelReadyToSend(bool writable) { | 2449 void RtpDataChannel::OnDataChannelReadyToSend(bool writable) { |
2449 // This is usded for congestion control to indicate that the stream is ready | 2450 // This is usded for congestion control to indicate that the stream is ready |
2450 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates | 2451 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates |
2451 // that the transport channel is ready. | 2452 // that the transport channel is ready. |
2452 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA, | 2453 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA, |
2453 new DataChannelReadyToSendMessageData(writable)); | 2454 new DataChannelReadyToSendMessageData(writable)); |
2454 } | 2455 } |
2455 | 2456 |
2456 } // namespace cricket | 2457 } // namespace cricket |
OLD | NEW |