diff --git a/webrtc/test/fake_network_pipe.cc b/webrtc/test/fake_network_pipe.cc index c5caef2e8..06bf062bf 100644 --- a/webrtc/test/fake_network_pipe.cc +++ b/webrtc/test/fake_network_pipe.cc @@ -104,8 +104,8 @@ void FakeNetworkPipe::SendPacket(const uint8_t* data, size_t data_length) { if (packet_receiver_ == NULL) return; CriticalSectionScoped crit(lock_.get()); - if (config_.queue_length > 0 && - capacity_link_.size() >= config_.queue_length) { + if (config_.queue_length_packets > 0 && + capacity_link_.size() >= config_.queue_length_packets) { // Too many packet on the link, drop this one. ++dropped_packets_; return; diff --git a/webrtc/test/fake_network_pipe.h b/webrtc/test/fake_network_pipe.h index b9690e79d..c741501e8 100644 --- a/webrtc/test/fake_network_pipe.h +++ b/webrtc/test/fake_network_pipe.h @@ -33,14 +33,14 @@ class FakeNetworkPipe { public: struct Config { Config() - : queue_length(0), + : queue_length_packets(0), queue_delay_ms(0), delay_standard_deviation_ms(0), link_capacity_kbps(0), loss_percent(0) { } // Queue length in number of packets. - size_t queue_length; + size_t queue_length_packets; // Delay in addition to capacity induced delay. int queue_delay_ms; // Standard deviation of the extra delay. diff --git a/webrtc/test/fake_network_pipe_unittest.cc b/webrtc/test/fake_network_pipe_unittest.cc index 0399688f6..d429fce98 100644 --- a/webrtc/test/fake_network_pipe_unittest.cc +++ b/webrtc/test/fake_network_pipe_unittest.cc @@ -65,7 +65,7 @@ void DeleteMemory(uint8_t* data, int length) { delete [] data; } // Test the capacity link and verify we get as many packets as we expect. TEST_F(FakeNetworkPipeTest, CapacityTest) { FakeNetworkPipe::Config config; - config.queue_length = 20; + config.queue_length_packets = 20; config.link_capacity_kbps = 80; scoped_ptr pipe(new FakeNetworkPipe(config)); pipe->SetReceiver(receiver_.get()); @@ -107,7 +107,7 @@ TEST_F(FakeNetworkPipeTest, CapacityTest) { // Test the extra network delay. TEST_F(FakeNetworkPipeTest, ExtraDelayTest) { FakeNetworkPipe::Config config; - config.queue_length = 20; + config.queue_length_packets = 20; config.queue_delay_ms = 100; config.link_capacity_kbps = 80; scoped_ptr pipe(new FakeNetworkPipe(config)); @@ -144,7 +144,7 @@ TEST_F(FakeNetworkPipeTest, ExtraDelayTest) { // packets too quickly. TEST_F(FakeNetworkPipeTest, QueueLengthTest) { FakeNetworkPipe::Config config; - config.queue_length = 2; + config.queue_length_packets = 2; config.link_capacity_kbps = 80; scoped_ptr pipe(new FakeNetworkPipe(config)); pipe->SetReceiver(receiver_.get()); @@ -167,7 +167,7 @@ TEST_F(FakeNetworkPipeTest, QueueLengthTest) { // Test we get statistics as expected. TEST_F(FakeNetworkPipeTest, StatisticsTest) { FakeNetworkPipe::Config config; - config.queue_length = 2; + config.queue_length_packets = 2; config.queue_delay_ms = 20; config.link_capacity_kbps = 80; scoped_ptr pipe(new FakeNetworkPipe(config)); @@ -197,7 +197,7 @@ TEST_F(FakeNetworkPipeTest, StatisticsTest) { // delivery times change accordingly. TEST_F(FakeNetworkPipeTest, ChangingCapacityWithEmptyPipeTest) { FakeNetworkPipe::Config config; - config.queue_length = 20; + config.queue_length_packets = 20; config.link_capacity_kbps = 80; scoped_ptr pipe(new FakeNetworkPipe(config)); pipe->SetReceiver(receiver_.get()); @@ -255,7 +255,7 @@ TEST_F(FakeNetworkPipeTest, ChangingCapacityWithEmptyPipeTest) { // delivery times change accordingly. TEST_F(FakeNetworkPipeTest, ChangingCapacityWithPacketsInPipeTest) { FakeNetworkPipe::Config config; - config.queue_length = 20; + config.queue_length_packets = 20; config.link_capacity_kbps = 80; scoped_ptr pipe(new FakeNetworkPipe(config)); pipe->SetReceiver(receiver_.get()); diff --git a/webrtc/video/full_stack.cc b/webrtc/video/full_stack.cc index 284efe203..a9ddd2c9b 100644 --- a/webrtc/video/full_stack.cc +++ b/webrtc/video/full_stack.cc @@ -35,7 +35,7 @@ namespace webrtc { -static const int kFullStackTestDurationSecs = 10; +static const int kFullStackTestDurationSecs = 60; struct FullStackTestParams { const char* test_label; @@ -44,14 +44,17 @@ struct FullStackTestParams { size_t width, height; int fps; } clip; - unsigned int bitrate; + int min_bitrate_bps; + int target_bitrate_bps; + int max_bitrate_bps; double avg_psnr_threshold; double avg_ssim_threshold; + FakeNetworkPipe::Config link; }; class FullStackTest : public test::CallTest { protected: - void TestWithoutPacketLoss(const FullStackTestParams& params); + void RunTest(const FullStackTestParams& params); }; class VideoAnalyzer : public PacketReceiver, @@ -367,19 +370,21 @@ class VideoAnalyzer : public PacketReceiver, const scoped_ptr done_; }; -void FullStackTest::TestWithoutPacketLoss(const FullStackTestParams& params) { - test::DirectTransport transport; +void FullStackTest::RunTest(const FullStackTestParams& params) { + test::DirectTransport send_transport(params.link); + test::DirectTransport recv_transport(params.link); VideoAnalyzer analyzer(NULL, - &transport, + &send_transport, params.test_label, params.avg_psnr_threshold, params.avg_ssim_threshold, kFullStackTestDurationSecs * params.clip.fps); - CreateCalls(Call::Config(&analyzer), Call::Config(&analyzer)); + CreateCalls(Call::Config(&analyzer), Call::Config(&recv_transport)); analyzer.SetReceiver(receiver_call_->Receiver()); - transport.SetReceiver(&analyzer); + send_transport.SetReceiver(&analyzer); + recv_transport.SetReceiver(sender_call_->Receiver()); CreateSendConfig(1); @@ -391,8 +396,9 @@ void FullStackTest::TestWithoutPacketLoss(const FullStackTestParams& params) { VideoStream* stream = &video_streams_[0]; stream->width = params.clip.width; stream->height = params.clip.height; - stream->min_bitrate_bps = stream->target_bitrate_bps = - stream->max_bitrate_bps = params.bitrate * 1000; + stream->min_bitrate_bps = params.min_bitrate_bps; + stream->target_bitrate_bps = params.target_bitrate_bps; + stream->max_bitrate_bps = params.max_bitrate_bps; stream->max_framerate = params.clip.fps; CreateMatchingReceiveConfigs(); @@ -418,32 +424,111 @@ void FullStackTest::TestWithoutPacketLoss(const FullStackTestParams& params) { analyzer.Wait(); - transport.StopSending(); + send_transport.StopSending(); + recv_transport.StopSending(); Stop(); DestroyStreams(); } -FullStackTestParams paris_qcif = {"net_delay_0_0_plr_0", - {"paris_qcif", 176, 144, 30}, - 300, - 36.0, - 0.96}; - -// TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif. -FullStackTestParams foreman_cif = {"foreman_cif_net_delay_0_0_plr_0", - {"foreman_cif", 352, 288, 30}, - 700, - 0.0, - 0.0}; - TEST_F(FullStackTest, ParisQcifWithoutPacketLoss) { - TestWithoutPacketLoss(paris_qcif); + FullStackTestParams paris_qcif = {"net_delay_0_0_plr_0", + {"paris_qcif", 176, 144, 30}, + 300000, + 300000, + 300000, + 36.0, + 0.96 + }; + RunTest(paris_qcif); } TEST_F(FullStackTest, ForemanCifWithoutPacketLoss) { - TestWithoutPacketLoss(foreman_cif); + // TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif. + FullStackTestParams foreman_cif = {"foreman_cif_net_delay_0_0_plr_0", + {"foreman_cif", 352, 288, 30}, + 700000, + 700000, + 700000, + 0.0, + 0.0 + }; + RunTest(foreman_cif); } +TEST_F(FullStackTest, ForemanCif500kbps) { + FullStackTestParams foreman_cif = {"foreman_cif_500kbps", + {"foreman_cif", 352, 288, 30}, + 30000, + 500000, + 2000000, + 0.0, + 0.0 + }; + foreman_cif.link.queue_length_packets = 0; + foreman_cif.link.queue_delay_ms = 0; + foreman_cif.link.link_capacity_kbps = 500; + RunTest(foreman_cif); +} + +TEST_F(FullStackTest, ForemanCif500kbpsLimitedQueue) { + FullStackTestParams foreman_cif = {"foreman_cif_500kbps_32pkts_queue", + {"foreman_cif", 352, 288, 30}, + 30000, + 500000, + 2000000, + 0.0, + 0.0 + }; + foreman_cif.link.queue_length_packets = 32; + foreman_cif.link.queue_delay_ms = 0; + foreman_cif.link.link_capacity_kbps = 500; + RunTest(foreman_cif); +} + +TEST_F(FullStackTest, ForemanCif500kbps100ms) { + FullStackTestParams foreman_cif = {"foreman_cif_500kbps_100ms", + {"foreman_cif", 352, 288, 30}, + 30000, + 500000, + 2000000, + 0.0, + 0.0 + }; + foreman_cif.link.queue_length_packets = 0; + foreman_cif.link.queue_delay_ms = 100; + foreman_cif.link.link_capacity_kbps = 500; + RunTest(foreman_cif); +} + +TEST_F(FullStackTest, ForemanCif500kbps100msLimitedQueue) { + FullStackTestParams foreman_cif = {"foreman_cif_500kbps_100ms_32pkts_queue", + {"foreman_cif", 352, 288, 30}, + 30000, + 500000, + 2000000, + 0.0, + 0.0 + }; + foreman_cif.link.queue_length_packets = 32; + foreman_cif.link.queue_delay_ms = 100; + foreman_cif.link.link_capacity_kbps = 500; + RunTest(foreman_cif); +} + +TEST_F(FullStackTest, ForemanCif1000kbps100msLimitedQueue) { + FullStackTestParams foreman_cif = {"foreman_cif_1000kbps_100ms_32pkts_queue", + {"foreman_cif", 352, 288, 30}, + 30000, + 2000000, + 2000000, + 0.0, + 0.0 + }; + foreman_cif.link.queue_length_packets = 32; + foreman_cif.link.queue_delay_ms = 100; + foreman_cif.link.link_capacity_kbps = 1000; + RunTest(foreman_cif); +} } // namespace webrtc diff --git a/webrtc/video/rampup_tests.cc b/webrtc/video/rampup_tests.cc index b6f63814a..af3be8610 100644 --- a/webrtc/video/rampup_tests.cc +++ b/webrtc/video/rampup_tests.cc @@ -220,7 +220,7 @@ LowRateStreamObserver::LowRateStreamObserver( kRemoteBitrateEstimatorMinBitrateBps)); forward_transport_config_.link_capacity_kbps = kHighBandwidthLimitBps / 1000; - forward_transport_config_.queue_length = 100; // Something large. + forward_transport_config_.queue_length_packets = 100; // Something large. test::DirectTransport::SetConfig(forward_transport_config_); test::DirectTransport::SetReceiver(this); }