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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 *low_loss_threshold = kDefaultLowLossThreshold; | 97 *low_loss_threshold = kDefaultLowLossThreshold; |
98 *high_loss_threshold = kDefaultHighLossThreshold; | 98 *high_loss_threshold = kDefaultHighLossThreshold; |
99 *bitrate_threshold_kbps = kDefaultBitrateThresholdKbps; | 99 *bitrate_threshold_kbps = kDefaultBitrateThresholdKbps; |
100 return false; | 100 return false; |
101 } | 101 } |
102 } // namespace | 102 } // namespace |
103 | 103 |
104 SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log) | 104 SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log) |
105 : lost_packets_since_last_loss_update_Q8_(0), | 105 : lost_packets_since_last_loss_update_Q8_(0), |
106 expected_packets_since_last_loss_update_(0), | 106 expected_packets_since_last_loss_update_(0), |
107 bitrate_(0), | 107 current_bitrate_bps_(0), |
108 min_bitrate_configured_(congestion_controller::GetMinBitrateBps()), | 108 min_bitrate_configured_(congestion_controller::GetMinBitrateBps()), |
109 max_bitrate_configured_(kDefaultMaxBitrateBps), | 109 max_bitrate_configured_(kDefaultMaxBitrateBps), |
110 last_low_bitrate_log_ms_(-1), | 110 last_low_bitrate_log_ms_(-1), |
111 has_decreased_since_last_fraction_loss_(false), | 111 has_decreased_since_last_fraction_loss_(false), |
112 last_feedback_ms_(-1), | 112 last_feedback_ms_(-1), |
113 last_packet_report_ms_(-1), | 113 last_packet_report_ms_(-1), |
114 last_timeout_ms_(-1), | 114 last_timeout_ms_(-1), |
115 last_fraction_loss_(0), | 115 last_fraction_loss_(0), |
116 last_logged_fraction_loss_(0), | 116 last_logged_fraction_loss_(0), |
117 last_round_trip_time_ms_(0), | 117 last_round_trip_time_ms_(0), |
(...skipping 24 matching lines...) Expand all Loading... |
142 bitrate_threshold_bps_ = bitrate_threshold_kbps * 1000; | 142 bitrate_threshold_bps_ = bitrate_threshold_kbps * 1000; |
143 } | 143 } |
144 } | 144 } |
145 } | 145 } |
146 | 146 |
147 SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {} | 147 SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {} |
148 | 148 |
149 void SendSideBandwidthEstimation::SetBitrates(int send_bitrate, | 149 void SendSideBandwidthEstimation::SetBitrates(int send_bitrate, |
150 int min_bitrate, | 150 int min_bitrate, |
151 int max_bitrate) { | 151 int max_bitrate) { |
| 152 SetMinMaxBitrate(min_bitrate, max_bitrate); |
152 if (send_bitrate > 0) | 153 if (send_bitrate > 0) |
153 SetSendBitrate(send_bitrate); | 154 SetSendBitrate(send_bitrate); |
154 SetMinMaxBitrate(min_bitrate, max_bitrate); | |
155 } | 155 } |
156 | 156 |
157 void SendSideBandwidthEstimation::SetSendBitrate(int bitrate) { | 157 void SendSideBandwidthEstimation::SetSendBitrate(int bitrate) { |
158 RTC_DCHECK_GT(bitrate, 0); | 158 RTC_DCHECK_GT(bitrate, 0); |
159 bitrate_ = bitrate; | 159 CapBitrateToThresholds(Clock::GetRealTimeClock()->TimeInMilliseconds(), |
160 | 160 bitrate); |
161 // Clear last sent bitrate history so the new value can be used directly | 161 // Clear last sent bitrate history so the new value can be used directly |
162 // and not capped. | 162 // and not capped. |
163 min_bitrate_history_.clear(); | 163 min_bitrate_history_.clear(); |
164 } | 164 } |
165 | 165 |
166 void SendSideBandwidthEstimation::SetMinMaxBitrate(int min_bitrate, | 166 void SendSideBandwidthEstimation::SetMinMaxBitrate(int min_bitrate, |
167 int max_bitrate) { | 167 int max_bitrate) { |
168 RTC_DCHECK_GE(min_bitrate, 0); | 168 RTC_DCHECK_GE(min_bitrate, 0); |
169 min_bitrate_configured_ = | 169 min_bitrate_configured_ = |
170 std::max(min_bitrate, congestion_controller::GetMinBitrateBps()); | 170 std::max(min_bitrate, congestion_controller::GetMinBitrateBps()); |
171 if (max_bitrate > 0) { | 171 if (max_bitrate > 0) { |
172 max_bitrate_configured_ = | 172 max_bitrate_configured_ = |
173 std::max<uint32_t>(min_bitrate_configured_, max_bitrate); | 173 std::max<uint32_t>(min_bitrate_configured_, max_bitrate); |
174 } else { | 174 } else { |
175 max_bitrate_configured_ = kDefaultMaxBitrateBps; | 175 max_bitrate_configured_ = kDefaultMaxBitrateBps; |
176 } | 176 } |
177 } | 177 } |
178 | 178 |
179 int SendSideBandwidthEstimation::GetMinBitrate() const { | 179 int SendSideBandwidthEstimation::GetMinBitrate() const { |
180 return min_bitrate_configured_; | 180 return min_bitrate_configured_; |
181 } | 181 } |
182 | 182 |
183 void SendSideBandwidthEstimation::CurrentEstimate(int* bitrate, | 183 void SendSideBandwidthEstimation::CurrentEstimate(int* bitrate, |
184 uint8_t* loss, | 184 uint8_t* loss, |
185 int64_t* rtt) const { | 185 int64_t* rtt) const { |
186 *bitrate = bitrate_; | 186 *bitrate = current_bitrate_bps_; |
187 *loss = last_fraction_loss_; | 187 *loss = last_fraction_loss_; |
188 *rtt = last_round_trip_time_ms_; | 188 *rtt = last_round_trip_time_ms_; |
189 } | 189 } |
190 | 190 |
191 void SendSideBandwidthEstimation::UpdateReceiverEstimate( | 191 void SendSideBandwidthEstimation::UpdateReceiverEstimate( |
192 int64_t now_ms, uint32_t bandwidth) { | 192 int64_t now_ms, uint32_t bandwidth) { |
193 bwe_incoming_ = bandwidth; | 193 bwe_incoming_ = bandwidth; |
194 bitrate_ = CapBitrateToThresholds(now_ms, bitrate_); | 194 CapBitrateToThresholds(now_ms, current_bitrate_bps_); |
195 } | 195 } |
196 | 196 |
197 void SendSideBandwidthEstimation::UpdateDelayBasedEstimate( | 197 void SendSideBandwidthEstimation::UpdateDelayBasedEstimate( |
198 int64_t now_ms, | 198 int64_t now_ms, |
199 uint32_t bitrate_bps) { | 199 uint32_t bitrate_bps) { |
200 delay_based_bitrate_bps_ = bitrate_bps; | 200 delay_based_bitrate_bps_ = bitrate_bps; |
201 bitrate_ = CapBitrateToThresholds(now_ms, bitrate_); | 201 CapBitrateToThresholds(now_ms, current_bitrate_bps_); |
202 } | 202 } |
203 | 203 |
204 void SendSideBandwidthEstimation::UpdateReceiverBlock(uint8_t fraction_loss, | 204 void SendSideBandwidthEstimation::UpdateReceiverBlock(uint8_t fraction_loss, |
205 int64_t rtt, | 205 int64_t rtt, |
206 int number_of_packets, | 206 int number_of_packets, |
207 int64_t now_ms) { | 207 int64_t now_ms) { |
208 last_feedback_ms_ = now_ms; | 208 last_feedback_ms_ = now_ms; |
209 if (first_report_time_ms_ == -1) | 209 if (first_report_time_ms_ == -1) |
210 first_report_time_ms_ = now_ms; | 210 first_report_time_ms_ = now_ms; |
211 | 211 |
(...skipping 21 matching lines...) Expand all Loading... |
233 expected_packets_since_last_loss_update_ = 0; | 233 expected_packets_since_last_loss_update_ = 0; |
234 last_packet_report_ms_ = now_ms; | 234 last_packet_report_ms_ = now_ms; |
235 UpdateEstimate(now_ms); | 235 UpdateEstimate(now_ms); |
236 } | 236 } |
237 UpdateUmaStats(now_ms, rtt, (fraction_loss * number_of_packets) >> 8); | 237 UpdateUmaStats(now_ms, rtt, (fraction_loss * number_of_packets) >> 8); |
238 } | 238 } |
239 | 239 |
240 void SendSideBandwidthEstimation::UpdateUmaStats(int64_t now_ms, | 240 void SendSideBandwidthEstimation::UpdateUmaStats(int64_t now_ms, |
241 int64_t rtt, | 241 int64_t rtt, |
242 int lost_packets) { | 242 int lost_packets) { |
243 int bitrate_kbps = static_cast<int>((bitrate_ + 500) / 1000); | 243 int bitrate_kbps = static_cast<int>((current_bitrate_bps_ + 500) / 1000); |
244 for (size_t i = 0; i < kNumUmaRampupMetrics; ++i) { | 244 for (size_t i = 0; i < kNumUmaRampupMetrics; ++i) { |
245 if (!rampup_uma_stats_updated_[i] && | 245 if (!rampup_uma_stats_updated_[i] && |
246 bitrate_kbps >= kUmaRampupMetrics[i].bitrate_kbps) { | 246 bitrate_kbps >= kUmaRampupMetrics[i].bitrate_kbps) { |
247 RTC_HISTOGRAMS_COUNTS_100000(i, kUmaRampupMetrics[i].metric_name, | 247 RTC_HISTOGRAMS_COUNTS_100000(i, kUmaRampupMetrics[i].metric_name, |
248 now_ms - first_report_time_ms_); | 248 now_ms - first_report_time_ms_); |
249 rampup_uma_stats_updated_[i] = true; | 249 rampup_uma_stats_updated_[i] = true; |
250 } | 250 } |
251 } | 251 } |
252 if (IsInStartPhase(now_ms)) { | 252 if (IsInStartPhase(now_ms)) { |
253 initially_lost_packets_ += lost_packets; | 253 initially_lost_packets_ += lost_packets; |
(...skipping 10 matching lines...) Expand all Loading... |
264 now_ms - first_report_time_ms_ >= kBweConverganceTimeMs) { | 264 now_ms - first_report_time_ms_ >= kBweConverganceTimeMs) { |
265 uma_update_state_ = kDone; | 265 uma_update_state_ = kDone; |
266 int bitrate_diff_kbps = | 266 int bitrate_diff_kbps = |
267 std::max(bitrate_at_2_seconds_kbps_ - bitrate_kbps, 0); | 267 std::max(bitrate_at_2_seconds_kbps_ - bitrate_kbps, 0); |
268 RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialVsConvergedDiff", bitrate_diff_kbps, | 268 RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialVsConvergedDiff", bitrate_diff_kbps, |
269 0, 2000, 50); | 269 0, 2000, 50); |
270 } | 270 } |
271 } | 271 } |
272 | 272 |
273 void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) { | 273 void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) { |
| 274 uint32_t new_bitrate = current_bitrate_bps_; |
274 // We trust the REMB and/or delay-based estimate during the first 2 seconds if | 275 // We trust the REMB and/or delay-based estimate during the first 2 seconds if |
275 // we haven't had any packet loss reported, to allow startup bitrate probing. | 276 // we haven't had any packet loss reported, to allow startup bitrate probing. |
276 if (last_fraction_loss_ == 0 && IsInStartPhase(now_ms)) { | 277 if (last_fraction_loss_ == 0 && IsInStartPhase(now_ms)) { |
277 uint32_t prev_bitrate = bitrate_; | 278 new_bitrate = std::max(bwe_incoming_, new_bitrate); |
278 if (bwe_incoming_ > bitrate_) | 279 new_bitrate = std::max(delay_based_bitrate_bps_, new_bitrate); |
279 bitrate_ = CapBitrateToThresholds(now_ms, bwe_incoming_); | 280 |
280 if (delay_based_bitrate_bps_ > bitrate_) { | 281 if (new_bitrate != current_bitrate_bps_) { |
281 bitrate_ = CapBitrateToThresholds(now_ms, delay_based_bitrate_bps_); | |
282 } | |
283 if (bitrate_ != prev_bitrate) { | |
284 min_bitrate_history_.clear(); | 282 min_bitrate_history_.clear(); |
285 min_bitrate_history_.push_back(std::make_pair(now_ms, bitrate_)); | 283 min_bitrate_history_.push_back( |
| 284 std::make_pair(now_ms, current_bitrate_bps_)); |
| 285 CapBitrateToThresholds(now_ms, new_bitrate); |
286 return; | 286 return; |
287 } | 287 } |
288 } | 288 } |
289 UpdateMinHistory(now_ms); | 289 UpdateMinHistory(now_ms); |
290 if (last_packet_report_ms_ == -1) { | 290 if (last_packet_report_ms_ == -1) { |
291 // No feedback received. | 291 // No feedback received. |
292 bitrate_ = CapBitrateToThresholds(now_ms, bitrate_); | 292 CapBitrateToThresholds(now_ms, current_bitrate_bps_); |
293 return; | 293 return; |
294 } | 294 } |
295 int64_t time_since_packet_report_ms = now_ms - last_packet_report_ms_; | 295 int64_t time_since_packet_report_ms = now_ms - last_packet_report_ms_; |
296 int64_t time_since_feedback_ms = now_ms - last_feedback_ms_; | 296 int64_t time_since_feedback_ms = now_ms - last_feedback_ms_; |
297 if (time_since_packet_report_ms < 1.2 * kFeedbackIntervalMs) { | 297 if (time_since_packet_report_ms < 1.2 * kFeedbackIntervalMs) { |
298 // We only care about loss above a given bitrate threshold. | 298 // We only care about loss above a given bitrate threshold. |
299 float loss = last_fraction_loss_ / 256.0f; | 299 float loss = last_fraction_loss_ / 256.0f; |
300 // We only make decisions based on loss when the bitrate is above a | 300 // We only make decisions based on loss when the bitrate is above a |
301 // threshold. This is a crude way of handling loss which is uncorrelated | 301 // threshold. This is a crude way of handling loss which is uncorrelated |
302 // to congestion. | 302 // to congestion. |
303 if (bitrate_ < bitrate_threshold_bps_ || loss <= low_loss_threshold_) { | 303 if (current_bitrate_bps_ < bitrate_threshold_bps_ || |
| 304 loss <= low_loss_threshold_) { |
304 // Loss < 2%: Increase rate by 8% of the min bitrate in the last | 305 // Loss < 2%: Increase rate by 8% of the min bitrate in the last |
305 // kBweIncreaseIntervalMs. | 306 // kBweIncreaseIntervalMs. |
306 // Note that by remembering the bitrate over the last second one can | 307 // Note that by remembering the bitrate over the last second one can |
307 // rampup up one second faster than if only allowed to start ramping | 308 // rampup up one second faster than if only allowed to start ramping |
308 // at 8% per second rate now. E.g.: | 309 // at 8% per second rate now. E.g.: |
309 // If sending a constant 100kbps it can rampup immediatly to 108kbps | 310 // If sending a constant 100kbps it can rampup immediatly to 108kbps |
310 // whenever a receiver report is received with lower packet loss. | 311 // whenever a receiver report is received with lower packet loss. |
311 // If instead one would do: bitrate_ *= 1.08^(delta time), it would | 312 // If instead one would do: current_bitrate_bps_ *= 1.08^(delta time), |
312 // take over one second since the lower packet loss to achieve | 313 // it would take over one second since the lower packet loss to achieve |
313 // 108kbps. | 314 // 108kbps. |
314 bitrate_ = static_cast<uint32_t>( | 315 new_bitrate = static_cast<uint32_t>( |
315 min_bitrate_history_.front().second * 1.08 + 0.5); | 316 min_bitrate_history_.front().second * 1.08 + 0.5); |
316 | 317 |
317 // Add 1 kbps extra, just to make sure that we do not get stuck | 318 // Add 1 kbps extra, just to make sure that we do not get stuck |
318 // (gives a little extra increase at low rates, negligible at higher | 319 // (gives a little extra increase at low rates, negligible at higher |
319 // rates). | 320 // rates). |
320 bitrate_ += 1000; | 321 new_bitrate += 1000; |
321 } else if (bitrate_ > bitrate_threshold_bps_) { | 322 } else if (current_bitrate_bps_ > bitrate_threshold_bps_) { |
322 if (loss <= high_loss_threshold_) { | 323 if (loss <= high_loss_threshold_) { |
323 // Loss between 2% - 10%: Do nothing. | 324 // Loss between 2% - 10%: Do nothing. |
324 } else { | 325 } else { |
325 // Loss > 10%: Limit the rate decreases to once a kBweDecreaseIntervalMs | 326 // Loss > 10%: Limit the rate decreases to once a kBweDecreaseIntervalMs |
326 // + rtt. | 327 // + rtt. |
327 if (!has_decreased_since_last_fraction_loss_ && | 328 if (!has_decreased_since_last_fraction_loss_ && |
328 (now_ms - time_last_decrease_ms_) >= | 329 (now_ms - time_last_decrease_ms_) >= |
329 (kBweDecreaseIntervalMs + last_round_trip_time_ms_)) { | 330 (kBweDecreaseIntervalMs + last_round_trip_time_ms_)) { |
330 time_last_decrease_ms_ = now_ms; | 331 time_last_decrease_ms_ = now_ms; |
331 | 332 |
332 // Reduce rate: | 333 // Reduce rate: |
333 // newRate = rate * (1 - 0.5*lossRate); | 334 // newRate = rate * (1 - 0.5*lossRate); |
334 // where packetLoss = 256*lossRate; | 335 // where packetLoss = 256*lossRate; |
335 bitrate_ = static_cast<uint32_t>( | 336 new_bitrate = static_cast<uint32_t>( |
336 (bitrate_ * static_cast<double>(512 - last_fraction_loss_)) / | 337 (current_bitrate_bps_ * |
| 338 static_cast<double>(512 - last_fraction_loss_)) / |
337 512.0); | 339 512.0); |
338 has_decreased_since_last_fraction_loss_ = true; | 340 has_decreased_since_last_fraction_loss_ = true; |
339 } | 341 } |
340 } | 342 } |
341 } | 343 } |
342 } else if (time_since_feedback_ms > | 344 } else if (time_since_feedback_ms > |
343 kFeedbackTimeoutIntervals * kFeedbackIntervalMs && | 345 kFeedbackTimeoutIntervals * kFeedbackIntervalMs && |
344 (last_timeout_ms_ == -1 || | 346 (last_timeout_ms_ == -1 || |
345 now_ms - last_timeout_ms_ > kTimeoutIntervalMs)) { | 347 now_ms - last_timeout_ms_ > kTimeoutIntervalMs)) { |
346 if (in_timeout_experiment_) { | 348 if (in_timeout_experiment_) { |
347 LOG(LS_WARNING) << "Feedback timed out (" << time_since_feedback_ms | 349 LOG(LS_WARNING) << "Feedback timed out (" << time_since_feedback_ms |
348 << " ms), reducing bitrate."; | 350 << " ms), reducing bitrate."; |
349 bitrate_ *= 0.8; | 351 new_bitrate *= 0.8; |
350 // Reset accumulators since we've already acted on missing feedback and | 352 // Reset accumulators since we've already acted on missing feedback and |
351 // shouldn't to act again on these old lost packets. | 353 // shouldn't to act again on these old lost packets. |
352 lost_packets_since_last_loss_update_Q8_ = 0; | 354 lost_packets_since_last_loss_update_Q8_ = 0; |
353 expected_packets_since_last_loss_update_ = 0; | 355 expected_packets_since_last_loss_update_ = 0; |
354 last_timeout_ms_ = now_ms; | 356 last_timeout_ms_ = now_ms; |
355 } | 357 } |
356 } | 358 } |
357 uint32_t capped_bitrate = CapBitrateToThresholds(now_ms, bitrate_); | 359 |
358 if (capped_bitrate != bitrate_ || | 360 CapBitrateToThresholds(now_ms, new_bitrate); |
359 last_fraction_loss_ != last_logged_fraction_loss_ || | |
360 last_rtc_event_log_ms_ == -1 || | |
361 now_ms - last_rtc_event_log_ms_ > kRtcEventLogPeriodMs) { | |
362 event_log_->LogLossBasedBweUpdate(capped_bitrate, last_fraction_loss_, | |
363 expected_packets_since_last_loss_update_); | |
364 last_logged_fraction_loss_ = last_fraction_loss_; | |
365 last_rtc_event_log_ms_ = now_ms; | |
366 } | |
367 bitrate_ = capped_bitrate; | |
368 } | 361 } |
369 | 362 |
370 bool SendSideBandwidthEstimation::IsInStartPhase(int64_t now_ms) const { | 363 bool SendSideBandwidthEstimation::IsInStartPhase(int64_t now_ms) const { |
371 return first_report_time_ms_ == -1 || | 364 return first_report_time_ms_ == -1 || |
372 now_ms - first_report_time_ms_ < kStartPhaseMs; | 365 now_ms - first_report_time_ms_ < kStartPhaseMs; |
373 } | 366 } |
374 | 367 |
375 void SendSideBandwidthEstimation::UpdateMinHistory(int64_t now_ms) { | 368 void SendSideBandwidthEstimation::UpdateMinHistory(int64_t now_ms) { |
376 // Remove old data points from history. | 369 // Remove old data points from history. |
377 // Since history precision is in ms, add one so it is able to increase | 370 // Since history precision is in ms, add one so it is able to increase |
378 // bitrate if it is off by as little as 0.5ms. | 371 // bitrate if it is off by as little as 0.5ms. |
379 while (!min_bitrate_history_.empty() && | 372 while (!min_bitrate_history_.empty() && |
380 now_ms - min_bitrate_history_.front().first + 1 > | 373 now_ms - min_bitrate_history_.front().first + 1 > |
381 kBweIncreaseIntervalMs) { | 374 kBweIncreaseIntervalMs) { |
382 min_bitrate_history_.pop_front(); | 375 min_bitrate_history_.pop_front(); |
383 } | 376 } |
384 | 377 |
385 // Typical minimum sliding-window algorithm: Pop values higher than current | 378 // Typical minimum sliding-window algorithm: Pop values higher than current |
386 // bitrate before pushing it. | 379 // bitrate before pushing it. |
387 while (!min_bitrate_history_.empty() && | 380 while (!min_bitrate_history_.empty() && |
388 bitrate_ <= min_bitrate_history_.back().second) { | 381 current_bitrate_bps_ <= min_bitrate_history_.back().second) { |
389 min_bitrate_history_.pop_back(); | 382 min_bitrate_history_.pop_back(); |
390 } | 383 } |
391 | 384 |
392 min_bitrate_history_.push_back(std::make_pair(now_ms, bitrate_)); | 385 min_bitrate_history_.push_back(std::make_pair(now_ms, current_bitrate_bps_)); |
393 } | 386 } |
394 | 387 |
395 uint32_t SendSideBandwidthEstimation::CapBitrateToThresholds( | 388 void SendSideBandwidthEstimation::CapBitrateToThresholds(int64_t now_ms, |
396 int64_t now_ms, uint32_t bitrate) { | 389 uint32_t bitrate_bps) { |
397 if (bwe_incoming_ > 0 && bitrate > bwe_incoming_) { | 390 if (bwe_incoming_ > 0 && bitrate_bps > bwe_incoming_) { |
398 bitrate = bwe_incoming_; | 391 bitrate_bps = bwe_incoming_; |
399 } | 392 } |
400 if (delay_based_bitrate_bps_ > 0 && bitrate > delay_based_bitrate_bps_) { | 393 if (delay_based_bitrate_bps_ > 0 && bitrate_bps > delay_based_bitrate_bps_) { |
401 bitrate = delay_based_bitrate_bps_; | 394 bitrate_bps = delay_based_bitrate_bps_; |
402 } | 395 } |
403 if (bitrate > max_bitrate_configured_) { | 396 if (bitrate_bps > max_bitrate_configured_) { |
404 bitrate = max_bitrate_configured_; | 397 bitrate_bps = max_bitrate_configured_; |
405 } | 398 } |
406 if (bitrate < min_bitrate_configured_) { | 399 if (bitrate_bps < min_bitrate_configured_) { |
407 if (last_low_bitrate_log_ms_ == -1 || | 400 if (last_low_bitrate_log_ms_ == -1 || |
408 now_ms - last_low_bitrate_log_ms_ > kLowBitrateLogPeriodMs) { | 401 now_ms - last_low_bitrate_log_ms_ > kLowBitrateLogPeriodMs) { |
409 LOG(LS_WARNING) << "Estimated available bandwidth " << bitrate / 1000 | 402 LOG(LS_WARNING) << "Estimated available bandwidth " << bitrate_bps / 1000 |
410 << " kbps is below configured min bitrate " | 403 << " kbps is below configured min bitrate " |
411 << min_bitrate_configured_ / 1000 << " kbps."; | 404 << min_bitrate_configured_ / 1000 << " kbps."; |
412 last_low_bitrate_log_ms_ = now_ms; | 405 last_low_bitrate_log_ms_ = now_ms; |
413 } | 406 } |
414 bitrate = min_bitrate_configured_; | 407 bitrate_bps = min_bitrate_configured_; |
415 } | 408 } |
416 return bitrate; | 409 |
| 410 if (bitrate_bps != current_bitrate_bps_ || |
| 411 last_fraction_loss_ != last_logged_fraction_loss_ || |
| 412 now_ms - last_rtc_event_log_ms_ > kRtcEventLogPeriodMs) { |
| 413 event_log_->LogLossBasedBweUpdate(bitrate_bps, last_fraction_loss_, |
| 414 expected_packets_since_last_loss_update_); |
| 415 last_logged_fraction_loss_ = last_fraction_loss_; |
| 416 last_rtc_event_log_ms_ = now_ms; |
| 417 } |
| 418 current_bitrate_bps_ = bitrate_bps; |
417 } | 419 } |
418 } // namespace webrtc | 420 } // namespace webrtc |
OLD | NEW |