Skip to content

Commit

Permalink
Add simulation of network effects to video_loopback tool.
Browse files Browse the repository at this point in the history
Also add support for uniform random packet loss to the fake network pipe.

R=pbos@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/14039004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@6803 4adac7df-926f-26a2-2b94-8c16560cd09d
  • Loading branch information
stefan@webrtc.org committed Jul 31, 2014
1 parent d9843da commit bfe6e08
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 2 deletions.
11 changes: 11 additions & 0 deletions webrtc/test/fake_network_pipe.cc
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ static int GaussianRandom(int mean_delay_ms, int standard_deviation_ms) {
sqrt(-2 * log(uniform1)) * cos(2 * kPi * uniform2));
}

static bool UniformLoss(int loss_percent) {
int outcome = rand() % 100;
return outcome < loss_percent;
}

class NetworkPacket {
public:
NetworkPacket(const uint8_t* data, size_t length, int64_t send_time,
Expand Down Expand Up @@ -159,6 +164,12 @@ void FakeNetworkPipe::Process() {
NetworkPacket* packet = capacity_link_.front();
capacity_link_.pop();

// Packets are randomly dropped after being affected by the bottleneck.
if (UniformLoss(config_.loss_percent)) {
delete packet;
continue;
}

// Add extra delay and jitter, but make sure the arrival time is not
// earlier than the last packet in the queue.
int extra_delay = GaussianRandom(config_.queue_delay_ms,
Expand Down
2 changes: 1 addition & 1 deletion webrtc/test/fake_network_pipe.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class FakeNetworkPipe {
int delay_standard_deviation_ms;
// Link capacity in kbps.
int link_capacity_kbps;
// Random packet loss. Not implemented.
// Random packet loss.
int loss_percent;
};

Expand Down
48 changes: 47 additions & 1 deletion webrtc/video/loopback.cc
Original file line number Diff line number Diff line change
Expand Up @@ -51,18 +51,58 @@ size_t MaxBitrate() { return static_cast<size_t>(FLAGS_max_bitrate); }

DEFINE_string(codec, "VP8", "Video codec to use.");
std::string Codec() { return static_cast<std::string>(FLAGS_codec); }

DEFINE_int32(loss_percent, 0, "Percentage of packets randomly lost.");
int LossPercent() {
return static_cast<int>(FLAGS_loss_percent);
}

DEFINE_int32(link_capacity,
0,
"Capacity (kbps) of the fake link. 0 means infinite.");
int LinkCapacity() {
return static_cast<int>(FLAGS_link_capacity);
}

DEFINE_int32(queue_size, 0, "Size of the bottleneck link queue in packets.");
int QueueSize() {
return static_cast<int>(FLAGS_queue_size);
}

DEFINE_int32(avg_propagation_delay_ms,
0,
"Average link propagation delay in ms.");
int AvgPropagationDelayMs() {
return static_cast<int>(FLAGS_avg_propagation_delay_ms);
}

DEFINE_int32(std_propagation_delay_ms,
0,
"Link propagation delay standard deviation in ms.");
int StdPropagationDelayMs() {
return static_cast<int>(FLAGS_std_propagation_delay_ms);
}
} // namespace flags

static const uint32_t kSendSsrc = 0x654321;
static const uint32_t kSendRtxSsrc = 0x654322;
static const uint32_t kReceiverLocalSsrc = 0x123456;

static const uint8_t kRtxPayloadType = 96;

void Loopback() {
scoped_ptr<test::VideoRenderer> local_preview(test::VideoRenderer::Create(
"Local Preview", flags::Width(), flags::Height()));
scoped_ptr<test::VideoRenderer> loopback_video(test::VideoRenderer::Create(
"Loopback Video", flags::Width(), flags::Height()));

test::DirectTransport transport;
FakeNetworkPipe::Config pipe_config;
pipe_config.loss_percent = flags::LossPercent();
pipe_config.link_capacity_kbps = flags::LinkCapacity();
pipe_config.queue_length_packets = flags::QueueSize();
pipe_config.queue_delay_ms = flags::AvgPropagationDelayMs();
pipe_config.delay_standard_deviation_ms = flags::StdPropagationDelayMs();
test::DirectTransport transport(pipe_config);
Call::Config call_config(&transport);
call_config.start_bitrate_bps =
static_cast<int>(flags::StartBitrate()) * 1000;
Expand All @@ -73,6 +113,9 @@ void Loopback() {

VideoSendStream::Config send_config;
send_config.rtp.ssrcs.push_back(kSendSsrc);
send_config.rtp.rtx.ssrcs.push_back(kSendRtxSsrc);
send_config.rtp.rtx.payload_type = kRtxPayloadType;
send_config.rtp.nack.rtp_history_ms = 1000;

send_config.local_renderer = local_preview.get();
scoped_ptr<VideoEncoder> encoder;
Expand Down Expand Up @@ -111,6 +154,9 @@ void Loopback() {
VideoReceiveStream::Config receive_config;
receive_config.rtp.remote_ssrc = send_config.rtp.ssrcs[0];
receive_config.rtp.local_ssrc = kReceiverLocalSsrc;
receive_config.rtp.nack.rtp_history_ms = 1000;
receive_config.rtp.rtx[kRtxPayloadType].ssrc = kSendRtxSsrc;
receive_config.rtp.rtx[kRtxPayloadType].payload_type = kRtxPayloadType;
receive_config.renderer = loopback_video.get();
VideoCodec codec =
test::CreateDecoderVideoCodec(send_config.encoder_settings);
Expand Down

0 comments on commit bfe6e08

Please sign in to comment.