OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 class RtpPacketSenderProxy : public RtpPacketSender { | 117 class RtpPacketSenderProxy : public RtpPacketSender { |
118 public: | 118 public: |
119 RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) {} | 119 RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) {} |
120 | 120 |
121 void SetPacketSender(RtpPacketSender* rtp_packet_sender) { | 121 void SetPacketSender(RtpPacketSender* rtp_packet_sender) { |
122 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 122 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
123 rtc::CritScope lock(&crit_); | 123 rtc::CritScope lock(&crit_); |
124 rtp_packet_sender_ = rtp_packet_sender; | 124 rtp_packet_sender_ = rtp_packet_sender; |
125 } | 125 } |
126 | 126 |
| 127 bool HasPacketSender() const { |
| 128 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
| 129 rtc::CritScope lock(&crit_); |
| 130 return rtp_packet_sender_ != nullptr; |
| 131 } |
| 132 |
127 // Implements RtpPacketSender. | 133 // Implements RtpPacketSender. |
128 void InsertPacket(Priority priority, | 134 void InsertPacket(Priority priority, |
129 uint32_t ssrc, | 135 uint32_t ssrc, |
130 uint16_t sequence_number, | 136 uint16_t sequence_number, |
131 int64_t capture_time_ms, | 137 int64_t capture_time_ms, |
132 size_t bytes, | 138 size_t bytes, |
133 bool retransmission) override { | 139 bool retransmission) override { |
134 rtc::CritScope lock(&crit_); | 140 rtc::CritScope lock(&crit_); |
135 if (rtp_packet_sender_) { | 141 if (rtp_packet_sender_) { |
136 rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number, | 142 rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number, |
(...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 _previousTimestamp(0), | 812 _previousTimestamp(0), |
807 _recPacketDelayMs(20), | 813 _recPacketDelayMs(20), |
808 _RxVadDetection(false), | 814 _RxVadDetection(false), |
809 _rxAgcIsEnabled(false), | 815 _rxAgcIsEnabled(false), |
810 _rxNsIsEnabled(false), | 816 _rxNsIsEnabled(false), |
811 restored_packet_in_use_(false), | 817 restored_packet_in_use_(false), |
812 rtcp_observer_(new VoERtcpObserver(this)), | 818 rtcp_observer_(new VoERtcpObserver(this)), |
813 network_predictor_(new NetworkPredictor(Clock::GetRealTimeClock())), | 819 network_predictor_(new NetworkPredictor(Clock::GetRealTimeClock())), |
814 associate_send_channel_(ChannelOwner(nullptr)), | 820 associate_send_channel_(ChannelOwner(nullptr)), |
815 pacing_enabled_(config.Get<VoicePacing>().enabled), | 821 pacing_enabled_(config.Get<VoicePacing>().enabled), |
816 feedback_observer_proxy_(pacing_enabled_ ? new TransportFeedbackProxy() | 822 feedback_observer_proxy_(new TransportFeedbackProxy()), |
817 : nullptr), | 823 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()), |
818 seq_num_allocator_proxy_( | 824 rtp_packet_sender_proxy_(new RtpPacketSenderProxy()) { |
819 pacing_enabled_ ? new TransportSequenceNumberProxy() : nullptr), | |
820 rtp_packet_sender_proxy_(pacing_enabled_ ? new RtpPacketSenderProxy() | |
821 : nullptr) { | |
822 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, _channelId), | 825 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, _channelId), |
823 "Channel::Channel() - ctor"); | 826 "Channel::Channel() - ctor"); |
824 AudioCodingModule::Config acm_config; | 827 AudioCodingModule::Config acm_config; |
825 acm_config.id = VoEModuleId(instanceId, channelId); | 828 acm_config.id = VoEModuleId(instanceId, channelId); |
826 if (config.Get<NetEqCapacityConfig>().enabled) { | 829 if (config.Get<NetEqCapacityConfig>().enabled) { |
827 // Clamping the buffer capacity at 20 packets. While going lower will | 830 // Clamping the buffer capacity at 20 packets. While going lower will |
828 // probably work, it makes little sense. | 831 // probably work, it makes little sense. |
829 acm_config.neteq_config.max_packets_in_buffer = | 832 acm_config.neteq_config.max_packets_in_buffer = |
830 std::max(20, config.Get<NetEqCapacityConfig>().capacity); | 833 std::max(20, config.Get<NetEqCapacityConfig>().capacity); |
831 } | 834 } |
832 acm_config.neteq_config.enable_fast_accelerate = | 835 acm_config.neteq_config.enable_fast_accelerate = |
833 config.Get<NetEqFastAccelerate>().enabled; | 836 config.Get<NetEqFastAccelerate>().enabled; |
834 audio_coding_.reset(AudioCodingModule::Create(acm_config)); | 837 audio_coding_.reset(AudioCodingModule::Create(acm_config)); |
835 | 838 |
836 _inbandDtmfQueue.ResetDtmf(); | 839 _inbandDtmfQueue.ResetDtmf(); |
837 _inbandDtmfGenerator.Init(); | 840 _inbandDtmfGenerator.Init(); |
838 _outputAudioLevel.Clear(); | 841 _outputAudioLevel.Clear(); |
839 | 842 |
840 RtpRtcp::Configuration configuration; | 843 RtpRtcp::Configuration configuration; |
841 configuration.audio = true; | 844 configuration.audio = true; |
842 configuration.outgoing_transport = this; | 845 configuration.outgoing_transport = this; |
843 configuration.audio_messages = this; | 846 configuration.audio_messages = this; |
844 configuration.receive_statistics = rtp_receive_statistics_.get(); | 847 configuration.receive_statistics = rtp_receive_statistics_.get(); |
845 configuration.bandwidth_callback = rtcp_observer_.get(); | 848 configuration.bandwidth_callback = rtcp_observer_.get(); |
846 configuration.paced_sender = rtp_packet_sender_proxy_.get(); | 849 if (pacing_enabled_) { |
847 configuration.transport_sequence_number_allocator = | 850 configuration.paced_sender = rtp_packet_sender_proxy_.get(); |
848 seq_num_allocator_proxy_.get(); | 851 configuration.transport_sequence_number_allocator = |
849 configuration.transport_feedback_callback = feedback_observer_proxy_.get(); | 852 seq_num_allocator_proxy_.get(); |
| 853 configuration.transport_feedback_callback = feedback_observer_proxy_.get(); |
| 854 } |
850 configuration.event_log = event_log; | 855 configuration.event_log = event_log; |
851 | 856 |
852 _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration)); | 857 _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration)); |
853 | 858 |
854 statistics_proxy_.reset(new StatisticsProxy(_rtpRtcpModule->SSRC())); | 859 statistics_proxy_.reset(new StatisticsProxy(_rtpRtcpModule->SSRC())); |
855 rtp_receive_statistics_->RegisterRtcpStatisticsCallback( | 860 rtp_receive_statistics_->RegisterRtcpStatisticsCallback( |
856 statistics_proxy_.get()); | 861 statistics_proxy_.get()); |
857 | 862 |
858 Config audioproc_config; | 863 Config audioproc_config; |
859 audioproc_config.Set<ExperimentalAgc>(new ExperimentalAgc(false)); | 864 audioproc_config.Set<ExperimentalAgc>(new ExperimentalAgc(false)); |
(...skipping 1715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2575 } | 2580 } |
2576 | 2581 |
2577 void Channel::EnableReceiveTransportSequenceNumber(int id) { | 2582 void Channel::EnableReceiveTransportSequenceNumber(int id) { |
2578 rtp_header_parser_->DeregisterRtpHeaderExtension( | 2583 rtp_header_parser_->DeregisterRtpHeaderExtension( |
2579 kRtpExtensionTransportSequenceNumber); | 2584 kRtpExtensionTransportSequenceNumber); |
2580 bool ret = rtp_header_parser_->RegisterRtpHeaderExtension( | 2585 bool ret = rtp_header_parser_->RegisterRtpHeaderExtension( |
2581 kRtpExtensionTransportSequenceNumber, id); | 2586 kRtpExtensionTransportSequenceNumber, id); |
2582 RTC_DCHECK(ret); | 2587 RTC_DCHECK(ret); |
2583 } | 2588 } |
2584 | 2589 |
2585 void Channel::SetCongestionControlObjects( | 2590 void Channel::RegisterSenderCongestionControlObjects( |
2586 RtpPacketSender* rtp_packet_sender, | 2591 RtpPacketSender* rtp_packet_sender, |
2587 TransportFeedbackObserver* transport_feedback_observer, | 2592 TransportFeedbackObserver* transport_feedback_observer, |
2588 PacketRouter* packet_router) { | 2593 PacketRouter* packet_router) { |
2589 RTC_DCHECK(packet_router != nullptr || packet_router_ != nullptr); | 2594 RTC_DCHECK(rtp_packet_sender); |
2590 if (transport_feedback_observer) { | 2595 RTC_DCHECK(transport_feedback_observer); |
2591 RTC_DCHECK(feedback_observer_proxy_.get()); | 2596 RTC_DCHECK(packet_router && !packet_router_); |
2592 feedback_observer_proxy_->SetTransportFeedbackObserver( | 2597 feedback_observer_proxy_->SetTransportFeedbackObserver( |
2593 transport_feedback_observer); | 2598 transport_feedback_observer); |
2594 } | 2599 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router); |
2595 if (rtp_packet_sender) { | 2600 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender); |
2596 RTC_DCHECK(rtp_packet_sender_proxy_.get()); | 2601 _rtpRtcpModule->SetStorePacketsStatus(true, 600); |
2597 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender); | 2602 packet_router->AddRtpModule(_rtpRtcpModule.get(), true); |
2598 } | |
2599 if (seq_num_allocator_proxy_.get()) { | |
2600 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router); | |
2601 } | |
2602 _rtpRtcpModule->SetStorePacketsStatus(rtp_packet_sender != nullptr, 600); | |
2603 if (packet_router != nullptr) { | |
2604 packet_router->AddRtpModule(_rtpRtcpModule.get()); | |
2605 } else { | |
2606 packet_router_->RemoveRtpModule(_rtpRtcpModule.get()); | |
2607 } | |
2608 packet_router_ = packet_router; | 2603 packet_router_ = packet_router; |
2609 } | 2604 } |
2610 | 2605 |
| 2606 void Channel::RegisterReceiverCongestionControlObjects( |
| 2607 PacketRouter* packet_router) { |
| 2608 RTC_DCHECK(packet_router && !packet_router_); |
| 2609 packet_router->AddRtpModule(_rtpRtcpModule.get(), false); |
| 2610 packet_router_ = packet_router; |
| 2611 } |
| 2612 |
| 2613 void Channel::ResetCongestionControlObjects() { |
| 2614 RTC_DCHECK(packet_router_); |
| 2615 _rtpRtcpModule->SetStorePacketsStatus(false, 600); |
| 2616 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr); |
| 2617 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr); |
| 2618 const bool sender = rtp_packet_sender_proxy_->HasPacketSender(); |
| 2619 packet_router_->RemoveRtpModule(_rtpRtcpModule.get(), sender); |
| 2620 packet_router_ = nullptr; |
| 2621 rtp_packet_sender_proxy_->SetPacketSender(nullptr); |
| 2622 } |
| 2623 |
2611 void Channel::SetRTCPStatus(bool enable) { | 2624 void Channel::SetRTCPStatus(bool enable) { |
2612 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), | 2625 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
2613 "Channel::SetRTCPStatus()"); | 2626 "Channel::SetRTCPStatus()"); |
2614 _rtpRtcpModule->SetRTCPStatus(enable ? RtcpMode::kCompound : RtcpMode::kOff); | 2627 _rtpRtcpModule->SetRTCPStatus(enable ? RtcpMode::kCompound : RtcpMode::kOff); |
2615 } | 2628 } |
2616 | 2629 |
2617 int Channel::GetRTCPStatus(bool& enabled) { | 2630 int Channel::GetRTCPStatus(bool& enabled) { |
2618 RtcpMode method = _rtpRtcpModule->RTCP(); | 2631 RtcpMode method = _rtpRtcpModule->RTCP(); |
2619 enabled = (method != RtcpMode::kOff); | 2632 enabled = (method != RtcpMode::kOff); |
2620 return 0; | 2633 return 0; |
(...skipping 1020 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3641 int64_t min_rtt = 0; | 3654 int64_t min_rtt = 0; |
3642 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) != | 3655 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) != |
3643 0) { | 3656 0) { |
3644 return 0; | 3657 return 0; |
3645 } | 3658 } |
3646 return rtt; | 3659 return rtt; |
3647 } | 3660 } |
3648 | 3661 |
3649 } // namespace voe | 3662 } // namespace voe |
3650 } // namespace webrtc | 3663 } // namespace webrtc |
OLD | NEW |