| 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 |