| 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 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 test_receiver_video_callback_(new TestReceiverVideoCallback()) { | 454 test_receiver_video_callback_(new TestReceiverVideoCallback()) { |
| 455 testing_clock_.Advance( | 455 testing_clock_.Advance( |
| 456 base::TimeDelta::FromMilliseconds(kStartMillisecond)); | 456 base::TimeDelta::FromMilliseconds(kStartMillisecond)); |
| 457 cast_environment_sender_->Logging()->AddRawEventSubscriber( | 457 cast_environment_sender_->Logging()->AddRawEventSubscriber( |
| 458 &event_subscriber_sender_); | 458 &event_subscriber_sender_); |
| 459 } | 459 } |
| 460 | 460 |
| 461 void Configure(transport::VideoCodec video_codec, | 461 void Configure(transport::VideoCodec video_codec, |
| 462 transport::AudioCodec audio_codec, | 462 transport::AudioCodec audio_codec, |
| 463 int audio_sampling_frequency, | 463 int audio_sampling_frequency, |
| 464 bool external_audio_decoder, | |
| 465 int max_number_of_video_buffers_used) { | 464 int max_number_of_video_buffers_used) { |
| 466 audio_sender_config_.rtp_config.ssrc = 1; | 465 audio_sender_config_.rtp_config.ssrc = 1; |
| 467 audio_sender_config_.rtp_config.max_delay_ms = kTargetPlayoutDelayMs; | 466 audio_sender_config_.rtp_config.max_delay_ms = kTargetPlayoutDelayMs; |
| 468 audio_sender_config_.incoming_feedback_ssrc = 2; | 467 audio_sender_config_.incoming_feedback_ssrc = 2; |
| 469 audio_sender_config_.rtp_config.payload_type = 96; | 468 audio_sender_config_.rtp_config.payload_type = 96; |
| 470 audio_sender_config_.use_external_encoder = false; | 469 audio_sender_config_.use_external_encoder = false; |
| 471 audio_sender_config_.frequency = audio_sampling_frequency; | 470 audio_sender_config_.frequency = audio_sampling_frequency; |
| 472 audio_sender_config_.channels = kAudioChannels; | 471 audio_sender_config_.channels = kAudioChannels; |
| 473 audio_sender_config_.bitrate = kDefaultAudioEncoderBitrate; | 472 audio_sender_config_.bitrate = kDefaultAudioEncoderBitrate; |
| 474 audio_sender_config_.codec = audio_codec; | 473 audio_sender_config_.codec = audio_codec; |
| 475 | 474 |
| 476 audio_receiver_config_.feedback_ssrc = | 475 audio_receiver_config_.feedback_ssrc = |
| 477 audio_sender_config_.incoming_feedback_ssrc; | 476 audio_sender_config_.incoming_feedback_ssrc; |
| 478 audio_receiver_config_.incoming_ssrc = audio_sender_config_.rtp_config.ssrc; | 477 audio_receiver_config_.incoming_ssrc = audio_sender_config_.rtp_config.ssrc; |
| 479 audio_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs; | 478 audio_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs; |
| 480 audio_receiver_config_.rtp_payload_type = | 479 audio_receiver_config_.rtp_payload_type = |
| 481 audio_sender_config_.rtp_config.payload_type; | 480 audio_sender_config_.rtp_config.payload_type; |
| 482 audio_receiver_config_.use_external_decoder = external_audio_decoder; | |
| 483 audio_receiver_config_.frequency = audio_sender_config_.frequency; | 481 audio_receiver_config_.frequency = audio_sender_config_.frequency; |
| 484 audio_receiver_config_.channels = kAudioChannels; | 482 audio_receiver_config_.channels = kAudioChannels; |
| 485 audio_receiver_config_.codec = audio_sender_config_.codec; | 483 audio_receiver_config_.max_frame_rate = 100; |
| 484 audio_receiver_config_.codec.audio = audio_sender_config_.codec; |
| 486 | 485 |
| 487 test_receiver_audio_callback_->SetExpectedSamplingFrequency( | 486 test_receiver_audio_callback_->SetExpectedSamplingFrequency( |
| 488 audio_receiver_config_.frequency); | 487 audio_receiver_config_.frequency); |
| 489 | 488 |
| 490 video_sender_config_.rtp_config.ssrc = 3; | 489 video_sender_config_.rtp_config.ssrc = 3; |
| 491 video_sender_config_.rtp_config.max_delay_ms = kTargetPlayoutDelayMs; | 490 video_sender_config_.rtp_config.max_delay_ms = kTargetPlayoutDelayMs; |
| 492 video_sender_config_.incoming_feedback_ssrc = 4; | 491 video_sender_config_.incoming_feedback_ssrc = 4; |
| 493 video_sender_config_.rtp_config.payload_type = 97; | 492 video_sender_config_.rtp_config.payload_type = 97; |
| 494 video_sender_config_.use_external_encoder = false; | 493 video_sender_config_.use_external_encoder = false; |
| 495 video_sender_config_.width = kVideoHdWidth; | 494 video_sender_config_.width = kVideoHdWidth; |
| 496 video_sender_config_.height = kVideoHdHeight; | 495 video_sender_config_.height = kVideoHdHeight; |
| 497 video_sender_config_.max_bitrate = 50000; | 496 video_sender_config_.max_bitrate = 50000; |
| 498 video_sender_config_.min_bitrate = 10000; | 497 video_sender_config_.min_bitrate = 10000; |
| 499 video_sender_config_.start_bitrate = 10000; | 498 video_sender_config_.start_bitrate = 10000; |
| 500 video_sender_config_.max_qp = 30; | 499 video_sender_config_.max_qp = 30; |
| 501 video_sender_config_.min_qp = 4; | 500 video_sender_config_.min_qp = 4; |
| 502 video_sender_config_.max_frame_rate = 30; | 501 video_sender_config_.max_frame_rate = 30; |
| 503 video_sender_config_.max_number_of_video_buffers_used = | 502 video_sender_config_.max_number_of_video_buffers_used = |
| 504 max_number_of_video_buffers_used; | 503 max_number_of_video_buffers_used; |
| 505 video_sender_config_.codec = video_codec; | 504 video_sender_config_.codec = video_codec; |
| 506 | 505 |
| 507 video_receiver_config_.feedback_ssrc = | 506 video_receiver_config_.feedback_ssrc = |
| 508 video_sender_config_.incoming_feedback_ssrc; | 507 video_sender_config_.incoming_feedback_ssrc; |
| 509 video_receiver_config_.incoming_ssrc = video_sender_config_.rtp_config.ssrc; | 508 video_receiver_config_.incoming_ssrc = video_sender_config_.rtp_config.ssrc; |
| 510 video_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs; | 509 video_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs; |
| 511 video_receiver_config_.rtp_payload_type = | 510 video_receiver_config_.rtp_payload_type = |
| 512 video_sender_config_.rtp_config.payload_type; | 511 video_sender_config_.rtp_config.payload_type; |
| 513 video_receiver_config_.use_external_decoder = false; | 512 video_receiver_config_.frequency = kVideoFrequency; |
| 514 video_receiver_config_.codec = video_sender_config_.codec; | 513 video_receiver_config_.channels = 1; |
| 514 video_receiver_config_.max_frame_rate = video_sender_config_.max_frame_rate; |
| 515 video_receiver_config_.codec.video = video_sender_config_.codec; |
| 515 } | 516 } |
| 516 | 517 |
| 517 void SetReceiverSkew(double skew, base::TimeDelta offset) { | 518 void SetReceiverSkew(double skew, base::TimeDelta offset) { |
| 518 testing_clock_receiver_->SetSkew(skew, offset); | 519 testing_clock_receiver_->SetSkew(skew, offset); |
| 519 task_runner_receiver_->SetSkew(1.0 / skew); | 520 task_runner_receiver_->SetSkew(1.0 / skew); |
| 520 } | 521 } |
| 521 | 522 |
| 522 // Specify the minimum/maximum difference in playout times between two | 523 // Specify the minimum/maximum difference in playout times between two |
| 523 // consecutive frames. Also, specify the maximum absolute rate of change over | 524 // consecutive frames. Also, specify the maximum absolute rate of change over |
| 524 // each three consecutive frames. | 525 // each three consecutive frames. |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 724 it->type, | 725 it->type, |
| 725 it->media_type, | 726 it->media_type, |
| 726 it->rtp_timestamp, | 727 it->rtp_timestamp, |
| 727 it->frame_id, | 728 it->frame_id, |
| 728 it->packet_id, | 729 it->packet_id, |
| 729 it->max_packet_id, | 730 it->max_packet_id, |
| 730 it->size); | 731 it->size); |
| 731 } | 732 } |
| 732 } | 733 } |
| 733 | 734 |
| 734 AudioReceiverConfig audio_receiver_config_; | 735 FrameReceiverConfig audio_receiver_config_; |
| 735 VideoReceiverConfig video_receiver_config_; | 736 FrameReceiverConfig video_receiver_config_; |
| 736 AudioSenderConfig audio_sender_config_; | 737 AudioSenderConfig audio_sender_config_; |
| 737 VideoSenderConfig video_sender_config_; | 738 VideoSenderConfig video_sender_config_; |
| 738 | 739 |
| 739 base::TimeTicks start_time_; | 740 base::TimeTicks start_time_; |
| 740 | 741 |
| 741 // These run in "test time" | 742 // These run in "test time" |
| 742 base::SimpleTestTickClock testing_clock_; | 743 base::SimpleTestTickClock testing_clock_; |
| 743 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 744 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
| 744 | 745 |
| 745 // These run on the sender timeline. | 746 // These run on the sender timeline. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 777 SimpleEventSubscriber event_subscriber_sender_; | 778 SimpleEventSubscriber event_subscriber_sender_; |
| 778 std::vector<FrameEvent> frame_events_; | 779 std::vector<FrameEvent> frame_events_; |
| 779 std::vector<PacketEvent> packet_events_; | 780 std::vector<PacketEvent> packet_events_; |
| 780 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > audio_ticks_; | 781 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > audio_ticks_; |
| 781 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > video_ticks_; | 782 std::vector<std::pair<base::TimeTicks, base::TimeTicks> > video_ticks_; |
| 782 // |transport_sender_| has a RepeatingTimer which needs a MessageLoop. | 783 // |transport_sender_| has a RepeatingTimer which needs a MessageLoop. |
| 783 base::MessageLoop message_loop_; | 784 base::MessageLoop message_loop_; |
| 784 }; | 785 }; |
| 785 | 786 |
| 786 TEST_F(End2EndTest, LoopNoLossPcm16) { | 787 TEST_F(End2EndTest, LoopNoLossPcm16) { |
| 787 Configure(transport::kVp8, transport::kPcm16, 32000, false, 1); | 788 Configure(transport::kVp8, transport::kPcm16, 32000, 1); |
| 788 // Reduce video resolution to allow processing multiple frames within a | 789 // Reduce video resolution to allow processing multiple frames within a |
| 789 // reasonable time frame. | 790 // reasonable time frame. |
| 790 video_sender_config_.width = kVideoQcifWidth; | 791 video_sender_config_.width = kVideoQcifWidth; |
| 791 video_sender_config_.height = kVideoQcifHeight; | 792 video_sender_config_.height = kVideoQcifHeight; |
| 792 Create(); | 793 Create(); |
| 793 | 794 |
| 794 const int kNumIterations = 50; | 795 const int kNumIterations = 50; |
| 795 int video_start = kVideoStart; | 796 int video_start = kVideoStart; |
| 796 int audio_diff = kFrameTimerMs; | 797 int audio_diff = kFrameTimerMs; |
| 797 int num_audio_frames_requested = 0; | 798 int num_audio_frames_requested = 0; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. | 832 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. |
| 832 EXPECT_EQ(num_audio_frames_requested, | 833 EXPECT_EQ(num_audio_frames_requested, |
| 833 test_receiver_audio_callback_->number_times_called()); | 834 test_receiver_audio_callback_->number_times_called()); |
| 834 EXPECT_EQ(kNumIterations, | 835 EXPECT_EQ(kNumIterations, |
| 835 test_receiver_video_callback_->number_times_called()); | 836 test_receiver_video_callback_->number_times_called()); |
| 836 } | 837 } |
| 837 | 838 |
| 838 // This tests our external decoder interface for Audio. | 839 // This tests our external decoder interface for Audio. |
| 839 // Audio test without packet loss using raw PCM 16 audio "codec"; | 840 // Audio test without packet loss using raw PCM 16 audio "codec"; |
| 840 TEST_F(End2EndTest, LoopNoLossPcm16ExternalDecoder) { | 841 TEST_F(End2EndTest, LoopNoLossPcm16ExternalDecoder) { |
| 841 Configure(transport::kVp8, transport::kPcm16, 32000, true, 1); | 842 Configure(transport::kVp8, transport::kPcm16, 32000, 1); |
| 842 Create(); | 843 Create(); |
| 843 | 844 |
| 844 const int kNumIterations = 10; | 845 const int kNumIterations = 10; |
| 845 for (int i = 0; i < kNumIterations; ++i) { | 846 for (int i = 0; i < kNumIterations; ++i) { |
| 846 FeedAudioFrames(1, true); | 847 FeedAudioFrames(1, true); |
| 847 RunTasks(kAudioFrameDurationMs); | 848 RunTasks(kAudioFrameDurationMs); |
| 848 frame_receiver_->GetCodedAudioFrame( | 849 frame_receiver_->GetCodedAudioFrame( |
| 849 base::Bind(&TestReceiverAudioCallback::CheckCodedAudioFrame, | 850 base::Bind(&TestReceiverAudioCallback::CheckCodedAudioFrame, |
| 850 test_receiver_audio_callback_)); | 851 test_receiver_audio_callback_)); |
| 851 } | 852 } |
| 852 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. | 853 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. |
| 853 EXPECT_EQ(kNumIterations, | 854 EXPECT_EQ(kNumIterations, |
| 854 test_receiver_audio_callback_->number_times_called()); | 855 test_receiver_audio_callback_->number_times_called()); |
| 855 } | 856 } |
| 856 | 857 |
| 857 // This tests our Opus audio codec without video. | 858 // This tests our Opus audio codec without video. |
| 858 TEST_F(End2EndTest, LoopNoLossOpus) { | 859 TEST_F(End2EndTest, LoopNoLossOpus) { |
| 859 Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, | 860 Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, 1); |
| 860 false, 1); | |
| 861 Create(); | 861 Create(); |
| 862 | 862 |
| 863 const int kNumIterations = 300; | 863 const int kNumIterations = 300; |
| 864 for (int i = 0; i < kNumIterations; ++i) { | 864 for (int i = 0; i < kNumIterations; ++i) { |
| 865 // Opus introduces a tiny delay before the sinewave starts; so don't examine | 865 // Opus introduces a tiny delay before the sinewave starts; so don't examine |
| 866 // the first frame. | 866 // the first frame. |
| 867 const bool examine_audio_data = i > 0; | 867 const bool examine_audio_data = i > 0; |
| 868 FeedAudioFrames(1, examine_audio_data); | 868 FeedAudioFrames(1, examine_audio_data); |
| 869 RunTasks(kAudioFrameDurationMs); | 869 RunTasks(kAudioFrameDurationMs); |
| 870 RequestAudioFrames(1, examine_audio_data); | 870 RequestAudioFrames(1, examine_audio_data); |
| 871 } | 871 } |
| 872 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. | 872 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. |
| 873 EXPECT_EQ(kNumIterations, | 873 EXPECT_EQ(kNumIterations, |
| 874 test_receiver_audio_callback_->number_times_called()); | 874 test_receiver_audio_callback_->number_times_called()); |
| 875 } | 875 } |
| 876 | 876 |
| 877 // This tests start sending audio and video at start-up time before the receiver | 877 // This tests start sending audio and video at start-up time before the receiver |
| 878 // is ready; it sends 2 frames before the receiver comes online. | 878 // is ready; it sends 2 frames before the receiver comes online. |
| 879 // | 879 // |
| 880 // Test disabled due to flakiness: It appears that the RTCP synchronization | 880 // Test disabled due to flakiness: It appears that the RTCP synchronization |
| 881 // sometimes kicks in, and sometimes doesn't. When it does, there's a sharp | 881 // sometimes kicks in, and sometimes doesn't. When it does, there's a sharp |
| 882 // discontinuity in the timeline, throwing off the test expectations. See TODOs | 882 // discontinuity in the timeline, throwing off the test expectations. See TODOs |
| 883 // in audio_receiver.cc for likely cause(s) of this bug. | 883 // in audio_receiver.cc for likely cause(s) of this bug. |
| 884 // http://crbug.com/356942 | 884 // http://crbug.com/356942 |
| 885 TEST_F(End2EndTest, DISABLED_StartSenderBeforeReceiver) { | 885 TEST_F(End2EndTest, DISABLED_StartSenderBeforeReceiver) { |
| 886 Configure(transport::kVp8, transport::kPcm16, kDefaultAudioSamplingRate, | 886 Configure(transport::kVp8, transport::kPcm16, kDefaultAudioSamplingRate, 1); |
| 887 false, 1); | |
| 888 Create(); | 887 Create(); |
| 889 | 888 |
| 890 int video_start = kVideoStart; | 889 int video_start = kVideoStart; |
| 891 int audio_diff = kFrameTimerMs; | 890 int audio_diff = kFrameTimerMs; |
| 892 | 891 |
| 893 sender_to_receiver_.SetSendPackets(false); | 892 sender_to_receiver_.SetSendPackets(false); |
| 894 | 893 |
| 895 const int test_delay_ms = 100; | 894 const int test_delay_ms = 100; |
| 896 | 895 |
| 897 const int kNumVideoFramesBeforeReceiverStarted = 2; | 896 const int kNumVideoFramesBeforeReceiverStarted = 2; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 965 } | 964 } |
| 966 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. | 965 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. |
| 967 EXPECT_EQ(num_audio_frames_requested, | 966 EXPECT_EQ(num_audio_frames_requested, |
| 968 test_receiver_audio_callback_->number_times_called()); | 967 test_receiver_audio_callback_->number_times_called()); |
| 969 EXPECT_EQ(10, test_receiver_video_callback_->number_times_called()); | 968 EXPECT_EQ(10, test_receiver_video_callback_->number_times_called()); |
| 970 } | 969 } |
| 971 | 970 |
| 972 // This tests a network glitch lasting for 10 video frames. | 971 // This tests a network glitch lasting for 10 video frames. |
| 973 // Flaky. See crbug.com/351596. | 972 // Flaky. See crbug.com/351596. |
| 974 TEST_F(End2EndTest, DISABLED_GlitchWith3Buffers) { | 973 TEST_F(End2EndTest, DISABLED_GlitchWith3Buffers) { |
| 975 Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, | 974 Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, 3); |
| 976 false, 3); | |
| 977 video_sender_config_.rtp_config.max_delay_ms = 67; | 975 video_sender_config_.rtp_config.max_delay_ms = 67; |
| 978 video_receiver_config_.rtp_max_delay_ms = 67; | 976 video_receiver_config_.rtp_max_delay_ms = 67; |
| 979 Create(); | 977 Create(); |
| 980 | 978 |
| 981 int video_start = kVideoStart; | 979 int video_start = kVideoStart; |
| 982 base::TimeTicks capture_time; | 980 base::TimeTicks capture_time; |
| 983 // Frames will rendered on completion until the render time stabilizes, i.e. | 981 // Frames will rendered on completion until the render time stabilizes, i.e. |
| 984 // we got enough data. | 982 // we got enough data. |
| 985 const int frames_before_glitch = 20; | 983 const int frames_before_glitch = 20; |
| 986 for (int i = 0; i < frames_before_glitch; ++i) { | 984 for (int i = 0; i < frames_before_glitch; ++i) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1029 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, | 1027 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, |
| 1030 test_receiver_video_callback_)); | 1028 test_receiver_video_callback_)); |
| 1031 | 1029 |
| 1032 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. | 1030 RunTasks(2 * kFrameTimerMs + 1); // Empty the receiver pipeline. |
| 1033 EXPECT_EQ(frames_before_glitch + 1, | 1031 EXPECT_EQ(frames_before_glitch + 1, |
| 1034 test_receiver_video_callback_->number_times_called()); | 1032 test_receiver_video_callback_->number_times_called()); |
| 1035 } | 1033 } |
| 1036 | 1034 |
| 1037 // Disabled due to flakiness and crashiness. http://crbug.com/360951 | 1035 // Disabled due to flakiness and crashiness. http://crbug.com/360951 |
| 1038 TEST_F(End2EndTest, DISABLED_DropEveryOtherFrame3Buffers) { | 1036 TEST_F(End2EndTest, DISABLED_DropEveryOtherFrame3Buffers) { |
| 1039 Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, false, | 1037 Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, 3); |
| 1040 3); | |
| 1041 video_sender_config_.rtp_config.max_delay_ms = 67; | 1038 video_sender_config_.rtp_config.max_delay_ms = 67; |
| 1042 video_receiver_config_.rtp_max_delay_ms = 67; | 1039 video_receiver_config_.rtp_max_delay_ms = 67; |
| 1043 Create(); | 1040 Create(); |
| 1044 sender_to_receiver_.DropAllPacketsBelongingToOddFrames(); | 1041 sender_to_receiver_.DropAllPacketsBelongingToOddFrames(); |
| 1045 | 1042 |
| 1046 int video_start = kVideoStart; | 1043 int video_start = kVideoStart; |
| 1047 base::TimeTicks capture_time; | 1044 base::TimeTicks capture_time; |
| 1048 | 1045 |
| 1049 int i = 0; | 1046 int i = 0; |
| 1050 for (; i < 20; ++i) { | 1047 for (; i < 20; ++i) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1068 } | 1065 } |
| 1069 RunTasks(kFrameTimerMs); | 1066 RunTasks(kFrameTimerMs); |
| 1070 video_start++; | 1067 video_start++; |
| 1071 } | 1068 } |
| 1072 | 1069 |
| 1073 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1070 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
| 1074 EXPECT_EQ(i / 2, test_receiver_video_callback_->number_times_called()); | 1071 EXPECT_EQ(i / 2, test_receiver_video_callback_->number_times_called()); |
| 1075 } | 1072 } |
| 1076 | 1073 |
| 1077 TEST_F(End2EndTest, CryptoVideo) { | 1074 TEST_F(End2EndTest, CryptoVideo) { |
| 1078 Configure(transport::kVp8, transport::kPcm16, 32000, false, 1); | 1075 Configure(transport::kVp8, transport::kPcm16, 32000, 1); |
| 1079 | 1076 |
| 1080 video_sender_config_.rtp_config.aes_iv_mask = | 1077 video_sender_config_.rtp_config.aes_iv_mask = |
| 1081 ConvertFromBase16String("1234567890abcdeffedcba0987654321"); | 1078 ConvertFromBase16String("1234567890abcdeffedcba0987654321"); |
| 1082 video_sender_config_.rtp_config.aes_key = | 1079 video_sender_config_.rtp_config.aes_key = |
| 1083 ConvertFromBase16String("deadbeefcafeb0b0b0b0cafedeadbeef"); | 1080 ConvertFromBase16String("deadbeefcafeb0b0b0b0cafedeadbeef"); |
| 1084 | 1081 |
| 1085 video_receiver_config_.aes_iv_mask = | 1082 video_receiver_config_.aes_iv_mask = |
| 1086 video_sender_config_.rtp_config.aes_iv_mask; | 1083 video_sender_config_.rtp_config.aes_iv_mask; |
| 1087 video_receiver_config_.aes_key = | 1084 video_receiver_config_.aes_key = |
| 1088 video_sender_config_.rtp_config.aes_key; | 1085 video_sender_config_.rtp_config.aes_key; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1106 frame_receiver_->GetRawVideoFrame( | 1103 frame_receiver_->GetRawVideoFrame( |
| 1107 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, | 1104 base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, |
| 1108 test_receiver_video_callback_)); | 1105 test_receiver_video_callback_)); |
| 1109 } | 1106 } |
| 1110 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1107 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
| 1111 EXPECT_EQ(frames_counter, | 1108 EXPECT_EQ(frames_counter, |
| 1112 test_receiver_video_callback_->number_times_called()); | 1109 test_receiver_video_callback_->number_times_called()); |
| 1113 } | 1110 } |
| 1114 | 1111 |
| 1115 TEST_F(End2EndTest, CryptoAudio) { | 1112 TEST_F(End2EndTest, CryptoAudio) { |
| 1116 Configure(transport::kVp8, transport::kPcm16, 32000, false, 1); | 1113 Configure(transport::kVp8, transport::kPcm16, 32000, 1); |
| 1117 | 1114 |
| 1118 audio_sender_config_.rtp_config.aes_iv_mask = | 1115 audio_sender_config_.rtp_config.aes_iv_mask = |
| 1119 ConvertFromBase16String("abcdeffedcba12345678900987654321"); | 1116 ConvertFromBase16String("abcdeffedcba12345678900987654321"); |
| 1120 audio_sender_config_.rtp_config.aes_key = | 1117 audio_sender_config_.rtp_config.aes_key = |
| 1121 ConvertFromBase16String("deadbeefcafecafedeadbeefb0b0b0b0"); | 1118 ConvertFromBase16String("deadbeefcafecafedeadbeefb0b0b0b0"); |
| 1122 | 1119 |
| 1123 audio_receiver_config_.aes_iv_mask = | 1120 audio_receiver_config_.aes_iv_mask = |
| 1124 audio_sender_config_.rtp_config.aes_iv_mask; | 1121 audio_sender_config_.rtp_config.aes_iv_mask; |
| 1125 audio_receiver_config_.aes_key = | 1122 audio_receiver_config_.aes_key = |
| 1126 audio_sender_config_.rtp_config.aes_key; | 1123 audio_sender_config_.rtp_config.aes_key; |
| 1127 | 1124 |
| 1128 Create(); | 1125 Create(); |
| 1129 | 1126 |
| 1130 const int kNumIterations = 3; | 1127 const int kNumIterations = 3; |
| 1131 const int kNumAudioFramesPerIteration = 2; | 1128 const int kNumAudioFramesPerIteration = 2; |
| 1132 for (int i = 0; i < kNumIterations; ++i) { | 1129 for (int i = 0; i < kNumIterations; ++i) { |
| 1133 FeedAudioFrames(kNumAudioFramesPerIteration, true); | 1130 FeedAudioFrames(kNumAudioFramesPerIteration, true); |
| 1134 RunTasks(kNumAudioFramesPerIteration * kAudioFrameDurationMs); | 1131 RunTasks(kNumAudioFramesPerIteration * kAudioFrameDurationMs); |
| 1135 RequestAudioFrames(kNumAudioFramesPerIteration, true); | 1132 RequestAudioFrames(kNumAudioFramesPerIteration, true); |
| 1136 } | 1133 } |
| 1137 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1134 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
| 1138 EXPECT_EQ(kNumIterations * kNumAudioFramesPerIteration, | 1135 EXPECT_EQ(kNumIterations * kNumAudioFramesPerIteration, |
| 1139 test_receiver_audio_callback_->number_times_called()); | 1136 test_receiver_audio_callback_->number_times_called()); |
| 1140 } | 1137 } |
| 1141 | 1138 |
| 1142 // Video test without packet loss - tests the logging aspects of the end2end, | 1139 // Video test without packet loss - tests the logging aspects of the end2end, |
| 1143 // but is basically equivalent to LoopNoLossPcm16. | 1140 // but is basically equivalent to LoopNoLossPcm16. |
| 1144 TEST_F(End2EndTest, VideoLogging) { | 1141 TEST_F(End2EndTest, VideoLogging) { |
| 1145 Configure(transport::kVp8, transport::kPcm16, 32000, false, 1); | 1142 Configure(transport::kVp8, transport::kPcm16, 32000, 1); |
| 1146 Create(); | 1143 Create(); |
| 1147 | 1144 |
| 1148 int video_start = kVideoStart; | 1145 int video_start = kVideoStart; |
| 1149 const int num_frames = 5; | 1146 const int num_frames = 5; |
| 1150 for (int i = 0; i < num_frames; ++i) { | 1147 for (int i = 0; i < num_frames; ++i) { |
| 1151 base::TimeTicks capture_time = testing_clock_sender_->NowTicks(); | 1148 base::TimeTicks capture_time = testing_clock_sender_->NowTicks(); |
| 1152 test_receiver_video_callback_->AddExpectedResult( | 1149 test_receiver_video_callback_->AddExpectedResult( |
| 1153 video_start, | 1150 video_start, |
| 1154 video_sender_config_.width, | 1151 video_sender_config_.width, |
| 1155 video_sender_config_.height, | 1152 video_sender_config_.height, |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1259 | 1256 |
| 1260 // Verify that there were no other events logged with respect to this | 1257 // Verify that there were no other events logged with respect to this |
| 1261 // packet. (i.e. Total event count = expected event count) | 1258 // packet. (i.e. Total event count = expected event count) |
| 1262 EXPECT_EQ(total_event_count_for_packet, expected_event_count_for_packet); | 1259 EXPECT_EQ(total_event_count_for_packet, expected_event_count_for_packet); |
| 1263 } | 1260 } |
| 1264 } | 1261 } |
| 1265 | 1262 |
| 1266 // Audio test without packet loss - tests the logging aspects of the end2end, | 1263 // Audio test without packet loss - tests the logging aspects of the end2end, |
| 1267 // but is basically equivalent to LoopNoLossPcm16. | 1264 // but is basically equivalent to LoopNoLossPcm16. |
| 1268 TEST_F(End2EndTest, AudioLogging) { | 1265 TEST_F(End2EndTest, AudioLogging) { |
| 1269 Configure(transport::kVp8, transport::kPcm16, 32000, false, 1); | 1266 Configure(transport::kVp8, transport::kPcm16, 32000, 1); |
| 1270 Create(); | 1267 Create(); |
| 1271 | 1268 |
| 1272 int audio_diff = kFrameTimerMs; | 1269 int audio_diff = kFrameTimerMs; |
| 1273 const int kNumVideoFrames = 10; | 1270 const int kNumVideoFrames = 10; |
| 1274 int num_audio_frames_requested = 0; | 1271 int num_audio_frames_requested = 0; |
| 1275 for (int i = 0; i < kNumVideoFrames; ++i) { | 1272 for (int i = 0; i < kNumVideoFrames; ++i) { |
| 1276 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; | 1273 const int num_audio_frames = audio_diff / kAudioFrameDurationMs; |
| 1277 audio_diff -= num_audio_frames * kAudioFrameDurationMs; | 1274 audio_diff -= num_audio_frames * kAudioFrameDurationMs; |
| 1278 | 1275 |
| 1279 FeedAudioFrames(num_audio_frames, true); | 1276 FeedAudioFrames(num_audio_frames, true); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1337 EXPECT_GT(map_it->second.counter[FRAME_ACK_SENT], 0); | 1334 EXPECT_GT(map_it->second.counter[FRAME_ACK_SENT], 0); |
| 1338 expected_event_count_for_frame += map_it->second.counter[FRAME_ACK_SENT]; | 1335 expected_event_count_for_frame += map_it->second.counter[FRAME_ACK_SENT]; |
| 1339 | 1336 |
| 1340 // Verify that there were no other events logged with respect to this frame. | 1337 // Verify that there were no other events logged with respect to this frame. |
| 1341 // (i.e. Total event count = expected event count) | 1338 // (i.e. Total event count = expected event count) |
| 1342 EXPECT_EQ(total_event_count_for_frame, expected_event_count_for_frame); | 1339 EXPECT_EQ(total_event_count_for_frame, expected_event_count_for_frame); |
| 1343 } | 1340 } |
| 1344 } | 1341 } |
| 1345 | 1342 |
| 1346 TEST_F(End2EndTest, BasicFakeSoftwareVideo) { | 1343 TEST_F(End2EndTest, BasicFakeSoftwareVideo) { |
| 1347 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); | 1344 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, 1); |
| 1348 Create(); | 1345 Create(); |
| 1349 StartBasicPlayer(); | 1346 StartBasicPlayer(); |
| 1350 SetReceiverSkew(1.0, base::TimeDelta::FromMilliseconds(1)); | 1347 SetReceiverSkew(1.0, base::TimeDelta::FromMilliseconds(1)); |
| 1351 | 1348 |
| 1352 // Expect very smooth playout when there is no clock skew. | 1349 // Expect very smooth playout when there is no clock skew. |
| 1353 SetExpectedVideoPlayoutSmoothness( | 1350 SetExpectedVideoPlayoutSmoothness( |
| 1354 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 99 / 100, | 1351 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 99 / 100, |
| 1355 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 101 / 100, | 1352 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 101 / 100, |
| 1356 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 100); | 1353 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 100); |
| 1357 | 1354 |
| 1358 int frames_counter = 0; | 1355 int frames_counter = 0; |
| 1359 for (; frames_counter < 1000; ++frames_counter) { | 1356 for (; frames_counter < 1000; ++frames_counter) { |
| 1360 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1357 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
| 1361 RunTasks(kFrameTimerMs); | 1358 RunTasks(kFrameTimerMs); |
| 1362 } | 1359 } |
| 1363 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1360 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
| 1364 EXPECT_EQ(1000ul, video_ticks_.size()); | 1361 EXPECT_EQ(1000ul, video_ticks_.size()); |
| 1365 } | 1362 } |
| 1366 | 1363 |
| 1367 TEST_F(End2EndTest, ReceiverClockFast) { | 1364 TEST_F(End2EndTest, ReceiverClockFast) { |
| 1368 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); | 1365 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, 1); |
| 1369 Create(); | 1366 Create(); |
| 1370 StartBasicPlayer(); | 1367 StartBasicPlayer(); |
| 1371 SetReceiverSkew(2.0, base::TimeDelta::FromMicroseconds(1234567)); | 1368 SetReceiverSkew(2.0, base::TimeDelta::FromMicroseconds(1234567)); |
| 1372 | 1369 |
| 1373 int frames_counter = 0; | 1370 int frames_counter = 0; |
| 1374 for (; frames_counter < 10000; ++frames_counter) { | 1371 for (; frames_counter < 10000; ++frames_counter) { |
| 1375 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1372 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
| 1376 RunTasks(kFrameTimerMs); | 1373 RunTasks(kFrameTimerMs); |
| 1377 } | 1374 } |
| 1378 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1375 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
| 1379 EXPECT_EQ(10000ul, video_ticks_.size()); | 1376 EXPECT_EQ(10000ul, video_ticks_.size()); |
| 1380 } | 1377 } |
| 1381 | 1378 |
| 1382 TEST_F(End2EndTest, ReceiverClockSlow) { | 1379 TEST_F(End2EndTest, ReceiverClockSlow) { |
| 1383 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); | 1380 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, 1); |
| 1384 Create(); | 1381 Create(); |
| 1385 StartBasicPlayer(); | 1382 StartBasicPlayer(); |
| 1386 SetReceiverSkew(0.5, base::TimeDelta::FromMicroseconds(-765432)); | 1383 SetReceiverSkew(0.5, base::TimeDelta::FromMicroseconds(-765432)); |
| 1387 | 1384 |
| 1388 int frames_counter = 0; | 1385 int frames_counter = 0; |
| 1389 for (; frames_counter < 10000; ++frames_counter) { | 1386 for (; frames_counter < 10000; ++frames_counter) { |
| 1390 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1387 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
| 1391 RunTasks(kFrameTimerMs); | 1388 RunTasks(kFrameTimerMs); |
| 1392 } | 1389 } |
| 1393 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1390 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
| 1394 EXPECT_EQ(10000ul, video_ticks_.size()); | 1391 EXPECT_EQ(10000ul, video_ticks_.size()); |
| 1395 } | 1392 } |
| 1396 | 1393 |
| 1397 TEST_F(End2EndTest, SmoothPlayoutWithFivePercentClockRateSkew) { | 1394 TEST_F(End2EndTest, SmoothPlayoutWithFivePercentClockRateSkew) { |
| 1398 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); | 1395 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, 1); |
| 1399 Create(); | 1396 Create(); |
| 1400 StartBasicPlayer(); | 1397 StartBasicPlayer(); |
| 1401 SetReceiverSkew(1.05, base::TimeDelta::FromMilliseconds(-42)); | 1398 SetReceiverSkew(1.05, base::TimeDelta::FromMilliseconds(-42)); |
| 1402 | 1399 |
| 1403 // Expect smooth playout when there is 5% skew. | 1400 // Expect smooth playout when there is 5% skew. |
| 1404 SetExpectedVideoPlayoutSmoothness( | 1401 SetExpectedVideoPlayoutSmoothness( |
| 1405 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 90 / 100, | 1402 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 90 / 100, |
| 1406 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 110 / 100, | 1403 base::TimeDelta::FromMilliseconds(kFrameTimerMs) * 110 / 100, |
| 1407 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 10); | 1404 base::TimeDelta::FromMilliseconds(kFrameTimerMs) / 10); |
| 1408 | 1405 |
| 1409 int frames_counter = 0; | 1406 int frames_counter = 0; |
| 1410 for (; frames_counter < 10000; ++frames_counter) { | 1407 for (; frames_counter < 10000; ++frames_counter) { |
| 1411 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1408 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
| 1412 RunTasks(kFrameTimerMs); | 1409 RunTasks(kFrameTimerMs); |
| 1413 } | 1410 } |
| 1414 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. | 1411 RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. |
| 1415 EXPECT_EQ(10000ul, video_ticks_.size()); | 1412 EXPECT_EQ(10000ul, video_ticks_.size()); |
| 1416 } | 1413 } |
| 1417 | 1414 |
| 1418 TEST_F(End2EndTest, EvilNetwork) { | 1415 TEST_F(End2EndTest, EvilNetwork) { |
| 1419 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, false, 1); | 1416 Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, 1); |
| 1420 receiver_to_sender_.SetPacketPipe(test::EvilNetwork().Pass()); | 1417 receiver_to_sender_.SetPacketPipe(test::EvilNetwork().Pass()); |
| 1421 sender_to_receiver_.SetPacketPipe(test::EvilNetwork().Pass()); | 1418 sender_to_receiver_.SetPacketPipe(test::EvilNetwork().Pass()); |
| 1422 Create(); | 1419 Create(); |
| 1423 StartBasicPlayer(); | 1420 StartBasicPlayer(); |
| 1424 | 1421 |
| 1425 int frames_counter = 0; | 1422 int frames_counter = 0; |
| 1426 for (; frames_counter < 10000; ++frames_counter) { | 1423 for (; frames_counter < 10000; ++frames_counter) { |
| 1427 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); | 1424 SendFakeVideoFrame(testing_clock_sender_->NowTicks()); |
| 1428 RunTasks(kFrameTimerMs); | 1425 RunTasks(kFrameTimerMs); |
| 1429 } | 1426 } |
| 1430 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); | 1427 base::TimeTicks test_end = testing_clock_receiver_->NowTicks(); |
| 1431 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. | 1428 RunTasks(100 * kFrameTimerMs + 1); // Empty the pipeline. |
| 1432 EXPECT_GT(video_ticks_.size(), 100ul); | 1429 EXPECT_GT(video_ticks_.size(), 100ul); |
| 1433 EXPECT_LT((video_ticks_.back().second - test_end).InMilliseconds(), 1000); | 1430 EXPECT_LT((video_ticks_.back().second - test_end).InMilliseconds(), 1000); |
| 1434 } | 1431 } |
| 1435 | 1432 |
| 1436 // TODO(pwestin): Add repeatable packet loss test. | 1433 // TODO(pwestin): Add repeatable packet loss test. |
| 1437 // TODO(pwestin): Add test for misaligned send get calls. | 1434 // TODO(pwestin): Add test for misaligned send get calls. |
| 1438 // TODO(pwestin): Add more tests that does not resample. | 1435 // TODO(pwestin): Add more tests that does not resample. |
| 1439 // TODO(pwestin): Add test when we have starvation for our RunTask. | 1436 // TODO(pwestin): Add test when we have starvation for our RunTask. |
| 1440 | 1437 |
| 1441 } // namespace cast | 1438 } // namespace cast |
| 1442 } // namespace media | 1439 } // namespace media |
| OLD | NEW |