| /* |
| * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #ifndef WEBRTC_MODULES_VIDEO_CODING_JITTER_ESTIMATOR_H_ |
| #define WEBRTC_MODULES_VIDEO_CODING_JITTER_ESTIMATOR_H_ |
| |
| #include "webrtc/base/rollingaccumulator.h" |
| #include "webrtc/modules/video_coding/rtt_filter.h" |
| #include "webrtc/typedefs.h" |
| |
| namespace webrtc { |
| |
| class Clock; |
| |
| class VCMJitterEstimator { |
| public: |
| VCMJitterEstimator(const Clock* clock, |
| int32_t vcmId = 0, |
| int32_t receiverId = 0); |
| virtual ~VCMJitterEstimator(); |
| VCMJitterEstimator& operator=(const VCMJitterEstimator& rhs); |
| |
| // Resets the estimate to the initial state |
| void Reset(); |
| void ResetNackCount(); |
| |
| // Updates the jitter estimate with the new data. |
| // |
| // Input: |
| // - frameDelay : Delay-delta calculated by UTILDelayEstimate in |
| // milliseconds |
| // - frameSize : Frame size of the current frame. |
| // - incompleteFrame : Flags if the frame is used to update the |
| // estimate before it |
| // was complete. Default is false. |
| void UpdateEstimate(int64_t frameDelayMS, |
| uint32_t frameSizeBytes, |
| bool incompleteFrame = false); |
| |
| // Returns the current jitter estimate in milliseconds and adds |
| // also adds an RTT dependent term in cases of retransmission. |
| // Input: |
| // - rttMultiplier : RTT param multiplier (when applicable). |
| // |
| // Return value : Jitter estimate in milliseconds |
| int GetJitterEstimate(double rttMultiplier); |
| |
| // Updates the nack counter. |
| void FrameNacked(); |
| |
| // Updates the RTT filter. |
| // |
| // Input: |
| // - rttMs : RTT in ms |
| void UpdateRtt(int64_t rttMs); |
| |
| void UpdateMaxFrameSize(uint32_t frameSizeBytes); |
| |
| // A constant describing the delay from the jitter buffer |
| // to the delay on the receiving side which is not accounted |
| // for by the jitter buffer nor the decoding delay estimate. |
| static const uint32_t OPERATING_SYSTEM_JITTER = 10; |
| |
| protected: |
| // These are protected for better testing possibilities |
| double _theta[2]; // Estimated line parameters (slope, offset) |
| double _varNoise; // Variance of the time-deviation from the line |
| |
| virtual bool LowRateExperimentEnabled(); |
| |
| private: |
| // Updates the Kalman filter for the line describing |
| // the frame size dependent jitter. |
| // |
| // Input: |
| // - frameDelayMS : Delay-delta calculated by UTILDelayEstimate in |
| // milliseconds |
| // - deltaFSBytes : Frame size delta, i.e. |
| // : frame size at time T minus frame size at time |
| // T-1 |
| void KalmanEstimateChannel(int64_t frameDelayMS, int32_t deltaFSBytes); |
| |
| // Updates the random jitter estimate, i.e. the variance |
| // of the time deviations from the line given by the Kalman filter. |
| // |
| // Input: |
| // - d_dT : The deviation from the kalman estimate |
| // - incompleteFrame : True if the frame used to update the |
| // estimate |
| // with was incomplete |
| void EstimateRandomJitter(double d_dT, bool incompleteFrame); |
| |
| double NoiseThreshold() const; |
| |
| // Calculates the current jitter estimate. |
| // |
| // Return value : The current jitter estimate in milliseconds |
| double CalculateEstimate(); |
| |
| // Post process the calculated estimate |
| void PostProcessEstimate(); |
| |
| // Calculates the difference in delay between a sample and the |
| // expected delay estimated by the Kalman filter. |
| // |
| // Input: |
| // - frameDelayMS : Delay-delta calculated by UTILDelayEstimate in |
| // milliseconds |
| // - deltaFS : Frame size delta, i.e. frame size at time |
| // T minus frame size at time T-1 |
| // |
| // Return value : The difference in milliseconds |
| double DeviationFromExpectedDelay(int64_t frameDelayMS, |
| int32_t deltaFSBytes) const; |
| |
| double GetFrameRate() const; |
| |
| // Constants, filter parameters |
| int32_t _vcmId; |
| int32_t _receiverId; |
| const double _phi; |
| const double _psi; |
| const uint32_t _alphaCountMax; |
| const double _thetaLow; |
| const uint32_t _nackLimit; |
| const int32_t _numStdDevDelayOutlier; |
| const int32_t _numStdDevFrameSizeOutlier; |
| const double _noiseStdDevs; |
| const double _noiseStdDevOffset; |
| |
| double _thetaCov[2][2]; // Estimate covariance |
| double _Qcov[2][2]; // Process noise covariance |
| double _avgFrameSize; // Average frame size |
| double _varFrameSize; // Frame size variance |
| double _maxFrameSize; // Largest frame size received (descending |
| // with a factor _psi) |
| uint32_t _fsSum; |
| uint32_t _fsCount; |
| |
| int64_t _lastUpdateT; |
| double _prevEstimate; // The previously returned jitter estimate |
| uint32_t _prevFrameSize; // Frame size of the previous frame |
| double _avgNoise; // Average of the random jitter |
| uint32_t _alphaCount; |
| double _filterJitterEstimate; // The filtered sum of jitter estimates |
| |
| uint32_t _startupCount; |
| |
| int64_t |
| _latestNackTimestamp; // Timestamp in ms when the latest nack was seen |
| uint32_t _nackCount; // Keeps track of the number of nacks received, |
| // but never goes above _nackLimit |
| VCMRttFilter _rttFilter; |
| |
| rtc::RollingAccumulator<uint64_t> fps_counter_; |
| enum ExperimentFlag { kInit, kEnabled, kDisabled }; |
| ExperimentFlag low_rate_experiment_; |
| const Clock* clock_; |
| }; |
| |
| } // namespace webrtc |
| |
| #endif // WEBRTC_MODULES_VIDEO_CODING_JITTER_ESTIMATOR_H_ |