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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 class LoopBackTransport : public PacketSender { | 66 class LoopBackTransport : public PacketSender { |
67 public: | 67 public: |
68 explicit LoopBackTransport(scoped_refptr<CastEnvironment> cast_environment) | 68 explicit LoopBackTransport(scoped_refptr<CastEnvironment> cast_environment) |
69 : packet_receiver_(NULL), | 69 : packet_receiver_(NULL), |
70 send_packets_(true), | 70 send_packets_(true), |
71 drop_packets_belonging_to_odd_frames_(false), | 71 drop_packets_belonging_to_odd_frames_(false), |
72 reset_reference_frame_id_(false), | 72 reset_reference_frame_id_(false), |
73 cast_environment_(cast_environment) { | 73 cast_environment_(cast_environment) { |
74 } | 74 } |
75 | 75 |
76 void RegisterPacketReceiver(transport::PacketReceiver* packet_receiver) { | 76 void RegisterPacketReceiver(PacketReceiver* packet_receiver) { |
77 DCHECK(packet_receiver); | 77 DCHECK(packet_receiver); |
78 packet_receiver_ = packet_receiver; | 78 packet_receiver_ = packet_receiver; |
79 } | 79 } |
80 | 80 |
81 virtual bool SendPacket(const Packet& packet) OVERRIDE { | 81 virtual bool SendPacket(const Packet& packet) OVERRIDE { |
82 DCHECK(packet_receiver_); | 82 DCHECK(packet_receiver_); |
83 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 83 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
84 if (!send_packets_) return false; | 84 if (!send_packets_) return false; |
85 | 85 |
86 uint8* packet_copy = new uint8[packet.size()]; | 86 uint8* packet_copy = new uint8[packet.size()]; |
87 memcpy(packet_copy, packet.data(), packet.size()); | 87 memcpy(packet_copy, packet.data(), packet.size()); |
88 packet_receiver_->ReceivedPacket(packet_copy, packet.size(), | 88 packet_receiver_->ReceivedPacket(packet_copy, packet.size(), |
89 base::Bind(transport::PacketReceiver::DeletePacket, packet_copy)); | 89 base::Bind(PacketReceiver::DeletePacket, packet_copy)); |
90 return true; | 90 return true; |
91 } | 91 } |
92 | 92 |
93 virtual bool SendPackets(const PacketList& packets) OVERRIDE { | 93 virtual bool SendPackets(const PacketList& packets) OVERRIDE { |
94 DCHECK(packet_receiver_); | 94 DCHECK(packet_receiver_); |
95 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 95 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
96 if (!send_packets_) return false; | 96 if (!send_packets_) return false; |
97 | 97 |
98 for (size_t i = 0; i < packets.size(); ++i) { | 98 for (size_t i = 0; i < packets.size(); ++i) { |
99 const Packet& packet = packets[i]; | 99 const Packet& packet = packets[i]; |
100 if (drop_packets_belonging_to_odd_frames_) { | 100 if (drop_packets_belonging_to_odd_frames_) { |
101 uint32 frame_id = packet[13]; | 101 uint32 frame_id = packet[13]; |
102 if (frame_id % 2 == 1) continue; | 102 if (frame_id % 2 == 1) continue; |
103 } | 103 } |
104 uint8* packet_copy = new uint8[packet.size()]; | 104 uint8* packet_copy = new uint8[packet.size()]; |
105 memcpy(packet_copy, packet.data(), packet.size()); | 105 memcpy(packet_copy, packet.data(), packet.size()); |
106 if (reset_reference_frame_id_) { | 106 if (reset_reference_frame_id_) { |
107 // Reset the is_reference bit in the cast header. | 107 // Reset the is_reference bit in the cast header. |
108 packet_copy[kCommonRtpHeaderLength] &= kCastReferenceFrameIdBitReset; | 108 packet_copy[kCommonRtpHeaderLength] &= kCastReferenceFrameIdBitReset; |
109 } | 109 } |
110 packet_receiver_->ReceivedPacket(packet_copy, packet.size(), | 110 packet_receiver_->ReceivedPacket(packet_copy, packet.size(), |
111 base::Bind(transport::PacketReceiver::DeletePacket, packet_copy)); | 111 base::Bind(PacketReceiver::DeletePacket, packet_copy)); |
112 } | 112 } |
113 return true; | 113 return true; |
114 } | 114 } |
115 | 115 |
116 void SetSendPackets(bool send_packets) { | 116 void SetSendPackets(bool send_packets) { |
117 send_packets_ = send_packets; | 117 send_packets_ = send_packets; |
118 } | 118 } |
119 | 119 |
120 void DropAllPacketsBelongingToOddFrames() { | 120 void DropAllPacketsBelongingToOddFrames() { |
121 drop_packets_belonging_to_odd_frames_ = true; | 121 drop_packets_belonging_to_odd_frames_ = true; |
122 } | 122 } |
123 | 123 |
124 void AlwaysResetReferenceFrameId() { | 124 void AlwaysResetReferenceFrameId() { |
125 reset_reference_frame_id_ = true; | 125 reset_reference_frame_id_ = true; |
126 } | 126 } |
127 | 127 |
128 private: | 128 private: |
129 transport::PacketReceiver* packet_receiver_; | 129 PacketReceiver* packet_receiver_; |
130 bool send_packets_; | 130 bool send_packets_; |
131 bool drop_packets_belonging_to_odd_frames_; | 131 bool drop_packets_belonging_to_odd_frames_; |
132 bool reset_reference_frame_id_; | 132 bool reset_reference_frame_id_; |
133 scoped_refptr<CastEnvironment> cast_environment_; | 133 scoped_refptr<CastEnvironment> cast_environment_; |
134 }; | 134 }; |
135 | 135 |
136 // Class that verifies the audio frames coming out of the receiver. | 136 // Class that verifies the audio frames coming out of the receiver. |
137 class TestReceiverAudioCallback : | 137 class TestReceiverAudioCallback : |
138 public base::RefCountedThreadSafe<TestReceiverAudioCallback> { | 138 public base::RefCountedThreadSafe<TestReceiverAudioCallback> { |
139 public: | 139 public: |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 CheckBasicAudioFrame(audio_frame, playout_time); | 196 CheckBasicAudioFrame(audio_frame, playout_time); |
197 ExpectedAudioFrame expected_audio_frame = expected_frame_.front(); | 197 ExpectedAudioFrame expected_audio_frame = expected_frame_.front(); |
198 expected_frame_.pop_front(); | 198 expected_frame_.pop_front(); |
199 if (audio_frame->samples.size() == 0) return; // No more checks needed. | 199 if (audio_frame->samples.size() == 0) return; // No more checks needed. |
200 | 200 |
201 EXPECT_NEAR(CountZeroCrossings(expected_audio_frame.audio_frame.samples), | 201 EXPECT_NEAR(CountZeroCrossings(expected_audio_frame.audio_frame.samples), |
202 CountZeroCrossings(audio_frame->samples), | 202 CountZeroCrossings(audio_frame->samples), |
203 1); | 203 1); |
204 } | 204 } |
205 | 205 |
206 void CheckCodedPcmAudioFrame( | 206 void CheckCodedPcmAudioFrame(scoped_ptr<EncodedAudioFrame> audio_frame, |
207 scoped_ptr<transport::EncodedAudioFrame> audio_frame, | 207 const base::TimeTicks& playout_time) { |
208 const base::TimeTicks& playout_time) { | |
209 ++num_called_; | 208 ++num_called_; |
210 | 209 |
211 EXPECT_FALSE(expected_frame_.empty()); // Test for bug in test code. | 210 EXPECT_FALSE(expected_frame_.empty()); // Test for bug in test code. |
212 ExpectedAudioFrame expected_audio_frame = expected_frame_.front(); | 211 ExpectedAudioFrame expected_audio_frame = expected_frame_.front(); |
213 expected_frame_.pop_front(); | 212 expected_frame_.pop_front(); |
214 | 213 |
215 EXPECT_EQ(static_cast<int>(audio_frame->data.size()), | 214 EXPECT_EQ(static_cast<int>(audio_frame->data.size()), |
216 2 * kAudioChannels * expected_sampling_frequency_ / 100); | 215 2 * kAudioChannels * expected_sampling_frequency_ / 100); |
217 | 216 |
218 base::TimeDelta time_since_recording = | 217 base::TimeDelta time_since_recording = |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 return config; | 327 return config; |
329 } | 328 } |
330 // The actual test class, generate synthetic data for both audio and video and | 329 // The actual test class, generate synthetic data for both audio and video and |
331 // send those through the sender and receiver and analyzes the result. | 330 // send those through the sender and receiver and analyzes the result. |
332 class End2EndTest : public ::testing::Test { | 331 class End2EndTest : public ::testing::Test { |
333 protected: | 332 protected: |
334 End2EndTest() | 333 End2EndTest() |
335 : task_runner_(new test::FakeTaskRunner(&testing_clock_)), | 334 : task_runner_(new test::FakeTaskRunner(&testing_clock_)), |
336 cast_environment_(new CastEnvironment(&testing_clock_, task_runner_, | 335 cast_environment_(new CastEnvironment(&testing_clock_, task_runner_, |
337 task_runner_, task_runner_, task_runner_, task_runner_, | 336 task_runner_, task_runner_, task_runner_, task_runner_, |
338 task_runner_, EnableCastLoggingConfig())), | 337 EnableCastLoggingConfig())), |
339 start_time_(), | 338 start_time_(), |
340 sender_to_receiver_(cast_environment_), | 339 sender_to_receiver_(cast_environment_), |
341 receiver_to_sender_(cast_environment_), | 340 receiver_to_sender_(cast_environment_), |
342 test_receiver_audio_callback_(new TestReceiverAudioCallback()), | 341 test_receiver_audio_callback_(new TestReceiverAudioCallback()), |
343 test_receiver_video_callback_(new TestReceiverVideoCallback()) { | 342 test_receiver_video_callback_(new TestReceiverVideoCallback()) { |
344 testing_clock_.Advance( | 343 testing_clock_.Advance( |
345 base::TimeDelta::FromMilliseconds(kStartMillisecond)); | 344 base::TimeDelta::FromMilliseconds(kStartMillisecond)); |
346 } | 345 } |
347 | 346 |
348 void SetupConfig(transport::AudioCodec audio_codec, | 347 void SetupConfig(AudioCodec audio_codec, |
349 int audio_sampling_frequency, | 348 int audio_sampling_frequency, |
350 // TODO(miu): 3rd arg is meaningless?!? | 349 // TODO(miu): 3rd arg is meaningless?!? |
351 bool external_audio_decoder, | 350 bool external_audio_decoder, |
352 int max_number_of_video_buffers_used) { | 351 int max_number_of_video_buffers_used) { |
353 audio_sender_config_.sender_ssrc = 1; | 352 audio_sender_config_.sender_ssrc = 1; |
354 audio_sender_config_.incoming_feedback_ssrc = 2; | 353 audio_sender_config_.incoming_feedback_ssrc = 2; |
355 audio_sender_config_.rtp_payload_type = 96; | 354 audio_sender_config_.rtp_payload_type = 96; |
356 audio_sender_config_.use_external_encoder = false; | 355 audio_sender_config_.use_external_encoder = false; |
357 audio_sender_config_.frequency = audio_sampling_frequency; | 356 audio_sender_config_.frequency = audio_sampling_frequency; |
358 audio_sender_config_.channels = kAudioChannels; | 357 audio_sender_config_.channels = kAudioChannels; |
(...skipping 21 matching lines...) Expand all Loading... |
380 video_sender_config_.width = kVideoWidth; | 379 video_sender_config_.width = kVideoWidth; |
381 video_sender_config_.height = kVideoHeight; | 380 video_sender_config_.height = kVideoHeight; |
382 video_sender_config_.max_bitrate = 5000000; | 381 video_sender_config_.max_bitrate = 5000000; |
383 video_sender_config_.min_bitrate = 1000000; | 382 video_sender_config_.min_bitrate = 1000000; |
384 video_sender_config_.start_bitrate = 5000000; | 383 video_sender_config_.start_bitrate = 5000000; |
385 video_sender_config_.max_qp = 30; | 384 video_sender_config_.max_qp = 30; |
386 video_sender_config_.min_qp = 4; | 385 video_sender_config_.min_qp = 4; |
387 video_sender_config_.max_frame_rate = 30; | 386 video_sender_config_.max_frame_rate = 30; |
388 video_sender_config_.max_number_of_video_buffers_used = | 387 video_sender_config_.max_number_of_video_buffers_used = |
389 max_number_of_video_buffers_used; | 388 max_number_of_video_buffers_used; |
390 video_sender_config_.codec = transport::kVp8; | 389 video_sender_config_.codec = kVp8; |
391 video_sender_config_.number_of_cores = 1; | 390 video_sender_config_.number_of_cores = 1; |
392 | 391 |
393 video_receiver_config_.feedback_ssrc = | 392 video_receiver_config_.feedback_ssrc = |
394 video_sender_config_.incoming_feedback_ssrc; | 393 video_sender_config_.incoming_feedback_ssrc; |
395 video_receiver_config_.incoming_ssrc = | 394 video_receiver_config_.incoming_ssrc = |
396 video_sender_config_.sender_ssrc; | 395 video_sender_config_.sender_ssrc; |
397 video_receiver_config_.rtp_payload_type = | 396 video_receiver_config_.rtp_payload_type = |
398 video_sender_config_.rtp_payload_type; | 397 video_sender_config_.rtp_payload_type; |
399 video_receiver_config_.use_external_decoder = false; | 398 video_receiver_config_.use_external_decoder = false; |
400 video_receiver_config_.codec = video_sender_config_.codec; | 399 video_receiver_config_.codec = video_sender_config_.codec; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 | 466 |
468 scoped_refptr<TestReceiverAudioCallback> test_receiver_audio_callback_; | 467 scoped_refptr<TestReceiverAudioCallback> test_receiver_audio_callback_; |
469 scoped_refptr<TestReceiverVideoCallback> test_receiver_video_callback_; | 468 scoped_refptr<TestReceiverVideoCallback> test_receiver_video_callback_; |
470 | 469 |
471 scoped_ptr<TestAudioBusFactory> audio_bus_factory_; | 470 scoped_ptr<TestAudioBusFactory> audio_bus_factory_; |
472 }; | 471 }; |
473 | 472 |
474 // Audio and video test without packet loss using raw PCM 16 audio "codec"; | 473 // Audio and video test without packet loss using raw PCM 16 audio "codec"; |
475 // This test is too slow. Disabled for now: crbug.com/329333. | 474 // This test is too slow. Disabled for now: crbug.com/329333. |
476 TEST_F(End2EndTest, DISABLED_LoopNoLossPcm16) { | 475 TEST_F(End2EndTest, DISABLED_LoopNoLossPcm16) { |
477 SetupConfig(transport::kPcm16, 32000, false, 1); | 476 SetupConfig(kPcm16, 32000, false, 1); |
478 Create(); | 477 Create(); |
479 | 478 |
480 int video_start = 1; | 479 int video_start = 1; |
481 int audio_diff = kFrameTimerMs; | 480 int audio_diff = kFrameTimerMs; |
482 int i = 0; | 481 int i = 0; |
483 | 482 |
484 std::cout << "Progress "; | 483 std::cout << "Progress "; |
485 for (; i < 10; ++i) { | 484 for (; i < 10; ++i) { |
486 int num_10ms_blocks = audio_diff / 10; | 485 int num_10ms_blocks = audio_diff / 10; |
487 audio_diff -= num_10ms_blocks * 10; | 486 audio_diff -= num_10ms_blocks * 10; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
540 // TODO(mikhal): Crashes on the Win7 x64 bots. Re-enable. | 539 // TODO(mikhal): Crashes on the Win7 x64 bots. Re-enable. |
541 // http://crbug.com/329563 | 540 // http://crbug.com/329563 |
542 #if defined(OS_WIN) | 541 #if defined(OS_WIN) |
543 #define MAYBE_LoopNoLossPcm16ExternalDecoder DISABLED_LoopNoLossPcm16ExternalDec
oder | 542 #define MAYBE_LoopNoLossPcm16ExternalDecoder DISABLED_LoopNoLossPcm16ExternalDec
oder |
544 #else | 543 #else |
545 #define MAYBE_LoopNoLossPcm16ExternalDecoder LoopNoLossPcm16ExternalDecoder | 544 #define MAYBE_LoopNoLossPcm16ExternalDecoder LoopNoLossPcm16ExternalDecoder |
546 #endif | 545 #endif |
547 // This tests our external decoder interface for Audio. | 546 // This tests our external decoder interface for Audio. |
548 // Audio test without packet loss using raw PCM 16 audio "codec"; | 547 // Audio test without packet loss using raw PCM 16 audio "codec"; |
549 TEST_F(End2EndTest, MAYBE_LoopNoLossPcm16ExternalDecoder) { | 548 TEST_F(End2EndTest, MAYBE_LoopNoLossPcm16ExternalDecoder) { |
550 SetupConfig(transport::kPcm16, 32000, true, 1); | 549 SetupConfig(kPcm16, 32000, true, 1); |
551 Create(); | 550 Create(); |
552 | 551 |
553 int i = 0; | 552 int i = 0; |
554 for (; i < 10; ++i) { | 553 for (; i < 10; ++i) { |
555 base::TimeTicks send_time = testing_clock_.NowTicks(); | 554 base::TimeTicks send_time = testing_clock_.NowTicks(); |
556 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus( | 555 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus( |
557 base::TimeDelta::FromMilliseconds(10))); | 556 base::TimeDelta::FromMilliseconds(10))); |
558 test_receiver_audio_callback_->AddExpectedResult( | 557 test_receiver_audio_callback_->AddExpectedResult( |
559 ToPcmAudioFrame(*audio_bus, audio_sender_config_.frequency), | 558 ToPcmAudioFrame(*audio_bus, audio_sender_config_.frequency), |
560 1, send_time); | 559 1, send_time); |
(...skipping 12 matching lines...) Expand all Loading... |
573 } | 572 } |
574 | 573 |
575 // TODO(mikhal): Crashes on the bots. Re-enable. http://crbug.com/329563 | 574 // TODO(mikhal): Crashes on the bots. Re-enable. http://crbug.com/329563 |
576 #if defined(OS_WIN) | 575 #if defined(OS_WIN) |
577 #define MAYBE_LoopNoLossOpus DISABLED_LoopNoLossOpus | 576 #define MAYBE_LoopNoLossOpus DISABLED_LoopNoLossOpus |
578 #else | 577 #else |
579 #define MAYBE_LoopNoLossOpus LoopNoLossOpus | 578 #define MAYBE_LoopNoLossOpus LoopNoLossOpus |
580 #endif | 579 #endif |
581 // This tests our Opus audio codec without video. | 580 // This tests our Opus audio codec without video. |
582 TEST_F(End2EndTest, MAYBE_LoopNoLossOpus) { | 581 TEST_F(End2EndTest, MAYBE_LoopNoLossOpus) { |
583 SetupConfig(transport::kOpus, kDefaultAudioSamplingRate, false, 1); | 582 SetupConfig(kOpus, kDefaultAudioSamplingRate, false, 1); |
584 Create(); | 583 Create(); |
585 | 584 |
586 int i = 0; | 585 int i = 0; |
587 for (; i < 10; ++i) { | 586 for (; i < 10; ++i) { |
588 int num_10ms_blocks = 3; | 587 int num_10ms_blocks = 3; |
589 base::TimeTicks send_time = testing_clock_.NowTicks(); | 588 base::TimeTicks send_time = testing_clock_.NowTicks(); |
590 | 589 |
591 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus( | 590 scoped_ptr<AudioBus> audio_bus(audio_bus_factory_->NextAudioBus( |
592 base::TimeDelta::FromMilliseconds(10) * num_10ms_blocks)); | 591 base::TimeDelta::FromMilliseconds(10) * num_10ms_blocks)); |
593 | 592 |
(...skipping 23 matching lines...) Expand all Loading... |
617 } | 616 } |
618 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. | 617 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. |
619 EXPECT_EQ(i - 1, test_receiver_audio_callback_->number_times_called()); | 618 EXPECT_EQ(i - 1, test_receiver_audio_callback_->number_times_called()); |
620 } | 619 } |
621 | 620 |
622 // This tests start sending audio and video before the receiver is ready. | 621 // This tests start sending audio and video before the receiver is ready. |
623 // | 622 // |
624 // TODO(miu): Test disabled because of non-determinism. | 623 // TODO(miu): Test disabled because of non-determinism. |
625 // http://crbug.com/314233 | 624 // http://crbug.com/314233 |
626 TEST_F(End2EndTest, DISABLED_StartSenderBeforeReceiver) { | 625 TEST_F(End2EndTest, DISABLED_StartSenderBeforeReceiver) { |
627 SetupConfig(transport::kOpus, kDefaultAudioSamplingRate, false, 1); | 626 SetupConfig(kOpus, kDefaultAudioSamplingRate, false, 1); |
628 Create(); | 627 Create(); |
629 | 628 |
630 int video_start = 1; | 629 int video_start = 1; |
631 int audio_diff = kFrameTimerMs; | 630 int audio_diff = kFrameTimerMs; |
632 | 631 |
633 sender_to_receiver_.SetSendPackets(false); | 632 sender_to_receiver_.SetSendPackets(false); |
634 | 633 |
635 for (int i = 0; i < 3; ++i) { | 634 for (int i = 0; i < 3; ++i) { |
636 int num_10ms_blocks = audio_diff / 10; | 635 int num_10ms_blocks = audio_diff / 10; |
637 audio_diff -= num_10ms_blocks * 10; | 636 audio_diff -= num_10ms_blocks * 10; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 video_start++; | 695 video_start++; |
697 } | 696 } |
698 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. | 697 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. |
699 EXPECT_EQ(j - number_of_audio_frames_to_ignore, | 698 EXPECT_EQ(j - number_of_audio_frames_to_ignore, |
700 test_receiver_audio_callback_->number_times_called()); | 699 test_receiver_audio_callback_->number_times_called()); |
701 EXPECT_EQ(j, test_receiver_video_callback_->number_times_called()); | 700 EXPECT_EQ(j, test_receiver_video_callback_->number_times_called()); |
702 } | 701 } |
703 | 702 |
704 // This tests a network glitch lasting for 10 video frames. | 703 // This tests a network glitch lasting for 10 video frames. |
705 TEST_F(End2EndTest, GlitchWith3Buffers) { | 704 TEST_F(End2EndTest, GlitchWith3Buffers) { |
706 SetupConfig(transport::kOpus, kDefaultAudioSamplingRate, false, 3); | 705 SetupConfig(kOpus, kDefaultAudioSamplingRate, false, 3); |
707 video_sender_config_.rtp_max_delay_ms = 67; | 706 video_sender_config_.rtp_max_delay_ms = 67; |
708 video_receiver_config_.rtp_max_delay_ms = 67; | 707 video_receiver_config_.rtp_max_delay_ms = 67; |
709 Create(); | 708 Create(); |
710 | 709 |
711 int video_start = 50; | 710 int video_start = 50; |
712 base::TimeTicks send_time = testing_clock_.NowTicks(); | 711 base::TimeTicks send_time = testing_clock_.NowTicks(); |
713 SendVideoFrame(video_start, send_time); | 712 SendVideoFrame(video_start, send_time); |
714 RunTasks(kFrameTimerMs); | 713 RunTasks(kFrameTimerMs); |
715 | 714 |
716 test_receiver_video_callback_->AddExpectedResult(video_start, | 715 test_receiver_video_callback_->AddExpectedResult(video_start, |
(...skipping 28 matching lines...) Expand all Loading... |
745 | 744 |
746 frame_receiver_->GetRawVideoFrame( | 745 frame_receiver_->GetRawVideoFrame( |
747 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, | 746 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, |
748 test_receiver_video_callback_)); | 747 test_receiver_video_callback_)); |
749 | 748 |
750 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. | 749 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. |
751 EXPECT_EQ(2, test_receiver_video_callback_->number_times_called()); | 750 EXPECT_EQ(2, test_receiver_video_callback_->number_times_called()); |
752 } | 751 } |
753 | 752 |
754 TEST_F(End2EndTest, DropEveryOtherFrame3Buffers) { | 753 TEST_F(End2EndTest, DropEveryOtherFrame3Buffers) { |
755 SetupConfig(transport::kOpus, kDefaultAudioSamplingRate, false, 3); | 754 SetupConfig(kOpus, kDefaultAudioSamplingRate, false, 3); |
756 video_sender_config_.rtp_max_delay_ms = 67; | 755 video_sender_config_.rtp_max_delay_ms = 67; |
757 video_receiver_config_.rtp_max_delay_ms = 67; | 756 video_receiver_config_.rtp_max_delay_ms = 67; |
758 Create(); | 757 Create(); |
759 sender_to_receiver_.DropAllPacketsBelongingToOddFrames(); | 758 sender_to_receiver_.DropAllPacketsBelongingToOddFrames(); |
760 | 759 |
761 int video_start = 50; | 760 int video_start = 50; |
762 base::TimeTicks send_time; | 761 base::TimeTicks send_time; |
763 | 762 |
764 std::cout << "Progress "; | 763 std::cout << "Progress "; |
765 int i = 0; | 764 int i = 0; |
(...skipping 14 matching lines...) Expand all Loading... |
780 RunTasks(kFrameTimerMs); | 779 RunTasks(kFrameTimerMs); |
781 std::cout << " " << i << std::flush; | 780 std::cout << " " << i << std::flush; |
782 video_start++; | 781 video_start++; |
783 } | 782 } |
784 std::cout << std::endl; | 783 std::cout << std::endl; |
785 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 784 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
786 EXPECT_EQ(i / 2, test_receiver_video_callback_->number_times_called()); | 785 EXPECT_EQ(i / 2, test_receiver_video_callback_->number_times_called()); |
787 } | 786 } |
788 | 787 |
789 TEST_F(End2EndTest, ResetReferenceFrameId) { | 788 TEST_F(End2EndTest, ResetReferenceFrameId) { |
790 SetupConfig(transport::kOpus, kDefaultAudioSamplingRate, false, 3); | 789 SetupConfig(kOpus, kDefaultAudioSamplingRate, false, 3); |
791 video_sender_config_.rtp_max_delay_ms = 67; | 790 video_sender_config_.rtp_max_delay_ms = 67; |
792 video_receiver_config_.rtp_max_delay_ms = 67; | 791 video_receiver_config_.rtp_max_delay_ms = 67; |
793 Create(); | 792 Create(); |
794 sender_to_receiver_.AlwaysResetReferenceFrameId(); | 793 sender_to_receiver_.AlwaysResetReferenceFrameId(); |
795 | 794 |
796 int frames_counter = 0; | 795 int frames_counter = 0; |
797 for (; frames_counter < 20; ++frames_counter) { | 796 for (; frames_counter < 20; ++frames_counter) { |
798 const base::TimeTicks send_time = testing_clock_.NowTicks(); | 797 const base::TimeTicks send_time = testing_clock_.NowTicks(); |
799 SendVideoFrame(frames_counter, send_time); | 798 SendVideoFrame(frames_counter, send_time); |
800 | 799 |
801 test_receiver_video_callback_->AddExpectedResult(frames_counter, | 800 test_receiver_video_callback_->AddExpectedResult(frames_counter, |
802 video_sender_config_.width, video_sender_config_.height, send_time); | 801 video_sender_config_.width, video_sender_config_.height, send_time); |
803 | 802 |
804 // GetRawVideoFrame will not return the frame until we are close to the | 803 // GetRawVideoFrame will not return the frame until we are close to the |
805 // time in which we should render the frame. | 804 // time in which we should render the frame. |
806 frame_receiver_->GetRawVideoFrame( | 805 frame_receiver_->GetRawVideoFrame( |
807 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, | 806 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, |
808 test_receiver_video_callback_)); | 807 test_receiver_video_callback_)); |
809 RunTasks(kFrameTimerMs); | 808 RunTasks(kFrameTimerMs); |
810 } | 809 } |
811 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 810 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
812 EXPECT_EQ(frames_counter, | 811 EXPECT_EQ(frames_counter, |
813 test_receiver_video_callback_->number_times_called()); | 812 test_receiver_video_callback_->number_times_called()); |
814 } | 813 } |
815 | 814 |
816 TEST_F(End2EndTest, CryptoVideo) { | 815 TEST_F(End2EndTest, CryptoVideo) { |
817 SetupConfig(transport::kPcm16, 32000, false, 1); | 816 SetupConfig(kPcm16, 32000, false, 1); |
818 | 817 |
819 video_sender_config_.aes_iv_mask = | 818 video_sender_config_.aes_iv_mask = |
820 ConvertFromBase16String("1234567890abcdeffedcba0987654321"); | 819 ConvertFromBase16String("1234567890abcdeffedcba0987654321"); |
821 video_sender_config_.aes_key = | 820 video_sender_config_.aes_key = |
822 ConvertFromBase16String("deadbeefcafeb0b0b0b0cafedeadbeef"); | 821 ConvertFromBase16String("deadbeefcafeb0b0b0b0cafedeadbeef"); |
823 | 822 |
824 video_receiver_config_.aes_iv_mask = video_sender_config_.aes_iv_mask; | 823 video_receiver_config_.aes_iv_mask = video_sender_config_.aes_iv_mask; |
825 video_receiver_config_.aes_key = video_sender_config_.aes_key; | 824 video_receiver_config_.aes_key = video_sender_config_.aes_key; |
826 | 825 |
827 Create(); | 826 Create(); |
(...skipping 19 matching lines...) Expand all Loading... |
847 test_receiver_video_callback_->number_times_called()); | 846 test_receiver_video_callback_->number_times_called()); |
848 } | 847 } |
849 | 848 |
850 // TODO(mikhal): Crashes on the bots. Re-enable. http://crbug.com/329563 | 849 // TODO(mikhal): Crashes on the bots. Re-enable. http://crbug.com/329563 |
851 #if defined(OS_WIN) | 850 #if defined(OS_WIN) |
852 #define MAYBE_CryptoAudio DISABLED_CryptoAudio | 851 #define MAYBE_CryptoAudio DISABLED_CryptoAudio |
853 #else | 852 #else |
854 #define MAYBE_CryptoAudio CryptoAudio | 853 #define MAYBE_CryptoAudio CryptoAudio |
855 #endif | 854 #endif |
856 TEST_F(End2EndTest, MAYBE_CryptoAudio) { | 855 TEST_F(End2EndTest, MAYBE_CryptoAudio) { |
857 SetupConfig(transport::kPcm16, 32000, false, 1); | 856 SetupConfig(kPcm16, 32000, false, 1); |
858 | 857 |
859 audio_sender_config_.aes_iv_mask = | 858 audio_sender_config_.aes_iv_mask = |
860 ConvertFromBase16String("abcdeffedcba12345678900987654321"); | 859 ConvertFromBase16String("abcdeffedcba12345678900987654321"); |
861 audio_sender_config_.aes_key = | 860 audio_sender_config_.aes_key = |
862 ConvertFromBase16String("deadbeefcafecafedeadbeefb0b0b0b0"); | 861 ConvertFromBase16String("deadbeefcafecafedeadbeefb0b0b0b0"); |
863 | 862 |
864 audio_receiver_config_.aes_iv_mask = audio_sender_config_.aes_iv_mask; | 863 audio_receiver_config_.aes_iv_mask = audio_sender_config_.aes_iv_mask; |
865 audio_receiver_config_.aes_key = audio_sender_config_.aes_key; | 864 audio_receiver_config_.aes_key = audio_sender_config_.aes_key; |
866 | 865 |
867 Create(); | 866 Create(); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
902 } | 901 } |
903 } | 902 } |
904 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 903 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
905 EXPECT_EQ(frames_counter - 1, | 904 EXPECT_EQ(frames_counter - 1, |
906 test_receiver_audio_callback_->number_times_called()); | 905 test_receiver_audio_callback_->number_times_called()); |
907 } | 906 } |
908 | 907 |
909 // Video test without packet loss; This test is targeted at testing the logging | 908 // Video test without packet loss; This test is targeted at testing the logging |
910 // aspects of the end2end, but is basically equivalent to LoopNoLossPcm16. | 909 // aspects of the end2end, but is basically equivalent to LoopNoLossPcm16. |
911 TEST_F(End2EndTest, VideoLogging) { | 910 TEST_F(End2EndTest, VideoLogging) { |
912 SetupConfig(transport::kPcm16, 32000, false, 1); | 911 SetupConfig(kPcm16, 32000, false, 1); |
913 Create(); | 912 Create(); |
914 | 913 |
915 int video_start = 1; | 914 int video_start = 1; |
916 int i = 0; | 915 int i = 0; |
917 for (; i < 1; ++i) { | 916 for (; i < 1; ++i) { |
918 base::TimeTicks send_time = testing_clock_.NowTicks(); | 917 base::TimeTicks send_time = testing_clock_.NowTicks(); |
919 test_receiver_video_callback_->AddExpectedResult(video_start, | 918 test_receiver_video_callback_->AddExpectedResult(video_start, |
920 video_sender_config_.width, video_sender_config_.height, send_time); | 919 video_sender_config_.width, video_sender_config_.height, send_time); |
921 | 920 |
922 SendVideoFrame(video_start, send_time); | 921 SendVideoFrame(video_start, send_time); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 | 959 |
961 // Packet logging. | 960 // Packet logging. |
962 // Verify that all packet related events were logged. | 961 // Verify that all packet related events were logged. |
963 PacketRawMap packet_raw_log = logging->GetPacketRawData(); | 962 PacketRawMap packet_raw_log = logging->GetPacketRawData(); |
964 // Every rtp_timestamp should have only one entry. | 963 // Every rtp_timestamp should have only one entry. |
965 EXPECT_EQ(static_cast<unsigned int>(i), packet_raw_log.size()); | 964 EXPECT_EQ(static_cast<unsigned int>(i), packet_raw_log.size()); |
966 PacketRawMap::const_iterator packet_it = packet_raw_log.begin(); | 965 PacketRawMap::const_iterator packet_it = packet_raw_log.begin(); |
967 // Choose a packet, and verify that all events were logged. | 966 // Choose a packet, and verify that all events were logged. |
968 event_log = (++(packet_it->second.packet_map.begin()))->second.type; | 967 event_log = (++(packet_it->second.packet_map.begin()))->second.type; |
969 EXPECT_TRUE((std::find(event_log.begin(), event_log.end(), | 968 EXPECT_TRUE((std::find(event_log.begin(), event_log.end(), |
| 969 kPacketSentToPacer)) != event_log.end()); |
| 970 EXPECT_TRUE((std::find(event_log.begin(), event_log.end(), |
| 971 kPacketSentToNetwork)) != event_log.end()); |
| 972 EXPECT_TRUE((std::find(event_log.begin(), event_log.end(), |
970 kPacketReceived)) != event_log.end()); | 973 kPacketReceived)) != event_log.end()); |
971 // Verify that there were no other events logged with respect to this frame. | 974 // Verify that there were no other events logged with respect to this frame. |
972 EXPECT_EQ(1u, event_log.size()); | 975 EXPECT_EQ(3u, event_log.size()); |
973 } | 976 } |
974 | 977 |
975 // TODO(mikhal): Crashes on the bots. Re-enable. http://crbug.com/329563 | 978 // TODO(mikhal): Crashes on the bots. Re-enable. http://crbug.com/329563 |
976 #if defined(OS_WIN) | 979 #if defined(OS_WIN) |
977 #define MAYBE_AudioLogging DISABLED_AudioLogging | 980 #define MAYBE_AudioLogging DISABLED_AudioLogging |
978 #else | 981 #else |
979 #define MAYBE_AudioLogging AudioLogging | 982 #define MAYBE_AudioLogging AudioLogging |
980 #endif | 983 #endif |
981 // Audio test without packet loss; This test is targeted at testing the logging | 984 // Audio test without packet loss; This test is targeted at testing the logging |
982 // aspects of the end2end, but is basically equivalent to LoopNoLossPcm16. | 985 // aspects of the end2end, but is basically equivalent to LoopNoLossPcm16. |
983 TEST_F(End2EndTest, MAYBE_AudioLogging) { | 986 TEST_F(End2EndTest, MAYBE_AudioLogging) { |
984 SetupConfig(transport::kPcm16, 32000, false, 1); | 987 SetupConfig(kPcm16, 32000, false, 1); |
985 Create(); | 988 Create(); |
986 | 989 |
987 int audio_diff = kFrameTimerMs; | 990 int audio_diff = kFrameTimerMs; |
988 int i = 0; | 991 int i = 0; |
989 | 992 |
990 for (; i < 10; ++i) { | 993 for (; i < 10; ++i) { |
991 int num_10ms_blocks = audio_diff / 10; | 994 int num_10ms_blocks = audio_diff / 10; |
992 audio_diff -= num_10ms_blocks * 10; | 995 audio_diff -= num_10ms_blocks * 10; |
993 base::TimeTicks send_time = testing_clock_.NowTicks(); | 996 base::TimeTicks send_time = testing_clock_.NowTicks(); |
994 | 997 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1054 } | 1057 } |
1055 | 1058 |
1056 | 1059 |
1057 // TODO(pwestin): Add repeatable packet loss test. | 1060 // TODO(pwestin): Add repeatable packet loss test. |
1058 // TODO(pwestin): Add test for misaligned send get calls. | 1061 // TODO(pwestin): Add test for misaligned send get calls. |
1059 // TODO(pwestin): Add more tests that does not resample. | 1062 // TODO(pwestin): Add more tests that does not resample. |
1060 // TODO(pwestin): Add test when we have starvation for our RunTask. | 1063 // TODO(pwestin): Add test when we have starvation for our RunTask. |
1061 | 1064 |
1062 } // namespace cast | 1065 } // namespace cast |
1063 } // namespace media | 1066 } // namespace media |
OLD | NEW |