Fix crash on multiple feedback messages are received on old transport.
BUG=webrtc:7347 Review-Url: https://codereview.webrtc.org/2753283002 Cr-Commit-Position: refs/heads/master@{#17290}
This commit is contained in:
parent
6585f7087c
commit
dd20054e06
@ -346,11 +346,14 @@ void CongestionController::OnTransportFeedback(
|
||||
const rtcp::TransportFeedback& feedback) {
|
||||
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
|
||||
transport_feedback_adapter_.OnTransportFeedback(feedback);
|
||||
std::vector<PacketFeedback> 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);
|
||||
|
||||
@ -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<PacketFeedback> 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
|
||||
|
||||
@ -277,6 +277,7 @@ DelayBasedBwe::DelayBasedBwe(RtcEventLog* event_log, const Clock* clock)
|
||||
DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector(
|
||||
const std::vector<PacketFeedback>& packet_feedback_vector) {
|
||||
RTC_DCHECK(network_thread_.CalledOnValidThread());
|
||||
RTC_DCHECK(!packet_feedback_vector.empty());
|
||||
|
||||
std::vector<PacketFeedback> sorted_packet_feedback_vector;
|
||||
SortPacketFeedbackVector(packet_feedback_vector,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user