Add kTransmissionMaxBitrateMultiplier logic to audio priority bitrate allocation strategy similarly to default bitrate allocation logic.

Bug: webrtc:8243
Change-Id: I128712ae96cc13ace0c6d2edf518eb59d30a4569
Reviewed-on: https://webrtc-review.googlesource.com/21983
Commit-Queue: Alex Narest <alexnarest@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20722}
diff --git a/call/bitrate_allocator.cc b/call/bitrate_allocator.cc
index 004262e..fc202ce 100644
--- a/call/bitrate_allocator.cc
+++ b/call/bitrate_allocator.cc
@@ -26,6 +26,9 @@
 
 // Allow packets to be transmitted in up to 2 times max video bitrate if the
 // bandwidth estimate allows it.
+// TODO(bugs.webrtc.org/8541): May be worth to refactor to keep this logic in
+// video send stream. Similar logic is implemented in
+// AudioPriorityBitrateAllocationStrategy.
 const int kTransmissionMaxBitrateMultiplier = 2;
 const int kDefaultBitrateBps = 300000;
 
diff --git a/rtc_base/bitrateallocationstrategy.cc b/rtc_base/bitrateallocationstrategy.cc
index 66528d75..d2a06cd 100644
--- a/rtc_base/bitrateallocationstrategy.cc
+++ b/rtc_base/bitrateallocationstrategy.cc
@@ -14,6 +14,12 @@
 
 namespace rtc {
 
+// The purpose of this is to allow video streams to use extra bandwidth for FEC.
+// TODO(bugs.webrtc.org/8541): May be worth to refactor to keep this logic in
+// video send stream. Similar logic is implemented in BitrateAllocator.
+
+const int kTransmissionMaxBitrateMultiplier = 2;
+
 std::vector<uint32_t> BitrateAllocationStrategy::SetAllBitratesToMinimum(
     const ArrayView<const TrackConfig*> track_configs) {
   std::vector<uint32_t> track_allocations;
@@ -84,14 +90,35 @@
   const TrackConfig* audio_track_config = NULL;
   size_t audio_config_index = 0;
   uint32_t sum_min_bitrates = 0;
+  uint32_t sum_max_bitrates = 0;
 
   for (const auto*& track_config : track_configs) {
     sum_min_bitrates += track_config->min_bitrate_bps;
+    sum_max_bitrates += track_config->max_bitrate_bps;
     if (track_config->track_id == audio_track_id_) {
       audio_track_config = track_config;
       audio_config_index = &track_config - &track_configs[0];
     }
   }
+  if (sum_max_bitrates < available_bitrate) {
+    // Allow non audio streams to go above max upto
+    // kTransmissionMaxBitrateMultiplier * max_bitrate_bps
+    size_t track_configs_size = track_configs.size();
+    std::vector<TrackConfig> increased_track_configs(track_configs_size);
+    std::vector<const TrackConfig*> increased_track_configs_ptr(
+        track_configs_size);
+    for (unsigned long i = 0; i < track_configs_size; i++) {
+      increased_track_configs[i] = (*track_configs[i]);
+      increased_track_configs_ptr[i] = &increased_track_configs[i];
+      if (track_configs[i]->track_id != audio_track_id_) {
+        increased_track_configs[i].max_bitrate_bps =
+            track_configs[i]->max_bitrate_bps *
+            kTransmissionMaxBitrateMultiplier;
+      }
+    }
+    return DistributeBitratesEvenly(increased_track_configs_ptr,
+                                    available_bitrate);
+  }
   if (audio_track_config == nullptr) {
     return DistributeBitratesEvenly(track_configs, available_bitrate);
   }