Chromium Code Reviews| 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 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 387 }; | 387 }; |
| 388 | 388 |
| 389 // The actual test class, generate synthetic data for both audio and video and | 389 // The actual test class, generate synthetic data for both audio and video and |
| 390 // send those through the sender and receiver and analyzes the result. | 390 // send those through the sender and receiver and analyzes the result. |
| 391 class End2EndTest : public ::testing::Test { | 391 class End2EndTest : public ::testing::Test { |
| 392 protected: | 392 protected: |
| 393 End2EndTest() | 393 End2EndTest() |
| 394 : start_time_(), | 394 : start_time_(), |
| 395 testing_clock_(new base::SimpleTestTickClock()), | 395 testing_clock_(new base::SimpleTestTickClock()), |
| 396 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), | 396 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), |
| 397 logging_config_(GetLoggingConfigWithRawEventsAndStatsEnabled()), | |
| 397 cast_environment_(new CastEnvironment( | 398 cast_environment_(new CastEnvironment( |
| 398 scoped_ptr<base::TickClock>(testing_clock_).Pass(), | 399 scoped_ptr<base::TickClock>(testing_clock_).Pass(), |
| 399 task_runner_, | 400 task_runner_, |
| 400 task_runner_, | 401 task_runner_, |
| 401 task_runner_, | 402 task_runner_, |
| 402 task_runner_, | 403 task_runner_, |
| 403 task_runner_, | 404 task_runner_, |
| 404 task_runner_, | 405 task_runner_, |
| 405 GetLoggingConfigWithRawEventsAndStatsEnabled())), | 406 logging_config_)), |
| 406 receiver_to_sender_(cast_environment_), | 407 receiver_to_sender_(cast_environment_), |
| 407 sender_to_receiver_(cast_environment_), | 408 sender_to_receiver_(cast_environment_), |
| 408 test_receiver_audio_callback_(new TestReceiverAudioCallback()), | 409 test_receiver_audio_callback_(new TestReceiverAudioCallback()), |
| 409 test_receiver_video_callback_(new TestReceiverVideoCallback()) { | 410 test_receiver_video_callback_(new TestReceiverVideoCallback()) { |
| 410 testing_clock_->Advance( | 411 testing_clock_->Advance( |
| 411 base::TimeDelta::FromMilliseconds(kStartMillisecond)); | 412 base::TimeDelta::FromMilliseconds(kStartMillisecond)); |
| 412 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber_); | 413 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber_); |
| 413 } | 414 } |
| 414 | 415 |
| 415 void SetupConfig(transport::AudioCodec audio_codec, | 416 void SetupConfig(transport::AudioCodec audio_codec, |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 477 void Create() { | 478 void Create() { |
| 478 cast_receiver_.reset( | 479 cast_receiver_.reset( |
| 479 CastReceiver::CreateCastReceiver(cast_environment_, | 480 CastReceiver::CreateCastReceiver(cast_environment_, |
| 480 audio_receiver_config_, | 481 audio_receiver_config_, |
| 481 video_receiver_config_, | 482 video_receiver_config_, |
| 482 &receiver_to_sender_)); | 483 &receiver_to_sender_)); |
| 483 transport_sender_.reset(new transport::CastTransportSenderImpl( | 484 transport_sender_.reset(new transport::CastTransportSenderImpl( |
| 484 NULL, | 485 NULL, |
| 485 testing_clock_, | 486 testing_clock_, |
| 486 transport_config_, | 487 transport_config_, |
| 488 logging_config_, | |
| 487 base::Bind(&UpdateCastTransportStatus), | 489 base::Bind(&UpdateCastTransportStatus), |
| 490 base::Bind(&End2EndTest::LogRawEvents, base::Unretained(this)), | |
| 491 base::TimeDelta::FromSeconds(1), | |
| 488 task_runner_, | 492 task_runner_, |
| 489 &sender_to_receiver_)); | 493 &sender_to_receiver_)); |
| 490 | 494 |
| 491 cast_sender_.reset(CastSender::CreateCastSender( | 495 cast_sender_.reset(CastSender::CreateCastSender( |
| 492 cast_environment_, | 496 cast_environment_, |
| 493 &audio_sender_config_, | 497 &audio_sender_config_, |
| 494 &video_sender_config_, | 498 &video_sender_config_, |
| 495 NULL, | 499 NULL, |
| 496 base::Bind(&End2EndTest::InitializationResult, base::Unretained(this)), | 500 base::Bind(&End2EndTest::InitializationResult, base::Unretained(this)), |
| 497 transport_sender_.get())); | 501 transport_sender_.get())); |
| 498 | 502 |
| 499 receiver_to_sender_.SetPacketReceiver(cast_sender_->packet_receiver()); | 503 receiver_to_sender_.SetPacketReceiver(cast_sender_->packet_receiver()); |
| 500 sender_to_receiver_.SetPacketReceiver(cast_receiver_->packet_receiver()); | 504 sender_to_receiver_.SetPacketReceiver(cast_receiver_->packet_receiver()); |
| 501 | 505 |
| 502 frame_input_ = cast_sender_->frame_input(); | 506 frame_input_ = cast_sender_->frame_input(); |
| 503 frame_receiver_ = cast_receiver_->frame_receiver(); | 507 frame_receiver_ = cast_receiver_->frame_receiver(); |
| 504 | 508 |
| 505 audio_bus_factory_.reset( | 509 audio_bus_factory_.reset( |
| 506 new TestAudioBusFactory(audio_sender_config_.channels, | 510 new TestAudioBusFactory(audio_sender_config_.channels, |
| 507 audio_sender_config_.frequency, | 511 audio_sender_config_.frequency, |
| 508 kSoundFrequency, | 512 kSoundFrequency, |
| 509 kSoundVolume)); | 513 kSoundVolume)); |
| 510 } | 514 } |
| 511 | 515 |
| 512 virtual ~End2EndTest() { | 516 virtual ~End2EndTest() { |
| 513 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber_); | 517 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber_); |
| 514 } | 518 } |
| 515 | 519 |
| 516 virtual void TearDown() OVERRIDE { | 520 virtual void TearDown() OVERRIDE { |
| 517 | |
| 518 cast_sender_.reset(); | 521 cast_sender_.reset(); |
| 519 cast_receiver_.reset(); | 522 cast_receiver_.reset(); |
| 520 task_runner_->RunTasks(); | 523 task_runner_->RunTasks(); |
| 521 } | 524 } |
| 522 | 525 |
| 523 void SendVideoFrame(int start_value, const base::TimeTicks& capture_time) { | 526 void SendVideoFrame(int start_value, const base::TimeTicks& capture_time) { |
| 524 if (start_time_.is_null()) | 527 if (start_time_.is_null()) |
| 525 start_time_ = capture_time; | 528 start_time_ = capture_time; |
| 526 base::TimeDelta time_diff = capture_time - start_time_; | 529 base::TimeDelta time_diff = capture_time - start_time_; |
| 527 gfx::Size size(video_sender_config_.width, video_sender_config_.height); | 530 gfx::Size size(video_sender_config_.width, video_sender_config_.height); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 539 // Call process the timers every 1 ms. | 542 // Call process the timers every 1 ms. |
| 540 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); | 543 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); |
| 541 task_runner_->RunTasks(); | 544 task_runner_->RunTasks(); |
| 542 } | 545 } |
| 543 } | 546 } |
| 544 | 547 |
| 545 void InitializationResult(CastInitializationStatus result) { | 548 void InitializationResult(CastInitializationStatus result) { |
| 546 EXPECT_EQ(result, STATUS_INITIALIZED); | 549 EXPECT_EQ(result, STATUS_INITIALIZED); |
| 547 } | 550 } |
| 548 | 551 |
| 552 void LogRawEvents(const std::vector<PacketEvent>& packet_events) { | |
| 553 EXPECT_FALSE(packet_events.empty()); | |
| 554 for (std::vector<media::cast::PacketEvent>::const_iterator it = | |
| 555 packet_events.begin(); | |
| 556 it != packet_events.end(); | |
| 557 ++it) { | |
| 558 cast_environment_->Logging()->InsertPacketEvent(it->timestamp, | |
| 559 it->type, | |
| 560 it->rtp_timestamp, | |
| 561 it->frame_id, | |
| 562 it->packet_id, | |
| 563 it->max_packet_id, | |
| 564 it->size); | |
| 565 } | |
| 566 } | |
| 567 | |
| 549 AudioReceiverConfig audio_receiver_config_; | 568 AudioReceiverConfig audio_receiver_config_; |
| 550 VideoReceiverConfig video_receiver_config_; | 569 VideoReceiverConfig video_receiver_config_; |
| 551 AudioSenderConfig audio_sender_config_; | 570 AudioSenderConfig audio_sender_config_; |
| 552 VideoSenderConfig video_sender_config_; | 571 VideoSenderConfig video_sender_config_; |
| 553 transport::CastTransportConfig transport_config_; | 572 transport::CastTransportConfig transport_config_; |
| 554 | 573 |
| 555 base::TimeTicks start_time_; | 574 base::TimeTicks start_time_; |
| 556 base::SimpleTestTickClock* testing_clock_; | 575 base::SimpleTestTickClock* testing_clock_; |
| 557 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 576 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
| 577 CastLoggingConfig logging_config_; | |
| 558 scoped_refptr<CastEnvironment> cast_environment_; | 578 scoped_refptr<CastEnvironment> cast_environment_; |
| 559 | 579 |
| 560 LoopBackTransport receiver_to_sender_; | 580 LoopBackTransport receiver_to_sender_; |
| 561 LoopBackTransport sender_to_receiver_; | 581 LoopBackTransport sender_to_receiver_; |
| 562 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; | 582 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; |
| 563 | 583 |
| 564 scoped_ptr<CastReceiver> cast_receiver_; | 584 scoped_ptr<CastReceiver> cast_receiver_; |
| 565 scoped_ptr<CastSender> cast_sender_; | 585 scoped_ptr<CastSender> cast_sender_; |
| 566 scoped_refptr<FrameInput> frame_input_; | 586 scoped_refptr<FrameInput> frame_input_; |
| 567 scoped_refptr<FrameReceiver> frame_receiver_; | 587 scoped_refptr<FrameReceiver> frame_receiver_; |
| 568 | 588 |
| 569 scoped_refptr<TestReceiverAudioCallback> test_receiver_audio_callback_; | 589 scoped_refptr<TestReceiverAudioCallback> test_receiver_audio_callback_; |
| 570 scoped_refptr<TestReceiverVideoCallback> test_receiver_video_callback_; | 590 scoped_refptr<TestReceiverVideoCallback> test_receiver_video_callback_; |
| 571 | 591 |
| 572 scoped_ptr<TestAudioBusFactory> audio_bus_factory_; | 592 scoped_ptr<TestAudioBusFactory> audio_bus_factory_; |
| 573 | 593 |
| 574 SimpleEventSubscriber event_subscriber_; | 594 SimpleEventSubscriber event_subscriber_; |
| 575 std::vector<FrameEvent> frame_events_; | 595 std::vector<FrameEvent> frame_events_; |
| 576 std::vector<PacketEvent> packet_events_; | 596 std::vector<PacketEvent> packet_events_; |
| 577 std::vector<GenericEvent> generic_events_; | 597 std::vector<GenericEvent> generic_events_; |
| 598 | |
| 599 // For transport_sender_. | |
| 600 base::MessageLoopForIO message_loop_; | |
|
dcheng
2014/02/27 22:27:20
Where is this used?
imcheng
2014/02/28 00:15:06
CastTransportSenderImpl creates a RepeatingTimer w
dcheng
2014/02/28 19:46:11
OK, perhaps add a reference to the fact that CastT
imcheng
2014/03/03 19:00:09
Changed comments. I also changed it to a MessageLo
| |
| 578 }; | 601 }; |
| 579 | 602 |
| 580 #if defined(OS_WIN) | 603 #if defined(OS_WIN) |
| 581 #define MAYBE_LoopNoLossPcm16 DISABLED_LoopNoLossPcm16 | 604 #define MAYBE_LoopNoLossPcm16 DISABLED_LoopNoLossPcm16 |
| 582 #else | 605 #else |
| 583 #define MAYBE_LoopNoLossPcm16 LoopNoLossPcm16 | 606 #define MAYBE_LoopNoLossPcm16 LoopNoLossPcm16 |
| 584 #endif | 607 #endif |
| 585 // TODO(mikhal): Crashes in win bots (http://crbug.com/329563) | 608 // TODO(mikhal): Crashes in win bots (http://crbug.com/329563) |
| 586 TEST_F(End2EndTest, MAYBE_LoopNoLossPcm16) { | 609 TEST_F(End2EndTest, MAYBE_LoopNoLossPcm16) { |
| 587 SetupConfig(transport::kPcm16, 32000, false, 1); | 610 SetupConfig(transport::kPcm16, 32000, false, 1); |
| (...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1285 EXPECT_EQ(total_event_count_for_frame, expected_event_count_for_frame); | 1308 EXPECT_EQ(total_event_count_for_frame, expected_event_count_for_frame); |
| 1286 } | 1309 } |
| 1287 | 1310 |
| 1288 // TODO(pwestin): Add repeatable packet loss test. | 1311 // TODO(pwestin): Add repeatable packet loss test. |
| 1289 // TODO(pwestin): Add test for misaligned send get calls. | 1312 // TODO(pwestin): Add test for misaligned send get calls. |
| 1290 // TODO(pwestin): Add more tests that does not resample. | 1313 // TODO(pwestin): Add more tests that does not resample. |
| 1291 // TODO(pwestin): Add test when we have starvation for our RunTask. | 1314 // TODO(pwestin): Add test when we have starvation for our RunTask. |
| 1292 | 1315 |
| 1293 } // namespace cast | 1316 } // namespace cast |
| 1294 } // namespace media | 1317 } // namespace media |
| OLD | NEW |