From e0b2ff5ea4a1894086791dc70634383b8e85f089 Mon Sep 17 00:00:00 2001 From: Alex Narest Date: Thu, 16 Nov 2017 20:03:46 +0100 Subject: [PATCH] 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 Reviewed-by: Niels Moller Reviewed-by: Stefan Holmer Cr-Commit-Position: refs/heads/master@{#20722} --- call/bitrate_allocator.cc | 3 +++ rtc_base/bitrateallocationstrategy.cc | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/call/bitrate_allocator.cc b/call/bitrate_allocator.cc index 004262e262..fc202ce22f 100644 --- a/call/bitrate_allocator.cc +++ b/call/bitrate_allocator.cc @@ -26,6 +26,9 @@ namespace webrtc { // 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 66528d75a4..d2a06cd9ef 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 BitrateAllocationStrategy::SetAllBitratesToMinimum( const ArrayView track_configs) { std::vector track_allocations; @@ -84,14 +90,35 @@ std::vector AudioPriorityBitrateAllocationStrategy::AllocateBitrates( 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 increased_track_configs(track_configs_size); + std::vector 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); }