Index: webrtc/system_wrappers/source/rtp_to_ntp_estimator.cc |
diff --git a/webrtc/system_wrappers/source/rtp_to_ntp_estimator.cc b/webrtc/system_wrappers/source/rtp_to_ntp_estimator.cc |
index 339635e88dd9da1d47dfadd2d917a13438bd45e9..baa218d4ae4633317118fa287b692b79e9b149cd 100644 |
--- a/webrtc/system_wrappers/source/rtp_to_ntp_estimator.cc |
+++ b/webrtc/system_wrappers/source/rtp_to_ntp_estimator.cc |
@@ -54,30 +54,6 @@ bool Contains(const std::list<RtpToNtpEstimator::RtcpMeasurement>& measurements, |
} |
return false; |
} |
- |
-bool IsValid(const std::list<RtpToNtpEstimator::RtcpMeasurement>& measurements, |
- const RtpToNtpEstimator::RtcpMeasurement& other) { |
- if (!other.ntp_time.Valid()) |
- return false; |
- |
- int64_t ntp_ms_new = other.ntp_time.ToMs(); |
- for (const auto& measurement : measurements) { |
- if (ntp_ms_new <= measurement.ntp_time.ToMs()) { |
- // Old report. |
- return false; |
- } |
- int64_t timestamp_new = other.rtp_timestamp; |
- if (!CompensateForWrapAround(timestamp_new, measurement.rtp_timestamp, |
- ×tamp_new)) { |
- return false; |
- } |
- if (timestamp_new <= measurement.rtp_timestamp) { |
- LOG(LS_WARNING) << "Newer RTCP SR report with older RTP timestamp."; |
- return false; |
- } |
- } |
- return true; |
-} |
} // namespace |
RtpToNtpEstimator::RtcpMeasurement::RtcpMeasurement(uint32_t ntp_secs, |
@@ -93,7 +69,7 @@ bool RtpToNtpEstimator::RtcpMeasurement::IsEqual( |
} |
// Class for converting an RTP timestamp to the NTP domain. |
-RtpToNtpEstimator::RtpToNtpEstimator() {} |
+RtpToNtpEstimator::RtpToNtpEstimator() : consecutive_invalid_samples_(0) {} |
RtpToNtpEstimator::~RtpToNtpEstimator() {} |
void RtpToNtpEstimator::UpdateParameters() { |
@@ -122,21 +98,51 @@ bool RtpToNtpEstimator::UpdateMeasurements(uint32_t ntp_secs, |
bool* new_rtcp_sr) { |
*new_rtcp_sr = false; |
- RtcpMeasurement measurement(ntp_secs, ntp_frac, rtp_timestamp); |
- if (Contains(measurements_, measurement)) { |
+ RtcpMeasurement new_measurement(ntp_secs, ntp_frac, rtp_timestamp); |
+ if (Contains(measurements_, new_measurement)) { |
// RTCP SR report already added. |
return true; |
} |
- if (!IsValid(measurements_, measurement)) { |
- // Old report or invalid parameters. |
+ if (!new_measurement.ntp_time.Valid()) |
return false; |
+ |
+ int64_t ntp_ms_new = new_measurement.ntp_time.ToMs(); |
+ bool invalid_sample = false; |
+ for (const auto& measurement : measurements_) { |
+ if (ntp_ms_new <= measurement.ntp_time.ToMs()) { |
+ // Old report. |
+ invalid_sample = true; |
+ break; |
+ } |
+ int64_t timestamp_new = new_measurement.rtp_timestamp; |
+ if (!CompensateForWrapAround(timestamp_new, measurement.rtp_timestamp, |
+ ×tamp_new)) { |
+ invalid_sample = true; |
+ break; |
+ } |
+ if (timestamp_new <= measurement.rtp_timestamp) { |
+ LOG(LS_WARNING) |
+ << "Newer RTCP SR report with older RTP timestamp, dropping"; |
+ invalid_sample = true; |
+ break; |
+ } |
+ } |
+ if (invalid_sample) { |
+ ++consecutive_invalid_samples_; |
+ if (consecutive_invalid_samples_ < kMaxInvalidSamples) { |
+ return false; |
+ } |
+ LOG(LS_WARNING) << "Multiple consecutively invalid RTCP SR reports, " |
+ "clearing measurements."; |
+ measurements_.clear(); |
} |
+ consecutive_invalid_samples_ = 0; |
// Insert new RTCP SR report. |
if (measurements_.size() == kNumRtcpReportsToUse) |
measurements_.pop_back(); |
- measurements_.push_front(measurement); |
+ measurements_.push_front(new_measurement); |
*new_rtcp_sr = true; |
// List updated, calculate new parameters. |