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 13 matching lines...) Expand all Loading... | |
24 #include "base/test/simple_test_tick_clock.h" | 24 #include "base/test/simple_test_tick_clock.h" |
25 #include "base/time/tick_clock.h" | 25 #include "base/time/tick_clock.h" |
26 #include "media/base/audio_bus.h" | 26 #include "media/base/audio_bus.h" |
27 #include "media/base/video_frame.h" | 27 #include "media/base/video_frame.h" |
28 #include "media/cast/cast_config.h" | 28 #include "media/cast/cast_config.h" |
29 #include "media/cast/cast_environment.h" | 29 #include "media/cast/cast_environment.h" |
30 #include "media/cast/cast_receiver.h" | 30 #include "media/cast/cast_receiver.h" |
31 #include "media/cast/cast_sender.h" | 31 #include "media/cast/cast_sender.h" |
32 #include "media/cast/logging/simple_event_subscriber.h" | 32 #include "media/cast/logging/simple_event_subscriber.h" |
33 #include "media/cast/test/fake_single_thread_task_runner.h" | 33 #include "media/cast/test/fake_single_thread_task_runner.h" |
34 #include "media/cast/test/skewed_single_thread_task_runner.h" | |
35 #include "media/cast/test/skewed_tick_clock.h" | |
34 #include "media/cast/test/utility/audio_utility.h" | 36 #include "media/cast/test/utility/audio_utility.h" |
35 #include "media/cast/test/utility/default_config.h" | 37 #include "media/cast/test/utility/default_config.h" |
36 #include "media/cast/test/utility/udp_proxy.h" | 38 #include "media/cast/test/utility/udp_proxy.h" |
37 #include "media/cast/test/utility/video_utility.h" | 39 #include "media/cast/test/utility/video_utility.h" |
38 #include "media/cast/transport/cast_transport_config.h" | 40 #include "media/cast/transport/cast_transport_config.h" |
39 #include "media/cast/transport/cast_transport_defines.h" | 41 #include "media/cast/transport/cast_transport_defines.h" |
40 #include "media/cast/transport/cast_transport_sender.h" | 42 #include "media/cast/transport/cast_transport_sender.h" |
41 #include "media/cast/transport/cast_transport_sender_impl.h" | 43 #include "media/cast/transport/cast_transport_sender_impl.h" |
42 #include "testing/gtest/include/gtest/gtest.h" | 44 #include "testing/gtest/include/gtest/gtest.h" |
43 | 45 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
151 ++(new_counter.counter[it->type]); | 153 ++(new_counter.counter[it->type]); |
152 event_counter_for_packet.insert( | 154 event_counter_for_packet.insert( |
153 std::make_pair(it->packet_id, new_counter)); | 155 std::make_pair(it->packet_id, new_counter)); |
154 } else { | 156 } else { |
155 ++(map_it->second.counter[it->type]); | 157 ++(map_it->second.counter[it->type]); |
156 } | 158 } |
157 } | 159 } |
158 return event_counter_for_packet; | 160 return event_counter_for_packet; |
159 } | 161 } |
160 | 162 |
161 void CountVideoFrame(int* counter, | |
162 const scoped_refptr<media::VideoFrame>& video_frame, | |
163 const base::TimeTicks& render_time, bool continuous) { | |
164 ++*counter; | |
165 } | |
166 | |
167 } // namespace | 163 } // namespace |
168 | 164 |
165 // Shim that turns forwards packets from a test::PacketPipe to a | |
166 // PacketReceiverCallback. | |
169 class LoopBackPacketPipe : public test::PacketPipe { | 167 class LoopBackPacketPipe : public test::PacketPipe { |
170 public: | 168 public: |
171 LoopBackPacketPipe(const transport::PacketReceiverCallback& packet_receiver) | 169 LoopBackPacketPipe(const transport::PacketReceiverCallback& packet_receiver) |
172 : packet_receiver_(packet_receiver) {} | 170 : packet_receiver_(packet_receiver) {} |
173 | 171 |
174 virtual ~LoopBackPacketPipe() {} | 172 virtual ~LoopBackPacketPipe() {} |
175 | 173 |
176 // PacketPipe implementations. | 174 // PacketPipe implementations. |
177 virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { | 175 virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { |
178 packet_receiver_.Run(packet.Pass()); | 176 packet_receiver_.Run(packet.Pass()); |
179 } | 177 } |
180 | 178 |
181 private: | 179 private: |
182 transport::PacketReceiverCallback packet_receiver_; | 180 transport::PacketReceiverCallback packet_receiver_; |
183 }; | 181 }; |
184 | 182 |
185 // Class that sends the packet direct from sender into the receiver with the | 183 // Class that sends the packet direct from sender into the receiver with the |
186 // ability to drop packets between the two. | 184 // ability to drop packets between the two. |
187 class LoopBackTransport : public transport::PacketSender { | 185 class LoopBackTransport : public transport::PacketSender { |
188 public: | 186 public: |
189 explicit LoopBackTransport(scoped_refptr<CastEnvironment> cast_environment) | 187 explicit LoopBackTransport(scoped_refptr<CastEnvironment> cast_environment) |
190 : send_packets_(true), | 188 : send_packets_(true), |
191 drop_packets_belonging_to_odd_frames_(false), | 189 drop_packets_belonging_to_odd_frames_(false), |
192 cast_environment_(cast_environment) {} | 190 cast_environment_(cast_environment) {} |
193 | 191 |
194 void SetPacketReceiver( | 192 void SetPacketReceiver( |
195 const transport::PacketReceiverCallback& packet_receiver) { | 193 const transport::PacketReceiverCallback& packet_receiver, |
194 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | |
195 base::TickClock* clock) { | |
196 scoped_ptr<test::PacketPipe> loopback_pipe( | 196 scoped_ptr<test::PacketPipe> loopback_pipe( |
197 new LoopBackPacketPipe(packet_receiver)); | 197 new LoopBackPacketPipe(packet_receiver)); |
198 if (packet_pipe_) { | 198 if (packet_pipe_) { |
199 packet_pipe_->AppendToPipe(loopback_pipe.Pass()); | 199 packet_pipe_->AppendToPipe(loopback_pipe.Pass()); |
200 } else { | 200 } else { |
201 packet_pipe_ = loopback_pipe.Pass(); | 201 packet_pipe_ = loopback_pipe.Pass(); |
202 } | 202 } |
203 packet_pipe_->InitOnIOThread(task_runner, clock); | |
203 } | 204 } |
204 | 205 |
205 virtual bool SendPacket(transport::PacketRef packet, | 206 virtual bool SendPacket(transport::PacketRef packet, |
206 const base::Closure& cb) OVERRIDE { | 207 const base::Closure& cb) OVERRIDE { |
207 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 208 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
208 if (!send_packets_) | 209 if (!send_packets_) |
209 return false; | 210 return false; |
210 | 211 |
211 if (drop_packets_belonging_to_odd_frames_) { | 212 if (drop_packets_belonging_to_odd_frames_) { |
212 uint32 frame_id = packet->data[13]; | 213 uint32 frame_id = packet->data[13]; |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
428 int num_called_; | 429 int num_called_; |
429 std::list<ExpectedVideoFrame> expected_frame_; | 430 std::list<ExpectedVideoFrame> expected_frame_; |
430 }; | 431 }; |
431 | 432 |
432 // The actual test class, generate synthetic data for both audio and video and | 433 // The actual test class, generate synthetic data for both audio and video and |
433 // send those through the sender and receiver and analyzes the result. | 434 // send those through the sender and receiver and analyzes the result. |
434 class End2EndTest : public ::testing::Test { | 435 class End2EndTest : public ::testing::Test { |
435 protected: | 436 protected: |
436 End2EndTest() | 437 End2EndTest() |
437 : start_time_(), | 438 : start_time_(), |
438 testing_clock_sender_(new base::SimpleTestTickClock()), | 439 task_runner_(new test::FakeSingleThreadTaskRunner(&testing_clock_)), |
439 testing_clock_receiver_(new base::SimpleTestTickClock()), | 440 testing_clock_sender_(new test::SkewedTickClock(&testing_clock_)), |
440 task_runner_( | 441 task_runner_sender_( |
441 new test::FakeSingleThreadTaskRunner(testing_clock_sender_)), | 442 new test::SkewedSingleThreadTaskRunner(task_runner_)), |
443 testing_clock_receiver_(new test::SkewedTickClock(&testing_clock_)), | |
444 task_runner_receiver_( | |
445 new test::SkewedSingleThreadTaskRunner(task_runner_)), | |
442 cast_environment_sender_(new CastEnvironment( | 446 cast_environment_sender_(new CastEnvironment( |
443 scoped_ptr<base::TickClock>(testing_clock_sender_).Pass(), | 447 scoped_ptr<base::TickClock>(testing_clock_sender_).Pass(), |
444 task_runner_, | 448 task_runner_sender_, |
445 task_runner_, | 449 task_runner_sender_, |
446 task_runner_)), | 450 task_runner_sender_)), |
447 cast_environment_receiver_(new CastEnvironment( | 451 cast_environment_receiver_(new CastEnvironment( |
448 scoped_ptr<base::TickClock>(testing_clock_receiver_).Pass(), | 452 scoped_ptr<base::TickClock>(testing_clock_receiver_).Pass(), |
449 task_runner_, | 453 task_runner_receiver_, |
450 task_runner_, | 454 task_runner_receiver_, |
451 task_runner_)), | 455 task_runner_receiver_)), |
452 receiver_to_sender_(cast_environment_receiver_), | 456 receiver_to_sender_(cast_environment_receiver_), |
453 sender_to_receiver_(cast_environment_sender_), | 457 sender_to_receiver_(cast_environment_sender_), |
454 test_receiver_audio_callback_(new TestReceiverAudioCallback()), | 458 test_receiver_audio_callback_(new TestReceiverAudioCallback()), |
455 test_receiver_video_callback_(new TestReceiverVideoCallback()) { | 459 test_receiver_video_callback_(new TestReceiverVideoCallback()) { |
456 testing_clock_sender_->Advance( | 460 testing_clock_.Advance( |
457 base::TimeDelta::FromMilliseconds(kStartMillisecond)); | |
458 testing_clock_receiver_->Advance( | |
459 base::TimeDelta::FromMilliseconds(kStartMillisecond)); | 461 base::TimeDelta::FromMilliseconds(kStartMillisecond)); |
460 cast_environment_sender_->Logging()->AddRawEventSubscriber( | 462 cast_environment_sender_->Logging()->AddRawEventSubscriber( |
461 &event_subscriber_sender_); | 463 &event_subscriber_sender_); |
462 } | 464 } |
463 | 465 |
464 void Configure(transport::VideoCodec video_codec, | 466 void Configure(transport::VideoCodec video_codec, |
465 transport::AudioCodec audio_codec, | 467 transport::AudioCodec audio_codec, |
466 int audio_sampling_frequency, | 468 int audio_sampling_frequency, |
467 bool external_audio_decoder, | 469 bool external_audio_decoder, |
468 int max_number_of_video_buffers_used) { | 470 int max_number_of_video_buffers_used) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
506 | 508 |
507 video_receiver_config_.feedback_ssrc = | 509 video_receiver_config_.feedback_ssrc = |
508 video_sender_config_.incoming_feedback_ssrc; | 510 video_sender_config_.incoming_feedback_ssrc; |
509 video_receiver_config_.incoming_ssrc = video_sender_config_.rtp_config.ssrc; | 511 video_receiver_config_.incoming_ssrc = video_sender_config_.rtp_config.ssrc; |
510 video_receiver_config_.rtp_payload_type = | 512 video_receiver_config_.rtp_payload_type = |
511 video_sender_config_.rtp_config.payload_type; | 513 video_sender_config_.rtp_config.payload_type; |
512 video_receiver_config_.use_external_decoder = false; | 514 video_receiver_config_.use_external_decoder = false; |
513 video_receiver_config_.codec = video_sender_config_.codec; | 515 video_receiver_config_.codec = video_sender_config_.codec; |
514 } | 516 } |
515 | 517 |
518 void SetSenderSkew(double skew, base::TimeDelta offset) { | |
519 testing_clock_sender_->SetSkew(skew, offset); | |
520 task_runner_sender_->SetSkew(1.0 / skew); | |
521 } | |
522 | |
523 void SetReceiverSkew(double skew, base::TimeDelta offset) { | |
524 testing_clock_receiver_->SetSkew(skew, offset); | |
525 task_runner_receiver_->SetSkew(1.0 / skew); | |
526 } | |
527 | |
516 void FeedAudioFrames(int count, bool will_be_checked) { | 528 void FeedAudioFrames(int count, bool will_be_checked) { |
517 for (int i = 0; i < count; ++i) { | 529 for (int i = 0; i < count; ++i) { |
518 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus( | 530 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus( |
519 base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs))); | 531 base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs))); |
520 const base::TimeTicks send_time = | 532 const base::TimeTicks send_time = |
521 testing_clock_sender_->NowTicks() + | 533 testing_clock_sender_->NowTicks() + |
522 i * base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs); | 534 i * base::TimeDelta::FromMilliseconds(kAudioFrameDurationMs); |
523 if (will_be_checked) | 535 if (will_be_checked) |
524 test_receiver_audio_callback_->AddExpectedResult(*audio_bus, send_time); | 536 test_receiver_audio_callback_->AddExpectedResult(*audio_bus, send_time); |
525 audio_frame_input_->InsertAudio(audio_bus.Pass(), send_time); | 537 audio_frame_input_->InsertAudio(audio_bus.Pass(), send_time); |
(...skipping 29 matching lines...) Expand all Loading... | |
555 video_receiver_config_, | 567 video_receiver_config_, |
556 &receiver_to_sender_); | 568 &receiver_to_sender_); |
557 net::IPEndPoint dummy_endpoint; | 569 net::IPEndPoint dummy_endpoint; |
558 transport_sender_.reset(new transport::CastTransportSenderImpl( | 570 transport_sender_.reset(new transport::CastTransportSenderImpl( |
559 NULL, | 571 NULL, |
560 testing_clock_sender_, | 572 testing_clock_sender_, |
561 dummy_endpoint, | 573 dummy_endpoint, |
562 base::Bind(&UpdateCastTransportStatus), | 574 base::Bind(&UpdateCastTransportStatus), |
563 base::Bind(&End2EndTest::LogRawEvents, base::Unretained(this)), | 575 base::Bind(&End2EndTest::LogRawEvents, base::Unretained(this)), |
564 base::TimeDelta::FromSeconds(1), | 576 base::TimeDelta::FromSeconds(1), |
565 task_runner_, | 577 task_runner_sender_, |
566 &sender_to_receiver_)); | 578 &sender_to_receiver_)); |
567 | 579 |
568 cast_sender_ = | 580 cast_sender_ = |
569 CastSender::Create(cast_environment_sender_, transport_sender_.get()); | 581 CastSender::Create(cast_environment_sender_, transport_sender_.get()); |
570 | 582 |
571 // Initializing audio and video senders. | 583 // Initializing audio and video senders. |
572 cast_sender_->InitializeAudio(audio_sender_config_, | 584 cast_sender_->InitializeAudio(audio_sender_config_, |
573 base::Bind(&AudioInitializationStatus)); | 585 base::Bind(&AudioInitializationStatus)); |
574 cast_sender_->InitializeVideo(video_sender_config_, | 586 cast_sender_->InitializeVideo(video_sender_config_, |
575 base::Bind(&VideoInitializationStatus), | 587 base::Bind(&VideoInitializationStatus), |
576 CreateDefaultVideoEncodeAcceleratorCallback(), | 588 CreateDefaultVideoEncodeAcceleratorCallback(), |
577 CreateDefaultVideoEncodeMemoryCallback()); | 589 CreateDefaultVideoEncodeMemoryCallback()); |
578 | 590 |
579 receiver_to_sender_.SetPacketReceiver(cast_sender_->packet_receiver()); | 591 receiver_to_sender_.SetPacketReceiver(cast_sender_->packet_receiver(), |
580 sender_to_receiver_.SetPacketReceiver(cast_receiver_->packet_receiver()); | 592 task_runner_, |
593 &testing_clock_); | |
594 sender_to_receiver_.SetPacketReceiver(cast_receiver_->packet_receiver(), | |
595 task_runner_, | |
596 &testing_clock_); | |
581 | 597 |
582 audio_frame_input_ = cast_sender_->audio_frame_input(); | 598 audio_frame_input_ = cast_sender_->audio_frame_input(); |
583 video_frame_input_ = cast_sender_->video_frame_input(); | 599 video_frame_input_ = cast_sender_->video_frame_input(); |
584 | 600 |
585 frame_receiver_ = cast_receiver_->frame_receiver(); | 601 frame_receiver_ = cast_receiver_->frame_receiver(); |
586 | 602 |
587 audio_bus_factory_.reset( | 603 audio_bus_factory_.reset( |
588 new TestAudioBusFactory(audio_sender_config_.channels, | 604 new TestAudioBusFactory(audio_sender_config_.channels, |
589 audio_sender_config_.frequency, | 605 audio_sender_config_.frequency, |
590 kSoundFrequency, | 606 kSoundFrequency, |
(...skipping 23 matching lines...) Expand all Loading... | |
614 VideoFrame::I420, size, gfx::Rect(size), size, time_diff); | 630 VideoFrame::I420, size, gfx::Rect(size), size, time_diff); |
615 PopulateVideoFrame(video_frame, start_value); | 631 PopulateVideoFrame(video_frame, start_value); |
616 video_frame_input_->InsertRawVideoFrame(video_frame, capture_time); | 632 video_frame_input_->InsertRawVideoFrame(video_frame, capture_time); |
617 } | 633 } |
618 | 634 |
619 void SendFakeVideoFrame(const base::TimeTicks& capture_time) { | 635 void SendFakeVideoFrame(const base::TimeTicks& capture_time) { |
620 video_frame_input_->InsertRawVideoFrame( | 636 video_frame_input_->InsertRawVideoFrame( |
621 media::VideoFrame::CreateBlackFrame(gfx::Size(2, 2)), capture_time); | 637 media::VideoFrame::CreateBlackFrame(gfx::Size(2, 2)), capture_time); |
622 } | 638 } |
623 | 639 |
624 void RunTasks(int during_ms) { | 640 void RunTasks(int ms) { |
625 for (int i = 0; i < during_ms; ++i) { | 641 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(ms)); |
626 // Call process the timers every 1 ms. | 642 } |
627 testing_clock_sender_->Advance(base::TimeDelta::FromMilliseconds(1)); | 643 |
628 testing_clock_receiver_->Advance(base::TimeDelta::FromMilliseconds(1)); | 644 void BasicPlayerGotVideoFrame( |
629 task_runner_->RunTasks(); | 645 const scoped_refptr<media::VideoFrame>& video_frame, |
630 } | 646 const base::TimeTicks& render_time, bool continuous) { |
647 video_ticks_.push_back(std::make_pair( | |
648 testing_clock_receiver_->NowTicks(), | |
649 render_time)); | |
650 frame_receiver_->GetRawVideoFrame( | |
651 base::Bind(&End2EndTest::BasicPlayerGotVideoFrame, | |
652 base::Unretained(this))); | |
653 } | |
654 | |
655 void BasicPlayerGotAudioFrame(scoped_ptr<AudioBus> audio_bus, | |
656 const base::TimeTicks& playout_time, | |
657 bool is_continuous) { | |
658 audio_ticks_.push_back(std::make_pair( | |
659 testing_clock_receiver_->NowTicks(), | |
660 playout_time)); | |
661 frame_receiver_->GetRawAudioFrame( | |
662 base::Bind(&End2EndTest::BasicPlayerGotAudioFrame, | |
663 base::Unretained(this))); | |
664 } | |
665 | |
666 void StartBasicPlayer() { | |
667 frame_receiver_->GetRawVideoFrame( | |
668 base::Bind(&End2EndTest::BasicPlayerGotVideoFrame, | |
669 base::Unretained(this))); | |
670 frame_receiver_->GetRawAudioFrame( | |
671 base::Bind(&End2EndTest::BasicPlayerGotAudioFrame, | |
672 base::Unretained(this))); | |
631 } | 673 } |
632 | 674 |
633 void LogRawEvents(const std::vector<PacketEvent>& packet_events) { | 675 void LogRawEvents(const std::vector<PacketEvent>& packet_events) { |
634 EXPECT_FALSE(packet_events.empty()); | 676 EXPECT_FALSE(packet_events.empty()); |
635 for (std::vector<media::cast::PacketEvent>::const_iterator it = | 677 for (std::vector<media::cast::PacketEvent>::const_iterator it = |
636 packet_events.begin(); | 678 packet_events.begin(); |
637 it != packet_events.end(); | 679 it != packet_events.end(); |
638 ++it) { | 680 ++it) { |
639 cast_environment_sender_->Logging()->InsertPacketEvent(it->timestamp, | 681 cast_environment_sender_->Logging()->InsertPacketEvent(it->timestamp, |
640 it->type, | 682 it->type, |
641 it->media_type, | 683 it->media_type, |
642 it->rtp_timestamp, | 684 it->rtp_timestamp, |
643 it->frame_id, | 685 it->frame_id, |
644 it->packet_id, | 686 it->packet_id, |
645 it->max_packet_id, | 687 it->max_packet_id, |
646 it->size); | 688 it->size); |
647 } | 689 } |
648 } | 690 } |
649 | 691 |
650 AudioReceiverConfig audio_receiver_config_; | 692 AudioReceiverConfig audio_receiver_config_; |
651 VideoReceiverConfig video_receiver_config_; | 693 VideoReceiverConfig video_receiver_config_; |
652 AudioSenderConfig audio_sender_config_; | 694 AudioSenderConfig audio_sender_config_; |
653 VideoSenderConfig video_sender_config_; | 695 VideoSenderConfig video_sender_config_; |
654 | 696 |
655 base::TimeTicks start_time_; | 697 base::TimeTicks start_time_; |
656 base::SimpleTestTickClock* testing_clock_sender_; | 698 |
657 base::SimpleTestTickClock* testing_clock_receiver_; | 699 // These run in "test time" |
700 base::SimpleTestTickClock testing_clock_; | |
658 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 701 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
702 | |
703 // These run on the sender timeline. | |
704 test::SkewedTickClock* testing_clock_sender_; | |
705 scoped_refptr<test::SkewedSingleThreadTaskRunner> task_runner_sender_; | |
706 | |
707 // These run on the receiver timeline. | |
708 test::SkewedTickClock* testing_clock_receiver_; | |
709 scoped_refptr<test::SkewedSingleThreadTaskRunner> task_runner_receiver_; | |
710 | |
659 scoped_refptr<CastEnvironment> cast_environment_sender_; | 711 scoped_refptr<CastEnvironment> cast_environment_sender_; |
660 scoped_refptr<CastEnvironment> cast_environment_receiver_; | 712 scoped_refptr<CastEnvironment> cast_environment_receiver_; |
661 | 713 |
662 LoopBackTransport receiver_to_sender_; | 714 LoopBackTransport receiver_to_sender_; |
663 LoopBackTransport sender_to_receiver_; | 715 LoopBackTransport sender_to_receiver_; |
664 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; | 716 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; |
665 | 717 |
666 scoped_ptr<CastReceiver> cast_receiver_; | 718 scoped_ptr<CastReceiver> cast_receiver_; |
667 scoped_ptr<CastSender> cast_sender_; | 719 scoped_ptr<CastSender> cast_sender_; |
668 scoped_refptr<AudioFrameInput> audio_frame_input_; | 720 scoped_refptr<AudioFrameInput> audio_frame_input_; |
669 scoped_refptr<VideoFrameInput> video_frame_input_; | 721 scoped_refptr<VideoFrameInput> video_frame_input_; |
670 scoped_refptr<FrameReceiver> frame_receiver_; | 722 scoped_refptr<FrameReceiver> frame_receiver_; |
671 | 723 |
672 scoped_refptr<TestReceiverAudioCallback> test_receiver_audio_callback_; | 724 scoped_refptr<TestReceiverAudioCallback> test_receiver_audio_callback_; |
673 scoped_refptr<TestReceiverVideoCallback> test_receiver_video_callback_; | 725 scoped_refptr<TestReceiverVideoCallback> test_receiver_video_callback_; |
674 | 726 |
675 scoped_ptr<TestAudioBusFactory> audio_bus_factory_; | 727 scoped_ptr<TestAudioBusFactory> audio_bus_factory_; |
676 | 728 |
677 SimpleEventSubscriber event_subscriber_sender_; | 729 SimpleEventSubscriber event_subscriber_sender_; |
678 std::vector<FrameEvent> frame_events_; | 730 std::vector<FrameEvent> frame_events_; |
679 std::vector<PacketEvent> packet_events_; | 731 std::vector<PacketEvent> packet_events_; |
732 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > audio_ticks_; | |
733 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > video_ticks_; | |
680 // |transport_sender_| has a RepeatingTimer which needs a MessageLoop. | 734 // |transport_sender_| has a RepeatingTimer which needs a MessageLoop. |
681 base::MessageLoop message_loop_; | 735 base::MessageLoop message_loop_; |
682 }; | 736 }; |
683 | 737 |
684 TEST_F(End2EndTest, LoopNoLossPcm16) { | 738 TEST_F(End2EndTest, LoopNoLossPcm16) { |
685 Configure(transport::kVp8, transport::kPcm16, 32000, false, 1); | 739 Configure(transport::kVp8, transport::kPcm16, 32000, false, 1); |
686 // Reduce video resolution to allow processing multiple frames within a | 740 // Reduce video resolution to allow processing multiple frames within a |
687 // reasonable time frame. | 741 // reasonable time frame. |
688 video_sender_config_.width = kVideoQcifWidth; | 742 video_sender_config_.width = kVideoQcifWidth; |
689 video_sender_config_.height = kVideoQcifHeight; | 743 video_sender_config_.height = kVideoQcifHeight; |
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1232 | 1286 |
1233 // Verify that there were no other events logged with respect to this frame. | 1287 // Verify that there were no other events logged with respect to this frame. |
1234 // (i.e. Total event count = expected event count) | 1288 // (i.e. Total event count = expected event count) |
1235 EXPECT_EQ(total_event_count_for_frame, expected_event_count_for_frame); | 1289 EXPECT_EQ(total_event_count_for_frame, expected_event_count_for_frame); |
1236 } | 1290 } |
1237 } | 1291 } |
1238 | 1292 |
1239 TEST_F(End2EndTest, BasicFakeSoftwareVideo) { | 1293 TEST_F(End2EndTest, BasicFakeSoftwareVideo) { |
1240 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); | 1294 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); |
1241 Create(); | 1295 Create(); |
1296 StartBasicPlayer(); | |
1242 | 1297 |
1243 int frames_counter = 0; | 1298 int frames_counter = 0; |
1244 int received_counter = 0; | |
1245 for (; frames_counter < 1000; ++frames_counter) { | 1299 for (; frames_counter < 1000; ++frames_counter) { |
1246 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1300 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
1247 frame_receiver_->GetRawVideoFrame( | |
1248 base::Bind(&CountVideoFrame, &received_counter)); | |
1249 RunTasks(kFrameTimerMs); | 1301 RunTasks(kFrameTimerMs); |
1250 } | 1302 } |
1251 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1303 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
1252 EXPECT_EQ(1000, received_counter); | 1304 EXPECT_EQ(1000ul, video_ticks_.size()); |
1305 } | |
1306 | |
1307 TEST_F(End2EndTest, WonkyClock1) { | |
1308 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); | |
1309 Create(); | |
1310 StartBasicPlayer(); | |
1311 SetReceiverSkew(2.0, base::TimeDelta()); | |
1312 | |
1313 int frames_counter = 0; | |
1314 for (; frames_counter < 10000; ++frames_counter) { | |
1315 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | |
1316 RunTasks(kFrameTimerMs); | |
1317 } | |
1318 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | |
1319 EXPECT_EQ(10000ul, video_ticks_.size()); | |
1320 } | |
1321 | |
1322 TEST_F(End2EndTest, WonkyClock2) { | |
Alpha Left Google
2014/05/15 22:21:24
How is this different from the test above? Please
hubbe
2014/05/16 04:31:10
Done.
| |
1323 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); | |
1324 Create(); | |
1325 StartBasicPlayer(); | |
1326 SetReceiverSkew(0.5, base::TimeDelta()); | |
1327 | |
1328 int frames_counter = 0; | |
1329 for (; frames_counter < 10000; ++frames_counter) { | |
1330 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | |
1331 RunTasks(kFrameTimerMs); | |
1332 } | |
1333 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | |
1334 EXPECT_EQ(10000ul, video_ticks_.size()); | |
1335 } | |
1336 | |
1337 TEST_F(End2EndTest, EvilNetwork) { | |
1338 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); | |
1339 receiver_to_sender_.SetPacketPipe(test::EvilNetwork().Pass()); | |
1340 sender_to_receiver_.SetPacketPipe(test::EvilNetwork().Pass()); | |
1341 Create(); | |
1342 StartBasicPlayer(); | |
1343 | |
1344 int frames_counter = 0; | |
1345 for (; frames_counter < 10000; ++frames_counter) { | |
1346 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | |
1347 RunTasks(kFrameTimerMs); | |
1348 } | |
1349 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); | |
1350 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. | |
1351 EXPECT_GT(video_ticks_.size(), 100ul); | |
1352 EXPECT_LT((video_ticks_.back().second - test_end).InMilliseconds(), 1000); | |
1253 } | 1353 } |
1254 | 1354 |
1255 // TODO(pwestin): Add repeatable packet loss test. | 1355 // TODO(pwestin): Add repeatable packet loss test. |
1256 // TODO(pwestin): Add test for misaligned send get calls. | 1356 // TODO(pwestin): Add test for misaligned send get calls. |
1257 // TODO(pwestin): Add more tests that does not resample. | 1357 // TODO(pwestin): Add more tests that does not resample. |
1258 // TODO(pwestin): Add test when we have starvation for our RunTask. | 1358 // TODO(pwestin): Add test when we have starvation for our RunTask. |
1259 | 1359 |
1260 } // namespace cast | 1360 } // namespace cast |
1261 } // namespace media | 1361 } // namespace media |
OLD | NEW |