Index: webrtc/call/call.cc |
diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc |
index e9838d9baad0acdadde8f33ddc12bb863068cc92..814bd0dd7edb6b4342edbecf6b021e41cef6540e 100644 |
--- a/webrtc/call/call.cc |
+++ b/webrtc/call/call.cc |
@@ -180,6 +180,13 @@ class Call : public webrtc::Call, |
void SetBitrateConfig( |
const webrtc::Call::Config::BitrateConfig& bitrate_config) override; |
+ void SetBitrateConfigMask( |
+ const webrtc::Call::Config::BitrateConfigMask& bitrate_config) override; |
+ |
+ // Updates the cached |masked_bitrate_config_| struct and updates the |
+ // congestion controller if the masked config changed. |
+ void UpdateMaskedBitrateConfig(); |
+ |
void SignalChannelNetworkState(MediaType media, NetworkState state) override; |
void OnTransportOverheadChanged(MediaType media, |
@@ -321,6 +328,14 @@ class Call : public webrtc::Call, |
// and deleted before any other members. |
rtc::TaskQueue worker_queue_; |
+ // The mask is kept so it can be re-applied if SetBitrateConfig is called. |
+ Config::BitrateConfigMask bitrate_config_mask_; |
+ |
+ // This is the BitrateConfig given to the congestion controller. We cache it |
+ // here to avoid resets in the congestion controller when nothing has actually |
+ // changed. |
+ Config::BitrateConfig masked_bitrate_config_; |
+ |
RTC_DISALLOW_COPY_AND_ASSIGN(Call); |
}; |
} // namespace internal |
@@ -374,7 +389,8 @@ Call::Call(const Call::Config& config, |
receive_side_cc_(clock_, &remb_, transport_send_->packet_router()), |
video_send_delay_stats_(new SendDelayStats(clock_)), |
start_ms_(clock_->TimeInMilliseconds()), |
- worker_queue_("call_worker_queue") { |
+ worker_queue_("call_worker_queue"), |
+ masked_bitrate_config_(config.bitrate_config) { |
RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
RTC_DCHECK(config.event_log != nullptr); |
RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0); |
@@ -897,9 +913,11 @@ void Call::SetBitrateConfig( |
const webrtc::Call::Config::BitrateConfig& bitrate_config) { |
TRACE_EVENT0("webrtc", "Call::SetBitrateConfig"); |
RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
+ |
RTC_DCHECK_GE(bitrate_config.min_bitrate_bps, 0); |
if (bitrate_config.max_bitrate_bps != -1) |
RTC_DCHECK_GT(bitrate_config.max_bitrate_bps, 0); |
+ |
if (config_.bitrate_config.min_bitrate_bps == |
bitrate_config.min_bitrate_bps && |
(bitrate_config.start_bitrate_bps <= 0 || |
@@ -910,16 +928,71 @@ void Call::SetBitrateConfig( |
// Nothing new to set, early abort to avoid encoder reconfigurations. |
return; |
} |
+ |
config_.bitrate_config.min_bitrate_bps = bitrate_config.min_bitrate_bps; |
// Start bitrate of -1 means we should keep the old bitrate, which there is |
// no point in remembering for the future. |
if (bitrate_config.start_bitrate_bps > 0) |
config_.bitrate_config.start_bitrate_bps = bitrate_config.start_bitrate_bps; |
config_.bitrate_config.max_bitrate_bps = bitrate_config.max_bitrate_bps; |
+ |
RTC_DCHECK_NE(bitrate_config.start_bitrate_bps, 0); |
- transport_send_->send_side_cc()->SetBweBitrates( |
- bitrate_config.min_bitrate_bps, bitrate_config.start_bitrate_bps, |
+ |
+ UpdateMaskedBitrateConfig(); |
+} |
+ |
+void Call::SetBitrateConfigMask( |
+ const webrtc::Call::Config::BitrateConfigMask& mask) { |
+ TRACE_EVENT0("webrtc", "Call::UpdateBitrateConfig"); |
+ RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
+ |
+ const bool has_min = static_cast<bool>(mask.min_bitrate_bps); |
+ const bool has_start = static_cast<bool>(mask.start_bitrate_bps); |
+ const bool has_max = static_cast<bool>(mask.max_bitrate_bps); |
+ if (has_min) { |
+ RTC_DCHECK_GE(*mask.min_bitrate_bps, 0); |
Taylor Brandstetter
2017/04/12 01:33:41
In general we don't assert as a result of bad inpu
Zach Stein
2017/04/18 22:54:50
Done.
|
+ } |
+ if (has_start) { |
+ RTC_DCHECK_GE(*mask.start_bitrate_bps, has_min ? *mask.min_bitrate_bps : 0); |
+ } |
+ if (has_max) { |
+ RTC_DCHECK_GE(*mask.max_bitrate_bps, |
+ has_start ? *mask.start_bitrate_bps |
+ : (has_min ? *mask.min_bitrate_bps : 0)); |
+ } |
+ |
+ bitrate_config_mask_ = mask; |
+ |
+ UpdateMaskedBitrateConfig(); |
+} |
+ |
+void Call::UpdateMaskedBitrateConfig() { |
+ Config::BitrateConfig new_masked; |
+ const Config::BitrateConfig& bitrate_config = config_.bitrate_config; |
Taylor Brandstetter
2017/04/12 01:33:42
It seems unintuitive that config_.bitrate_config i
Zach Stein
2017/04/18 22:54:50
Done.
|
+ |
+ new_masked.min_bitrate_bps = bitrate_config_mask_.min_bitrate_bps.value_or( |
+ bitrate_config.min_bitrate_bps); |
+ new_masked.start_bitrate_bps = |
+ bitrate_config_mask_.start_bitrate_bps.value_or( |
+ bitrate_config.start_bitrate_bps); |
+ new_masked.max_bitrate_bps = bitrate_config_mask_.max_bitrate_bps.value_or( |
bitrate_config.max_bitrate_bps); |
Taylor Brandstetter
2017/04/12 01:33:42
I'm not sure the "mask" should completely override
Zach Stein
2017/04/13 00:26:36
We don't know that bitrate_config.max_bitrate_bps
Taylor Brandstetter
2017/04/13 22:16:13
The codec params also come from SDP (from "a=fmtp"
Zach Stein
2017/04/18 22:54:50
I didn't realize that the codec params also came f
|
+ |
+ if (new_masked.min_bitrate_bps != masked_bitrate_config_.min_bitrate_bps || |
+ new_masked.start_bitrate_bps != |
+ masked_bitrate_config_.start_bitrate_bps || |
Taylor Brandstetter
2017/04/12 01:33:42
Should this be the same condition as in SetBitrate
Zach Stein
2017/04/18 22:54:50
Done.
|
+ new_masked.max_bitrate_bps != masked_bitrate_config_.max_bitrate_bps) { |
+ RTC_DCHECK_GT(new_masked.min_bitrate_bps, 0); |
+ RTC_DCHECK_GT(new_masked.start_bitrate_bps, new_masked.min_bitrate_bps); |
+ RTC_DCHECK(new_masked.max_bitrate_bps == -1 || |
+ new_masked.max_bitrate_bps > new_masked.start_bitrate_bps); |
+ |
+ masked_bitrate_config_ = new_masked; |
+ transport_send_->send_side_cc()->SetBweBitrates( |
+ masked_bitrate_config_.min_bitrate_bps, |
+ masked_bitrate_config_.start_bitrate_bps, |
+ masked_bitrate_config_.max_bitrate_bps); |
+ } |
} |
void Call::SignalChannelNetworkState(MediaType media, NetworkState state) { |