blob: cd7338afce02e93c8371ba5196faefe6dd315f39 [file] [log] [blame]
/*
* 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_