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