| Index: webrtc/call/bitrate_allocator.cc
 | 
| diff --git a/webrtc/call/bitrate_allocator.cc b/webrtc/call/bitrate_allocator.cc
 | 
| index 2eb40b0670813c008b1b594541fc1e12147e47e9..cebce9e0031bbc9accf4dff22766709c1567b5b2 100644
 | 
| --- a/webrtc/call/bitrate_allocator.cc
 | 
| +++ b/webrtc/call/bitrate_allocator.cc
 | 
| @@ -56,7 +56,8 @@ BitrateAllocator::BitrateAllocator(LimitObserver* limit_observer)
 | 
|        clock_(Clock::GetRealTimeClock()),
 | 
|        last_bwe_log_time_(0),
 | 
|        total_requested_padding_bitrate_(0),
 | 
| -      total_requested_min_bitrate_(0) {
 | 
| +      total_requested_min_bitrate_(0),
 | 
| +      bitrate_allocation_strategy_(nullptr) {
 | 
|    sequenced_checker_.Detach();
 | 
|  }
 | 
|  
 | 
| @@ -199,6 +200,7 @@ void BitrateAllocator::UpdateAllocationLimits() {
 | 
|  
 | 
|  void BitrateAllocator::RemoveObserver(BitrateAllocatorObserver* observer) {
 | 
|    RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
 | 
| +
 | 
|    auto it = FindObserverConfig(observer);
 | 
|    if (it != bitrate_observer_configs_.end()) {
 | 
|      bitrate_observer_configs_.erase(it);
 | 
| @@ -224,6 +226,12 @@ int BitrateAllocator::GetStartBitrate(BitrateAllocatorObserver* observer) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +void BitrateAllocator::SetBitrateAllocationStrategy(
 | 
| +    rtc::BitrateAllocationStrategy* bitrate_allocation_strategy) {
 | 
| +  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
 | 
| +  bitrate_allocation_strategy_ = bitrate_allocation_strategy;
 | 
| +}
 | 
| +
 | 
|  BitrateAllocator::ObserverConfigs::iterator
 | 
|  BitrateAllocator::FindObserverConfig(const BitrateAllocatorObserver* observer) {
 | 
|    RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
 | 
| @@ -241,6 +249,25 @@ BitrateAllocator::ObserverAllocation BitrateAllocator::AllocateBitrates(
 | 
|    if (bitrate_observer_configs_.empty())
 | 
|      return ObserverAllocation();
 | 
|  
 | 
| +  if (bitrate_allocation_strategy_ != nullptr) {
 | 
| +    std::vector<const rtc::BitrateAllocationStrategy::TrackConfig*>
 | 
| +        track_configs(bitrate_observer_configs_.size());
 | 
| +    int i = 0;
 | 
| +    for (const auto& c : bitrate_observer_configs_) {
 | 
| +      track_configs[i++] = &c;
 | 
| +    }
 | 
| +    std::vector<uint32_t> track_allocations =
 | 
| +        bitrate_allocation_strategy_->AllocateBitrates(bitrate, track_configs);
 | 
| +    // The strategy should return allocation for all tracks.
 | 
| +    RTC_CHECK(track_allocations.size() == bitrate_observer_configs_.size());
 | 
| +    ObserverAllocation allocation;
 | 
| +    auto track_allocations_it = track_allocations.begin();
 | 
| +    for (const auto& observer_config : bitrate_observer_configs_) {
 | 
| +      allocation[observer_config.observer] = *track_allocations_it++;
 | 
| +    }
 | 
| +    return allocation;
 | 
| +  }
 | 
| +
 | 
|    if (bitrate == 0)
 | 
|      return ZeroRateAllocation();
 | 
|  
 | 
| 
 |