Chromium Code Reviews| Index: webrtc/modules/video_coding/rtt_filter.cc |
| diff --git a/webrtc/modules/video_coding/rtt_filter.cc b/webrtc/modules/video_coding/rtt_filter.cc |
| index 30a6946f9740a2157a095080b442efa7c55fb9a4..2b63126a3ca4d65f82f2ffc9d7c0e7c501a3762a 100644 |
| --- a/webrtc/modules/video_coding/rtt_filter.cc |
| +++ b/webrtc/modules/video_coding/rtt_filter.cc |
| @@ -8,13 +8,13 @@ |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| -#include "webrtc/modules/video_coding/internal_defines.h" |
| -#include "webrtc/modules/video_coding/rtt_filter.h" |
| - |
| #include <math.h> |
| #include <stdlib.h> |
| #include <string.h> |
| +#include "webrtc/modules/video_coding/internal_defines.h" |
| +#include "webrtc/modules/video_coding/rtt_filter.h" |
|
mflodman
2015/12/17 13:05:39
On top.
philipel
2015/12/18 12:23:16
Done.
|
| + |
| namespace webrtc { |
| VCMRttFilter::VCMRttFilter() |
| @@ -22,181 +22,143 @@ VCMRttFilter::VCMRttFilter() |
| _jumpStdDevs(2.5), |
| _driftStdDevs(3.5), |
| _detectThreshold(kMaxDriftJumpCount) { |
| - Reset(); |
| + Reset(); |
| } |
| -VCMRttFilter& |
| -VCMRttFilter::operator=(const VCMRttFilter& rhs) |
| -{ |
| - if (this != &rhs) |
| - { |
| - _gotNonZeroUpdate = rhs._gotNonZeroUpdate; |
| - _avgRtt = rhs._avgRtt; |
| - _varRtt = rhs._varRtt; |
| - _maxRtt = rhs._maxRtt; |
| - _filtFactCount = rhs._filtFactCount; |
| - _jumpCount = rhs._jumpCount; |
| - _driftCount = rhs._driftCount; |
| - memcpy(_jumpBuf, rhs._jumpBuf, sizeof(_jumpBuf)); |
| - memcpy(_driftBuf, rhs._driftBuf, sizeof(_driftBuf)); |
| - } |
| - return *this; |
| +VCMRttFilter& VCMRttFilter::operator=(const VCMRttFilter& rhs) { |
| + if (this != &rhs) { |
| + _gotNonZeroUpdate = rhs._gotNonZeroUpdate; |
| + _avgRtt = rhs._avgRtt; |
| + _varRtt = rhs._varRtt; |
| + _maxRtt = rhs._maxRtt; |
| + _filtFactCount = rhs._filtFactCount; |
| + _jumpCount = rhs._jumpCount; |
| + _driftCount = rhs._driftCount; |
| + memcpy(_jumpBuf, rhs._jumpBuf, sizeof(_jumpBuf)); |
| + memcpy(_driftBuf, rhs._driftBuf, sizeof(_driftBuf)); |
| + } |
| + return *this; |
| } |
| -void |
| -VCMRttFilter::Reset() |
| -{ |
| - _gotNonZeroUpdate = false; |
| - _avgRtt = 0; |
| - _varRtt = 0; |
| - _maxRtt = 0; |
| - _filtFactCount = 1; |
| - _jumpCount = 0; |
| - _driftCount = 0; |
| - memset(_jumpBuf, 0, kMaxDriftJumpCount); |
| - memset(_driftBuf, 0, kMaxDriftJumpCount); |
| +void VCMRttFilter::Reset() { |
| + _gotNonZeroUpdate = false; |
| + _avgRtt = 0; |
| + _varRtt = 0; |
| + _maxRtt = 0; |
| + _filtFactCount = 1; |
| + _jumpCount = 0; |
| + _driftCount = 0; |
| + memset(_jumpBuf, 0, kMaxDriftJumpCount); |
| + memset(_driftBuf, 0, kMaxDriftJumpCount); |
| } |
| -void |
| -VCMRttFilter::Update(int64_t rttMs) |
| -{ |
| - if (!_gotNonZeroUpdate) |
| - { |
| - if (rttMs == 0) |
| - { |
| - return; |
| - } |
| - _gotNonZeroUpdate = true; |
| +void VCMRttFilter::Update(int64_t rttMs) { |
| + if (!_gotNonZeroUpdate) { |
| + if (rttMs == 0) { |
| + return; |
| } |
| + _gotNonZeroUpdate = true; |
| + } |
| - // Sanity check |
| - if (rttMs > 3000) |
| - { |
| - rttMs = 3000; |
| - } |
| + // Sanity check |
| + if (rttMs > 3000) { |
| + rttMs = 3000; |
| + } |
| - double filtFactor = 0; |
| - if (_filtFactCount > 1) |
| - { |
| - filtFactor = static_cast<double>(_filtFactCount - 1) / _filtFactCount; |
| - } |
| - _filtFactCount++; |
| - if (_filtFactCount > _filtFactMax) |
| - { |
| - // This prevents filtFactor from going above |
| - // (_filtFactMax - 1) / _filtFactMax, |
| - // e.g., _filtFactMax = 50 => filtFactor = 49/50 = 0.98 |
| - _filtFactCount = _filtFactMax; |
| - } |
| - double oldAvg = _avgRtt; |
| - double oldVar = _varRtt; |
| - _avgRtt = filtFactor * _avgRtt + (1 - filtFactor) * rttMs; |
| - _varRtt = filtFactor * _varRtt + (1 - filtFactor) * |
| - (rttMs - _avgRtt) * (rttMs - _avgRtt); |
| - _maxRtt = VCM_MAX(rttMs, _maxRtt); |
| - if (!JumpDetection(rttMs) || !DriftDetection(rttMs)) |
| - { |
| - // In some cases we don't want to update the statistics |
| - _avgRtt = oldAvg; |
| - _varRtt = oldVar; |
| - } |
| + double filtFactor = 0; |
| + if (_filtFactCount > 1) { |
| + filtFactor = static_cast<double>(_filtFactCount - 1) / _filtFactCount; |
| + } |
| + _filtFactCount++; |
| + if (_filtFactCount > _filtFactMax) { |
| + // This prevents filtFactor from going above |
| + // (_filtFactMax - 1) / _filtFactMax, |
| + // e.g., _filtFactMax = 50 => filtFactor = 49/50 = 0.98 |
| + _filtFactCount = _filtFactMax; |
| + } |
| + double oldAvg = _avgRtt; |
| + double oldVar = _varRtt; |
| + _avgRtt = filtFactor * _avgRtt + (1 - filtFactor) * rttMs; |
| + _varRtt = filtFactor * _varRtt + |
| + (1 - filtFactor) * (rttMs - _avgRtt) * (rttMs - _avgRtt); |
| + _maxRtt = VCM_MAX(rttMs, _maxRtt); |
| + if (!JumpDetection(rttMs) || !DriftDetection(rttMs)) { |
| + // In some cases we don't want to update the statistics |
| + _avgRtt = oldAvg; |
| + _varRtt = oldVar; |
| + } |
| } |
| -bool |
| -VCMRttFilter::JumpDetection(int64_t rttMs) |
| -{ |
| - double diffFromAvg = _avgRtt - rttMs; |
| - if (fabs(diffFromAvg) > _jumpStdDevs * sqrt(_varRtt)) |
| - { |
| - int diffSign = (diffFromAvg >= 0) ? 1 : -1; |
| - int jumpCountSign = (_jumpCount >= 0) ? 1 : -1; |
| - if (diffSign != jumpCountSign) |
| - { |
| - // Since the signs differ the samples currently |
| - // in the buffer is useless as they represent a |
| - // jump in a different direction. |
| - _jumpCount = 0; |
| - } |
| - if (abs(_jumpCount) < kMaxDriftJumpCount) |
| - { |
| - // Update the buffer used for the short time |
| - // statistics. |
| - // The sign of the diff is used for updating the counter since |
| - // we want to use the same buffer for keeping track of when |
| - // the RTT jumps down and up. |
| - _jumpBuf[abs(_jumpCount)] = rttMs; |
| - _jumpCount += diffSign; |
| - } |
| - if (abs(_jumpCount) >= _detectThreshold) |
| - { |
| - // Detected an RTT jump |
| - ShortRttFilter(_jumpBuf, abs(_jumpCount)); |
| - _filtFactCount = _detectThreshold + 1; |
| - _jumpCount = 0; |
| - } |
| - else |
| - { |
| - return false; |
| - } |
| +bool VCMRttFilter::JumpDetection(int64_t rttMs) { |
| + double diffFromAvg = _avgRtt - rttMs; |
| + if (fabs(diffFromAvg) > _jumpStdDevs * sqrt(_varRtt)) { |
| + int diffSign = (diffFromAvg >= 0) ? 1 : -1; |
| + int jumpCountSign = (_jumpCount >= 0) ? 1 : -1; |
| + if (diffSign != jumpCountSign) { |
| + // Since the signs differ the samples currently |
| + // in the buffer is useless as they represent a |
| + // jump in a different direction. |
| + _jumpCount = 0; |
| } |
| - else |
| - { |
| - _jumpCount = 0; |
| + if (abs(_jumpCount) < kMaxDriftJumpCount) { |
| + // Update the buffer used for the short time |
| + // statistics. |
| + // The sign of the diff is used for updating the counter since |
| + // we want to use the same buffer for keeping track of when |
| + // the RTT jumps down and up. |
| + _jumpBuf[abs(_jumpCount)] = rttMs; |
| + _jumpCount += diffSign; |
| } |
| - return true; |
| -} |
| - |
| -bool |
| -VCMRttFilter::DriftDetection(int64_t rttMs) |
| -{ |
| - if (_maxRtt - _avgRtt > _driftStdDevs * sqrt(_varRtt)) |
| - { |
| - if (_driftCount < kMaxDriftJumpCount) |
| - { |
| - // Update the buffer used for the short time |
| - // statistics. |
| - _driftBuf[_driftCount] = rttMs; |
| - _driftCount++; |
| - } |
| - if (_driftCount >= _detectThreshold) |
| - { |
| - // Detected an RTT drift |
| - ShortRttFilter(_driftBuf, _driftCount); |
| - _filtFactCount = _detectThreshold + 1; |
| - _driftCount = 0; |
| - } |
| + if (abs(_jumpCount) >= _detectThreshold) { |
| + // Detected an RTT jump |
| + ShortRttFilter(_jumpBuf, abs(_jumpCount)); |
| + _filtFactCount = _detectThreshold + 1; |
| + _jumpCount = 0; |
| + } else { |
| + return false; |
| } |
| - else |
| - { |
| - _driftCount = 0; |
| - } |
| - return true; |
| + } else { |
| + _jumpCount = 0; |
| + } |
| + return true; |
| } |
| -void |
| -VCMRttFilter::ShortRttFilter(int64_t* buf, uint32_t length) |
| -{ |
| - if (length == 0) |
| - { |
| - return; |
| +bool VCMRttFilter::DriftDetection(int64_t rttMs) { |
| + if (_maxRtt - _avgRtt > _driftStdDevs * sqrt(_varRtt)) { |
| + if (_driftCount < kMaxDriftJumpCount) { |
| + // Update the buffer used for the short time |
| + // statistics. |
| + _driftBuf[_driftCount] = rttMs; |
| + _driftCount++; |
| } |
| - _maxRtt = 0; |
| - _avgRtt = 0; |
| - for (uint32_t i=0; i < length; i++) |
| - { |
| - if (buf[i] > _maxRtt) |
| - { |
| - _maxRtt = buf[i]; |
| - } |
| - _avgRtt += buf[i]; |
| + if (_driftCount >= _detectThreshold) { |
| + // Detected an RTT drift |
| + ShortRttFilter(_driftBuf, _driftCount); |
| + _filtFactCount = _detectThreshold + 1; |
| + _driftCount = 0; |
| } |
| - _avgRtt = _avgRtt / static_cast<double>(length); |
| + } else { |
| + _driftCount = 0; |
| + } |
| + return true; |
| } |
| -int64_t |
| -VCMRttFilter::RttMs() const |
| -{ |
| - return static_cast<int64_t>(_maxRtt + 0.5); |
| +void VCMRttFilter::ShortRttFilter(int64_t* buf, uint32_t length) { |
| + if (length == 0) { |
| + return; |
| + } |
| + _maxRtt = 0; |
| + _avgRtt = 0; |
| + for (uint32_t i = 0; i < length; i++) { |
| + if (buf[i] > _maxRtt) { |
| + _maxRtt = buf[i]; |
| + } |
| + _avgRtt += buf[i]; |
| + } |
| + _avgRtt = _avgRtt / static_cast<double>(length); |
| } |
| +int64_t VCMRttFilter::RttMs() const { |
| + return static_cast<int64_t>(_maxRtt + 0.5); |
| } |
| +} // namespace webrtc |