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);
}