Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(330)

Side by Side Diff: webrtc/voice_engine/channel.cc

Issue 2638083002: Attach TransportFeedbackPacketLossTracker to ANA (PLR only) (Closed)
Patch Set: event_log_visualizer Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 15 matching lines...) Expand all
26 #include "webrtc/config.h" 26 #include "webrtc/config.h"
27 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" 27 #include "webrtc/logging/rtc_event_log/rtc_event_log.h"
28 #include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h" 28 #include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
29 #include "webrtc/modules/audio_device/include/audio_device.h" 29 #include "webrtc/modules/audio_device/include/audio_device.h"
30 #include "webrtc/modules/audio_processing/include/audio_processing.h" 30 #include "webrtc/modules/audio_processing/include/audio_processing.h"
31 #include "webrtc/modules/include/module_common_types.h" 31 #include "webrtc/modules/include/module_common_types.h"
32 #include "webrtc/modules/pacing/packet_router.h" 32 #include "webrtc/modules/pacing/packet_router.h"
33 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" 33 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
34 #include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" 34 #include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
35 #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" 35 #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h"
36 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
36 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" 37 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
37 #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h" 38 #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h"
38 #include "webrtc/modules/utility/include/process_thread.h" 39 #include "webrtc/modules/utility/include/process_thread.h"
39 #include "webrtc/system_wrappers/include/trace.h" 40 #include "webrtc/system_wrappers/include/trace.h"
40 #include "webrtc/voice_engine/include/voe_rtp_rtcp.h" 41 #include "webrtc/voice_engine/include/voe_rtp_rtcp.h"
41 #include "webrtc/voice_engine/output_mixer.h" 42 #include "webrtc/voice_engine/output_mixer.h"
42 #include "webrtc/voice_engine/statistics.h" 43 #include "webrtc/voice_engine/statistics.h"
43 #include "webrtc/voice_engine/utility.h" 44 #include "webrtc/voice_engine/utility.h"
44 45
45 namespace webrtc { 46 namespace webrtc {
46 namespace voe { 47 namespace voe {
47 48
48 namespace { 49 namespace {
49 50
50 constexpr int64_t kMaxRetransmissionWindowMs = 1000; 51 constexpr int64_t kMaxRetransmissionWindowMs = 1000;
51 constexpr int64_t kMinRetransmissionWindowMs = 30; 52 constexpr int64_t kMinRetransmissionWindowMs = 30;
52 53
54 // TODO(elad.alon): Subsequent CL will make these values experiment-dependent.
55 constexpr size_t kPacketLossTrackerMaxWindowSizeMs = 15000;
56 constexpr size_t kPlrMinNumAckedPackets = 50;
57 constexpr size_t kRplrMinNumAckedPairs = 40;
58
53 } // namespace 59 } // namespace
54 60
55 const int kTelephoneEventAttenuationdB = 10; 61 const int kTelephoneEventAttenuationdB = 10;
56 62
57 class RtcEventLogProxy final : public webrtc::RtcEventLog { 63 class RtcEventLogProxy final : public webrtc::RtcEventLog {
58 public: 64 public:
59 RtcEventLogProxy() : event_log_(nullptr) {} 65 RtcEventLogProxy() : event_log_(nullptr) {}
60 66
61 bool StartLogging(const std::string& file_name, 67 bool StartLogging(const std::string& file_name,
62 int64_t max_size_bytes) override { 68 int64_t max_size_bytes) override {
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 } 246 }
241 247
242 void SetTransportFeedbackObserver( 248 void SetTransportFeedbackObserver(
243 TransportFeedbackObserver* feedback_observer) { 249 TransportFeedbackObserver* feedback_observer) {
244 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 250 RTC_DCHECK(thread_checker_.CalledOnValidThread());
245 rtc::CritScope lock(&crit_); 251 rtc::CritScope lock(&crit_);
246 feedback_observer_ = feedback_observer; 252 feedback_observer_ = feedback_observer;
247 } 253 }
248 254
249 // Implements TransportFeedbackObserver. 255 // Implements TransportFeedbackObserver.
250 void AddPacket(uint16_t sequence_number, 256 void AddPacket(uint32_t ssrc,
257 uint16_t sequence_number,
251 size_t length, 258 size_t length,
252 const PacedPacketInfo& pacing_info) override { 259 const PacedPacketInfo& pacing_info) override {
253 RTC_DCHECK(pacer_thread_.CalledOnValidThread()); 260 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
254 rtc::CritScope lock(&crit_); 261 rtc::CritScope lock(&crit_);
255 if (feedback_observer_) 262 if (feedback_observer_)
256 feedback_observer_->AddPacket(sequence_number, length, pacing_info); 263 feedback_observer_->AddPacket(ssrc, sequence_number, length, pacing_info);
257 } 264 }
258 265
259 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override { 266 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
260 RTC_DCHECK(network_thread_.CalledOnValidThread()); 267 RTC_DCHECK(network_thread_.CalledOnValidThread());
261 rtc::CritScope lock(&crit_); 268 rtc::CritScope lock(&crit_);
262 if (feedback_observer_) 269 if (feedback_observer_)
263 feedback_observer_->OnTransportFeedback(feedback); 270 feedback_observer_->OnTransportFeedback(feedback);
264 } 271 }
265 std::vector<PacketFeedback> GetTransportFeedbackVector() const override { 272 std::vector<PacketFeedback> GetTransportFeedbackVector() const override {
266 RTC_NOTREACHED(); 273 RTC_NOTREACHED();
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 _outputSpeechType(AudioFrame::kNormalSpeech), 913 _outputSpeechType(AudioFrame::kNormalSpeech),
907 restored_packet_in_use_(false), 914 restored_packet_in_use_(false),
908 rtcp_observer_(new VoERtcpObserver(this)), 915 rtcp_observer_(new VoERtcpObserver(this)),
909 associate_send_channel_(ChannelOwner(nullptr)), 916 associate_send_channel_(ChannelOwner(nullptr)),
910 pacing_enabled_(config.enable_voice_pacing), 917 pacing_enabled_(config.enable_voice_pacing),
911 feedback_observer_proxy_(new TransportFeedbackProxy()), 918 feedback_observer_proxy_(new TransportFeedbackProxy()),
912 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()), 919 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
913 rtp_packet_sender_proxy_(new RtpPacketSenderProxy()), 920 rtp_packet_sender_proxy_(new RtpPacketSenderProxy()),
914 retransmission_rate_limiter_(new RateLimiter(Clock::GetRealTimeClock(), 921 retransmission_rate_limiter_(new RateLimiter(Clock::GetRealTimeClock(),
915 kMaxRetransmissionWindowMs)), 922 kMaxRetransmissionWindowMs)),
916 decoder_factory_(config.acm_config.decoder_factory) { 923 decoder_factory_(config.acm_config.decoder_factory),
924 // TODO(elad.alon): Subsequent CL experiments with PLR source.
925 use_twcc_plr_for_ana_(false),
926 packet_loss_tracker_(kPacketLossTrackerMaxWindowSizeMs,
927 kPlrMinNumAckedPackets,
928 kRplrMinNumAckedPairs) {
917 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, _channelId), 929 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, _channelId),
918 "Channel::Channel() - ctor"); 930 "Channel::Channel() - ctor");
919 AudioCodingModule::Config acm_config(config.acm_config); 931 AudioCodingModule::Config acm_config(config.acm_config);
920 acm_config.id = VoEModuleId(instanceId, channelId); 932 acm_config.id = VoEModuleId(instanceId, channelId);
921 acm_config.neteq_config.enable_muted_state = true; 933 acm_config.neteq_config.enable_muted_state = true;
922 audio_coding_.reset(AudioCodingModule::Create(acm_config)); 934 audio_coding_.reset(AudioCodingModule::Create(acm_config));
923 935
924 _outputAudioLevel.Clear(); 936 _outputAudioLevel.Clear();
925 937
926 RtpRtcp::Configuration configuration; 938 RtpRtcp::Configuration configuration;
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
1297 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) { 1309 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
1298 if (*encoder) { 1310 if (*encoder) {
1299 (*encoder)->OnReceivedUplinkBandwidth( 1311 (*encoder)->OnReceivedUplinkBandwidth(
1300 bitrate_bps, rtc::Optional<int64_t>(probing_interval_ms)); 1312 bitrate_bps, rtc::Optional<int64_t>(probing_interval_ms));
1301 } 1313 }
1302 }); 1314 });
1303 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); 1315 retransmission_rate_limiter_->SetMaxRate(bitrate_bps);
1304 } 1316 }
1305 1317
1306 void Channel::OnIncomingFractionLoss(int fraction_lost) { 1318 void Channel::OnIncomingFractionLoss(int fraction_lost) {
1319 if (use_twcc_plr_for_ana_)
1320 return;
1307 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) { 1321 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
1308 if (*encoder) 1322 if (*encoder)
1309 (*encoder)->OnReceivedUplinkPacketLossFraction(fraction_lost / 255.0f); 1323 (*encoder)->OnReceivedUplinkPacketLossFraction(fraction_lost / 255.0f);
1310 }); 1324 });
1311 } 1325 }
1312 1326
1313 int32_t Channel::SetVADStatus(bool enableVAD, 1327 int32_t Channel::SetVADStatus(bool enableVAD,
1314 ACMVADMode mode, 1328 ACMVADMode mode,
1315 bool disableDTX) { 1329 bool disableDTX) {
1316 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), 1330 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
(...skipping 1407 matching lines...) Expand 10 before | Expand all | Expand 10 after
2724 UpdateOverheadForEncoder(); 2738 UpdateOverheadForEncoder();
2725 } 2739 }
2726 2740
2727 // TODO(solenberg): Make AudioSendStream an OverheadObserver instead. 2741 // TODO(solenberg): Make AudioSendStream an OverheadObserver instead.
2728 void Channel::OnOverheadChanged(size_t overhead_bytes_per_packet) { 2742 void Channel::OnOverheadChanged(size_t overhead_bytes_per_packet) {
2729 rtc::CritScope cs(&overhead_per_packet_lock_); 2743 rtc::CritScope cs(&overhead_per_packet_lock_);
2730 rtp_overhead_per_packet_ = overhead_bytes_per_packet; 2744 rtp_overhead_per_packet_ = overhead_bytes_per_packet;
2731 UpdateOverheadForEncoder(); 2745 UpdateOverheadForEncoder();
2732 } 2746 }
2733 2747
2748 void Channel::HandleTransportFeedback(
2749 const std::vector<SentTransportPacketRecord>&
2750 packets_sent_since_last_feedback,
2751 const rtcp::TransportFeedback& feedback) {
2752 for (const auto& sent_packet : packets_sent_since_last_feedback) {
2753 packet_loss_tracker_.OnPacketAdded(sent_packet.sequence_number,
2754 sent_packet.sent_time_ms);
2755 }
2756
2757 // TODO(elad.alon): Needed even when !use_twcc_plr_for_ana_, because
2758 // subsequent CLs will introduce pushing RPLR down to ANA, too, and that
2759 // would happen unconditionally.
2760 // (Rationale for unconditionality: it's cheap enough, and once
2761 // experimentation is over, we either always do it or never do it, in which
2762 // case the code involved will just be deleted.)
2763 packet_loss_tracker_.OnReceivedTransportFeedback(feedback);
2764
2765 if (use_twcc_plr_for_ana_) {
2766 rtc::Optional<float> plr = packet_loss_tracker_.GetPacketLossRate();
2767 if (plr) {
2768 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
2769 if (*encoder)
2770 (*encoder)->OnReceivedUplinkPacketLossFraction(*plr);
2771 });
2772 }
2773 }
2774 }
2775
2734 int Channel::GetNetworkStatistics(NetworkStatistics& stats) { 2776 int Channel::GetNetworkStatistics(NetworkStatistics& stats) {
2735 return audio_coding_->GetNetworkStatistics(&stats); 2777 return audio_coding_->GetNetworkStatistics(&stats);
2736 } 2778 }
2737 2779
2738 void Channel::GetDecodingCallStatistics(AudioDecodingCallStats* stats) const { 2780 void Channel::GetDecodingCallStatistics(AudioDecodingCallStats* stats) const {
2739 audio_coding_->GetDecodingCallStatistics(stats); 2781 audio_coding_->GetDecodingCallStatistics(stats);
2740 } 2782 }
2741 2783
2742 uint32_t Channel::GetDelayEstimate() const { 2784 uint32_t Channel::GetDelayEstimate() const {
2743 rtc::CritScope lock(&video_sync_lock_); 2785 rtc::CritScope lock(&video_sync_lock_);
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
3010 int64_t min_rtt = 0; 3052 int64_t min_rtt = 0;
3011 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) != 3053 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) !=
3012 0) { 3054 0) {
3013 return 0; 3055 return 0;
3014 } 3056 }
3015 return rtt; 3057 return rtt;
3016 } 3058 }
3017 3059
3018 } // namespace voe 3060 } // namespace voe
3019 } // namespace webrtc 3061 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698