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 <utility> | 11 #include <utility> |
12 | 12 |
13 #include "webrtc/pc/channel.h" | 13 #include "webrtc/pc/channel.h" |
14 | 14 |
15 #include "webrtc/api/call/audio_sink.h" | 15 #include "webrtc/api/call/audio_sink.h" |
16 #include "webrtc/base/bind.h" | 16 #include "webrtc/base/bind.h" |
17 #include "webrtc/base/byteorder.h" | 17 #include "webrtc/base/byteorder.h" |
18 #include "webrtc/base/checks.h" | 18 #include "webrtc/base/checks.h" |
19 #include "webrtc/base/copyonwritebuffer.h" | 19 #include "webrtc/base/copyonwritebuffer.h" |
20 #include "webrtc/base/dscp.h" | 20 #include "webrtc/base/dscp.h" |
21 #include "webrtc/base/logging.h" | 21 #include "webrtc/base/logging.h" |
22 #include "webrtc/base/networkroute.h" | 22 #include "webrtc/base/networkroute.h" |
23 #include "webrtc/base/trace_event.h" | 23 #include "webrtc/base/trace_event.h" |
24 #include "webrtc/media/base/mediaconstants.h" | 24 #include "webrtc/media/base/mediaconstants.h" |
25 #include "webrtc/media/base/rtputils.h" | 25 #include "webrtc/media/base/rtputils.h" |
26 #include "webrtc/p2p/base/packettransportinterface.h" | 26 #include "webrtc/p2p/base/packettransportinternal.h" |
27 #include "webrtc/pc/channelmanager.h" | 27 #include "webrtc/pc/channelmanager.h" |
28 | 28 |
29 namespace cricket { | 29 namespace cricket { |
30 using rtc::Bind; | 30 using rtc::Bind; |
31 | 31 |
32 namespace { | 32 namespace { |
33 // See comment below for why we need to use a pointer to a unique_ptr. | 33 // See comment below for why we need to use a pointer to a unique_ptr. |
34 bool SetRawAudioSink_w(VoiceMediaChannel* channel, | 34 bool SetRawAudioSink_w(VoiceMediaChannel* channel, |
35 uint32_t ssrc, | 35 uint32_t ssrc, |
36 std::unique_ptr<webrtc::AudioSinkInterface>* sink) { | 36 std::unique_ptr<webrtc::AudioSinkInterface>* sink) { |
(...skipping 170 matching lines...) Loading... |
207 DisconnectFromPacketTransport(rtcp_packet_transport_); | 207 DisconnectFromPacketTransport(rtcp_packet_transport_); |
208 } | 208 } |
209 | 209 |
210 // Clear pending read packets/messages. | 210 // Clear pending read packets/messages. |
211 network_thread_->Clear(&invoker_); | 211 network_thread_->Clear(&invoker_); |
212 network_thread_->Clear(this); | 212 network_thread_->Clear(this); |
213 } | 213 } |
214 | 214 |
215 bool BaseChannel::Init_w(DtlsTransportInternal* rtp_dtls_transport, | 215 bool BaseChannel::Init_w(DtlsTransportInternal* rtp_dtls_transport, |
216 DtlsTransportInternal* rtcp_dtls_transport, | 216 DtlsTransportInternal* rtcp_dtls_transport, |
217 rtc::PacketTransportInterface* rtp_packet_transport, | 217 rtc::PacketTransportInternal* rtp_packet_transport, |
218 rtc::PacketTransportInterface* rtcp_packet_transport) { | 218 rtc::PacketTransportInternal* rtcp_packet_transport) { |
219 if (!network_thread_->Invoke<bool>( | 219 if (!network_thread_->Invoke<bool>( |
220 RTC_FROM_HERE, Bind(&BaseChannel::InitNetwork_n, this, | 220 RTC_FROM_HERE, Bind(&BaseChannel::InitNetwork_n, this, |
221 rtp_dtls_transport, rtcp_dtls_transport, | 221 rtp_dtls_transport, rtcp_dtls_transport, |
222 rtp_packet_transport, rtcp_packet_transport))) { | 222 rtp_packet_transport, rtcp_packet_transport))) { |
223 return false; | 223 return false; |
224 } | 224 } |
225 // Both RTP and RTCP channels should be set, we can call SetInterface on | 225 // Both RTP and RTCP channels should be set, we can call SetInterface on |
226 // the media channel and it can set network options. | 226 // the media channel and it can set network options. |
227 RTC_DCHECK_RUN_ON(worker_thread_); | 227 RTC_DCHECK_RUN_ON(worker_thread_); |
228 media_channel_->SetInterface(this); | 228 media_channel_->SetInterface(this); |
229 return true; | 229 return true; |
230 } | 230 } |
231 | 231 |
232 bool BaseChannel::InitNetwork_n( | 232 bool BaseChannel::InitNetwork_n( |
233 DtlsTransportInternal* rtp_dtls_transport, | 233 DtlsTransportInternal* rtp_dtls_transport, |
234 DtlsTransportInternal* rtcp_dtls_transport, | 234 DtlsTransportInternal* rtcp_dtls_transport, |
235 rtc::PacketTransportInterface* rtp_packet_transport, | 235 rtc::PacketTransportInternal* rtp_packet_transport, |
236 rtc::PacketTransportInterface* rtcp_packet_transport) { | 236 rtc::PacketTransportInternal* rtcp_packet_transport) { |
237 RTC_DCHECK(network_thread_->IsCurrent()); | 237 RTC_DCHECK(network_thread_->IsCurrent()); |
238 SetTransports_n(rtp_dtls_transport, rtcp_dtls_transport, rtp_packet_transport, | 238 SetTransports_n(rtp_dtls_transport, rtcp_dtls_transport, rtp_packet_transport, |
239 rtcp_packet_transport); | 239 rtcp_packet_transport); |
240 | 240 |
241 if (rtp_dtls_transport_ && | 241 if (rtp_dtls_transport_ && |
242 !SetDtlsSrtpCryptoSuites_n(rtp_dtls_transport_, false)) { | 242 !SetDtlsSrtpCryptoSuites_n(rtp_dtls_transport_, false)) { |
243 return false; | 243 return false; |
244 } | 244 } |
245 if (rtcp_dtls_transport_ && | 245 if (rtcp_dtls_transport_ && |
246 !SetDtlsSrtpCryptoSuites_n(rtcp_dtls_transport_, true)) { | 246 !SetDtlsSrtpCryptoSuites_n(rtcp_dtls_transport_, true)) { |
(...skipping 17 matching lines...) Loading... |
264 | 264 |
265 void BaseChannel::SetTransports(DtlsTransportInternal* rtp_dtls_transport, | 265 void BaseChannel::SetTransports(DtlsTransportInternal* rtp_dtls_transport, |
266 DtlsTransportInternal* rtcp_dtls_transport) { | 266 DtlsTransportInternal* rtcp_dtls_transport) { |
267 network_thread_->Invoke<void>( | 267 network_thread_->Invoke<void>( |
268 RTC_FROM_HERE, | 268 RTC_FROM_HERE, |
269 Bind(&BaseChannel::SetTransports_n, this, rtp_dtls_transport, | 269 Bind(&BaseChannel::SetTransports_n, this, rtp_dtls_transport, |
270 rtcp_dtls_transport, rtp_dtls_transport, rtcp_dtls_transport)); | 270 rtcp_dtls_transport, rtp_dtls_transport, rtcp_dtls_transport)); |
271 } | 271 } |
272 | 272 |
273 void BaseChannel::SetTransports( | 273 void BaseChannel::SetTransports( |
274 rtc::PacketTransportInterface* rtp_packet_transport, | 274 rtc::PacketTransportInternal* rtp_packet_transport, |
275 rtc::PacketTransportInterface* rtcp_packet_transport) { | 275 rtc::PacketTransportInternal* rtcp_packet_transport) { |
276 network_thread_->Invoke<void>( | 276 network_thread_->Invoke<void>( |
277 RTC_FROM_HERE, Bind(&BaseChannel::SetTransports_n, this, nullptr, nullptr, | 277 RTC_FROM_HERE, Bind(&BaseChannel::SetTransports_n, this, nullptr, nullptr, |
278 rtp_packet_transport, rtcp_packet_transport)); | 278 rtp_packet_transport, rtcp_packet_transport)); |
279 } | 279 } |
280 | 280 |
281 void BaseChannel::SetTransports_n( | 281 void BaseChannel::SetTransports_n( |
282 DtlsTransportInternal* rtp_dtls_transport, | 282 DtlsTransportInternal* rtp_dtls_transport, |
283 DtlsTransportInternal* rtcp_dtls_transport, | 283 DtlsTransportInternal* rtcp_dtls_transport, |
284 rtc::PacketTransportInterface* rtp_packet_transport, | 284 rtc::PacketTransportInternal* rtp_packet_transport, |
285 rtc::PacketTransportInterface* rtcp_packet_transport) { | 285 rtc::PacketTransportInternal* rtcp_packet_transport) { |
286 RTC_DCHECK(network_thread_->IsCurrent()); | 286 RTC_DCHECK(network_thread_->IsCurrent()); |
287 // Validate some assertions about the input. | 287 // Validate some assertions about the input. |
288 RTC_DCHECK(rtp_packet_transport); | 288 RTC_DCHECK(rtp_packet_transport); |
289 RTC_DCHECK_EQ(NeedsRtcpTransport(), rtcp_packet_transport != nullptr); | 289 RTC_DCHECK_EQ(NeedsRtcpTransport(), rtcp_packet_transport != nullptr); |
290 if (rtp_dtls_transport || rtcp_dtls_transport) { | 290 if (rtp_dtls_transport || rtcp_dtls_transport) { |
291 // DTLS/non-DTLS pointers should be to the same object. | 291 // DTLS/non-DTLS pointers should be to the same object. |
292 RTC_DCHECK(rtp_dtls_transport == rtp_packet_transport); | 292 RTC_DCHECK(rtp_dtls_transport == rtp_packet_transport); |
293 RTC_DCHECK(rtcp_dtls_transport == rtcp_packet_transport); | 293 RTC_DCHECK(rtcp_dtls_transport == rtcp_packet_transport); |
294 // Can't go from non-DTLS to DTLS. | 294 // Can't go from non-DTLS to DTLS. |
295 RTC_DCHECK(!rtp_packet_transport_ || rtp_dtls_transport_); | 295 RTC_DCHECK(!rtp_packet_transport_ || rtp_dtls_transport_); |
(...skipping 54 matching lines...) Loading... |
350 // encounter the error again and update "ready to send" accordingly. | 350 // encounter the error again and update "ready to send" accordingly. |
351 SetTransportChannelReadyToSend( | 351 SetTransportChannelReadyToSend( |
352 false, rtp_packet_transport_ && rtp_packet_transport_->writable()); | 352 false, rtp_packet_transport_ && rtp_packet_transport_->writable()); |
353 SetTransportChannelReadyToSend( | 353 SetTransportChannelReadyToSend( |
354 true, rtcp_packet_transport_ && rtcp_packet_transport_->writable()); | 354 true, rtcp_packet_transport_ && rtcp_packet_transport_->writable()); |
355 } | 355 } |
356 | 356 |
357 void BaseChannel::SetTransport_n( | 357 void BaseChannel::SetTransport_n( |
358 bool rtcp, | 358 bool rtcp, |
359 DtlsTransportInternal* new_dtls_transport, | 359 DtlsTransportInternal* new_dtls_transport, |
360 rtc::PacketTransportInterface* new_packet_transport) { | 360 rtc::PacketTransportInternal* new_packet_transport) { |
361 RTC_DCHECK(network_thread_->IsCurrent()); | 361 RTC_DCHECK(network_thread_->IsCurrent()); |
362 DtlsTransportInternal*& old_dtls_transport = | 362 DtlsTransportInternal*& old_dtls_transport = |
363 rtcp ? rtcp_dtls_transport_ : rtp_dtls_transport_; | 363 rtcp ? rtcp_dtls_transport_ : rtp_dtls_transport_; |
364 rtc::PacketTransportInterface*& old_packet_transport = | 364 rtc::PacketTransportInternal*& old_packet_transport = |
365 rtcp ? rtcp_packet_transport_ : rtp_packet_transport_; | 365 rtcp ? rtcp_packet_transport_ : rtp_packet_transport_; |
366 | 366 |
367 if (!old_packet_transport && !new_packet_transport) { | 367 if (!old_packet_transport && !new_packet_transport) { |
368 // Nothing to do. | 368 // Nothing to do. |
369 return; | 369 return; |
370 } | 370 } |
371 | 371 |
372 RTC_DCHECK(old_packet_transport != new_packet_transport); | 372 RTC_DCHECK(old_packet_transport != new_packet_transport); |
373 if (old_dtls_transport) { | 373 if (old_dtls_transport) { |
374 DisconnectFromDtlsTransport(old_dtls_transport); | 374 DisconnectFromDtlsTransport(old_dtls_transport); |
(...skipping 46 matching lines...) Loading... |
421 transport->SignalWritableState.disconnect(this); | 421 transport->SignalWritableState.disconnect(this); |
422 transport->SignalReadPacket.disconnect(this); | 422 transport->SignalReadPacket.disconnect(this); |
423 transport->SignalReadyToSend.disconnect(this); | 423 transport->SignalReadyToSend.disconnect(this); |
424 transport->SignalDtlsState.disconnect(this); | 424 transport->SignalDtlsState.disconnect(this); |
425 transport->SignalSentPacket.disconnect(this); | 425 transport->SignalSentPacket.disconnect(this); |
426 transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect( | 426 transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect( |
427 this); | 427 this); |
428 } | 428 } |
429 | 429 |
430 void BaseChannel::ConnectToPacketTransport( | 430 void BaseChannel::ConnectToPacketTransport( |
431 rtc::PacketTransportInterface* transport) { | 431 rtc::PacketTransportInternal* transport) { |
432 RTC_DCHECK_RUN_ON(network_thread_); | 432 RTC_DCHECK_RUN_ON(network_thread_); |
433 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); | 433 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); |
434 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); | 434 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); |
435 transport->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend); | 435 transport->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend); |
436 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); | 436 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); |
437 } | 437 } |
438 | 438 |
439 void BaseChannel::DisconnectFromPacketTransport( | 439 void BaseChannel::DisconnectFromPacketTransport( |
440 rtc::PacketTransportInterface* transport) { | 440 rtc::PacketTransportInternal* transport) { |
441 RTC_DCHECK_RUN_ON(network_thread_); | 441 RTC_DCHECK_RUN_ON(network_thread_); |
442 transport->SignalWritableState.disconnect(this); | 442 transport->SignalWritableState.disconnect(this); |
443 transport->SignalReadPacket.disconnect(this); | 443 transport->SignalReadPacket.disconnect(this); |
444 transport->SignalReadyToSend.disconnect(this); | 444 transport->SignalReadyToSend.disconnect(this); |
445 transport->SignalSentPacket.disconnect(this); | 445 transport->SignalSentPacket.disconnect(this); |
446 } | 446 } |
447 | 447 |
448 bool BaseChannel::Enable(bool enable) { | 448 bool BaseChannel::Enable(bool enable) { |
449 worker_thread_->Invoke<void>( | 449 worker_thread_->Invoke<void>( |
450 RTC_FROM_HERE, | 450 RTC_FROM_HERE, |
(...skipping 106 matching lines...) Loading... |
557 int BaseChannel::SetOption(SocketType type, rtc::Socket::Option opt, | 557 int BaseChannel::SetOption(SocketType type, rtc::Socket::Option opt, |
558 int value) { | 558 int value) { |
559 return network_thread_->Invoke<int>( | 559 return network_thread_->Invoke<int>( |
560 RTC_FROM_HERE, Bind(&BaseChannel::SetOption_n, this, type, opt, value)); | 560 RTC_FROM_HERE, Bind(&BaseChannel::SetOption_n, this, type, opt, value)); |
561 } | 561 } |
562 | 562 |
563 int BaseChannel::SetOption_n(SocketType type, | 563 int BaseChannel::SetOption_n(SocketType type, |
564 rtc::Socket::Option opt, | 564 rtc::Socket::Option opt, |
565 int value) { | 565 int value) { |
566 RTC_DCHECK(network_thread_->IsCurrent()); | 566 RTC_DCHECK(network_thread_->IsCurrent()); |
567 rtc::PacketTransportInterface* transport = nullptr; | 567 rtc::PacketTransportInternal* transport = nullptr; |
568 switch (type) { | 568 switch (type) { |
569 case ST_RTP: | 569 case ST_RTP: |
570 transport = rtp_packet_transport_; | 570 transport = rtp_packet_transport_; |
571 socket_options_.push_back( | 571 socket_options_.push_back( |
572 std::pair<rtc::Socket::Option, int>(opt, value)); | 572 std::pair<rtc::Socket::Option, int>(opt, value)); |
573 break; | 573 break; |
574 case ST_RTCP: | 574 case ST_RTCP: |
575 transport = rtcp_packet_transport_; | 575 transport = rtcp_packet_transport_; |
576 rtcp_socket_options_.push_back( | 576 rtcp_socket_options_.push_back( |
577 std::pair<rtc::Socket::Option, int>(opt, value)); | 577 std::pair<rtc::Socket::Option, int>(opt, value)); |
578 break; | 578 break; |
579 } | 579 } |
580 return transport ? transport->SetOption(opt, value) : -1; | 580 return transport ? transport->SetOption(opt, value) : -1; |
581 } | 581 } |
582 | 582 |
583 bool BaseChannel::SetCryptoOptions(const rtc::CryptoOptions& crypto_options) { | 583 bool BaseChannel::SetCryptoOptions(const rtc::CryptoOptions& crypto_options) { |
584 crypto_options_ = crypto_options; | 584 crypto_options_ = crypto_options; |
585 return true; | 585 return true; |
586 } | 586 } |
587 | 587 |
588 void BaseChannel::OnWritableState(rtc::PacketTransportInterface* transport) { | 588 void BaseChannel::OnWritableState(rtc::PacketTransportInternal* transport) { |
589 RTC_DCHECK(transport == rtp_packet_transport_ || | 589 RTC_DCHECK(transport == rtp_packet_transport_ || |
590 transport == rtcp_packet_transport_); | 590 transport == rtcp_packet_transport_); |
591 RTC_DCHECK(network_thread_->IsCurrent()); | 591 RTC_DCHECK(network_thread_->IsCurrent()); |
592 UpdateWritableState_n(); | 592 UpdateWritableState_n(); |
593 } | 593 } |
594 | 594 |
595 void BaseChannel::OnPacketRead(rtc::PacketTransportInterface* transport, | 595 void BaseChannel::OnPacketRead(rtc::PacketTransportInternal* transport, |
596 const char* data, | 596 const char* data, |
597 size_t len, | 597 size_t len, |
598 const rtc::PacketTime& packet_time, | 598 const rtc::PacketTime& packet_time, |
599 int flags) { | 599 int flags) { |
600 TRACE_EVENT0("webrtc", "BaseChannel::OnPacketRead"); | 600 TRACE_EVENT0("webrtc", "BaseChannel::OnPacketRead"); |
601 // OnPacketRead gets called from P2PSocket; now pass data to MediaEngine | 601 // OnPacketRead gets called from P2PSocket; now pass data to MediaEngine |
602 RTC_DCHECK(network_thread_->IsCurrent()); | 602 RTC_DCHECK(network_thread_->IsCurrent()); |
603 | 603 |
604 // When using RTCP multiplexing we might get RTCP packets on the RTP | 604 // When using RTCP multiplexing we might get RTCP packets on the RTP |
605 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. | 605 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. |
606 bool rtcp = PacketIsRtcp(transport, data, len); | 606 bool rtcp = PacketIsRtcp(transport, data, len); |
607 rtc::CopyOnWriteBuffer packet(data, len); | 607 rtc::CopyOnWriteBuffer packet(data, len); |
608 HandlePacket(rtcp, &packet, packet_time); | 608 HandlePacket(rtcp, &packet, packet_time); |
609 } | 609 } |
610 | 610 |
611 void BaseChannel::OnReadyToSend(rtc::PacketTransportInterface* transport) { | 611 void BaseChannel::OnReadyToSend(rtc::PacketTransportInternal* transport) { |
612 RTC_DCHECK(transport == rtp_packet_transport_ || | 612 RTC_DCHECK(transport == rtp_packet_transport_ || |
613 transport == rtcp_packet_transport_); | 613 transport == rtcp_packet_transport_); |
614 SetTransportChannelReadyToSend(transport == rtcp_packet_transport_, true); | 614 SetTransportChannelReadyToSend(transport == rtcp_packet_transport_, true); |
615 } | 615 } |
616 | 616 |
617 void BaseChannel::OnDtlsState(DtlsTransportInternal* transport, | 617 void BaseChannel::OnDtlsState(DtlsTransportInternal* transport, |
618 DtlsTransportState state) { | 618 DtlsTransportState state) { |
619 if (!ShouldSetupDtlsSrtp_n()) { | 619 if (!ShouldSetupDtlsSrtp_n()) { |
620 return; | 620 return; |
621 } | 621 } |
(...skipping 46 matching lines...) Loading... |
668 bool ready_to_send = | 668 bool ready_to_send = |
669 (rtp_ready_to_send_ && | 669 (rtp_ready_to_send_ && |
670 // In the case of rtcp mux |rtcp_packet_transport_| will be null. | 670 // In the case of rtcp mux |rtcp_packet_transport_| will be null. |
671 (rtcp_ready_to_send_ || !rtcp_packet_transport_)); | 671 (rtcp_ready_to_send_ || !rtcp_packet_transport_)); |
672 | 672 |
673 invoker_.AsyncInvoke<void>( | 673 invoker_.AsyncInvoke<void>( |
674 RTC_FROM_HERE, worker_thread_, | 674 RTC_FROM_HERE, worker_thread_, |
675 Bind(&MediaChannel::OnReadyToSend, media_channel_, ready_to_send)); | 675 Bind(&MediaChannel::OnReadyToSend, media_channel_, ready_to_send)); |
676 } | 676 } |
677 | 677 |
678 bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInterface* transport, | 678 bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInternal* transport, |
679 const char* data, | 679 const char* data, |
680 size_t len) { | 680 size_t len) { |
681 return (transport == rtcp_packet_transport_ || | 681 return (transport == rtcp_packet_transport_ || |
682 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); | 682 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); |
683 } | 683 } |
684 | 684 |
685 bool BaseChannel::SendPacket(bool rtcp, | 685 bool BaseChannel::SendPacket(bool rtcp, |
686 rtc::CopyOnWriteBuffer* packet, | 686 rtc::CopyOnWriteBuffer* packet, |
687 const rtc::PacketOptions& options) { | 687 const rtc::PacketOptions& options) { |
688 // SendPacket gets called from MediaEngine, on a pacer or an encoder thread. | 688 // SendPacket gets called from MediaEngine, on a pacer or an encoder thread. |
(...skipping 11 matching lines...) Loading... |
700 data->options = options; | 700 data->options = options; |
701 network_thread_->Post(RTC_FROM_HERE, this, message_id, data); | 701 network_thread_->Post(RTC_FROM_HERE, this, message_id, data); |
702 return true; | 702 return true; |
703 } | 703 } |
704 TRACE_EVENT0("webrtc", "BaseChannel::SendPacket"); | 704 TRACE_EVENT0("webrtc", "BaseChannel::SendPacket"); |
705 | 705 |
706 // Now that we are on the correct thread, ensure we have a place to send this | 706 // Now that we are on the correct thread, ensure we have a place to send this |
707 // packet before doing anything. (We might get RTCP packets that we don't | 707 // packet before doing anything. (We might get RTCP packets that we don't |
708 // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP | 708 // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP |
709 // transport. | 709 // transport. |
710 rtc::PacketTransportInterface* transport = | 710 rtc::PacketTransportInternal* transport = |
711 (!rtcp || rtcp_mux_filter_.IsActive()) ? rtp_packet_transport_ | 711 (!rtcp || rtcp_mux_filter_.IsActive()) ? rtp_packet_transport_ |
712 : rtcp_packet_transport_; | 712 : rtcp_packet_transport_; |
713 if (!transport || !transport->writable()) { | 713 if (!transport || !transport->writable()) { |
714 return false; | 714 return false; |
715 } | 715 } |
716 | 716 |
717 // Protect ourselves against crazy data. | 717 // Protect ourselves against crazy data. |
718 if (!ValidPacket(rtcp, packet)) { | 718 if (!ValidPacket(rtcp, packet)) { |
719 LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " " | 719 LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " " |
720 << PacketType(rtcp) | 720 << PacketType(rtcp) |
(...skipping 778 matching lines...) Loading... |
1499 RTC_DCHECK(network_thread_->IsCurrent()); | 1499 RTC_DCHECK(network_thread_->IsCurrent()); |
1500 rtc::MessageList rtcp_messages; | 1500 rtc::MessageList rtcp_messages; |
1501 network_thread_->Clear(this, MSG_SEND_RTCP_PACKET, &rtcp_messages); | 1501 network_thread_->Clear(this, MSG_SEND_RTCP_PACKET, &rtcp_messages); |
1502 for (const auto& message : rtcp_messages) { | 1502 for (const auto& message : rtcp_messages) { |
1503 network_thread_->Send(RTC_FROM_HERE, this, MSG_SEND_RTCP_PACKET, | 1503 network_thread_->Send(RTC_FROM_HERE, this, MSG_SEND_RTCP_PACKET, |
1504 message.pdata); | 1504 message.pdata); |
1505 } | 1505 } |
1506 } | 1506 } |
1507 | 1507 |
1508 void BaseChannel::SignalSentPacket_n( | 1508 void BaseChannel::SignalSentPacket_n( |
1509 rtc::PacketTransportInterface* /* transport */, | 1509 rtc::PacketTransportInternal* /* transport */, |
1510 const rtc::SentPacket& sent_packet) { | 1510 const rtc::SentPacket& sent_packet) { |
1511 RTC_DCHECK(network_thread_->IsCurrent()); | 1511 RTC_DCHECK(network_thread_->IsCurrent()); |
1512 invoker_.AsyncInvoke<void>( | 1512 invoker_.AsyncInvoke<void>( |
1513 RTC_FROM_HERE, worker_thread_, | 1513 RTC_FROM_HERE, worker_thread_, |
1514 rtc::Bind(&BaseChannel::SignalSentPacket_w, this, sent_packet)); | 1514 rtc::Bind(&BaseChannel::SignalSentPacket_w, this, sent_packet)); |
1515 } | 1515 } |
1516 | 1516 |
1517 void BaseChannel::SignalSentPacket_w(const rtc::SentPacket& sent_packet) { | 1517 void BaseChannel::SignalSentPacket_w(const rtc::SentPacket& sent_packet) { |
1518 RTC_DCHECK(worker_thread_->IsCurrent()); | 1518 RTC_DCHECK(worker_thread_->IsCurrent()); |
1519 SignalSentPacket(sent_packet); | 1519 SignalSentPacket(sent_packet); |
(...skipping 170 matching lines...) Loading... |
1690 } | 1690 } |
1691 | 1691 |
1692 int VoiceChannel::GetOutputLevel_w() { | 1692 int VoiceChannel::GetOutputLevel_w() { |
1693 return media_channel()->GetOutputLevel(); | 1693 return media_channel()->GetOutputLevel(); |
1694 } | 1694 } |
1695 | 1695 |
1696 void VoiceChannel::GetActiveStreams_w(AudioInfo::StreamList* actives) { | 1696 void VoiceChannel::GetActiveStreams_w(AudioInfo::StreamList* actives) { |
1697 media_channel()->GetActiveStreams(actives); | 1697 media_channel()->GetActiveStreams(actives); |
1698 } | 1698 } |
1699 | 1699 |
1700 void VoiceChannel::OnPacketRead(rtc::PacketTransportInterface* transport, | 1700 void VoiceChannel::OnPacketRead(rtc::PacketTransportInternal* transport, |
1701 const char* data, | 1701 const char* data, |
1702 size_t len, | 1702 size_t len, |
1703 const rtc::PacketTime& packet_time, | 1703 const rtc::PacketTime& packet_time, |
1704 int flags) { | 1704 int flags) { |
1705 BaseChannel::OnPacketRead(transport, data, len, packet_time, flags); | 1705 BaseChannel::OnPacketRead(transport, data, len, packet_time, flags); |
1706 // Set a flag when we've received an RTP packet. If we're waiting for early | 1706 // Set a flag when we've received an RTP packet. If we're waiting for early |
1707 // media, this will disable the timeout. | 1707 // media, this will disable the timeout. |
1708 if (!received_media_ && !PacketIsRtcp(transport, data, len)) { | 1708 if (!received_media_ && !PacketIsRtcp(transport, data, len)) { |
1709 received_media_ = true; | 1709 received_media_ = true; |
1710 } | 1710 } |
(...skipping 493 matching lines...) Loading... |
2204 StopMediaMonitor(); | 2204 StopMediaMonitor(); |
2205 // this can't be done in the base class, since it calls a virtual | 2205 // this can't be done in the base class, since it calls a virtual |
2206 DisableMedia_w(); | 2206 DisableMedia_w(); |
2207 | 2207 |
2208 Deinit(); | 2208 Deinit(); |
2209 } | 2209 } |
2210 | 2210 |
2211 bool RtpDataChannel::Init_w( | 2211 bool RtpDataChannel::Init_w( |
2212 DtlsTransportInternal* rtp_dtls_transport, | 2212 DtlsTransportInternal* rtp_dtls_transport, |
2213 DtlsTransportInternal* rtcp_dtls_transport, | 2213 DtlsTransportInternal* rtcp_dtls_transport, |
2214 rtc::PacketTransportInterface* rtp_packet_transport, | 2214 rtc::PacketTransportInternal* rtp_packet_transport, |
2215 rtc::PacketTransportInterface* rtcp_packet_transport) { | 2215 rtc::PacketTransportInternal* rtcp_packet_transport) { |
2216 if (!BaseChannel::Init_w(rtp_dtls_transport, rtcp_dtls_transport, | 2216 if (!BaseChannel::Init_w(rtp_dtls_transport, rtcp_dtls_transport, |
2217 rtp_packet_transport, rtcp_packet_transport)) { | 2217 rtp_packet_transport, rtcp_packet_transport)) { |
2218 return false; | 2218 return false; |
2219 } | 2219 } |
2220 media_channel()->SignalDataReceived.connect(this, | 2220 media_channel()->SignalDataReceived.connect(this, |
2221 &RtpDataChannel::OnDataReceived); | 2221 &RtpDataChannel::OnDataReceived); |
2222 media_channel()->SignalReadyToSend.connect( | 2222 media_channel()->SignalReadyToSend.connect( |
2223 this, &RtpDataChannel::OnDataChannelReadyToSend); | 2223 this, &RtpDataChannel::OnDataChannelReadyToSend); |
2224 return true; | 2224 return true; |
2225 } | 2225 } |
(...skipping 227 matching lines...) Loading... |
2453 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA, | 2453 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA, |
2454 new DataChannelReadyToSendMessageData(writable)); | 2454 new DataChannelReadyToSendMessageData(writable)); |
2455 } | 2455 } |
2456 | 2456 |
2457 void RtpDataChannel::GetSrtpCryptoSuites_n( | 2457 void RtpDataChannel::GetSrtpCryptoSuites_n( |
2458 std::vector<int>* crypto_suites) const { | 2458 std::vector<int>* crypto_suites) const { |
2459 GetSupportedDataCryptoSuites(crypto_options(), crypto_suites); | 2459 GetSupportedDataCryptoSuites(crypto_options(), crypto_suites); |
2460 } | 2460 } |
2461 | 2461 |
2462 } // namespace cricket | 2462 } // namespace cricket |
OLD | NEW |