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

Side by Side Diff: webrtc/call/bitrate_allocator.cc

Issue 2996643002: BWE allocation strategy
Patch Set: Comments handling Created 3 years, 3 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
« no previous file with comments | « webrtc/call/bitrate_allocator.h ('k') | webrtc/call/call.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 : limit_observer_(limit_observer), 49 : limit_observer_(limit_observer),
50 bitrate_observer_configs_(), 50 bitrate_observer_configs_(),
51 last_bitrate_bps_(0), 51 last_bitrate_bps_(0),
52 last_non_zero_bitrate_bps_(kDefaultBitrateBps), 52 last_non_zero_bitrate_bps_(kDefaultBitrateBps),
53 last_fraction_loss_(0), 53 last_fraction_loss_(0),
54 last_rtt_(0), 54 last_rtt_(0),
55 num_pause_events_(0), 55 num_pause_events_(0),
56 clock_(Clock::GetRealTimeClock()), 56 clock_(Clock::GetRealTimeClock()),
57 last_bwe_log_time_(0), 57 last_bwe_log_time_(0),
58 total_requested_padding_bitrate_(0), 58 total_requested_padding_bitrate_(0),
59 total_requested_min_bitrate_(0) { 59 total_requested_min_bitrate_(0),
60 bitrate_allocation_strategy_(nullptr) {
60 sequenced_checker_.Detach(); 61 sequenced_checker_.Detach();
61 } 62 }
62 63
63 BitrateAllocator::~BitrateAllocator() { 64 BitrateAllocator::~BitrateAllocator() {
64 RTC_HISTOGRAM_COUNTS_100("WebRTC.Call.NumberOfPauseEvents", 65 RTC_HISTOGRAM_COUNTS_100("WebRTC.Call.NumberOfPauseEvents",
65 num_pause_events_); 66 num_pause_events_);
66 } 67 }
67 68
68 void BitrateAllocator::OnNetworkChanged(uint32_t target_bitrate_bps, 69 void BitrateAllocator::OnNetworkChanged(uint32_t target_bitrate_bps,
69 uint8_t fraction_loss, 70 uint8_t fraction_loss,
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 LOG(LS_INFO) << "UpdateAllocationLimits : total_requested_min_bitrate: " 193 LOG(LS_INFO) << "UpdateAllocationLimits : total_requested_min_bitrate: "
193 << total_requested_min_bitrate 194 << total_requested_min_bitrate
194 << "bps, total_requested_padding_bitrate: " 195 << "bps, total_requested_padding_bitrate: "
195 << total_requested_padding_bitrate << "bps"; 196 << total_requested_padding_bitrate << "bps";
196 limit_observer_->OnAllocationLimitsChanged(total_requested_min_bitrate, 197 limit_observer_->OnAllocationLimitsChanged(total_requested_min_bitrate,
197 total_requested_padding_bitrate); 198 total_requested_padding_bitrate);
198 } 199 }
199 200
200 void BitrateAllocator::RemoveObserver(BitrateAllocatorObserver* observer) { 201 void BitrateAllocator::RemoveObserver(BitrateAllocatorObserver* observer) {
201 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_); 202 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
203
202 auto it = FindObserverConfig(observer); 204 auto it = FindObserverConfig(observer);
203 if (it != bitrate_observer_configs_.end()) { 205 if (it != bitrate_observer_configs_.end()) {
204 bitrate_observer_configs_.erase(it); 206 bitrate_observer_configs_.erase(it);
205 } 207 }
206 208
207 UpdateAllocationLimits(); 209 UpdateAllocationLimits();
208 } 210 }
209 211
210 int BitrateAllocator::GetStartBitrate(BitrateAllocatorObserver* observer) { 212 int BitrateAllocator::GetStartBitrate(BitrateAllocatorObserver* observer) {
211 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_); 213 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
212 const auto& it = FindObserverConfig(observer); 214 const auto& it = FindObserverConfig(observer);
213 if (it == bitrate_observer_configs_.end()) { 215 if (it == bitrate_observer_configs_.end()) {
214 // This observer hasn't been added yet, just give it its fair share. 216 // This observer hasn't been added yet, just give it its fair share.
215 return last_non_zero_bitrate_bps_ / 217 return last_non_zero_bitrate_bps_ /
216 static_cast<int>((bitrate_observer_configs_.size() + 1)); 218 static_cast<int>((bitrate_observer_configs_.size() + 1));
217 } else if (it->allocated_bitrate_bps == -1) { 219 } else if (it->allocated_bitrate_bps == -1) {
218 // This observer hasn't received an allocation yet, so do the same. 220 // This observer hasn't received an allocation yet, so do the same.
219 return last_non_zero_bitrate_bps_ / 221 return last_non_zero_bitrate_bps_ /
220 static_cast<int>(bitrate_observer_configs_.size()); 222 static_cast<int>(bitrate_observer_configs_.size());
221 } else { 223 } else {
222 // This observer already has an allocation. 224 // This observer already has an allocation.
223 return it->allocated_bitrate_bps; 225 return it->allocated_bitrate_bps;
224 } 226 }
225 } 227 }
226 228
229 void BitrateAllocator::SetBitrateAllocationStrategy(
230 rtc::BitrateAllocationStrategy* bitrate_allocation_strategy) {
231 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
232 bitrate_allocation_strategy_ = bitrate_allocation_strategy;
233 }
234
227 BitrateAllocator::ObserverConfigs::iterator 235 BitrateAllocator::ObserverConfigs::iterator
228 BitrateAllocator::FindObserverConfig(const BitrateAllocatorObserver* observer) { 236 BitrateAllocator::FindObserverConfig(const BitrateAllocatorObserver* observer) {
229 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_); 237 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
230 for (auto it = bitrate_observer_configs_.begin(); 238 for (auto it = bitrate_observer_configs_.begin();
231 it != bitrate_observer_configs_.end(); ++it) { 239 it != bitrate_observer_configs_.end(); ++it) {
232 if (it->observer == observer) 240 if (it->observer == observer)
233 return it; 241 return it;
234 } 242 }
235 return bitrate_observer_configs_.end(); 243 return bitrate_observer_configs_.end();
236 } 244 }
237 245
238 BitrateAllocator::ObserverAllocation BitrateAllocator::AllocateBitrates( 246 BitrateAllocator::ObserverAllocation BitrateAllocator::AllocateBitrates(
239 uint32_t bitrate) { 247 uint32_t bitrate) {
240 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_); 248 RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
241 if (bitrate_observer_configs_.empty()) 249 if (bitrate_observer_configs_.empty())
242 return ObserverAllocation(); 250 return ObserverAllocation();
243 251
252 if (bitrate_allocation_strategy_ != nullptr) {
253 std::vector<const rtc::BitrateAllocationStrategy::TrackConfig*>
254 track_configs(bitrate_observer_configs_.size());
255 int i = 0;
256 for (const auto& c : bitrate_observer_configs_) {
257 track_configs[i++] = &c;
258 }
259 std::vector<uint32_t> track_allocations =
260 bitrate_allocation_strategy_->AllocateBitrates(bitrate, track_configs);
261 // The strategy should return allocation for all tracks.
262 RTC_CHECK(track_allocations.size() == bitrate_observer_configs_.size());
263 ObserverAllocation allocation;
264 auto track_allocations_it = track_allocations.begin();
265 for (const auto& observer_config : bitrate_observer_configs_) {
266 allocation[observer_config.observer] = *track_allocations_it++;
267 }
268 return allocation;
269 }
270
244 if (bitrate == 0) 271 if (bitrate == 0)
245 return ZeroRateAllocation(); 272 return ZeroRateAllocation();
246 273
247 uint32_t sum_min_bitrates = 0; 274 uint32_t sum_min_bitrates = 0;
248 uint32_t sum_max_bitrates = 0; 275 uint32_t sum_max_bitrates = 0;
249 for (const auto& observer_config : bitrate_observer_configs_) { 276 for (const auto& observer_config : bitrate_observer_configs_) {
250 sum_min_bitrates += observer_config.min_bitrate_bps; 277 sum_min_bitrates += observer_config.min_bitrate_bps;
251 sum_max_bitrates += observer_config.max_bitrate_bps; 278 sum_max_bitrates += observer_config.max_bitrate_bps;
252 } 279 }
253 280
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 static_cast<uint32_t>(bitrate_observer_configs_.size()); 459 static_cast<uint32_t>(bitrate_observer_configs_.size());
433 for (const auto& observer_config : bitrate_observer_configs_) { 460 for (const auto& observer_config : bitrate_observer_configs_) {
434 if (observer_config.min_bitrate_bps + extra_bitrate_per_observer < 461 if (observer_config.min_bitrate_bps + extra_bitrate_per_observer <
435 MinBitrateWithHysteresis(observer_config)) { 462 MinBitrateWithHysteresis(observer_config)) {
436 return false; 463 return false;
437 } 464 }
438 } 465 }
439 return true; 466 return true;
440 } 467 }
441 } // namespace webrtc 468 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/call/bitrate_allocator.h ('k') | webrtc/call/call.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698