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 |