diff --git a/modules/rtp_rtcp/source/source_tracker.cc b/modules/rtp_rtcp/source/source_tracker.cc index 4d1f40641f..17862148eb 100644 --- a/modules/rtp_rtcp/source/source_tracker.cc +++ b/modules/rtp_rtcp/source/source_tracker.cc @@ -94,6 +94,9 @@ SourceTracker::SourceEntry& SourceTracker::UpdateEntry(const SourceKey& key) { } void SourceTracker::PruneEntries(Timestamp now) const { + if (now < Timestamp::Zero() + kTimeout) { + return; + } Timestamp prune = now - kTimeout; while (!list_.empty() && list_.back().second.timestamp < prune) { map_.erase(list_.back().first); diff --git a/modules/rtp_rtcp/source/source_tracker_unittest.cc b/modules/rtp_rtcp/source/source_tracker_unittest.cc index 32ac711ca5..749bfbaa41 100644 --- a/modules/rtp_rtcp/source/source_tracker_unittest.cc +++ b/modules/rtp_rtcp/source/source_tracker_unittest.cc @@ -535,4 +535,12 @@ TEST(SourceTrackerTest, TimedOutSourcesAreRemoved) { kRtpTimestamp1, extensions1))); } +TEST(SourceTrackerTest, AvoidNegativeTimestamp) { + SimulatedClock clock(Timestamp::Zero()); + SourceTracker tracker(&clock); + tracker.OnFrameDelivered(RtpPacketInfos( + {RtpPacketInfo(/*ssrc=*/111, /*csrcs=*/{}, /*rtp_timestamp=*/0, + /*receive_time=*/Timestamp::Zero())})); +} + } // namespace webrtc