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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 compressed.reserve(base_16.size() / 2); | 87 compressed.reserve(base_16.size() / 2); |
88 | 88 |
89 std::vector<uint8_t> v; | 89 std::vector<uint8_t> v; |
90 if (!base::HexStringToBytes(base_16, &v)) { | 90 if (!base::HexStringToBytes(base_16, &v)) { |
91 NOTREACHED(); | 91 NOTREACHED(); |
92 } | 92 } |
93 compressed.assign(reinterpret_cast<const char*>(&v[0]), v.size()); | 93 compressed.assign(reinterpret_cast<const char*>(&v[0]), v.size()); |
94 return compressed; | 94 return compressed; |
95 } | 95 } |
96 | 96 |
97 void UpdateCastTransportStatus(CastTransportStatus status) { | |
98 bool result = (status == TRANSPORT_AUDIO_INITIALIZED || | |
99 status == TRANSPORT_VIDEO_INITIALIZED); | |
100 EXPECT_TRUE(result); | |
101 } | |
102 | |
103 void ExpectSuccessOperationalStatus(OperationalStatus status) { | 97 void ExpectSuccessOperationalStatus(OperationalStatus status) { |
104 EXPECT_EQ(STATUS_INITIALIZED, status); | 98 EXPECT_EQ(STATUS_INITIALIZED, status); |
105 } | 99 } |
106 | 100 |
107 // This is wrapped in a struct because it needs to be put into a std::map. | 101 // This is wrapped in a struct because it needs to be put into a std::map. |
108 typedef struct { int counter[kNumOfLoggingEvents]; } LoggingEventCounts; | 102 typedef struct { int counter[kNumOfLoggingEvents]; } LoggingEventCounts; |
109 | 103 |
110 // Constructs a map from each frame (RTP timestamp) to counts of each event | 104 // Constructs a map from each frame (RTP timestamp) to counts of each event |
111 // type logged for that frame. | 105 // type logged for that frame. |
112 std::map<RtpTimeTicks, LoggingEventCounts> GetEventCountsForFrameEvents( | 106 std::map<RtpTimeTicks, LoggingEventCounts> GetEventCountsForFrameEvents( |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 return true; | 200 return true; |
207 } | 201 } |
208 | 202 |
209 scoped_ptr<Packet> packet_copy(new Packet(packet->data)); | 203 scoped_ptr<Packet> packet_copy(new Packet(packet->data)); |
210 packet_pipe_->Send(std::move(packet_copy)); | 204 packet_pipe_->Send(std::move(packet_copy)); |
211 return true; | 205 return true; |
212 } | 206 } |
213 | 207 |
214 int64_t GetBytesSent() final { return bytes_sent_; } | 208 int64_t GetBytesSent() final { return bytes_sent_; } |
215 | 209 |
| 210 void StartReceiving( |
| 211 const PacketReceiverCallbackWithStatus& packet_receiver) final {} |
| 212 |
| 213 void StopReceiving() final {} |
| 214 |
216 void SetSendPackets(bool send_packets) { send_packets_ = send_packets; } | 215 void SetSendPackets(bool send_packets) { send_packets_ = send_packets; } |
217 | 216 |
218 void DropAllPacketsBelongingToOddFrames() { | 217 void DropAllPacketsBelongingToOddFrames() { |
219 drop_packets_belonging_to_odd_frames_ = true; | 218 drop_packets_belonging_to_odd_frames_ = true; |
220 } | 219 } |
221 | 220 |
222 void SetPacketPipe(scoped_ptr<test::PacketPipe> pipe) { | 221 void SetPacketPipe(scoped_ptr<test::PacketPipe> pipe) { |
223 // Append the loopback pipe to the end. | 222 // Append the loopback pipe to the end. |
224 pipe->AppendToPipe(std::move(packet_pipe_)); | 223 pipe->AppendToPipe(std::move(packet_pipe_)); |
225 packet_pipe_ = std::move(pipe); | 224 packet_pipe_ = std::move(pipe); |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 int num_called_; | 389 int num_called_; |
391 std::list<ExpectedVideoFrame> expected_frame_; | 390 std::list<ExpectedVideoFrame> expected_frame_; |
392 base::TimeTicks last_playout_time_; | 391 base::TimeTicks last_playout_time_; |
393 }; | 392 }; |
394 | 393 |
395 } // namespace | 394 } // namespace |
396 | 395 |
397 // The actual test class, generate synthetic data for both audio and video and | 396 // The actual test class, generate synthetic data for both audio and video and |
398 // send those through the sender and receiver and analyzes the result. | 397 // send those through the sender and receiver and analyzes the result. |
399 class End2EndTest : public ::testing::Test { | 398 class End2EndTest : public ::testing::Test { |
| 399 public: |
| 400 void ReceivePacket(scoped_ptr<media::cast::Packet> packet) { |
| 401 cast_receiver_->ReceivePacket(std::move(packet)); |
| 402 }; |
| 403 |
400 protected: | 404 protected: |
401 End2EndTest() | 405 End2EndTest() |
402 : start_time_(), | 406 : start_time_(), |
403 task_runner_(new test::FakeSingleThreadTaskRunner(&testing_clock_)), | 407 task_runner_(new test::FakeSingleThreadTaskRunner(&testing_clock_)), |
404 testing_clock_sender_(new test::SkewedTickClock(&testing_clock_)), | 408 testing_clock_sender_(new test::SkewedTickClock(&testing_clock_)), |
405 task_runner_sender_( | 409 task_runner_sender_( |
406 new test::SkewedSingleThreadTaskRunner(task_runner_)), | 410 new test::SkewedSingleThreadTaskRunner(task_runner_)), |
407 testing_clock_receiver_(new test::SkewedTickClock(&testing_clock_)), | 411 testing_clock_receiver_(new test::SkewedTickClock(&testing_clock_)), |
408 task_runner_receiver_( | 412 task_runner_receiver_( |
409 new test::SkewedSingleThreadTaskRunner(task_runner_)), | 413 new test::SkewedSingleThreadTaskRunner(task_runner_)), |
410 cast_environment_sender_(new CastEnvironment( | 414 cast_environment_sender_(new CastEnvironment( |
411 scoped_ptr<base::TickClock>(testing_clock_sender_), | 415 scoped_ptr<base::TickClock>(testing_clock_sender_), |
412 task_runner_sender_, | 416 task_runner_sender_, |
413 task_runner_sender_, | 417 task_runner_sender_, |
414 task_runner_sender_)), | 418 task_runner_sender_)), |
415 cast_environment_receiver_(new CastEnvironment( | 419 cast_environment_receiver_(new CastEnvironment( |
416 scoped_ptr<base::TickClock>(testing_clock_receiver_), | 420 scoped_ptr<base::TickClock>(testing_clock_receiver_), |
417 task_runner_receiver_, | 421 task_runner_receiver_, |
418 task_runner_receiver_, | 422 task_runner_receiver_, |
419 task_runner_receiver_)), | 423 task_runner_receiver_)), |
420 receiver_to_sender_(cast_environment_receiver_), | 424 receiver_to_sender_(new LoopBackTransport(cast_environment_receiver_)), |
421 sender_to_receiver_(cast_environment_sender_), | 425 sender_to_receiver_(new LoopBackTransport(cast_environment_sender_)), |
422 test_receiver_audio_callback_(new TestReceiverAudioCallback()), | 426 test_receiver_audio_callback_(new TestReceiverAudioCallback()), |
423 test_receiver_video_callback_(new TestReceiverVideoCallback()) { | 427 test_receiver_video_callback_(new TestReceiverVideoCallback()) { |
424 testing_clock_.Advance( | 428 testing_clock_.Advance( |
425 base::TimeDelta::FromMilliseconds(kStartMillisecond)); | 429 base::TimeDelta::FromMilliseconds(kStartMillisecond)); |
426 cast_environment_sender_->logger()->Subscribe(&event_subscriber_sender_); | 430 cast_environment_sender_->logger()->Subscribe(&event_subscriber_sender_); |
427 } | 431 } |
428 | 432 |
429 void Configure(Codec video_codec, Codec audio_codec) { | 433 void Configure(Codec video_codec, Codec audio_codec) { |
430 audio_sender_config_.ssrc = 1; | 434 audio_sender_config_.ssrc = 1; |
431 audio_sender_config_.receiver_ssrc = 2; | 435 audio_sender_config_.receiver_ssrc = 2; |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 | 546 |
543 void RequestAudioFrames(int count, bool with_check) { | 547 void RequestAudioFrames(int count, bool with_check) { |
544 for (int i = 0; i < count; ++i) { | 548 for (int i = 0; i < count; ++i) { |
545 cast_receiver_->RequestDecodedAudioFrame( | 549 cast_receiver_->RequestDecodedAudioFrame( |
546 base::Bind(with_check ? &TestReceiverAudioCallback::CheckAudioFrame : | 550 base::Bind(with_check ? &TestReceiverAudioCallback::CheckAudioFrame : |
547 &TestReceiverAudioCallback::IgnoreAudioFrame, | 551 &TestReceiverAudioCallback::IgnoreAudioFrame, |
548 test_receiver_audio_callback_)); | 552 test_receiver_audio_callback_)); |
549 } | 553 } |
550 } | 554 } |
551 | 555 |
552 void ReceivePacket(scoped_ptr<Packet> packet) { | 556 void Create(); |
553 cast_receiver_->ReceivePacket(std::move(packet)); | |
554 } | |
555 | |
556 void Create() { | |
557 net::IPEndPoint dummy_endpoint; | |
558 transport_sender_.reset(new CastTransportSenderImpl( | |
559 nullptr, testing_clock_sender_, dummy_endpoint, dummy_endpoint, | |
560 make_scoped_ptr(new base::DictionaryValue), | |
561 base::Bind(&UpdateCastTransportStatus), | |
562 base::Bind(&LogEventDispatcher::DispatchBatchOfEvents, | |
563 base::Unretained(cast_environment_sender_->logger())), | |
564 base::TimeDelta::FromMilliseconds(1), task_runner_sender_, | |
565 PacketReceiverCallback(), &sender_to_receiver_)); | |
566 | |
567 transport_receiver_.reset(new CastTransportSenderImpl( | |
568 nullptr, testing_clock_sender_, dummy_endpoint, dummy_endpoint, | |
569 make_scoped_ptr(new base::DictionaryValue), | |
570 base::Bind(&UpdateCastTransportStatus), | |
571 base::Bind(&LogEventDispatcher::DispatchBatchOfEvents, | |
572 base::Unretained(cast_environment_receiver_->logger())), | |
573 base::TimeDelta::FromMilliseconds(1), task_runner_sender_, | |
574 base::Bind(&End2EndTest::ReceivePacket, base::Unretained(this)), | |
575 &receiver_to_sender_)); | |
576 | |
577 cast_receiver_ = CastReceiver::Create(cast_environment_receiver_, | |
578 audio_receiver_config_, | |
579 video_receiver_config_, | |
580 transport_receiver_.get()); | |
581 | |
582 cast_sender_ = | |
583 CastSender::Create(cast_environment_sender_, transport_sender_.get()); | |
584 | |
585 // Initializing audio and video senders. | |
586 cast_sender_->InitializeAudio( | |
587 audio_sender_config_, | |
588 base::Bind(&ExpectSuccessOperationalStatus)); | |
589 cast_sender_->InitializeVideo( | |
590 video_sender_config_, | |
591 base::Bind(&ExpectSuccessOperationalStatus), | |
592 CreateDefaultVideoEncodeAcceleratorCallback(), | |
593 CreateDefaultVideoEncodeMemoryCallback()); | |
594 task_runner_->RunTasks(); | |
595 | |
596 receiver_to_sender_.SetPacketReceiver( | |
597 transport_sender_->PacketReceiverForTesting(), | |
598 task_runner_, | |
599 &testing_clock_); | |
600 sender_to_receiver_.SetPacketReceiver( | |
601 transport_receiver_->PacketReceiverForTesting(), | |
602 task_runner_, | |
603 &testing_clock_); | |
604 | |
605 audio_frame_input_ = cast_sender_->audio_frame_input(); | |
606 video_frame_input_ = cast_sender_->video_frame_input(); | |
607 | |
608 audio_bus_factory_.reset( | |
609 new TestAudioBusFactory(audio_sender_config_.channels, | |
610 audio_sender_config_.frequency, | |
611 kSoundFrequency, | |
612 kSoundVolume)); | |
613 } | |
614 | 557 |
615 ~End2EndTest() override { | 558 ~End2EndTest() override { |
616 cast_environment_sender_->logger()->Unsubscribe(&event_subscriber_sender_); | 559 cast_environment_sender_->logger()->Unsubscribe(&event_subscriber_sender_); |
617 } | 560 } |
618 | 561 |
619 void TearDown() final { | 562 void TearDown() final { |
620 cast_sender_.reset(); | 563 cast_sender_.reset(); |
621 cast_receiver_.reset(); | 564 cast_receiver_.reset(); |
622 task_runner_->RunTasks(); | 565 task_runner_->RunTasks(); |
623 } | 566 } |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
909 base::TimeDelta min_video_playout_delta_; | 852 base::TimeDelta min_video_playout_delta_; |
910 base::TimeDelta max_video_playout_delta_; | 853 base::TimeDelta max_video_playout_delta_; |
911 base::TimeDelta max_video_playout_curvature_; | 854 base::TimeDelta max_video_playout_curvature_; |
912 base::TimeTicks last_video_playout_time_; | 855 base::TimeTicks last_video_playout_time_; |
913 base::TimeDelta last_video_playout_delta_; | 856 base::TimeDelta last_video_playout_delta_; |
914 base::TimeTicks last_audio_playout_time_; | 857 base::TimeTicks last_audio_playout_time_; |
915 | 858 |
916 scoped_refptr<CastEnvironment> cast_environment_sender_; | 859 scoped_refptr<CastEnvironment> cast_environment_sender_; |
917 scoped_refptr<CastEnvironment> cast_environment_receiver_; | 860 scoped_refptr<CastEnvironment> cast_environment_receiver_; |
918 | 861 |
919 LoopBackTransport receiver_to_sender_; | 862 LoopBackTransport* receiver_to_sender_; // Owned by CastTransportSender. |
920 LoopBackTransport sender_to_receiver_; | 863 LoopBackTransport* sender_to_receiver_; // Owned by CastTransportSender. |
| 864 |
921 scoped_ptr<CastTransportSenderImpl> transport_sender_; | 865 scoped_ptr<CastTransportSenderImpl> transport_sender_; |
922 scoped_ptr<CastTransportSenderImpl> transport_receiver_; | 866 scoped_ptr<CastTransportSenderImpl> transport_receiver_; |
923 | 867 |
924 scoped_ptr<CastReceiver> cast_receiver_; | 868 scoped_ptr<CastReceiver> cast_receiver_; |
925 scoped_ptr<CastSender> cast_sender_; | 869 scoped_ptr<CastSender> cast_sender_; |
926 scoped_refptr<AudioFrameInput> audio_frame_input_; | 870 scoped_refptr<AudioFrameInput> audio_frame_input_; |
927 scoped_refptr<VideoFrameInput> video_frame_input_; | 871 scoped_refptr<VideoFrameInput> video_frame_input_; |
928 | 872 |
929 scoped_refptr<TestReceiverAudioCallback> test_receiver_audio_callback_; | 873 scoped_refptr<TestReceiverAudioCallback> test_receiver_audio_callback_; |
930 scoped_refptr<TestReceiverVideoCallback> test_receiver_video_callback_; | 874 scoped_refptr<TestReceiverVideoCallback> test_receiver_video_callback_; |
931 | 875 |
932 scoped_ptr<TestAudioBusFactory> audio_bus_factory_; | 876 scoped_ptr<TestAudioBusFactory> audio_bus_factory_; |
933 | 877 |
934 SimpleEventSubscriber event_subscriber_sender_; | 878 SimpleEventSubscriber event_subscriber_sender_; |
935 | 879 |
936 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > audio_ticks_; | 880 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > audio_ticks_; |
937 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > video_ticks_; | 881 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > video_ticks_; |
938 | 882 |
939 // |transport_sender_| has a RepeatingTimer which needs a MessageLoop. | 883 // |transport_sender_| has a RepeatingTimer which needs a MessageLoop. |
940 base::MessageLoop message_loop_; | 884 base::MessageLoop message_loop_; |
941 }; | 885 }; |
942 | 886 |
| 887 namespace { |
| 888 |
| 889 class TransportClient : public CastTransportSender::Client { |
| 890 public: |
| 891 TransportClient(LogEventDispatcher* log_event_dispatcher, |
| 892 End2EndTest* e2e_test) |
| 893 : log_event_dispatcher_(log_event_dispatcher), e2e_test_(e2e_test) {} |
| 894 |
| 895 void OnStatusChanged(media::cast::CastTransportStatus status) final { |
| 896 bool result = (status == TRANSPORT_AUDIO_INITIALIZED || |
| 897 status == TRANSPORT_VIDEO_INITIALIZED); |
| 898 EXPECT_TRUE(result); |
| 899 }; |
| 900 void OnLoggingEventsReceived( |
| 901 scoped_ptr<std::vector<FrameEvent>> frame_events, |
| 902 scoped_ptr<std::vector<PacketEvent>> packet_events) final { |
| 903 log_event_dispatcher_->DispatchBatchOfEvents(std::move(frame_events), |
| 904 std::move(packet_events)); |
| 905 }; |
| 906 void ProcessRtpPacket(scoped_ptr<Packet> packet) final { |
| 907 if (e2e_test_) |
| 908 e2e_test_->ReceivePacket(std::move(packet)); |
| 909 }; |
| 910 |
| 911 private: |
| 912 LogEventDispatcher* const log_event_dispatcher_; // Not owned by this class. |
| 913 End2EndTest* const e2e_test_; // Not owned by this class. |
| 914 |
| 915 DISALLOW_COPY_AND_ASSIGN(TransportClient); |
| 916 }; |
| 917 |
| 918 } // namespace |
| 919 |
| 920 void End2EndTest::Create() { |
| 921 transport_sender_.reset(new CastTransportSenderImpl( |
| 922 testing_clock_sender_, base::TimeDelta::FromMilliseconds(1), |
| 923 make_scoped_ptr( |
| 924 new TransportClient(cast_environment_sender_->logger(), nullptr)), |
| 925 make_scoped_ptr(sender_to_receiver_), task_runner_sender_)); |
| 926 |
| 927 transport_receiver_.reset(new CastTransportSenderImpl( |
| 928 testing_clock_sender_, base::TimeDelta::FromMilliseconds(1), |
| 929 make_scoped_ptr( |
| 930 new TransportClient(cast_environment_receiver_->logger(), this)), |
| 931 make_scoped_ptr(receiver_to_sender_), task_runner_sender_)); |
| 932 |
| 933 cast_receiver_ = |
| 934 CastReceiver::Create(cast_environment_receiver_, audio_receiver_config_, |
| 935 video_receiver_config_, transport_receiver_.get()); |
| 936 |
| 937 cast_sender_ = |
| 938 CastSender::Create(cast_environment_sender_, transport_sender_.get()); |
| 939 |
| 940 // Initializing audio and video senders. |
| 941 cast_sender_->InitializeAudio(audio_sender_config_, |
| 942 base::Bind(&ExpectSuccessOperationalStatus)); |
| 943 cast_sender_->InitializeVideo(video_sender_config_, |
| 944 base::Bind(&ExpectSuccessOperationalStatus), |
| 945 CreateDefaultVideoEncodeAcceleratorCallback(), |
| 946 CreateDefaultVideoEncodeMemoryCallback()); |
| 947 task_runner_->RunTasks(); |
| 948 |
| 949 receiver_to_sender_->SetPacketReceiver( |
| 950 transport_sender_->PacketReceiverForTesting(), task_runner_, |
| 951 &testing_clock_); |
| 952 sender_to_receiver_->SetPacketReceiver( |
| 953 transport_receiver_->PacketReceiverForTesting(), task_runner_, |
| 954 &testing_clock_); |
| 955 |
| 956 audio_frame_input_ = cast_sender_->audio_frame_input(); |
| 957 video_frame_input_ = cast_sender_->video_frame_input(); |
| 958 |
| 959 audio_bus_factory_.reset(new TestAudioBusFactory( |
| 960 audio_sender_config_.channels, audio_sender_config_.frequency, |
| 961 kSoundFrequency, kSoundVolume)); |
| 962 } |
| 963 |
943 TEST_F(End2EndTest, LoopWithLosslessEncoding) { | 964 TEST_F(End2EndTest, LoopWithLosslessEncoding) { |
944 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16); | 965 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16); |
945 Create(); | 966 Create(); |
946 | 967 |
947 const auto frames_sent = RunAudioVideoLoop(base::TimeDelta::FromSeconds(3)); | 968 const auto frames_sent = RunAudioVideoLoop(base::TimeDelta::FromSeconds(3)); |
948 | 969 |
949 // Make sure that we send a RTCP message containing receiver log data, then | 970 // Make sure that we send a RTCP message containing receiver log data, then |
950 // verify the accumulated logging data. | 971 // verify the accumulated logging data. |
951 RunTasks(750); | 972 RunTasks(750); |
952 VerifyLogging(frames_sent.first, frames_sent.second); | 973 VerifyLogging(frames_sent.first, frames_sent.second); |
(...skipping 20 matching lines...) Expand all Loading... |
973 // discontinuity in the timeline, throwing off the test expectations. See TODOs | 994 // discontinuity in the timeline, throwing off the test expectations. See TODOs |
974 // in audio_receiver.cc for likely cause(s) of this bug. | 995 // in audio_receiver.cc for likely cause(s) of this bug. |
975 // http://crbug.com/573126 (history: http://crbug.com/314233) | 996 // http://crbug.com/573126 (history: http://crbug.com/314233) |
976 TEST_F(End2EndTest, DISABLED_StartSenderBeforeReceiver) { | 997 TEST_F(End2EndTest, DISABLED_StartSenderBeforeReceiver) { |
977 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16); | 998 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16); |
978 Create(); | 999 Create(); |
979 | 1000 |
980 int frame_number = 0; | 1001 int frame_number = 0; |
981 int audio_diff = kFrameTimerMs; | 1002 int audio_diff = kFrameTimerMs; |
982 | 1003 |
983 sender_to_receiver_.SetSendPackets(false); | 1004 sender_to_receiver_->SetSendPackets(false); |
984 | 1005 |
985 const int test_delay_ms = 100; | 1006 const int test_delay_ms = 100; |
986 | 1007 |
987 const int kNumVideoFramesBeforeReceiverStarted = 2; | 1008 const int kNumVideoFramesBeforeReceiverStarted = 2; |
988 const base::TimeTicks initial_send_time = testing_clock_sender_->NowTicks(); | 1009 const base::TimeTicks initial_send_time = testing_clock_sender_->NowTicks(); |
989 const base::TimeDelta expected_delay = | 1010 const base::TimeDelta expected_delay = |
990 base::TimeDelta::FromMilliseconds(test_delay_ms + kFrameTimerMs); | 1011 base::TimeDelta::FromMilliseconds(test_delay_ms + kFrameTimerMs); |
991 for (int i = 0; i < kNumVideoFramesBeforeReceiverStarted; ++i) { | 1012 for (int i = 0; i < kNumVideoFramesBeforeReceiverStarted; ++i) { |
992 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; | 1013 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; |
993 audio_diff -= num_audio_frames * kAudioFrameDurationMs; | 1014 audio_diff -= num_audio_frames * kAudioFrameDurationMs; |
(...skipping 14 matching lines...) Expand all Loading... |
1008 if (num_audio_frames > 0) | 1029 if (num_audio_frames > 0) |
1009 RunTasks(kAudioFrameDurationMs); // Advance clock forward. | 1030 RunTasks(kAudioFrameDurationMs); // Advance clock forward. |
1010 if (num_audio_frames > 1) | 1031 if (num_audio_frames > 1) |
1011 FeedAudioFramesWithExpectedDelay(num_audio_frames - 1, expected_delay); | 1032 FeedAudioFramesWithExpectedDelay(num_audio_frames - 1, expected_delay); |
1012 | 1033 |
1013 RunTasks(kFrameTimerMs - kAudioFrameDurationMs); | 1034 RunTasks(kFrameTimerMs - kAudioFrameDurationMs); |
1014 audio_diff += kFrameTimerMs; | 1035 audio_diff += kFrameTimerMs; |
1015 } | 1036 } |
1016 | 1037 |
1017 RunTasks(test_delay_ms); | 1038 RunTasks(test_delay_ms); |
1018 sender_to_receiver_.SetSendPackets(true); | 1039 sender_to_receiver_->SetSendPackets(true); |
1019 | 1040 |
1020 int num_audio_frames_requested = 0; | 1041 int num_audio_frames_requested = 0; |
1021 for (int j = 0; j < 10; ++j) { | 1042 for (int j = 0; j < 10; ++j) { |
1022 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; | 1043 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; |
1023 audio_diff -= num_audio_frames * kAudioFrameDurationMs; | 1044 audio_diff -= num_audio_frames * kAudioFrameDurationMs; |
1024 | 1045 |
1025 if (num_audio_frames > 0) | 1046 if (num_audio_frames > 0) |
1026 FeedAudioFrames(1, true); | 1047 FeedAudioFrames(1, true); |
1027 | 1048 |
1028 test_receiver_video_callback_->AddExpectedResult( | 1049 test_receiver_video_callback_->AddExpectedResult( |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1135 ++frames_counter) { | 1156 ++frames_counter) { |
1136 SendVideoFrame(frames_counter, testing_clock_sender_->NowTicks()); | 1157 SendVideoFrame(frames_counter, testing_clock_sender_->NowTicks()); |
1137 RunTasks(kFrameTimerMs); | 1158 RunTasks(kFrameTimerMs); |
1138 } | 1159 } |
1139 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1160 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
1140 EXPECT_EQ(static_cast<size_t>(kLongTestIterations), video_ticks_.size()); | 1161 EXPECT_EQ(static_cast<size_t>(kLongTestIterations), video_ticks_.size()); |
1141 } | 1162 } |
1142 | 1163 |
1143 TEST_F(End2EndTest, EvilNetwork) { | 1164 TEST_F(End2EndTest, EvilNetwork) { |
1144 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16); | 1165 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16); |
1145 receiver_to_sender_.SetPacketPipe(test::EvilNetwork()); | 1166 receiver_to_sender_->SetPacketPipe(test::EvilNetwork()); |
1146 sender_to_receiver_.SetPacketPipe(test::EvilNetwork()); | 1167 sender_to_receiver_->SetPacketPipe(test::EvilNetwork()); |
1147 Create(); | 1168 Create(); |
1148 StartBasicPlayer(); | 1169 StartBasicPlayer(); |
1149 | 1170 |
1150 for (int frames_counter = 0; frames_counter < kLongTestIterations; | 1171 for (int frames_counter = 0; frames_counter < kLongTestIterations; |
1151 ++frames_counter) { | 1172 ++frames_counter) { |
1152 SendVideoFrame(frames_counter, testing_clock_sender_->NowTicks()); | 1173 SendVideoFrame(frames_counter, testing_clock_sender_->NowTicks()); |
1153 RunTasks(kFrameTimerMs); | 1174 RunTasks(kFrameTimerMs); |
1154 } | 1175 } |
1155 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); | 1176 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); |
1156 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. | 1177 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. |
1157 EXPECT_LT(static_cast<size_t>(kLongTestIterations / 100), | 1178 EXPECT_LT(static_cast<size_t>(kLongTestIterations / 100), |
1158 video_ticks_.size()); | 1179 video_ticks_.size()); |
1159 VLOG(1) << "Fully transmitted " << video_ticks_.size() << " frames."; | 1180 VLOG(1) << "Fully transmitted " << video_ticks_.size() << " frames."; |
1160 EXPECT_GT(1000, (video_ticks_.back().second - test_end).InMilliseconds()); | 1181 EXPECT_GT(1000, (video_ticks_.back().second - test_end).InMilliseconds()); |
1161 } | 1182 } |
1162 | 1183 |
1163 // Tests that a system configured for 30 FPS drops frames when input is provided | 1184 // Tests that a system configured for 30 FPS drops frames when input is provided |
1164 // at a much higher frame rate. | 1185 // at a much higher frame rate. |
1165 TEST_F(End2EndTest, ShoveHighFrameRateDownYerThroat) { | 1186 TEST_F(End2EndTest, ShoveHighFrameRateDownYerThroat) { |
1166 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16); | 1187 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16); |
1167 receiver_to_sender_.SetPacketPipe(test::EvilNetwork()); | 1188 receiver_to_sender_->SetPacketPipe(test::EvilNetwork()); |
1168 sender_to_receiver_.SetPacketPipe(test::EvilNetwork()); | 1189 sender_to_receiver_->SetPacketPipe(test::EvilNetwork()); |
1169 Create(); | 1190 Create(); |
1170 StartBasicPlayer(); | 1191 StartBasicPlayer(); |
1171 | 1192 |
1172 for (int frames_counter = 0; frames_counter < kLongTestIterations; | 1193 for (int frames_counter = 0; frames_counter < kLongTestIterations; |
1173 ++frames_counter) { | 1194 ++frames_counter) { |
1174 SendVideoFrame(frames_counter, testing_clock_sender_->NowTicks()); | 1195 SendVideoFrame(frames_counter, testing_clock_sender_->NowTicks()); |
1175 RunTasks(10 /* 10 ms, but 33.3 expected by system */); | 1196 RunTasks(10 /* 10 ms, but 33.3 expected by system */); |
1176 } | 1197 } |
1177 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); | 1198 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); |
1178 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. | 1199 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. |
1179 EXPECT_LT(static_cast<size_t>(kLongTestIterations / 100), | 1200 EXPECT_LT(static_cast<size_t>(kLongTestIterations / 100), |
1180 video_ticks_.size()); | 1201 video_ticks_.size()); |
1181 EXPECT_GE(static_cast<size_t>(kLongTestIterations / 3), video_ticks_.size()); | 1202 EXPECT_GE(static_cast<size_t>(kLongTestIterations / 3), video_ticks_.size()); |
1182 VLOG(1) << "Fully transmitted " << video_ticks_.size() << " frames."; | 1203 VLOG(1) << "Fully transmitted " << video_ticks_.size() << " frames."; |
1183 EXPECT_LT((video_ticks_.back().second - test_end).InMilliseconds(), 1000); | 1204 EXPECT_LT((video_ticks_.back().second - test_end).InMilliseconds(), 1000); |
1184 } | 1205 } |
1185 | 1206 |
1186 TEST_F(End2EndTest, OldPacketNetwork) { | 1207 TEST_F(End2EndTest, OldPacketNetwork) { |
1187 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16); | 1208 Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16); |
1188 sender_to_receiver_.SetPacketPipe(test::NewRandomDrop(0.01)); | 1209 sender_to_receiver_->SetPacketPipe(test::NewRandomDrop(0.01)); |
1189 scoped_ptr<test::PacketPipe> echo_chamber( | 1210 scoped_ptr<test::PacketPipe> echo_chamber( |
1190 test::NewDuplicateAndDelay(1, 10 * kFrameTimerMs)); | 1211 test::NewDuplicateAndDelay(1, 10 * kFrameTimerMs)); |
1191 echo_chamber->AppendToPipe( | 1212 echo_chamber->AppendToPipe( |
1192 test::NewDuplicateAndDelay(1, 20 * kFrameTimerMs)); | 1213 test::NewDuplicateAndDelay(1, 20 * kFrameTimerMs)); |
1193 echo_chamber->AppendToPipe( | 1214 echo_chamber->AppendToPipe( |
1194 test::NewDuplicateAndDelay(1, 40 * kFrameTimerMs)); | 1215 test::NewDuplicateAndDelay(1, 40 * kFrameTimerMs)); |
1195 echo_chamber->AppendToPipe( | 1216 echo_chamber->AppendToPipe( |
1196 test::NewDuplicateAndDelay(1, 80 * kFrameTimerMs)); | 1217 test::NewDuplicateAndDelay(1, 80 * kFrameTimerMs)); |
1197 echo_chamber->AppendToPipe( | 1218 echo_chamber->AppendToPipe( |
1198 test::NewDuplicateAndDelay(1, 160 * kFrameTimerMs)); | 1219 test::NewDuplicateAndDelay(1, 160 * kFrameTimerMs)); |
1199 | 1220 |
1200 receiver_to_sender_.SetPacketPipe(std::move(echo_chamber)); | 1221 receiver_to_sender_->SetPacketPipe(std::move(echo_chamber)); |
1201 Create(); | 1222 Create(); |
1202 StartBasicPlayer(); | 1223 StartBasicPlayer(); |
1203 | 1224 |
1204 SetExpectedVideoPlayoutSmoothness( | 1225 SetExpectedVideoPlayoutSmoothness( |
1205 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 90 / 100, | 1226 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 90 / 100, |
1206 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 110 / 100, | 1227 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 110 / 100, |
1207 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 10); | 1228 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 10); |
1208 | 1229 |
1209 for (int frames_counter = 0; frames_counter < kLongTestIterations; | 1230 for (int frames_counter = 0; frames_counter < kLongTestIterations; |
1210 ++frames_counter) { | 1231 ++frames_counter) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1249 EXPECT_EQ(0u, jump); | 1270 EXPECT_EQ(0u, jump); |
1250 jump = i; | 1271 jump = i; |
1251 } | 1272 } |
1252 } | 1273 } |
1253 EXPECT_GT(jump, 49u); | 1274 EXPECT_GT(jump, 49u); |
1254 EXPECT_LT(jump, 120u); | 1275 EXPECT_LT(jump, 120u); |
1255 } | 1276 } |
1256 | 1277 |
1257 } // namespace cast | 1278 } // namespace cast |
1258 } // namespace media | 1279 } // namespace media |
OLD | NEW |