OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // This test generate synthetic data. For audio it's a sinusoid waveform with | 5 // This test generate synthetic data. For audio it's a sinusoid waveform with |
6 // frequency kSoundFrequency and different amplitudes. For video it's a pattern | 6 // frequency kSoundFrequency and different amplitudes. For video it's a pattern |
7 // that is shifting by one pixel per frame, each pixels neighbors right and down | 7 // that is shifting by one pixel per frame, each pixels neighbors right and down |
8 // is this pixels value +1, since the pixel value is 8 bit it will wrap | 8 // is this pixels value +1, since the pixel value is 8 bit it will wrap |
9 // frequently within the image. Visually this will create diagonally color bands | 9 // frequently within the image. Visually this will create diagonally color bands |
10 // that moves across the screen | 10 // that moves across the screen |
(...skipping 1339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1350 | 1350 |
1351 int frames_counter = 0; | 1351 int frames_counter = 0; |
1352 for (; frames_counter < 1000; ++frames_counter) { | 1352 for (; frames_counter < 1000; ++frames_counter) { |
1353 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1353 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
1354 RunTasks(kFrameTimerMs); | 1354 RunTasks(kFrameTimerMs); |
1355 } | 1355 } |
1356 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1356 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
1357 EXPECT_EQ(1000ul, video_ticks_.size()); | 1357 EXPECT_EQ(1000ul, video_ticks_.size()); |
1358 } | 1358 } |
1359 | 1359 |
| 1360 // The following tests run many many iterations to make sure that |
| 1361 // buffers don't fill, timers don't go askew etc. However, these |
| 1362 // high-level tests are too expensive in debug mode, so we reduce |
| 1363 // the iterations in debug mode. |
| 1364 #if defined(NDEBUG) |
| 1365 const size_t kLongTestIterations = 10000; |
| 1366 #else |
| 1367 const size_t kLongTestIterations = 1000; |
| 1368 #endif |
| 1369 |
1360 TEST_F(End2EndTest, ReceiverClockFast) { | 1370 TEST_F(End2EndTest, ReceiverClockFast) { |
1361 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, | 1371 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, |
1362 1); | 1372 1); |
1363 Create(); | 1373 Create(); |
1364 StartBasicPlayer(); | 1374 StartBasicPlayer(); |
1365 SetReceiverSkew(2.0, base::TimeDelta::FromMicroseconds(1234567)); | 1375 SetReceiverSkew(2.0, base::TimeDelta::FromMicroseconds(1234567)); |
1366 | 1376 |
1367 int frames_counter = 0; | 1377 for (size_t frames_counter = 0; |
1368 for (; frames_counter < 10000; ++frames_counter) { | 1378 frames_counter < kLongTestIterations; |
| 1379 ++frames_counter) { |
1369 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1380 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
1370 RunTasks(kFrameTimerMs); | 1381 RunTasks(kFrameTimerMs); |
1371 } | 1382 } |
1372 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1383 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
1373 EXPECT_EQ(10000ul, video_ticks_.size()); | 1384 EXPECT_EQ(kLongTestIterations, video_ticks_.size()); |
1374 } | 1385 } |
1375 | 1386 |
1376 TEST_F(End2EndTest, ReceiverClockSlow) { | 1387 TEST_F(End2EndTest, ReceiverClockSlow) { |
1377 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, | 1388 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, |
1378 1); | 1389 1); |
1379 Create(); | 1390 Create(); |
1380 StartBasicPlayer(); | 1391 StartBasicPlayer(); |
1381 SetReceiverSkew(0.5, base::TimeDelta::FromMicroseconds(-765432)); | 1392 SetReceiverSkew(0.5, base::TimeDelta::FromMicroseconds(-765432)); |
1382 | 1393 |
1383 int frames_counter = 0; | 1394 for (size_t frames_counter = 0; |
1384 for (; frames_counter < 10000; ++frames_counter) { | 1395 frames_counter < kLongTestIterations; |
| 1396 ++frames_counter) { |
1385 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1397 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
1386 RunTasks(kFrameTimerMs); | 1398 RunTasks(kFrameTimerMs); |
1387 } | 1399 } |
1388 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1400 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
1389 EXPECT_EQ(10000ul, video_ticks_.size()); | 1401 EXPECT_EQ(kLongTestIterations, video_ticks_.size()); |
1390 } | 1402 } |
1391 | 1403 |
1392 TEST_F(End2EndTest, SmoothPlayoutWithFivePercentClockRateSkew) { | 1404 TEST_F(End2EndTest, SmoothPlayoutWithFivePercentClockRateSkew) { |
1393 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, | 1405 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, |
1394 1); | 1406 1); |
1395 Create(); | 1407 Create(); |
1396 StartBasicPlayer(); | 1408 StartBasicPlayer(); |
1397 SetReceiverSkew(1.05, base::TimeDelta::FromMilliseconds(-42)); | 1409 SetReceiverSkew(1.05, base::TimeDelta::FromMilliseconds(-42)); |
1398 | 1410 |
1399 // Expect smooth playout when there is 5% skew. | 1411 // Expect smooth playout when there is 5% skew. |
1400 SetExpectedVideoPlayoutSmoothness( | 1412 SetExpectedVideoPlayoutSmoothness( |
1401 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 90 / 100, | 1413 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 90 / 100, |
1402 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 110 / 100, | 1414 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 110 / 100, |
1403 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 10); | 1415 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 10); |
1404 | 1416 |
1405 int frames_counter = 0; | 1417 for (size_t frames_counter = 0; |
1406 for (; frames_counter < 10000; ++frames_counter) { | 1418 frames_counter < kLongTestIterations; |
| 1419 ++frames_counter) { |
1407 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1420 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
1408 RunTasks(kFrameTimerMs); | 1421 RunTasks(kFrameTimerMs); |
1409 } | 1422 } |
1410 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1423 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
1411 EXPECT_EQ(10000ul, video_ticks_.size()); | 1424 EXPECT_EQ(kLongTestIterations, video_ticks_.size()); |
1412 } | 1425 } |
1413 | 1426 |
1414 TEST_F(End2EndTest, EvilNetwork) { | 1427 TEST_F(End2EndTest, EvilNetwork) { |
1415 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, | 1428 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, |
1416 1); | 1429 1); |
1417 receiver_to_sender_.SetPacketPipe(test::EvilNetwork().Pass()); | 1430 receiver_to_sender_.SetPacketPipe(test::EvilNetwork().Pass()); |
1418 sender_to_receiver_.SetPacketPipe(test::EvilNetwork().Pass()); | 1431 sender_to_receiver_.SetPacketPipe(test::EvilNetwork().Pass()); |
1419 Create(); | 1432 Create(); |
1420 StartBasicPlayer(); | 1433 StartBasicPlayer(); |
1421 | 1434 |
1422 int frames_counter = 0; | 1435 for (size_t frames_counter = 0; |
1423 for (; frames_counter < 10000; ++frames_counter) { | 1436 frames_counter < kLongTestIterations; |
| 1437 ++frames_counter) { |
1424 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1438 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
1425 RunTasks(kFrameTimerMs); | 1439 RunTasks(kFrameTimerMs); |
1426 } | 1440 } |
1427 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); | 1441 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); |
1428 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. | 1442 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. |
1429 EXPECT_GT(video_ticks_.size(), 100ul); | 1443 EXPECT_GT(video_ticks_.size(), kLongTestIterations / 100); |
1430 VLOG(1) << "Fully transmitted " << video_ticks_.size() | 1444 VLOG(1) << "Fully transmitted " << video_ticks_.size() << " frames."; |
1431 << " out of 10000 frames."; | |
1432 EXPECT_LT((video_ticks_.back().second - test_end).InMilliseconds(), 1000); | 1445 EXPECT_LT((video_ticks_.back().second - test_end).InMilliseconds(), 1000); |
1433 } | 1446 } |
1434 | 1447 |
1435 // Tests that a system configured for 30 FPS drops frames when input is provided | 1448 // Tests that a system configured for 30 FPS drops frames when input is provided |
1436 // at a much higher frame rate. | 1449 // at a much higher frame rate. |
1437 TEST_F(End2EndTest, ShoveHighFrameRateDownYerThroat) { | 1450 TEST_F(End2EndTest, ShoveHighFrameRateDownYerThroat) { |
1438 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, | 1451 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, |
1439 1); | 1452 1); |
1440 receiver_to_sender_.SetPacketPipe(test::EvilNetwork().Pass()); | 1453 receiver_to_sender_.SetPacketPipe(test::EvilNetwork().Pass()); |
1441 sender_to_receiver_.SetPacketPipe(test::EvilNetwork().Pass()); | 1454 sender_to_receiver_.SetPacketPipe(test::EvilNetwork().Pass()); |
1442 Create(); | 1455 Create(); |
1443 StartBasicPlayer(); | 1456 StartBasicPlayer(); |
1444 | 1457 |
1445 int frames_counter = 0; | 1458 for (size_t frames_counter = 0; |
1446 for (; frames_counter < 10000; ++frames_counter) { | 1459 frames_counter < kLongTestIterations; |
| 1460 ++frames_counter) { |
1447 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1461 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
1448 RunTasks(10 /* 10 ms, but 33.3 expected by system */); | 1462 RunTasks(10 /* 10 ms, but 33.3 expected by system */); |
1449 } | 1463 } |
1450 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); | 1464 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); |
1451 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. | 1465 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. |
1452 EXPECT_LT(100ul, video_ticks_.size()); | 1466 EXPECT_LT(kLongTestIterations / 100, video_ticks_.size()); |
1453 EXPECT_GE(3334ul, video_ticks_.size()); | 1467 EXPECT_GE(kLongTestIterations / 3, video_ticks_.size()); |
1454 VLOG(1) << "Fully transmitted " << video_ticks_.size() | 1468 VLOG(1) << "Fully transmitted " << video_ticks_.size() << " frames."; |
1455 << " out of 10000 frames."; | |
1456 EXPECT_LT((video_ticks_.back().second - test_end).InMilliseconds(), 1000); | 1469 EXPECT_LT((video_ticks_.back().second - test_end).InMilliseconds(), 1000); |
1457 } | 1470 } |
1458 | 1471 |
1459 // Disabled due to flake: http://crbug.com/448511 | 1472 TEST_F(End2EndTest, OldPacketNetwork) { |
1460 TEST_F(End2EndTest, DISABLED_OldPacketNetwork) { | |
1461 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1); | 1473 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1); |
1462 sender_to_receiver_.SetPacketPipe(test::NewRandomDrop(0.01)); | 1474 sender_to_receiver_.SetPacketPipe(test::NewRandomDrop(0.01)); |
1463 scoped_ptr<test::PacketPipe> echo_chamber( | 1475 scoped_ptr<test::PacketPipe> echo_chamber( |
1464 test::NewDuplicateAndDelay(1, 10 * kFrameTimerMs)); | 1476 test::NewDuplicateAndDelay(1, 10 * kFrameTimerMs)); |
1465 echo_chamber->AppendToPipe( | 1477 echo_chamber->AppendToPipe( |
1466 test::NewDuplicateAndDelay(1, 20 * kFrameTimerMs)); | 1478 test::NewDuplicateAndDelay(1, 20 * kFrameTimerMs)); |
1467 echo_chamber->AppendToPipe( | 1479 echo_chamber->AppendToPipe( |
1468 test::NewDuplicateAndDelay(1, 40 * kFrameTimerMs)); | 1480 test::NewDuplicateAndDelay(1, 40 * kFrameTimerMs)); |
1469 echo_chamber->AppendToPipe( | 1481 echo_chamber->AppendToPipe( |
1470 test::NewDuplicateAndDelay(1, 80 * kFrameTimerMs)); | 1482 test::NewDuplicateAndDelay(1, 80 * kFrameTimerMs)); |
1471 echo_chamber->AppendToPipe( | 1483 echo_chamber->AppendToPipe( |
1472 test::NewDuplicateAndDelay(1, 160 * kFrameTimerMs)); | 1484 test::NewDuplicateAndDelay(1, 160 * kFrameTimerMs)); |
1473 | 1485 |
1474 receiver_to_sender_.SetPacketPipe(echo_chamber.Pass()); | 1486 receiver_to_sender_.SetPacketPipe(echo_chamber.Pass()); |
1475 Create(); | 1487 Create(); |
1476 StartBasicPlayer(); | 1488 StartBasicPlayer(); |
1477 | 1489 |
1478 SetExpectedVideoPlayoutSmoothness( | 1490 SetExpectedVideoPlayoutSmoothness( |
1479 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 90 / 100, | 1491 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 90 / 100, |
1480 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 110 / 100, | 1492 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 110 / 100, |
1481 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 10); | 1493 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 10); |
1482 | 1494 |
1483 int frames_counter = 0; | 1495 for (size_t frames_counter = 0; |
1484 for (; frames_counter < 10000; ++frames_counter) { | 1496 frames_counter < kLongTestIterations; |
| 1497 ++frames_counter) { |
1485 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1498 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
1486 RunTasks(kFrameTimerMs); | 1499 RunTasks(kFrameTimerMs); |
1487 } | 1500 } |
1488 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. | 1501 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. |
1489 | 1502 |
1490 EXPECT_EQ(10000ul, video_ticks_.size()); | 1503 EXPECT_EQ(kLongTestIterations, video_ticks_.size()); |
1491 } | 1504 } |
1492 | 1505 |
1493 TEST_F(End2EndTest, TestSetPlayoutDelay) { | 1506 TEST_F(End2EndTest, TestSetPlayoutDelay) { |
1494 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1); | 1507 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1); |
1495 video_sender_config_.min_playout_delay = | 1508 video_sender_config_.min_playout_delay = |
1496 video_sender_config_.max_playout_delay; | 1509 video_sender_config_.max_playout_delay; |
1497 audio_sender_config_.min_playout_delay = | 1510 audio_sender_config_.min_playout_delay = |
1498 audio_sender_config_.max_playout_delay; | 1511 audio_sender_config_.max_playout_delay; |
1499 video_sender_config_.max_playout_delay = base::TimeDelta::FromSeconds(1); | 1512 video_sender_config_.max_playout_delay = base::TimeDelta::FromSeconds(1); |
1500 audio_sender_config_.max_playout_delay = base::TimeDelta::FromSeconds(1); | 1513 audio_sender_config_.max_playout_delay = base::TimeDelta::FromSeconds(1); |
(...skipping 27 matching lines...) Expand all Loading... |
1528 EXPECT_LT(jump, 220u); | 1541 EXPECT_LT(jump, 220u); |
1529 } | 1542 } |
1530 | 1543 |
1531 // TODO(pwestin): Add repeatable packet loss test. | 1544 // TODO(pwestin): Add repeatable packet loss test. |
1532 // TODO(pwestin): Add test for misaligned send get calls. | 1545 // TODO(pwestin): Add test for misaligned send get calls. |
1533 // TODO(pwestin): Add more tests that does not resample. | 1546 // TODO(pwestin): Add more tests that does not resample. |
1534 // TODO(pwestin): Add test when we have starvation for our RunTask. | 1547 // TODO(pwestin): Add test when we have starvation for our RunTask. |
1535 | 1548 |
1536 } // namespace cast | 1549 } // namespace cast |
1537 } // namespace media | 1550 } // namespace media |
OLD | NEW |