Missing packet send time should not cause BWE backoff.
The removed coded causes problems if the same RTCP packet is forwarded
to the congestion controller multiple times.
Bug: webrtc:10125
Change-Id: I659d8f8f3ce3c643710156fa81176ceeaedd714a
Reviewed-on: https://webrtc-review.googlesource.com/c/114165
Commit-Queue: Björn Terelius <terelius@webrtc.org>
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26016}
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe.cc b/modules/congestion_controller/goog_cc/delay_based_bwe.cc
index 4894c98..a76adb0 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe.cc
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe.cc
@@ -46,8 +46,6 @@
constexpr double kDefaultTrendlineSmoothingCoeff = 0.9;
constexpr double kDefaultTrendlineThresholdGain = 4.0;
-constexpr int kMaxConsecutiveFailedLookups = 5;
-
const char kBweWindowSizeInPacketsExperiment[] =
"WebRTC-BweWindowSizeInPackets";
@@ -94,7 +92,6 @@
: kDefaultTrendlineWindowSize),
trendline_smoothing_coeff_(kDefaultTrendlineSmoothingCoeff),
trendline_threshold_gain_(kDefaultTrendlineThresholdGain),
- consecutive_delayed_feedbacks_(0),
prev_bitrate_(DataRate::Zero()),
prev_state_(BandwidthUsage::kBwNormal) {
RTC_LOG(LS_INFO)
@@ -147,43 +144,12 @@
}
if (delayed_feedback) {
- Timestamp arrival_time = Timestamp::PlusInfinity();
- if (packet_feedback_vector.back().arrival_time_ms > 0)
- arrival_time =
- Timestamp::ms(packet_feedback_vector.back().arrival_time_ms);
- return OnDelayedFeedback(arrival_time);
-
- } else {
- consecutive_delayed_feedbacks_ = 0;
- return MaybeUpdateEstimate(acked_bitrate, probe_bitrate,
- recovered_from_overuse, at_time);
+ // TODO(bugs.webrtc.org/10125): Design a better mechanism to safe-guard
+ // against building very large network queues.
+ return Result();
}
- return Result();
-}
-
-DelayBasedBwe::Result DelayBasedBwe::OnDelayedFeedback(Timestamp receive_time) {
- ++consecutive_delayed_feedbacks_;
- if (consecutive_delayed_feedbacks_ >= kMaxConsecutiveFailedLookups) {
- consecutive_delayed_feedbacks_ = 0;
- return OnLongFeedbackDelay(receive_time);
- }
- return Result();
-}
-
-DelayBasedBwe::Result DelayBasedBwe::OnLongFeedbackDelay(
- Timestamp arrival_time) {
- // Estimate should always be valid since a start bitrate always is set in the
- // Call constructor. An alternative would be to return an empty Result here,
- // or to estimate the throughput based on the feedback we received.
- RTC_DCHECK(rate_control_.ValidEstimate());
- rate_control_.SetEstimate(rate_control_.LatestEstimate() / 2, arrival_time);
- Result result;
- result.updated = true;
- result.probe = false;
- result.target_bitrate = rate_control_.LatestEstimate();
- RTC_LOG(LS_WARNING) << "Long feedback delay detected, reducing BWE to "
- << ToString(result.target_bitrate);
- return result;
+ return MaybeUpdateEstimate(acked_bitrate, probe_bitrate,
+ recovered_from_overuse, at_time);
}
void DelayBasedBwe::IncomingPacketFeedback(
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe.h b/modules/congestion_controller/goog_cc/delay_based_bwe.h
index 616c5b0..ead60f3 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe.h
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe.h
@@ -49,7 +49,6 @@
absl::optional<DataRate> acked_bitrate,
absl::optional<DataRate> probe_bitrate,
Timestamp at_time);
- Result OnDelayedFeedback(Timestamp receive_time);
void OnRttUpdate(TimeDelta avg_rtt);
bool LatestEstimate(std::vector<uint32_t>* ssrcs, DataRate* bitrate) const;
void SetStartBitrate(DataRate start_bitrate);
@@ -60,7 +59,6 @@
friend class GoogCcStatePrinter;
void IncomingPacketFeedback(const PacketFeedback& packet_feedback,
Timestamp at_time);
- Result OnLongFeedbackDelay(Timestamp arrival_time);
Result MaybeUpdateEstimate(absl::optional<DataRate> acked_bitrate,
absl::optional<DataRate> probe_bitrate,
bool request_probe,
@@ -81,7 +79,6 @@
size_t trendline_window_size_;
double trendline_smoothing_coeff_;
double trendline_threshold_gain_;
- int consecutive_delayed_feedbacks_;
DataRate prev_bitrate_;
BandwidthUsage prev_state_;
diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control.cc b/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
index 6de143d..aa0b789 100644
--- a/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
+++ b/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
@@ -397,15 +397,9 @@
NetworkControlUpdate GoogCcNetworkController::OnTransportPacketsFeedback(
TransportPacketsFeedback report) {
if (report.packet_feedbacks.empty()) {
- DelayBasedBwe::Result result = delay_based_bwe_->OnDelayedFeedback(
- report.sendless_arrival_times.back());
- NetworkControlUpdate update;
- if (result.updated) {
- bandwidth_estimation_->UpdateDelayBasedEstimate(report.feedback_time,
- result.target_bitrate);
- MaybeTriggerOnNetworkChanged(&update, report.feedback_time);
- }
- return update;
+ // TODO(bugs.webrtc.org/10125): Design a better mechanism to safe-guard
+ // against building very large network queues.
+ return NetworkControlUpdate();
}
if (congestion_window_pushback_controller_) {
diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
index 62be521..340a093 100644
--- a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
+++ b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
@@ -245,74 +245,6 @@
update = controller_->OnProcessInterval(DefaultInterval());
}
-// Estimated bitrate reduced when the feedbacks arrive with such a long delay,
-// that the send-time-history no longer holds the feedbacked packets.
-TEST_F(GoogCcNetworkControllerTest, LongFeedbackDelays) {
- TargetBitrateTrackingSetup();
- const webrtc::PacedPacketInfo kPacingInfo0(0, 5, 2000);
- const webrtc::PacedPacketInfo kPacingInfo1(1, 8, 4000);
- const int64_t kFeedbackTimeoutMs = 60001;
- const int kMaxConsecutiveFailedLookups = 5;
- for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) {
- std::vector<PacketResult> packets;
- packets.push_back(CreateResult(i * 100, 2 * i * 100, 1500, kPacingInfo0));
- packets.push_back(
- CreateResult(i * 100 + 10, 2 * i * 100 + 10, 1500, kPacingInfo0));
- packets.push_back(
- CreateResult(i * 100 + 20, 2 * i * 100 + 20, 1500, kPacingInfo0));
- packets.push_back(
- CreateResult(i * 100 + 30, 2 * i * 100 + 30, 1500, kPacingInfo1));
- packets.push_back(
- CreateResult(i * 100 + 40, 2 * i * 100 + 40, 1500, kPacingInfo1));
-
- TransportPacketsFeedback feedback;
- for (PacketResult& packet : packets) {
- controller_->OnSentPacket(packet.sent_packet);
- feedback.sendless_arrival_times.push_back(packet.receive_time);
- }
-
- feedback.feedback_time = packets[0].receive_time;
- AdvanceTimeMilliseconds(kFeedbackTimeoutMs);
- SentPacket later_packet;
- later_packet.send_time = Timestamp::ms(kFeedbackTimeoutMs + i * 200 + 40);
- later_packet.size = DataSize::bytes(1500);
- later_packet.pacing_info = kPacingInfo1;
- controller_->OnSentPacket(later_packet);
-
- OnUpdate(controller_->OnTransportPacketsFeedback(feedback));
- }
- OnUpdate(controller_->OnProcessInterval(DefaultInterval()));
-
- EXPECT_EQ(kInitialBitrateKbps / 2, target_bitrate_->kbps());
-
- // Test with feedback that isn't late enough to time out.
- {
- std::vector<PacketResult> packets;
- packets.push_back(CreateResult(100, 200, 1500, kPacingInfo0));
- packets.push_back(CreateResult(110, 210, 1500, kPacingInfo0));
- packets.push_back(CreateResult(120, 220, 1500, kPacingInfo0));
- packets.push_back(CreateResult(130, 230, 1500, kPacingInfo1));
- packets.push_back(CreateResult(140, 240, 1500, kPacingInfo1));
-
- for (const PacketResult& packet : packets)
- controller_->OnSentPacket(packet.sent_packet);
-
- TransportPacketsFeedback feedback;
- feedback.feedback_time = packets[0].receive_time;
- feedback.packet_feedbacks = packets;
-
- AdvanceTimeMilliseconds(kFeedbackTimeoutMs - 1);
-
- SentPacket later_packet;
- later_packet.send_time = Timestamp::ms(kFeedbackTimeoutMs + 240);
- later_packet.size = DataSize::bytes(1500);
- later_packet.pacing_info = kPacingInfo1;
- controller_->OnSentPacket(later_packet);
-
- OnUpdate(controller_->OnTransportPacketsFeedback(feedback));
- }
-}
-
// Bandwidth estimation is updated when feedbacks are received.
// Feedbacks which show an increasing delay cause the estimation to be reduced.
TEST_F(GoogCcNetworkControllerTest, UpdatesDelayBasedEstimate) {
diff --git a/modules/congestion_controller/send_side_congestion_controller_unittest.cc b/modules/congestion_controller/send_side_congestion_controller_unittest.cc
index 5f58f21..0f37e0e 100644
--- a/modules/congestion_controller/send_side_congestion_controller_unittest.cc
+++ b/modules/congestion_controller/send_side_congestion_controller_unittest.cc
@@ -344,97 +344,6 @@
20 * kInitialBitrateBps);
}
-// Estimated bitrate reduced when the feedbacks arrive with such a long delay,
-// that the send-time-history no longer holds the feedbacked packets.
-TEST_F(LegacySendSideCongestionControllerTest, LongFeedbackDelays) {
- TargetBitrateTrackingSetup();
-
- const int64_t kFeedbackTimeoutMs = 60001;
- const int kMaxConsecutiveFailedLookups = 5;
- for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) {
- std::vector<PacketFeedback> packets;
- packets.push_back(
- PacketFeedback(i * 100, 2 * i * 100, 0, 1500, kPacingInfo0));
- packets.push_back(
- PacketFeedback(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, kPacingInfo0));
- packets.push_back(
- PacketFeedback(i * 100 + 20, 2 * i * 100 + 20, 2, 1500, kPacingInfo0));
- packets.push_back(
- PacketFeedback(i * 100 + 30, 2 * i * 100 + 30, 3, 1500, kPacingInfo1));
- packets.push_back(
- PacketFeedback(i * 100 + 40, 2 * i * 100 + 40, 4, 1500, kPacingInfo1));
-
- for (const PacketFeedback& packet : packets)
- OnSentPacket(packet);
-
- rtcp::TransportFeedback feedback;
- feedback.SetBase(packets[0].sequence_number,
- packets[0].arrival_time_ms * 1000);
-
- for (const PacketFeedback& packet : packets) {
- EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
- packet.arrival_time_ms * 1000));
- }
-
- feedback.Build();
-
- clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs);
- PacketFeedback later_packet(kFeedbackTimeoutMs + i * 100 + 40,
- kFeedbackTimeoutMs + i * 200 + 40, 5, 1500,
- kPacingInfo1);
- OnSentPacket(later_packet);
-
- controller_->OnTransportFeedback(feedback);
-
- // Check that packets have timed out.
- for (PacketFeedback& packet : packets) {
- packet.send_time_ms = PacketFeedback::kNoSendTime;
- packet.payload_size = 0;
- packet.pacing_info = PacedPacketInfo();
- }
- ComparePacketFeedbackVectors(packets,
- controller_->GetTransportFeedbackVector());
- }
-
- controller_->Process();
-
- EXPECT_EQ(kInitialBitrateBps / 2, target_bitrate_bps_);
-
- // Test with feedback that isn't late enough to time out.
- {
- std::vector<PacketFeedback> packets;
- packets.push_back(PacketFeedback(100, 200, 0, 1500, kPacingInfo0));
- packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0));
- packets.push_back(PacketFeedback(120, 220, 2, 1500, kPacingInfo0));
- packets.push_back(PacketFeedback(130, 230, 3, 1500, kPacingInfo1));
- packets.push_back(PacketFeedback(140, 240, 4, 1500, kPacingInfo1));
-
- for (const PacketFeedback& packet : packets)
- OnSentPacket(packet);
-
- rtcp::TransportFeedback feedback;
- feedback.SetBase(packets[0].sequence_number,
- packets[0].arrival_time_ms * 1000);
-
- for (const PacketFeedback& packet : packets) {
- EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
- packet.arrival_time_ms * 1000));
- }
-
- feedback.Build();
-
- clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs - 1);
- PacketFeedback later_packet(kFeedbackTimeoutMs + 140,
- kFeedbackTimeoutMs + 240, 5, 1500,
- kPacingInfo1);
- OnSentPacket(later_packet);
-
- controller_->OnTransportFeedback(feedback);
- ComparePacketFeedbackVectors(packets,
- controller_->GetTransportFeedbackVector());
- }
-}
-
// Bandwidth estimation is updated when feedbacks are received.
// Feedbacks which show an increasing delay cause the estimation to be reduced.
TEST_F(LegacySendSideCongestionControllerTest, UpdatesDelayBasedEstimate) {