Added simulations of capacity variations and wifi recordings.

Also changes the packet sizes for the video sender and the trace based filter to match.

R=solenberg@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5824 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
stefan@webrtc.org 2014-04-01 14:00:05 +00:00
parent 7e889b7126
commit f8f7c8b618
4 changed files with 63 additions and 22 deletions

View File

@ -82,6 +82,42 @@ TEST_P(BweSimulation, Verizon4gDownlinkTest) {
ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx"))); ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx")));
RunFor(22 * 60 * 1000); RunFor(22 * 60 * 1000);
} }
TEST_P(BweSimulation, Choke1000kbps500kbps1000kbps) {
VerboseLogging(true);
ChokeFilter filter(this);
RateCounterFilter counter(this, "receiver_input");
filter.SetCapacity(1000);
filter.SetMaxDelay(500);
RunFor(60 * 1000);
filter.SetCapacity(500);
RunFor(60 * 1000);
filter.SetCapacity(1000);
RunFor(60 * 1000);
}
TEST_P(BweSimulation, Choke200kbps30kbps200kbps) {
VerboseLogging(true);
ChokeFilter filter(this);
RateCounterFilter counter(this, "receiver_input");
filter.SetCapacity(200);
filter.SetMaxDelay(500);
RunFor(60 * 1000);
filter.SetCapacity(30);
RunFor(60 * 1000);
filter.SetCapacity(200);
RunFor(60 * 1000);
}
TEST_P(BweSimulation, GoogleWifiTrace3Mbps) {
VerboseLogging(true);
RateCounterFilter counter1(this, "sender_output");
TraceBasedDeliveryFilter filter(this, "link_capacity");
filter.SetMaxDelay(500);
RateCounterFilter counter2(this, "receiver_input");
ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
RunFor(300 * 1000);
}
#endif // BWE_TEST_LOGGING_COMPILE_TIME_ENABLE #endif // BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
} // namespace bwe } // namespace bwe
} // namespace testing } // namespace testing

View File

@ -203,6 +203,10 @@ void RateCounterFilter::LogStats() {
kbps_stats_.Log("kbps"); kbps_stats_.Log("kbps");
} }
Stats<double> RateCounterFilter::GetBitrateStats() const {
return kbps_stats_;
}
void RateCounterFilter::Plot(int64_t timestamp_ms) { void RateCounterFilter::Plot(int64_t timestamp_ms) {
BWE_TEST_LOGGING_CONTEXT(name_.c_str()); BWE_TEST_LOGGING_CONTEXT(name_.c_str());
BWE_TEST_LOGGING_PLOT("Throughput_#1", timestamp_ms, BWE_TEST_LOGGING_PLOT("Throughput_#1", timestamp_ms,
@ -469,7 +473,7 @@ void TraceBasedDeliveryFilter::ProceedToNextSlot() {
} }
} }
local_time_us_ = *next_delivery_it_; local_time_us_ = *next_delivery_it_;
const int kPayloadSize = 1240; const int kPayloadSize = 1200;
rate_counter_->UpdateRates(local_time_us_, kPayloadSize); rate_counter_->UpdateRates(local_time_us_, kPayloadSize);
} }
@ -480,7 +484,7 @@ PacketSender::PacketSender(PacketProcessorListener* listener)
VideoSender::VideoSender(PacketProcessorListener* listener, float fps, VideoSender::VideoSender(PacketProcessorListener* listener, float fps,
uint32_t kbps, uint32_t ssrc, float first_frame_offset) uint32_t kbps, uint32_t ssrc, float first_frame_offset)
: PacketSender(listener), : PacketSender(listener),
kMaxPayloadSizeBytes(1000), kMaxPayloadSizeBytes(1200),
kTimestampBase(0xff80ff00ul), kTimestampBase(0xff80ff00ul),
frame_period_ms_(1000.0 / fps), frame_period_ms_(1000.0 / fps),
bytes_per_second_((1000 * kbps) / 8), bytes_per_second_((1000 * kbps) / 8),

View File

@ -205,6 +205,7 @@ class RateCounterFilter : public PacketProcessor {
uint32_t bits_per_second() const; uint32_t bits_per_second() const;
void LogStats(); void LogStats();
Stats<double> GetBitrateStats() const;
virtual void Plot(int64_t timestamp_ms); virtual void Plot(int64_t timestamp_ms);
virtual void RunFor(int64_t time_ms, Packets* in_out); virtual void RunFor(int64_t time_ms, Packets* in_out);

View File

@ -772,33 +772,33 @@ TEST(BweTestFramework_VideoSenderTest, Fps1Kbps80_1s) {
EXPECT_EQ(10000u, sender.bytes_per_second()); EXPECT_EQ(10000u, sender.bytes_per_second());
// We're at 1 fps, so all packets should be generated on first call, giving 10 // We're at 1 fps, so all packets should be generated on first call, giving 10
// packets of each 1000 bytes, total 10000 bytes. // packets of each 1000 bytes, total 10000 bytes.
TestVideoSender(&sender, 1, 10, 1000, 10000); TestVideoSender(&sender, 1, 9, 400, 10000);
// 999ms, should see no output here. // 999ms, should see no output here.
TestVideoSender(&sender, 998, 0, 0, 0); TestVideoSender(&sender, 998, 0, 0, 0);
// 1999ms, should get data for one more frame. // 1999ms, should get data for one more frame.
TestVideoSender(&sender, 1000, 10, 1000, 10000); TestVideoSender(&sender, 1000, 9, 400, 10000);
// 2000ms, one more frame. // 2000ms, one more frame.
TestVideoSender(&sender, 1, 10, 1000, 10000); TestVideoSender(&sender, 1, 9, 400, 10000);
// 2999ms, should see nothing. // 2999ms, should see nothing.
TestVideoSender(&sender, 999, 0, 0, 0); TestVideoSender(&sender, 999, 0, 0, 0);
} }
TEST(BweTestFramework_VideoSenderTest, Fps1Kpbs80_1s_Offset) { TEST(BweTestFramework_VideoSenderTest, Fps1Kbps80_1s_Offset) {
// 1 fps, 80 kbps, offset 0.5 of a frame period, ==0.5s in this case. // 1 fps, 80 kbps, offset 0.5 of a frame period, ==0.5s in this case.
VideoSender sender(NULL, 1.0f, 80, 0x1234, 0.5f); VideoSender sender(NULL, 1.0f, 80, 0x1234, 0.5f);
EXPECT_EQ(10000u, sender.bytes_per_second()); EXPECT_EQ(10000u, sender.bytes_per_second());
// 499ms, no output. // 499ms, no output.
TestVideoSender(&sender, 499, 0, 0, 0); TestVideoSender(&sender, 499, 0, 0, 0);
// 500ms, first frame (this is the offset we set), 10 packets of 1000 bytes. // 500ms, first frame (this is the offset we set), 10 packets of 1000 bytes.
TestVideoSender(&sender, 1, 10, 1000, 10000); TestVideoSender(&sender, 1, 9, 400, 10000);
// 1499ms, nothing. // 1499ms, nothing.
TestVideoSender(&sender, 999, 0, 0, 0); TestVideoSender(&sender, 999, 0, 0, 0);
// 1999ms, second frame. // 1999ms, second frame.
TestVideoSender(&sender, 500, 10, 1000, 10000); TestVideoSender(&sender, 500, 9, 400, 10000);
// 2499ms, nothing. // 2499ms, nothing.
TestVideoSender(&sender, 500, 0, 0, 0); TestVideoSender(&sender, 500, 0, 0, 0);
// 2500ms, third frame. // 2500ms, third frame.
TestVideoSender(&sender, 1, 10, 1000, 10000); TestVideoSender(&sender, 1, 9, 400, 10000);
// 3499ms, nothing. // 3499ms, nothing.
TestVideoSender(&sender, 999, 0, 0, 0); TestVideoSender(&sender, 999, 0, 0, 0);
} }
@ -835,7 +835,7 @@ TEST(BweTestFramework_VideoSenderTest, Fps10Kpbs120_1s) {
TestVideoSender(&sender, 1, 0, 0, 0); TestVideoSender(&sender, 1, 0, 0, 0);
} }
TEST(BweTestFramework_VideoSenderTest, Fps30Kpbs800_20s) { TEST(BweTestFramework_VideoSenderTest, Fps30Kbps800_20s) {
// 20 fps, 820 kbps. // 20 fps, 820 kbps.
VideoSender sender(NULL, 25.0f, 820, 0x1234, 0); VideoSender sender(NULL, 25.0f, 820, 0x1234, 0);
EXPECT_EQ(102500u, sender.bytes_per_second()); EXPECT_EQ(102500u, sender.bytes_per_second());
@ -843,15 +843,15 @@ TEST(BweTestFramework_VideoSenderTest, Fps30Kpbs800_20s) {
// Each frame is 102500/25=4100 bytes, or 5 packets (4 @1000 bytes, 1 @100), // Each frame is 102500/25=4100 bytes, or 5 packets (4 @1000 bytes, 1 @100),
// so packet count should be 5*250=1250 and last packet of each frame has // so packet count should be 5*250=1250 and last packet of each frame has
// 100 bytes of payload. // 100 bytes of payload.
TestVideoSender(&sender, 9998, 1250, 100, 1025000); TestVideoSender(&sender, 9998, 1000, 500, 1025000);
// 9999ms, nothing. // 9999ms, nothing.
TestVideoSender(&sender, 1, 0, 0, 0); TestVideoSender(&sender, 1, 0, 0, 0);
// 19998ms, 250 more frames. // 19998ms, 250 more frames.
TestVideoSender(&sender, 9999, 1250, 100, 1025000); TestVideoSender(&sender, 9999, 1000, 500, 1025000);
// 19999ms, nothing. // 19999ms, nothing.
TestVideoSender(&sender, 1, 0, 0, 0); TestVideoSender(&sender, 1, 0, 0, 0);
// 20038ms, one more frame, as described above (25fps == 40ms/frame). // 20038ms, one more frame, as described above (25fps == 40ms/frame).
TestVideoSender(&sender, 39, 5, 100, 4100); TestVideoSender(&sender, 39, 4, 500, 4100);
// 20039ms, nothing. // 20039ms, nothing.
TestVideoSender(&sender, 1, 0, 0, 0); TestVideoSender(&sender, 1, 0, 0, 0);
} }
@ -865,12 +865,12 @@ TEST(BweTestFramework_VideoSenderTest, TestAppendInOrder) {
sender1.RunFor(999, &packets); sender1.RunFor(999, &packets);
ASSERT_TRUE(IsTimeSorted(packets)); ASSERT_TRUE(IsTimeSorted(packets));
ASSERT_TRUE(IsSequenceNumberSorted(packets)); ASSERT_TRUE(IsSequenceNumberSorted(packets));
EXPECT_EQ(10u, packets.size()); EXPECT_EQ(9u, packets.size());
// Generate some more packets and verify they are appended to end of list. // Generate some more packets and verify they are appended to end of list.
sender1.RunFor(1000, &packets); sender1.RunFor(1000, &packets);
ASSERT_TRUE(IsTimeSorted(packets)); ASSERT_TRUE(IsTimeSorted(packets));
ASSERT_TRUE(IsSequenceNumberSorted(packets)); ASSERT_TRUE(IsSequenceNumberSorted(packets));
EXPECT_EQ(20u, packets.size()); EXPECT_EQ(18u, packets.size());
// Another sender, 2 fps, 160 kpbs, 150ms offset // Another sender, 2 fps, 160 kpbs, 150ms offset
VideoSender sender2(NULL, 2.0f, 160, 0x2234, 0.30f); VideoSender sender2(NULL, 2.0f, 160, 0x2234, 0.30f);
@ -879,42 +879,42 @@ TEST(BweTestFramework_VideoSenderTest, TestAppendInOrder) {
// on the list. // on the list.
sender2.RunFor(999, &packets); sender2.RunFor(999, &packets);
ASSERT_TRUE(IsTimeSorted(packets)); ASSERT_TRUE(IsTimeSorted(packets));
EXPECT_EQ(40u, packets.size()); EXPECT_EQ(36u, packets.size());
// Generate some more. // Generate some more.
sender2.RunFor(1000, &packets); sender2.RunFor(1000, &packets);
ASSERT_TRUE(IsTimeSorted(packets)); ASSERT_TRUE(IsTimeSorted(packets));
EXPECT_EQ(60u, packets.size()); EXPECT_EQ(54u, packets.size());
} }
TEST(BweTestFramework_VideoSenderTest, FeedbackIneffective) { TEST(BweTestFramework_VideoSenderTest, FeedbackIneffective) {
VideoSender sender(NULL, 25.0f, 820, 0x1234, 0); VideoSender sender(NULL, 25.0f, 820, 0x1234, 0);
EXPECT_EQ(102500u, sender.bytes_per_second()); EXPECT_EQ(102500u, sender.bytes_per_second());
TestVideoSender(&sender, 9998, 1250, 100, 1025000); TestVideoSender(&sender, 9998, 1000, 500, 1025000);
// Make sure feedback has no effect on a regular video sender. // Make sure feedback has no effect on a regular video sender.
PacketSender::Feedback feedback = { 512000 }; PacketSender::Feedback feedback = { 512000 };
sender.GiveFeedback(feedback); sender.GiveFeedback(feedback);
EXPECT_EQ(102500u, sender.bytes_per_second()); EXPECT_EQ(102500u, sender.bytes_per_second());
TestVideoSender(&sender, 9998, 1250, 100, 1025000); TestVideoSender(&sender, 9998, 1000, 500, 1025000);
} }
TEST(BweTestFramework_AdaptiveVideoSenderTest, FeedbackChangesBitrate) { TEST(BweTestFramework_AdaptiveVideoSenderTest, FeedbackChangesBitrate) {
AdaptiveVideoSender sender(NULL, 25.0f, 820, 0x1234, 0); AdaptiveVideoSender sender(NULL, 25.0f, 820, 0x1234, 0);
EXPECT_EQ(102500u, sender.bytes_per_second()); EXPECT_EQ(102500u, sender.bytes_per_second());
TestVideoSender(&sender, 9998, 1250, 100, 1025000); TestVideoSender(&sender, 9998, 1000, 500, 1025000);
// Make sure we can reduce the bitrate. // Make sure we can reduce the bitrate.
PacketSender::Feedback feedback = { 512000 }; PacketSender::Feedback feedback = { 512000 };
sender.GiveFeedback(feedback); sender.GiveFeedback(feedback);
EXPECT_EQ(64000u, sender.bytes_per_second()); EXPECT_EQ(64000u, sender.bytes_per_second());
TestVideoSender(&sender, 9998, 750, 560, 640000); TestVideoSender(&sender, 9998, 750, 160, 640000);
// Increase the bitrate to the initial bitrate and verify that the output is // Increase the bitrate to the initial bitrate and verify that the output is
// the same. // the same.
feedback.estimated_bps = 820000; feedback.estimated_bps = 820000;
sender.GiveFeedback(feedback); sender.GiveFeedback(feedback);
EXPECT_EQ(102500u, sender.bytes_per_second()); EXPECT_EQ(102500u, sender.bytes_per_second());
TestVideoSender(&sender, 9998, 1250, 100, 1025000); TestVideoSender(&sender, 9998, 1000, 500, 1025000);
} }
} // namespace bwe } // namespace bwe
} // namespace testing } // namespace testing