diff --git a/webrtc/modules/congestion_controller/congestion_controller.cc b/webrtc/modules/congestion_controller/congestion_controller.cc index fdce8da435..ec94eeaba1 100644 --- a/webrtc/modules/congestion_controller/congestion_controller.cc +++ b/webrtc/modules/congestion_controller/congestion_controller.cc @@ -346,11 +346,14 @@ void CongestionController::OnTransportFeedback( const rtcp::TransportFeedback& feedback) { RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); transport_feedback_adapter_.OnTransportFeedback(feedback); + std::vector feedback_vector = + transport_feedback_adapter_.GetTransportFeedbackVector(); + if (feedback_vector.empty()) + return; DelayBasedBwe::Result result; { rtc::CritScope cs(&bwe_lock_); - result = delay_based_bwe_->IncomingPacketFeedbackVector( - transport_feedback_adapter_.GetTransportFeedbackVector()); + result = delay_based_bwe_->IncomingPacketFeedbackVector(feedback_vector); } if (result.updated) bitrate_controller_->OnDelayBasedBweResult(result); diff --git a/webrtc/modules/congestion_controller/congestion_controller_unittest.cc b/webrtc/modules/congestion_controller/congestion_controller_unittest.cc index 17d00c86e9..1a794f8b92 100644 --- a/webrtc/modules/congestion_controller/congestion_controller_unittest.cc +++ b/webrtc/modules/congestion_controller/congestion_controller_unittest.cc @@ -235,6 +235,49 @@ TEST_F(CongestionControllerTest, OnNetworkRouteChanged) { controller_->OnNetworkRouteChanged(route, -1, -1, -1); } +TEST_F(CongestionControllerTest, OldFeedback) { + int new_bitrate = 200000; + testing::Mock::VerifyAndClearExpectations(pacer_); + EXPECT_CALL(observer_, OnNetworkChanged(new_bitrate, _, _, _)); + EXPECT_CALL(*pacer_, SetEstimatedBitrate(new_bitrate)); + + // Send a few packets on the first network route. + std::vector packets; + packets.push_back(PacketFeedback(0, 0, 0, 1500, kPacingInfo0)); + packets.push_back(PacketFeedback(10, 10, 1, 1500, kPacingInfo0)); + packets.push_back(PacketFeedback(20, 20, 2, 1500, kPacingInfo0)); + packets.push_back(PacketFeedback(30, 30, 3, 1500, kPacingInfo1)); + packets.push_back(PacketFeedback(40, 40, 4, 1500, kPacingInfo1)); + + for (const PacketFeedback& packet : packets) + OnSentPacket(packet); + + // Change route and then insert a number of feedback packets. + rtc::NetworkRoute route; + route.local_network_id = 1; + controller_->OnNetworkRouteChanged(route, new_bitrate, -1, -1); + + for (const PacketFeedback& packet : packets) { + rtcp::TransportFeedback feedback; + feedback.SetBase(packet.sequence_number, packet.arrival_time_ms * 1000); + + EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, + packet.arrival_time_ms * 1000)); + feedback.Build(); + controller_->OnTransportFeedback(feedback); + } + + // If the bitrate is reset to -1, the new starting bitrate will be + // the minimum default bitrate kMinBitrateBps. + EXPECT_CALL( + observer_, + OnNetworkChanged(congestion_controller::GetMinBitrateBps(), _, _, _)); + EXPECT_CALL(*pacer_, + SetEstimatedBitrate(congestion_controller::GetMinBitrateBps())); + route.local_network_id = 2; + controller_->OnNetworkRouteChanged(route, -1, -1, -1); +} + TEST_F(CongestionControllerTest, SignalNetworkStateAndQueueIsFullAndEstimateChange) { // Send queue is full diff --git a/webrtc/modules/congestion_controller/delay_based_bwe.cc b/webrtc/modules/congestion_controller/delay_based_bwe.cc index 1a22f357c7..8f8618190c 100644 --- a/webrtc/modules/congestion_controller/delay_based_bwe.cc +++ b/webrtc/modules/congestion_controller/delay_based_bwe.cc @@ -277,6 +277,7 @@ DelayBasedBwe::DelayBasedBwe(RtcEventLog* event_log, const Clock* clock) DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector( const std::vector& packet_feedback_vector) { RTC_DCHECK(network_thread_.CalledOnValidThread()); + RTC_DCHECK(!packet_feedback_vector.empty()); std::vector sorted_packet_feedback_vector; SortPacketFeedbackVector(packet_feedback_vector,