From be40296ccef50dd79312c6fce533bfa36b7063dc Mon Sep 17 00:00:00 2001 From: Stefan Holmer Date: Fri, 8 Jul 2016 16:16:41 +0200 Subject: [PATCH] Fix bug where a connection switch causes BWE to be set to zero. BUG=webrtc:6076 R=sprang@webrtc.org Review URL: https://codereview.webrtc.org/2125523004 . Cr-Commit-Position: refs/heads/master@{#13414} --- webrtc/call/call.cc | 7 +++- webrtc/video/video_send_stream_tests.cc | 48 +++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc index c85eaf6990..dfb1879a5f 100644 --- a/webrtc/call/call.cc +++ b/webrtc/call/call.cc @@ -579,7 +579,12 @@ void Call::SetBitrateConfig( // Nothing new to set, early abort to avoid encoder reconfigurations. return; } - config_.bitrate_config = bitrate_config; + 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; congestion_controller_->SetBweBitrates(bitrate_config.min_bitrate_bps, bitrate_config.start_bitrate_bps, bitrate_config.max_bitrate_bps); diff --git a/webrtc/video/video_send_stream_tests.cc b/webrtc/video/video_send_stream_tests.cc index ddd099900d..3a8acbc5b5 100644 --- a/webrtc/video/video_send_stream_tests.cc +++ b/webrtc/video/video_send_stream_tests.cc @@ -1121,6 +1121,54 @@ TEST_F(VideoSendStreamTest, MinTransmitBitrateRespectsRemb) { RunBaseTest(&test); } +TEST_F(VideoSendStreamTest, ChangingNetworkRoute) { + class ChangingNetworkRouteTest : public test::EndToEndTest { + public: + const int kStartBitrateBps = 300000; + const int kNewMaxBitrateBps = 1234567; + + ChangingNetworkRouteTest() + : EndToEndTest(test::CallTest::kDefaultTimeoutMs), + call_(nullptr) {} + + void OnCallsCreated(Call* sender_call, Call* receiver_call) override { + call_ = sender_call; + } + + Action OnSendRtp(const uint8_t* packet, size_t length) override { + if (call_->GetStats().send_bandwidth_bps > kStartBitrateBps) { + observation_complete_.Set(); + } + + return SEND_PACKET; + } + + void PerformTest() override { + rtc::NetworkRoute new_route(true, 10, 20, -1); + call_->OnNetworkRouteChanged("transport", new_route); + Call::Config::BitrateConfig bitrate_config; + bitrate_config.start_bitrate_bps = kStartBitrateBps; + call_->SetBitrateConfig(bitrate_config); + EXPECT_TRUE(Wait()) + << "Timed out while waiting for start bitrate to be exceeded."; + + bitrate_config.start_bitrate_bps = -1; + bitrate_config.max_bitrate_bps = kNewMaxBitrateBps; + call_->SetBitrateConfig(bitrate_config); + // TODO(holmer): We should set the last sent packet id here and verify + // that we correctly ignore any packet loss reported prior to that id. + ++new_route.local_network_id; + call_->OnNetworkRouteChanged("transport", new_route); + EXPECT_EQ(kStartBitrateBps, call_->GetStats().send_bandwidth_bps); + } + + private: + Call* call_; + } test; + + RunBaseTest(&test); +} + class MaxPaddingSetTest : public test::SendTest { public: static const uint32_t kMinTransmitBitrateBps = 400000;