Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Side by Side Diff: media/cast/test/end2end_unittest.cc

Issue 289083002: Cast: Add tests for clocks being slow/fast (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: added missing files Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698