ViE autotest: Adding loss models to the external transport
Review URL: https://webrtc-codereview.appspot.com/1000004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3309 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
6e0ce73741
commit
622c8bd0cc
@ -125,7 +125,10 @@ class ParameterizedFullStackTest : public ViEVideoVerificationTest,
|
||||
|
||||
void SetUp() {
|
||||
int i = 0;
|
||||
// Uniform loss => Setting burst length to -1.
|
||||
parameter_table_[i].network.loss_model = kUniformLoss;
|
||||
parameter_table_[i].network.packet_loss_rate = 0;
|
||||
parameter_table_[i].network.burst_length = -1;
|
||||
parameter_table_[i].network.mean_one_way_delay = 0;
|
||||
parameter_table_[i].network.std_dev_one_way_delay = 0;
|
||||
parameter_table_[i].bitrate = 300;
|
||||
@ -133,7 +136,9 @@ class ParameterizedFullStackTest : public ViEVideoVerificationTest,
|
||||
parameter_table_[i].avg_ssim_threshold = 0.96;
|
||||
parameter_table_[i].test_label = "net delay (0, 0), plr 0";
|
||||
++i;
|
||||
parameter_table_[i].network.loss_model = kUniformLoss;
|
||||
parameter_table_[i].network.packet_loss_rate = 5;
|
||||
parameter_table_[i].network.burst_length = -1;
|
||||
parameter_table_[i].network.mean_one_way_delay = 50;
|
||||
parameter_table_[i].network.std_dev_one_way_delay = 5;
|
||||
parameter_table_[i].bitrate = 300;
|
||||
@ -141,7 +146,19 @@ class ParameterizedFullStackTest : public ViEVideoVerificationTest,
|
||||
parameter_table_[i].avg_ssim_threshold = 0.96;
|
||||
parameter_table_[i].test_label = "net delay (50, 5), plr 5";
|
||||
++i;
|
||||
parameter_table_[i].network.loss_model = kUniformLoss;
|
||||
parameter_table_[i].network.packet_loss_rate = 0;
|
||||
parameter_table_[i].network.burst_length = -1;
|
||||
parameter_table_[i].network.mean_one_way_delay = 100;
|
||||
parameter_table_[i].network.std_dev_one_way_delay = 10;
|
||||
parameter_table_[i].bitrate = 300;
|
||||
parameter_table_[i].avg_psnr_threshold = 35;
|
||||
parameter_table_[i].avg_ssim_threshold = 0.96;
|
||||
parameter_table_[i].test_label = "net delay (100, 10), plr 0";
|
||||
++i;
|
||||
parameter_table_[i].network.loss_model = kGilbertElliotLoss;
|
||||
parameter_table_[i].network.packet_loss_rate = 5;
|
||||
parameter_table_[i].network.burst_length = 3;
|
||||
parameter_table_[i].network.mean_one_way_delay = 100;
|
||||
parameter_table_[i].network.std_dev_one_way_delay = 10;
|
||||
parameter_table_[i].bitrate = 300;
|
||||
@ -150,7 +167,7 @@ class ParameterizedFullStackTest : public ViEVideoVerificationTest,
|
||||
parameter_table_[i].test_label = "net delay (100, 10), plr 0";
|
||||
}
|
||||
|
||||
TestParameters parameter_table_[3];
|
||||
TestParameters parameter_table_[4];
|
||||
};
|
||||
|
||||
TEST_F(ViEVideoVerificationTest, RunsBaseStandardTestWithoutErrors) {
|
||||
@ -207,6 +224,7 @@ TEST_P(ParameterizedFullStackTest, RunsFullStackWithoutErrors) {
|
||||
// frames every now and then.
|
||||
const int kBitRateKbps = parameter_table_[GetParam()].bitrate;
|
||||
const NetworkParameters network = parameter_table_[GetParam()].network;
|
||||
// TODO(mikhal): Resolution and file name should be in the parameter list.
|
||||
int width = 352;
|
||||
int height = 288;
|
||||
ViETest::Log("Bit rate : %5d kbps", kBitRateKbps);
|
||||
|
@ -28,10 +28,17 @@ class ThreadWrapper;
|
||||
class ViENetwork;
|
||||
}
|
||||
|
||||
enum RandomLossModel {
|
||||
kNoLoss,
|
||||
kUniformLoss,
|
||||
kGilbertElliotLoss
|
||||
};
|
||||
struct NetworkParameters {
|
||||
int packet_loss_rate;
|
||||
int burst_length; // Only applicable for kGilbertElliotLoss.
|
||||
int mean_one_way_delay;
|
||||
int std_dev_one_way_delay;
|
||||
RandomLossModel loss_model;
|
||||
};
|
||||
|
||||
// Allows to subscribe for callback when a frame is started being sent.
|
||||
@ -109,7 +116,10 @@ protected:
|
||||
static bool ViEExternalTransportRun(void* object);
|
||||
bool ViEExternalTransportProcess();
|
||||
private:
|
||||
// TODO(mikhal): Break these out to classes.
|
||||
static int GaussianRandom(int mean_ms, int standard_deviation_ms);
|
||||
bool UniformLoss(int loss_rate);
|
||||
bool GilbertElliotLoss(int loss_rate, int burst_length);
|
||||
WebRtc_Word64 NowMs();
|
||||
|
||||
enum
|
||||
@ -169,6 +179,7 @@ private:
|
||||
WebRtc_UWord32 _lastSendRTPTimestamp;
|
||||
WebRtc_UWord32 _lastReceiveRTPTimestamp;
|
||||
int64_t last_receive_time_;
|
||||
bool previous_drop_;
|
||||
};
|
||||
|
||||
#endif // WEBRTC_VIDEO_ENGINE_TEST_AUTOTEST_INTERFACE_TB_EXTERNAL_TRANSPORT_H_
|
||||
|
@ -73,7 +73,8 @@ TbExternalTransport::TbExternalTransport(
|
||||
_firstRTPTimestamp(0),
|
||||
_lastSendRTPTimestamp(0),
|
||||
_lastReceiveRTPTimestamp(0),
|
||||
last_receive_time_(-1)
|
||||
last_receive_time_(-1),
|
||||
previous_drop_(false)
|
||||
{
|
||||
srand((int) webrtc::TickTime::MicrosecondTimestamp());
|
||||
unsigned int tId = 0;
|
||||
@ -190,11 +191,24 @@ int TbExternalTransport::SendPacket(int channel, const void *data, int len)
|
||||
_rtpCount++;
|
||||
_statCrit.Leave();
|
||||
|
||||
// Packet loss. Never drop packets from the first RTP timestamp, i.e. the
|
||||
// first frame being transmitted.
|
||||
int dropThis = rand() % 100;
|
||||
if (dropThis < network_parameters_.packet_loss_rate &&
|
||||
_firstRTPTimestamp != rtp_timestamp)
|
||||
// Packet loss.
|
||||
switch (network_parameters_.loss_model)
|
||||
{
|
||||
case (kNoLoss):
|
||||
previous_drop_ = false;
|
||||
break;
|
||||
case (kUniformLoss):
|
||||
previous_drop_ = UniformLoss(network_parameters_.packet_loss_rate);
|
||||
break;
|
||||
case (kGilbertElliotLoss):
|
||||
previous_drop_ = GilbertElliotLoss(
|
||||
network_parameters_.packet_loss_rate,
|
||||
network_parameters_.burst_length);
|
||||
break;
|
||||
}
|
||||
// Never drop packets from the first RTP timestamp (first frame)
|
||||
// transmitted.
|
||||
if (previous_drop_ && _firstRTPTimestamp != rtp_timestamp)
|
||||
{
|
||||
_statCrit.Enter();
|
||||
_dropCount++;
|
||||
@ -501,6 +515,42 @@ WebRtc_Word64 TbExternalTransport::NowMs()
|
||||
return webrtc::TickTime::MillisecondTimestamp();
|
||||
}
|
||||
|
||||
bool TbExternalTransport::UniformLoss(int loss_rate) {
|
||||
int dropThis = rand() % 100;
|
||||
return (dropThis < loss_rate);
|
||||
}
|
||||
|
||||
bool TbExternalTransport::GilbertElliotLoss(int loss_rate, int burst_length) {
|
||||
// Simulate bursty channel (Gilbert model)
|
||||
// (1st order) Markov chain model with memory of the previous/last
|
||||
// packet state (loss or received)
|
||||
|
||||
// 0 = received state
|
||||
// 1 = loss state
|
||||
|
||||
// probTrans10: if previous packet is lost, prob. to -> received state
|
||||
// probTrans11: if previous packet is lost, prob. to -> loss state
|
||||
|
||||
// probTrans01: if previous packet is received, prob. to -> loss state
|
||||
// probTrans00: if previous packet is received, prob. to -> received
|
||||
|
||||
// Map the two channel parameters (average loss rate and burst length)
|
||||
// to the transition probabilities:
|
||||
double probTrans10 = 100 * (1.0 / burst_length);
|
||||
double probTrans11 = (100.0 - probTrans10);
|
||||
double probTrans01 = (probTrans10 * ( loss_rate / (100.0 - loss_rate)));
|
||||
|
||||
// Note: Random loss (Bernoulli) model is a special case where:
|
||||
// burstLength = 100.0 / (100.0 - _lossPct) (i.e., p10 + p01 = 100)
|
||||
|
||||
if (previous_drop_) {
|
||||
// Previous packet was not received.
|
||||
return UniformLoss(probTrans11);
|
||||
} else {
|
||||
return UniformLoss(probTrans01);
|
||||
}
|
||||
}
|
||||
|
||||
#define PI 3.14159265
|
||||
int TbExternalTransport::GaussianRandom(int mean_ms,
|
||||
int standard_deviation_ms) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user