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 16 matching lines...) Expand all Loading... |
27 const int64_t kStartPhaseMs = 2000; | 27 const int64_t kStartPhaseMs = 2000; |
28 const int64_t kBweConverganceTimeMs = 20000; | 28 const int64_t kBweConverganceTimeMs = 20000; |
29 const int kLimitNumPackets = 20; | 29 const int kLimitNumPackets = 20; |
30 const int kDefaultMaxBitrateBps = 1000000000; | 30 const int kDefaultMaxBitrateBps = 1000000000; |
31 const int64_t kLowBitrateLogPeriodMs = 10000; | 31 const int64_t kLowBitrateLogPeriodMs = 10000; |
32 const int64_t kRtcEventLogPeriodMs = 5000; | 32 const int64_t kRtcEventLogPeriodMs = 5000; |
33 // Expecting that RTCP feedback is sent uniformly within [0.5, 1.5]s intervals. | 33 // Expecting that RTCP feedback is sent uniformly within [0.5, 1.5]s intervals. |
34 const int64_t kFeedbackIntervalMs = 1500; | 34 const int64_t kFeedbackIntervalMs = 1500; |
35 const int64_t kFeedbackTimeoutIntervals = 3; | 35 const int64_t kFeedbackTimeoutIntervals = 3; |
36 const int64_t kTimeoutIntervalMs = 1000; | 36 const int64_t kTimeoutIntervalMs = 1000; |
37 | |
38 struct UmaRampUpMetric { | |
39 const char* metric_name; | |
40 int bitrate_kbps; | |
41 }; | |
42 | |
43 const UmaRampUpMetric kUmaRampupMetrics[] = { | |
44 {"WebRTC.BWE.RampUpTimeTo500kbpsInMs", 500}, | |
45 {"WebRTC.BWE.RampUpTimeTo1000kbpsInMs", 1000}, | |
46 {"WebRTC.BWE.RampUpTimeTo2000kbpsInMs", 2000}}; | |
47 const size_t kNumUmaRampupMetrics = | |
48 sizeof(kUmaRampupMetrics) / sizeof(kUmaRampupMetrics[0]); | |
49 | |
50 } // namespace | 37 } // namespace |
51 | 38 |
52 SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log) | 39 SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log) |
53 : lost_packets_since_last_loss_update_Q8_(0), | 40 : rampup_histograms_{ |
| 41 {rtc::Histogram("WebRTC.BWE.RampUpTimeTo500kbpsInMs", 100000), 500}, |
| 42 {rtc::Histogram("WebRTC.BWE.RampUpTimeTo1000kbpsInMs", 100000), 1000}, |
| 43 {rtc::Histogram("WebRTC.BWE.RampUpTimeTo2000kbpsInMs", 100000), 2000}, |
| 44 }, |
| 45 initially_lost_packets_histogram_( |
| 46 rtc::Histogram("WebRTC.BWE.InitiallyLostPackets", 0, 100)), |
| 47 initial_rtt_histogram_(rtc::Histogram("WebRTC.BWE.InitialRtt", 0, 2000)), |
| 48 initial_bwe_histogram_( |
| 49 rtc::Histogram("WebRTC.BWE.InitialBandwidthEstimate", 0, 2000)), |
| 50 initial_vs_converged_diff_histogram_( |
| 51 rtc::Histogram("WebRTC.BWE.InitialVsConvergedDiff", 0, 2000)), |
| 52 lost_packets_since_last_loss_update_Q8_(0), |
54 expected_packets_since_last_loss_update_(0), | 53 expected_packets_since_last_loss_update_(0), |
55 bitrate_(0), | 54 bitrate_(0), |
56 min_bitrate_configured_(congestion_controller::GetMinBitrateBps()), | 55 min_bitrate_configured_(congestion_controller::GetMinBitrateBps()), |
57 max_bitrate_configured_(kDefaultMaxBitrateBps), | 56 max_bitrate_configured_(kDefaultMaxBitrateBps), |
58 last_low_bitrate_log_ms_(-1), | 57 last_low_bitrate_log_ms_(-1), |
59 has_decreased_since_last_fraction_loss_(false), | 58 has_decreased_since_last_fraction_loss_(false), |
60 last_feedback_ms_(-1), | 59 last_feedback_ms_(-1), |
61 last_packet_report_ms_(-1), | 60 last_packet_report_ms_(-1), |
62 last_timeout_ms_(-1), | 61 last_timeout_ms_(-1), |
63 last_fraction_loss_(0), | 62 last_fraction_loss_(0), |
64 last_logged_fraction_loss_(0), | 63 last_logged_fraction_loss_(0), |
65 last_round_trip_time_ms_(0), | 64 last_round_trip_time_ms_(0), |
66 bwe_incoming_(0), | 65 bwe_incoming_(0), |
67 delay_based_bitrate_bps_(0), | 66 delay_based_bitrate_bps_(0), |
68 time_last_decrease_ms_(0), | 67 time_last_decrease_ms_(0), |
69 first_report_time_ms_(-1), | 68 first_report_time_ms_(-1), |
70 initially_lost_packets_(0), | 69 initially_lost_packets_(0), |
71 bitrate_at_2_seconds_kbps_(0), | 70 bitrate_at_2_seconds_kbps_(0), |
72 uma_update_state_(kNoUpdate), | 71 uma_update_state_(kNoUpdate), |
73 rampup_uma_stats_updated_(kNumUmaRampupMetrics, false), | 72 rampup_uma_stats_updated_( |
| 73 sizeof(rampup_histograms_) / sizeof(*rampup_histograms_), |
| 74 false), |
74 event_log_(event_log), | 75 event_log_(event_log), |
75 last_rtc_event_log_ms_(-1), | 76 last_rtc_event_log_ms_(-1), |
76 in_timeout_experiment_(webrtc::field_trial::FindFullName( | 77 in_timeout_experiment_(webrtc::field_trial::FindFullName( |
77 "WebRTC-FeedbackTimeout") == "Enabled") { | 78 "WebRTC-FeedbackTimeout") == "Enabled") { |
78 RTC_DCHECK(event_log); | 79 RTC_DCHECK(event_log); |
79 } | 80 } |
80 | 81 |
81 SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {} | 82 SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {} |
82 | 83 |
83 void SendSideBandwidthEstimation::SetBitrates(int send_bitrate, | 84 void SendSideBandwidthEstimation::SetBitrates(int send_bitrate, |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 last_packet_report_ms_ = now_ms; | 169 last_packet_report_ms_ = now_ms; |
169 UpdateEstimate(now_ms); | 170 UpdateEstimate(now_ms); |
170 } | 171 } |
171 UpdateUmaStats(now_ms, rtt, (fraction_loss * number_of_packets) >> 8); | 172 UpdateUmaStats(now_ms, rtt, (fraction_loss * number_of_packets) >> 8); |
172 } | 173 } |
173 | 174 |
174 void SendSideBandwidthEstimation::UpdateUmaStats(int64_t now_ms, | 175 void SendSideBandwidthEstimation::UpdateUmaStats(int64_t now_ms, |
175 int64_t rtt, | 176 int64_t rtt, |
176 int lost_packets) { | 177 int lost_packets) { |
177 int bitrate_kbps = static_cast<int>((bitrate_ + 500) / 1000); | 178 int bitrate_kbps = static_cast<int>((bitrate_ + 500) / 1000); |
178 for (size_t i = 0; i < kNumUmaRampupMetrics; ++i) { | 179 for (size_t i = 0; i < rampup_uma_stats_updated_.size(); ++i) { |
179 if (!rampup_uma_stats_updated_[i] && | 180 if (!rampup_uma_stats_updated_[i] && |
180 bitrate_kbps >= kUmaRampupMetrics[i].bitrate_kbps) { | 181 bitrate_kbps >= rampup_histograms_[i].bitrate_kbps) { |
181 RTC_HISTOGRAMS_COUNTS_100000(i, kUmaRampupMetrics[i].metric_name, | 182 rampup_histograms_[i].histogram.AddSample(now_ms - first_report_time_ms_); |
182 now_ms - first_report_time_ms_); | |
183 rampup_uma_stats_updated_[i] = true; | 183 rampup_uma_stats_updated_[i] = true; |
184 } | 184 } |
185 } | 185 } |
186 if (IsInStartPhase(now_ms)) { | 186 if (IsInStartPhase(now_ms)) { |
187 initially_lost_packets_ += lost_packets; | 187 initially_lost_packets_ += lost_packets; |
188 } else if (uma_update_state_ == kNoUpdate) { | 188 } else if (uma_update_state_ == kNoUpdate) { |
189 uma_update_state_ = kFirstDone; | 189 uma_update_state_ = kFirstDone; |
190 bitrate_at_2_seconds_kbps_ = bitrate_kbps; | 190 bitrate_at_2_seconds_kbps_ = bitrate_kbps; |
191 RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitiallyLostPackets", | 191 initially_lost_packets_histogram_.AddSample(initially_lost_packets_); |
192 initially_lost_packets_, 0, 100, 50); | 192 initial_rtt_histogram_.AddSample(static_cast<int>(rtt)); |
193 RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialRtt", static_cast<int>(rtt), 0, | 193 initial_bwe_histogram_.AddSample(bitrate_at_2_seconds_kbps_); |
194 2000, 50); | |
195 RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialBandwidthEstimate", | |
196 bitrate_at_2_seconds_kbps_, 0, 2000, 50); | |
197 } else if (uma_update_state_ == kFirstDone && | 194 } else if (uma_update_state_ == kFirstDone && |
198 now_ms - first_report_time_ms_ >= kBweConverganceTimeMs) { | 195 now_ms - first_report_time_ms_ >= kBweConverganceTimeMs) { |
199 uma_update_state_ = kDone; | 196 uma_update_state_ = kDone; |
200 int bitrate_diff_kbps = | 197 int bitrate_diff_kbps = |
201 std::max(bitrate_at_2_seconds_kbps_ - bitrate_kbps, 0); | 198 std::max(bitrate_at_2_seconds_kbps_ - bitrate_kbps, 0); |
202 RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialVsConvergedDiff", bitrate_diff_kbps, | 199 initial_vs_converged_diff_histogram_.AddSample(bitrate_diff_kbps); |
203 0, 2000, 50); | |
204 } | 200 } |
205 } | 201 } |
206 | 202 |
207 void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) { | 203 void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) { |
208 // We trust the REMB and/or delay-based estimate during the first 2 seconds if | 204 // We trust the REMB and/or delay-based estimate during the first 2 seconds if |
209 // we haven't had any packet loss reported, to allow startup bitrate probing. | 205 // we haven't had any packet loss reported, to allow startup bitrate probing. |
210 if (last_fraction_loss_ == 0 && IsInStartPhase(now_ms)) { | 206 if (last_fraction_loss_ == 0 && IsInStartPhase(now_ms)) { |
211 uint32_t prev_bitrate = bitrate_; | 207 uint32_t prev_bitrate = bitrate_; |
212 if (bwe_incoming_ > bitrate_) | 208 if (bwe_incoming_ > bitrate_) |
213 bitrate_ = CapBitrateToThresholds(now_ms, bwe_incoming_); | 209 bitrate_ = CapBitrateToThresholds(now_ms, bwe_incoming_); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 LOG(LS_WARNING) << "Estimated available bandwidth " << bitrate / 1000 | 332 LOG(LS_WARNING) << "Estimated available bandwidth " << bitrate / 1000 |
337 << " kbps is below configured min bitrate " | 333 << " kbps is below configured min bitrate " |
338 << min_bitrate_configured_ / 1000 << " kbps."; | 334 << min_bitrate_configured_ / 1000 << " kbps."; |
339 last_low_bitrate_log_ms_ = now_ms; | 335 last_low_bitrate_log_ms_ = now_ms; |
340 } | 336 } |
341 bitrate = min_bitrate_configured_; | 337 bitrate = min_bitrate_configured_; |
342 } | 338 } |
343 return bitrate; | 339 return bitrate; |
344 } | 340 } |
345 } // namespace webrtc | 341 } // namespace webrtc |
OLD | NEW |