text: /*
   *  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_TEST_JITTER_ESTIMATE_TEST_H_
  #define WEBRTC_MODULES_VIDEO_CODING_TEST_JITTER_ESTIMATE_TEST_H_
  
  #include "typedefs.h"
  #include "jitter_buffer.h"
  #include "jitter_estimator.h"
  #include <cstdlib>
  #include <cmath>
  
  double const pi = 4*std::atan(1.0);
  
  class GaussDist
  {
  public:
      GaussDist(double m, double v): _mu(m), _sigma(sqrt(v)) {}
  
      double RandValue() // returns a single normally distributed number
      {
          double r1 = (std::rand() + 1.0)/(RAND_MAX + 1.0); // gives equal distribution in (0, 1]
          double r2 = (std::rand() + 1.0)/(RAND_MAX + 1.0);
          return _mu + _sigma * std::sqrt(-2*std::log(r1))*std::cos(2*pi*r2);
      }
  
      double GetAverage()
      {
          return _mu;
      }
  
      double GetVariance()
      {
          return _sigma*_sigma;
      }
  
      void SetParams(double m, double v)
      {
          _mu = m;
          _sigma = sqrt(v);
      }
  
  private:
      double _mu, _sigma;
  };
  
  class JitterEstimateTestWrapper : public webrtc::VCMJitterEstimator
  {
  public:
      JitterEstimateTestWrapper() : VCMJitterEstimator() {}
      double GetTheta() { return _theta[0]; }
      double GetVarNoise() { return _varNoise; }
  };
  
  class FrameSample
  {
  public:
      FrameSample() {FrameSample(0, 0, 0, false, false);}
      FrameSample(unsigned int ts, WebRtc_Word64 wallClk, unsigned int fs, bool _keyFrame, bool _resent):
        timestamp90Khz(ts), wallClockMs(wallClk), frameSize(fs), keyFrame(_keyFrame), resent(_resent) {}
  
      unsigned int timestamp90Khz;
      WebRtc_Word64 wallClockMs;
      unsigned int frameSize;
      bool keyFrame;
      bool resent;
  };
  
  class JitterEstimateTest
  {
  public:
      JitterEstimateTest(unsigned int frameRate);
      FrameSample GenerateFrameSample();
      void SetCapacity(unsigned int c);
      void SetRate(unsigned int r);
      void SetJitter(double m, double v);
      void SetFrameSizeStats(double m, double v);
      void SetKeyFrameRate(int rate);
      void SetLossRate(double rate);
  
  private:
      double RandUniform() { return (std::rand() + 1.0)/(RAND_MAX + 1.0); }
      unsigned int _frameRate;
      unsigned int _capacity;
      unsigned int _rate;
      GaussDist _jitter;
      //GaussDist _noResend;
      GaussDist _deltaFrameSize;
      unsigned int _prevTimestamp;
      WebRtc_Word64 _prevWallClock;
      unsigned int _nextDelay;
      double _keyFrameRate;
      unsigned int _counter;
      unsigned int _seed;
      double _lossrate;
  };
  
  #endif // WEBRTC_MODULES_VIDEO_CODING_TEST_JITTER_ESTIMATE_TEST_H_
  