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

Side by Side Diff: webrtc/modules/audio_coding/audio_network_adaptor/fec_controller.cc

Issue 2643133003: Instantly pass network changes to controllers in audio network adaptor. (Closed)
Patch Set: fixing unittests Created 3 years, 10 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) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 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 19 matching lines...) Expand all
30 const Threshold& fec_enabling_threshold, 30 const Threshold& fec_enabling_threshold,
31 const Threshold& fec_disabling_threshold, 31 const Threshold& fec_disabling_threshold,
32 int time_constant_ms, 32 int time_constant_ms,
33 const Clock* clock) 33 const Clock* clock)
34 : initial_fec_enabled(initial_fec_enabled), 34 : initial_fec_enabled(initial_fec_enabled),
35 fec_enabling_threshold(fec_enabling_threshold), 35 fec_enabling_threshold(fec_enabling_threshold),
36 fec_disabling_threshold(fec_disabling_threshold), 36 fec_disabling_threshold(fec_disabling_threshold),
37 time_constant_ms(time_constant_ms), 37 time_constant_ms(time_constant_ms),
38 clock(clock) {} 38 clock(clock) {}
39 39
40 FecController::FecController(const Config& config) 40 FecController::FecController(const Config& config,
41 std::unique_ptr<SmoothingFilter> smoothing_filter)
41 : config_(config), 42 : config_(config),
42 fec_enabled_(config.initial_fec_enabled), 43 fec_enabled_(config.initial_fec_enabled),
43 packet_loss_smoothed_( 44 packet_loss_smoother_(std::move(smoothing_filter)),
44 new SmoothingFilterImpl(config_.time_constant_ms, config_.clock)),
45 fec_enabling_threshold_info_(config_.fec_enabling_threshold), 45 fec_enabling_threshold_info_(config_.fec_enabling_threshold),
46 fec_disabling_threshold_info_(config_.fec_disabling_threshold) { 46 fec_disabling_threshold_info_(config_.fec_disabling_threshold) {
47 RTC_DCHECK_LE(fec_enabling_threshold_info_.slope, 0); 47 RTC_DCHECK_LE(fec_enabling_threshold_info_.slope, 0);
48 RTC_DCHECK_LE(fec_enabling_threshold_info_.slope, 0); 48 RTC_DCHECK_LE(fec_enabling_threshold_info_.slope, 0);
49 RTC_DCHECK_LE( 49 RTC_DCHECK_LE(
50 GetPacketLossThreshold(config_.fec_enabling_threshold.low_bandwidth_bps, 50 GetPacketLossThreshold(config_.fec_enabling_threshold.low_bandwidth_bps,
51 config_.fec_disabling_threshold, 51 config_.fec_disabling_threshold,
52 fec_disabling_threshold_info_), 52 fec_disabling_threshold_info_),
53 config_.fec_enabling_threshold.low_bandwidth_packet_loss); 53 config_.fec_enabling_threshold.low_bandwidth_packet_loss);
54 RTC_DCHECK_LE( 54 RTC_DCHECK_LE(
55 GetPacketLossThreshold(config_.fec_enabling_threshold.high_bandwidth_bps, 55 GetPacketLossThreshold(config_.fec_enabling_threshold.high_bandwidth_bps,
56 config_.fec_disabling_threshold, 56 config_.fec_disabling_threshold,
57 fec_disabling_threshold_info_), 57 fec_disabling_threshold_info_),
58 config_.fec_enabling_threshold.high_bandwidth_packet_loss); 58 config_.fec_enabling_threshold.high_bandwidth_packet_loss);
59 } 59 }
60 60
61 FecController::FecController(const Config& config, 61 FecController::FecController(const Config& config)
62 std::unique_ptr<SmoothingFilter> smoothing_filter) 62 : FecController(
63 : FecController(config) { 63 config,
64 packet_loss_smoothed_ = std::move(smoothing_filter); 64 std::unique_ptr<SmoothingFilter>(
65 new SmoothingFilterImpl(config.time_constant_ms, config.clock))) {
65 } 66 }
66 67
67 FecController::~FecController() = default; 68 FecController::~FecController() = default;
68 69
70 void FecController::UpdateNetworkMetrics(
71 const NetworkMetrics& network_metrics) {
72 if (network_metrics.uplink_bandwidth_bps)
73 uplink_bandwidth_bps_ = network_metrics.uplink_bandwidth_bps;
74 if (network_metrics.uplink_packet_loss_fraction) {
75 packet_loss_smoother_->AddSample(
76 *network_metrics.uplink_packet_loss_fraction);
77 }
78 }
79
69 void FecController::MakeDecision( 80 void FecController::MakeDecision(
70 const NetworkMetrics& metrics,
71 AudioNetworkAdaptor::EncoderRuntimeConfig* config) { 81 AudioNetworkAdaptor::EncoderRuntimeConfig* config) {
72 RTC_DCHECK(!config->enable_fec); 82 RTC_DCHECK(!config->enable_fec);
73 RTC_DCHECK(!config->uplink_packet_loss_fraction); 83 RTC_DCHECK(!config->uplink_packet_loss_fraction);
74 84
75 if (metrics.uplink_packet_loss_fraction) 85 const auto& packet_loss = packet_loss_smoother_->GetAverage();
76 packet_loss_smoothed_->AddSample(*metrics.uplink_packet_loss_fraction);
77 86
78 const auto& packet_loss = packet_loss_smoothed_->GetAverage(); 87 fec_enabled_ = fec_enabled_ ? !FecDisablingDecision(packet_loss)
79 88 : FecEnablingDecision(packet_loss);
80 fec_enabled_ = fec_enabled_ ? !FecDisablingDecision(metrics, packet_loss)
81 : FecEnablingDecision(metrics, packet_loss);
82 89
83 config->enable_fec = rtc::Optional<bool>(fec_enabled_); 90 config->enable_fec = rtc::Optional<bool>(fec_enabled_);
84 91
85 auto packet_loss_fraction = packet_loss_smoothed_->GetAverage(); 92 config->uplink_packet_loss_fraction =
86 config->uplink_packet_loss_fraction = rtc::Optional<float>( 93 rtc::Optional<float>(packet_loss ? *packet_loss : 0.0);
87 packet_loss_fraction ? *packet_loss_fraction : 0.0);
88 } 94 }
89 95
90 FecController::ThresholdInfo::ThresholdInfo( 96 FecController::ThresholdInfo::ThresholdInfo(
91 const Config::Threshold& threshold) { 97 const Config::Threshold& threshold) {
92 int bandwidth_diff_bps = 98 int bandwidth_diff_bps =
93 threshold.high_bandwidth_bps - threshold.low_bandwidth_bps; 99 threshold.high_bandwidth_bps - threshold.low_bandwidth_bps;
94 float packet_loss_diff = threshold.high_bandwidth_packet_loss - 100 float packet_loss_diff = threshold.high_bandwidth_packet_loss -
95 threshold.low_bandwidth_packet_loss; 101 threshold.low_bandwidth_packet_loss;
96 slope = bandwidth_diff_bps == 0 ? 0.0 : packet_loss_diff / bandwidth_diff_bps; 102 slope = bandwidth_diff_bps == 0 ? 0.0 : packet_loss_diff / bandwidth_diff_bps;
97 offset = 103 offset =
98 threshold.low_bandwidth_packet_loss - slope * threshold.low_bandwidth_bps; 104 threshold.low_bandwidth_packet_loss - slope * threshold.low_bandwidth_bps;
99 } 105 }
100 106
101 float FecController::GetPacketLossThreshold( 107 float FecController::GetPacketLossThreshold(
102 int bandwidth_bps, 108 int bandwidth_bps,
103 const Config::Threshold& threshold, 109 const Config::Threshold& threshold,
104 const ThresholdInfo& threshold_info) const { 110 const ThresholdInfo& threshold_info) const {
105 if (bandwidth_bps < threshold.low_bandwidth_bps) 111 if (bandwidth_bps < threshold.low_bandwidth_bps)
106 return std::numeric_limits<float>::max(); 112 return std::numeric_limits<float>::max();
107 if (bandwidth_bps >= threshold.high_bandwidth_bps) 113 if (bandwidth_bps >= threshold.high_bandwidth_bps)
108 return threshold.high_bandwidth_packet_loss; 114 return threshold.high_bandwidth_packet_loss;
109 return threshold_info.offset + threshold_info.slope * bandwidth_bps; 115 return threshold_info.offset + threshold_info.slope * bandwidth_bps;
110 } 116 }
111 117
112 bool FecController::FecEnablingDecision( 118 bool FecController::FecEnablingDecision(
113 const NetworkMetrics& metrics,
114 const rtc::Optional<float>& packet_loss) const { 119 const rtc::Optional<float>& packet_loss) const {
115 if (!metrics.uplink_bandwidth_bps) 120 if (!uplink_bandwidth_bps_)
116 return false; 121 return false;
117 if (!packet_loss) 122 if (!packet_loss)
118 return false; 123 return false;
119 return *packet_loss >= GetPacketLossThreshold(*metrics.uplink_bandwidth_bps, 124 return *packet_loss >= GetPacketLossThreshold(*uplink_bandwidth_bps_,
120 config_.fec_enabling_threshold, 125 config_.fec_enabling_threshold,
121 fec_enabling_threshold_info_); 126 fec_enabling_threshold_info_);
122 } 127 }
123 128
124 bool FecController::FecDisablingDecision( 129 bool FecController::FecDisablingDecision(
125 const NetworkMetrics& metrics,
126 const rtc::Optional<float>& packet_loss) const { 130 const rtc::Optional<float>& packet_loss) const {
127 if (!metrics.uplink_bandwidth_bps) 131 if (!uplink_bandwidth_bps_)
128 return false; 132 return false;
129 if (!packet_loss) 133 if (!packet_loss)
130 return false; 134 return false;
131 return *packet_loss <= GetPacketLossThreshold(*metrics.uplink_bandwidth_bps, 135 return *packet_loss <= GetPacketLossThreshold(*uplink_bandwidth_bps_,
132 config_.fec_disabling_threshold, 136 config_.fec_disabling_threshold,
133 fec_disabling_threshold_info_); 137 fec_disabling_threshold_info_);
134 } 138 }
135 139
136 } // namespace webrtc 140 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698