From f8f7c8b61846b2fb652268f0a66147a0e557fae6 Mon Sep 17 00:00:00 2001 From: "stefan@webrtc.org" Date: Tue, 1 Apr 2014 14:00:05 +0000 Subject: [PATCH] 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 --- .../bwe_simulations.cc | 36 +++++++++++++++++ .../test/bwe_test_framework.cc | 8 +++- .../test/bwe_test_framework.h | 1 + .../test/bwe_test_framework_unittest.cc | 40 +++++++++---------- 4 files changed, 63 insertions(+), 22 deletions(-) diff --git a/webrtc/modules/remote_bitrate_estimator/bwe_simulations.cc b/webrtc/modules/remote_bitrate_estimator/bwe_simulations.cc index 9e71ead66..e4c67b595 100644 --- a/webrtc/modules/remote_bitrate_estimator/bwe_simulations.cc +++ b/webrtc/modules/remote_bitrate_estimator/bwe_simulations.cc @@ -82,6 +82,42 @@ TEST_P(BweSimulation, Verizon4gDownlinkTest) { ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx"))); 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 } // namespace bwe } // namespace testing diff --git a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc index 1e11763e6..893b6fee8 100644 --- a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc +++ b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.cc @@ -203,6 +203,10 @@ void RateCounterFilter::LogStats() { kbps_stats_.Log("kbps"); } +Stats RateCounterFilter::GetBitrateStats() const { + return kbps_stats_; +} + void RateCounterFilter::Plot(int64_t timestamp_ms) { BWE_TEST_LOGGING_CONTEXT(name_.c_str()); BWE_TEST_LOGGING_PLOT("Throughput_#1", timestamp_ms, @@ -469,7 +473,7 @@ void TraceBasedDeliveryFilter::ProceedToNextSlot() { } } local_time_us_ = *next_delivery_it_; - const int kPayloadSize = 1240; + const int kPayloadSize = 1200; rate_counter_->UpdateRates(local_time_us_, kPayloadSize); } @@ -480,7 +484,7 @@ PacketSender::PacketSender(PacketProcessorListener* listener) VideoSender::VideoSender(PacketProcessorListener* listener, float fps, uint32_t kbps, uint32_t ssrc, float first_frame_offset) : PacketSender(listener), - kMaxPayloadSizeBytes(1000), + kMaxPayloadSizeBytes(1200), kTimestampBase(0xff80ff00ul), frame_period_ms_(1000.0 / fps), bytes_per_second_((1000 * kbps) / 8), diff --git a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h index f8e27c25e..5302ba3d0 100644 --- a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h +++ b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h @@ -205,6 +205,7 @@ class RateCounterFilter : public PacketProcessor { uint32_t bits_per_second() const; void LogStats(); + Stats GetBitrateStats() const; virtual void Plot(int64_t timestamp_ms); virtual void RunFor(int64_t time_ms, Packets* in_out); diff --git a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework_unittest.cc b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework_unittest.cc index fd398dac0..56329b626 100644 --- a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework_unittest.cc +++ b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework_unittest.cc @@ -772,33 +772,33 @@ TEST(BweTestFramework_VideoSenderTest, Fps1Kbps80_1s) { EXPECT_EQ(10000u, sender.bytes_per_second()); // We're at 1 fps, so all packets should be generated on first call, giving 10 // 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. TestVideoSender(&sender, 998, 0, 0, 0); // 1999ms, should get data for one more frame. - TestVideoSender(&sender, 1000, 10, 1000, 10000); + TestVideoSender(&sender, 1000, 9, 400, 10000); // 2000ms, one more frame. - TestVideoSender(&sender, 1, 10, 1000, 10000); + TestVideoSender(&sender, 1, 9, 400, 10000); // 2999ms, should see nothing. 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. VideoSender sender(NULL, 1.0f, 80, 0x1234, 0.5f); EXPECT_EQ(10000u, sender.bytes_per_second()); // 499ms, no output. TestVideoSender(&sender, 499, 0, 0, 0); // 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. TestVideoSender(&sender, 999, 0, 0, 0); // 1999ms, second frame. - TestVideoSender(&sender, 500, 10, 1000, 10000); + TestVideoSender(&sender, 500, 9, 400, 10000); // 2499ms, nothing. TestVideoSender(&sender, 500, 0, 0, 0); // 2500ms, third frame. - TestVideoSender(&sender, 1, 10, 1000, 10000); + TestVideoSender(&sender, 1, 9, 400, 10000); // 3499ms, nothing. TestVideoSender(&sender, 999, 0, 0, 0); } @@ -835,7 +835,7 @@ TEST(BweTestFramework_VideoSenderTest, Fps10Kpbs120_1s) { TestVideoSender(&sender, 1, 0, 0, 0); } -TEST(BweTestFramework_VideoSenderTest, Fps30Kpbs800_20s) { +TEST(BweTestFramework_VideoSenderTest, Fps30Kbps800_20s) { // 20 fps, 820 kbps. VideoSender sender(NULL, 25.0f, 820, 0x1234, 0); 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), // so packet count should be 5*250=1250 and last packet of each frame has // 100 bytes of payload. - TestVideoSender(&sender, 9998, 1250, 100, 1025000); + TestVideoSender(&sender, 9998, 1000, 500, 1025000); // 9999ms, nothing. TestVideoSender(&sender, 1, 0, 0, 0); // 19998ms, 250 more frames. - TestVideoSender(&sender, 9999, 1250, 100, 1025000); + TestVideoSender(&sender, 9999, 1000, 500, 1025000); // 19999ms, nothing. TestVideoSender(&sender, 1, 0, 0, 0); // 20038ms, one more frame, as described above (25fps == 40ms/frame). - TestVideoSender(&sender, 39, 5, 100, 4100); + TestVideoSender(&sender, 39, 4, 500, 4100); // 20039ms, nothing. TestVideoSender(&sender, 1, 0, 0, 0); } @@ -865,12 +865,12 @@ TEST(BweTestFramework_VideoSenderTest, TestAppendInOrder) { sender1.RunFor(999, &packets); ASSERT_TRUE(IsTimeSorted(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. sender1.RunFor(1000, &packets); ASSERT_TRUE(IsTimeSorted(packets)); ASSERT_TRUE(IsSequenceNumberSorted(packets)); - EXPECT_EQ(20u, packets.size()); + EXPECT_EQ(18u, packets.size()); // Another sender, 2 fps, 160 kpbs, 150ms offset VideoSender sender2(NULL, 2.0f, 160, 0x2234, 0.30f); @@ -879,42 +879,42 @@ TEST(BweTestFramework_VideoSenderTest, TestAppendInOrder) { // on the list. sender2.RunFor(999, &packets); ASSERT_TRUE(IsTimeSorted(packets)); - EXPECT_EQ(40u, packets.size()); + EXPECT_EQ(36u, packets.size()); // Generate some more. sender2.RunFor(1000, &packets); ASSERT_TRUE(IsTimeSorted(packets)); - EXPECT_EQ(60u, packets.size()); + EXPECT_EQ(54u, packets.size()); } TEST(BweTestFramework_VideoSenderTest, FeedbackIneffective) { VideoSender sender(NULL, 25.0f, 820, 0x1234, 0); 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. PacketSender::Feedback feedback = { 512000 }; sender.GiveFeedback(feedback); EXPECT_EQ(102500u, sender.bytes_per_second()); - TestVideoSender(&sender, 9998, 1250, 100, 1025000); + TestVideoSender(&sender, 9998, 1000, 500, 1025000); } TEST(BweTestFramework_AdaptiveVideoSenderTest, FeedbackChangesBitrate) { AdaptiveVideoSender sender(NULL, 25.0f, 820, 0x1234, 0); 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. PacketSender::Feedback feedback = { 512000 }; sender.GiveFeedback(feedback); 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 // the same. feedback.estimated_bps = 820000; sender.GiveFeedback(feedback); EXPECT_EQ(102500u, sender.bytes_per_second()); - TestVideoSender(&sender, 9998, 1250, 100, 1025000); + TestVideoSender(&sender, 9998, 1000, 500, 1025000); } } // namespace bwe } // namespace testing