diff --git a/modules/congestion_controller/rtp/transport_feedback_adapter.cc b/modules/congestion_controller/rtp/transport_feedback_adapter.cc index b070b0e23a..877ee8e797 100644 --- a/modules/congestion_controller/rtp/transport_feedback_adapter.cc +++ b/modules/congestion_controller/rtp/transport_feedback_adapter.cc @@ -220,8 +220,15 @@ TransportFeedbackAdapter::ProcessTransportFeedbackInner( current_offset_ = feedback_time; } else { // TODO(srte): We shouldn't need to do rounding here. - current_offset_ += feedback.GetBaseDelta(last_timestamp_) - .RoundDownTo(TimeDelta::Millis<1>()); + const TimeDelta delta = feedback.GetBaseDelta(last_timestamp_) + .RoundDownTo(TimeDelta::Millis<1>()); + // Protect against assigning current_offset_ negative value. + if (delta < Timestamp::Zero() - current_offset_) { + RTC_LOG(LS_WARNING) << "Unexpected feedback timestamp received."; + current_offset_ = feedback_time; + } else { + current_offset_ += delta; + } } last_timestamp_ = feedback.GetBaseTime(); diff --git a/modules/congestion_controller/rtp/transport_feedback_adapter_unittest.cc b/modules/congestion_controller/rtp/transport_feedback_adapter_unittest.cc index e03bcc3750..32e5f0a537 100644 --- a/modules/congestion_controller/rtp/transport_feedback_adapter_unittest.cc +++ b/modules/congestion_controller/rtp/transport_feedback_adapter_unittest.cc @@ -284,9 +284,9 @@ TEST_F(TransportFeedbackAdapterTest, SendTimeWrapsBothWays) { static_cast((1 << 23) - 1) / 1000; std::vector packets; packets.push_back( - CreatePacket(kHighArrivalTimeMs - 64, 200, 0, 1500, PacedPacketInfo())); + CreatePacket(kHighArrivalTimeMs + 64, 210, 0, 1500, PacedPacketInfo())); packets.push_back( - CreatePacket(kHighArrivalTimeMs + 64, 210, 1, 1500, PacedPacketInfo())); + CreatePacket(kHighArrivalTimeMs - 64, 210, 1, 1500, PacedPacketInfo())); packets.push_back( CreatePacket(kHighArrivalTimeMs, 220, 2, 1500, PacedPacketInfo()));