OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 private: | 674 private: |
675 interfaces::ServiceFactoryPtr media_service_factory_; | 675 interfaces::ServiceFactoryPtr media_service_factory_; |
676 }; | 676 }; |
677 #else | 677 #else |
678 class PipelineIntegrationTestHost : public testing::Test, | 678 class PipelineIntegrationTestHost : public testing::Test, |
679 public PipelineIntegrationTestBase {}; | 679 public PipelineIntegrationTestBase {}; |
680 #endif // defined(MOJO_RENDERER) | 680 #endif // defined(MOJO_RENDERER) |
681 | 681 |
682 class PipelineIntegrationTest : public PipelineIntegrationTestHost { | 682 class PipelineIntegrationTest : public PipelineIntegrationTestHost { |
683 public: | 683 public: |
684 void StartPipelineWithMediaSource(MockMediaSource* source) { | 684 PipelineStatus StartPipelineWithMediaSource(MockMediaSource* source) { |
| 685 return StartPipelineWithMediaSource(source, kNormal); |
| 686 } |
| 687 |
| 688 PipelineStatus StartPipelineWithMediaSource(MockMediaSource* source, |
| 689 uint8_t test_type) { |
| 690 hashing_enabled_ = test_type & kHashed; |
| 691 clockless_playback_ = test_type & kClockless; |
| 692 |
685 EXPECT_CALL(*source, InitSegmentReceived()).Times(AtLeast(1)); | 693 EXPECT_CALL(*source, InitSegmentReceived()).Times(AtLeast(1)); |
686 EXPECT_CALL(*this, OnMetadata(_)) | 694 EXPECT_CALL(*this, OnMetadata(_)) |
687 .Times(AtMost(1)) | 695 .Times(AtMost(1)) |
688 .WillRepeatedly(SaveArg<0>(&metadata_)); | 696 .WillRepeatedly(SaveArg<0>(&metadata_)); |
689 EXPECT_CALL(*this, OnBufferingStateChanged(BUFFERING_HAVE_ENOUGH)) | 697 EXPECT_CALL(*this, OnBufferingStateChanged(BUFFERING_HAVE_ENOUGH)) |
690 .Times(AnyNumber()); | 698 .Times(AnyNumber()); |
691 EXPECT_CALL(*this, OnBufferingStateChanged(BUFFERING_HAVE_NOTHING)) | 699 EXPECT_CALL(*this, OnBufferingStateChanged(BUFFERING_HAVE_NOTHING)) |
692 .Times(AnyNumber()); | 700 .Times(AnyNumber()); |
693 | 701 |
694 // Encrypted content not used, so this is never called. | 702 // Encrypted content not used, so this is never called. |
695 EXPECT_CALL(*this, OnWaitingForDecryptionKey()).Times(0); | 703 EXPECT_CALL(*this, OnWaitingForDecryptionKey()).Times(0); |
696 | 704 |
697 demuxer_ = source->GetDemuxer(); | 705 demuxer_ = source->GetDemuxer(); |
698 pipeline_->Start( | 706 pipeline_->Start( |
699 demuxer_.get(), CreateRenderer(), | 707 demuxer_.get(), CreateRenderer(), |
700 base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)), | 708 base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)), |
701 base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)), | 709 base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)), |
702 base::Bind(&PipelineIntegrationTest::OnStatusCallback, | 710 base::Bind(&PipelineIntegrationTest::OnStatusCallback, |
703 base::Unretained(this)), | 711 base::Unretained(this)), |
704 base::Bind(&PipelineIntegrationTest::OnMetadata, | 712 base::Bind(&PipelineIntegrationTest::OnMetadata, |
705 base::Unretained(this)), | 713 base::Unretained(this)), |
706 base::Bind(&PipelineIntegrationTest::OnBufferingStateChanged, | 714 base::Bind(&PipelineIntegrationTest::OnBufferingStateChanged, |
707 base::Unretained(this)), | 715 base::Unretained(this)), |
708 base::Closure(), base::Bind(&PipelineIntegrationTest::OnAddTextTrack, | 716 base::Closure(), base::Bind(&PipelineIntegrationTest::OnAddTextTrack, |
709 base::Unretained(this)), | 717 base::Unretained(this)), |
710 base::Bind(&PipelineIntegrationTest::OnWaitingForDecryptionKey, | 718 base::Bind(&PipelineIntegrationTest::OnWaitingForDecryptionKey, |
711 base::Unretained(this))); | 719 base::Unretained(this))); |
712 message_loop_.Run(); | 720 message_loop_.Run(); |
713 EXPECT_EQ(PIPELINE_OK, pipeline_status_); | 721 EXPECT_EQ(PIPELINE_OK, pipeline_status_); |
714 } | 722 return pipeline_status_; |
715 | |
716 void StartHashedPipelineWithMediaSource(MockMediaSource* source) { | |
717 hashing_enabled_ = true; | |
718 StartPipelineWithMediaSource(source); | |
719 } | |
720 | |
721 void StartHashedClocklessPipelineWithMediaSource(MockMediaSource* source) { | |
722 hashing_enabled_ = true; | |
723 clockless_playback_ = true; | |
724 StartPipelineWithMediaSource(source); | |
725 } | 723 } |
726 | 724 |
727 void StartPipelineWithEncryptedMedia(MockMediaSource* source, | 725 void StartPipelineWithEncryptedMedia(MockMediaSource* source, |
728 FakeEncryptedMedia* encrypted_media) { | 726 FakeEncryptedMedia* encrypted_media) { |
729 EXPECT_CALL(*source, InitSegmentReceived()).Times(AtLeast(1)); | 727 EXPECT_CALL(*source, InitSegmentReceived()).Times(AtLeast(1)); |
730 EXPECT_CALL(*this, OnMetadata(_)) | 728 EXPECT_CALL(*this, OnMetadata(_)) |
731 .Times(AtMost(1)) | 729 .Times(AtMost(1)) |
732 .WillRepeatedly(SaveArg<0>(&metadata_)); | 730 .WillRepeatedly(SaveArg<0>(&metadata_)); |
733 EXPECT_CALL(*this, OnBufferingStateChanged(BUFFERING_HAVE_ENOUGH)) | 731 EXPECT_CALL(*this, OnBufferingStateChanged(BUFFERING_HAVE_ENOUGH)) |
734 .Times(AnyNumber()); | 732 .Times(AnyNumber()); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 return false; | 792 return false; |
795 | 793 |
796 source.EndOfStream(); | 794 source.EndOfStream(); |
797 | 795 |
798 source.Shutdown(); | 796 source.Shutdown(); |
799 Stop(); | 797 Stop(); |
800 return true; | 798 return true; |
801 } | 799 } |
802 }; | 800 }; |
803 | 801 |
| 802 struct PlaybackTestData { |
| 803 const std::string filename; |
| 804 const uint32_t start_time_ms; |
| 805 const uint32_t duration_ms; |
| 806 }; |
| 807 |
| 808 struct MSEPlaybackTestData { |
| 809 const std::string filename; |
| 810 const std::string mimetype; |
| 811 const size_t append_bytes; |
| 812 const uint32_t duration_ms; |
| 813 }; |
| 814 |
| 815 // Tells gtest how to print our PlaybackTestData structure. |
| 816 std::ostream& operator<<(std::ostream& os, const PlaybackTestData& data) { |
| 817 return os << data.filename; |
| 818 } |
| 819 |
| 820 std::ostream& operator<<(std::ostream& os, const MSEPlaybackTestData& data) { |
| 821 return os << data.filename; |
| 822 } |
| 823 |
| 824 class BasicPlaybackTest : public PipelineIntegrationTest, |
| 825 public testing::WithParamInterface<PlaybackTestData> { |
| 826 }; |
| 827 |
| 828 class BasicMSEPlaybackTest |
| 829 : public ::testing::WithParamInterface<MSEPlaybackTestData>, |
| 830 public PipelineIntegrationTest {}; |
| 831 |
| 832 TEST_P(BasicPlaybackTest, PlayToEnd) { |
| 833 PlaybackTestData data = GetParam(); |
| 834 |
| 835 ASSERT_EQ(PIPELINE_OK, Start(data.filename, kClockless)); |
| 836 EXPECT_EQ(data.start_time_ms, demuxer_->GetStartTime().InMilliseconds()); |
| 837 EXPECT_EQ(data.duration_ms, pipeline_->GetMediaDuration().InMilliseconds()); |
| 838 |
| 839 Play(); |
| 840 ASSERT_TRUE(WaitUntilOnEnded()); |
| 841 } |
| 842 |
| 843 TEST_P(BasicMSEPlaybackTest, PlayToEnd) { |
| 844 MSEPlaybackTestData data = GetParam(); |
| 845 |
| 846 MockMediaSource source(data.filename, data.mimetype, data.append_bytes); |
| 847 // TODO -- ADD uint8_t test_type to StartWithMSE and pass clockless flags |
| 848 ASSERT_EQ(PIPELINE_OK, StartPipelineWithMediaSource(&source, kClockless)); |
| 849 source.EndOfStream(); |
| 850 |
| 851 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
| 852 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
| 853 EXPECT_EQ(data.duration_ms, |
| 854 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
| 855 |
| 856 Play(); |
| 857 |
| 858 ASSERT_TRUE(WaitUntilOnEnded()); |
| 859 |
| 860 EXPECT_TRUE(demuxer_->GetTimelineOffset().is_null()); |
| 861 source.Shutdown(); |
| 862 Stop(); |
| 863 } |
| 864 |
| 865 #if defined(USE_PROPRIETARY_CODECS) |
| 866 |
| 867 const PlaybackTestData kADTSTests[] = { |
| 868 {"bear-audio-main-aac.aac", 0, 2724}, |
| 869 {"bear-audio-lc-aac.aac", 0, 2858}, |
| 870 {"bear-audio-implicit-he-aac-v1.aac", 0, 2812}, |
| 871 {"bear-audio-implicit-he-aac-v2.aac", 0, 3047}, |
| 872 }; |
| 873 |
| 874 // TODO(chcunningham): Migrate other basic playback tests to TEST_P. |
| 875 INSTANTIATE_TEST_CASE_P(PropritaryCodecs, |
| 876 BasicPlaybackTest, |
| 877 testing::ValuesIn(kADTSTests)); |
| 878 |
| 879 const MSEPlaybackTestData kMediaSourceADTSTests[] = { |
| 880 {"bear-audio-main-aac.aac", kADTS, kAppendWholeFile, 2773}, |
| 881 {"bear-audio-lc-aac.aac", kADTS, kAppendWholeFile, 2794}, |
| 882 {"bear-audio-implicit-he-aac-v1.aac", kADTS, kAppendWholeFile, 2858}, |
| 883 {"bear-audio-implicit-he-aac-v2.aac", kADTS, kAppendWholeFile, 2901}, |
| 884 }; |
| 885 |
| 886 // TODO(chcunningham): Migrate other basic MSE playback tests to TEST_P. |
| 887 INSTANTIATE_TEST_CASE_P(PropritaryCodecs, |
| 888 BasicMSEPlaybackTest, |
| 889 testing::ValuesIn(kMediaSourceADTSTests)); |
| 890 |
| 891 #endif // defined(USE_PROPRIETARY_CODECS) |
| 892 |
804 TEST_F(PipelineIntegrationTest, BasicPlayback) { | 893 TEST_F(PipelineIntegrationTest, BasicPlayback) { |
805 ASSERT_EQ(PIPELINE_OK, Start("bear-320x240.webm")); | 894 ASSERT_EQ(PIPELINE_OK, Start("bear-320x240.webm")); |
806 | 895 |
807 Play(); | 896 Play(); |
808 | 897 |
809 ASSERT_TRUE(WaitUntilOnEnded()); | 898 ASSERT_TRUE(WaitUntilOnEnded()); |
810 } | 899 } |
811 | 900 |
812 TEST_F(PipelineIntegrationTest, BasicPlaybackOpusOgg) { | 901 TEST_F(PipelineIntegrationTest, BasicPlaybackOpusOgg) { |
813 ASSERT_EQ(PIPELINE_OK, Start("bear-opus.ogg")); | 902 ASSERT_EQ(PIPELINE_OK, Start("bear-opus.ogg")); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 ASSERT_TRUE(Seek(base::TimeDelta::FromMilliseconds(6360))); | 963 ASSERT_TRUE(Seek(base::TimeDelta::FromMilliseconds(6360))); |
875 Play(); | 964 Play(); |
876 ASSERT_TRUE(WaitUntilOnEnded()); | 965 ASSERT_TRUE(WaitUntilOnEnded()); |
877 EXPECT_HASH_EQ(kOpusEndTrimmingHash_3, GetAudioHash()); | 966 EXPECT_HASH_EQ(kOpusEndTrimmingHash_3, GetAudioHash()); |
878 } | 967 } |
879 | 968 |
880 TEST_F(PipelineIntegrationTest, | 969 TEST_F(PipelineIntegrationTest, |
881 MAYBE_CLOCKLESS(BasicPlaybackOpusWebmTrimmingHashed_MediaSource)) { | 970 MAYBE_CLOCKLESS(BasicPlaybackOpusWebmTrimmingHashed_MediaSource)) { |
882 MockMediaSource source("opus-trimming-test.webm", kOpusAudioOnlyWebM, | 971 MockMediaSource source("opus-trimming-test.webm", kOpusAudioOnlyWebM, |
883 kAppendWholeFile); | 972 kAppendWholeFile); |
884 StartHashedClocklessPipelineWithMediaSource(&source); | 973 StartPipelineWithMediaSource(&source, kClockless | kHashed); |
885 source.EndOfStream(); | 974 source.EndOfStream(); |
886 | 975 |
887 Play(); | 976 Play(); |
888 | 977 |
889 ASSERT_TRUE(WaitUntilOnEnded()); | 978 ASSERT_TRUE(WaitUntilOnEnded()); |
890 EXPECT_HASH_EQ(kOpusEndTrimmingHash_1, GetAudioHash()); | 979 EXPECT_HASH_EQ(kOpusEndTrimmingHash_1, GetAudioHash()); |
891 | 980 |
892 // Seek within the pre-skip section, this should not cause a beep. | 981 // Seek within the pre-skip section, this should not cause a beep. |
893 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(1); | 982 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(1); |
894 source.Seek(seek_time); | 983 source.Seek(seek_time); |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 | 1133 |
1045 ASSERT_TRUE(WaitUntilOnEnded()); | 1134 ASSERT_TRUE(WaitUntilOnEnded()); |
1046 source.Shutdown(); | 1135 source.Shutdown(); |
1047 Stop(); | 1136 Stop(); |
1048 } | 1137 } |
1049 | 1138 |
1050 // Flaky. http://crbug.com/304776 | 1139 // Flaky. http://crbug.com/304776 |
1051 TEST_F(PipelineIntegrationTest, DISABLED_MediaSource_Opus_Seeking_WebM) { | 1140 TEST_F(PipelineIntegrationTest, DISABLED_MediaSource_Opus_Seeking_WebM) { |
1052 MockMediaSource source("bear-opus-end-trimming.webm", kOpusAudioOnlyWebM, | 1141 MockMediaSource source("bear-opus-end-trimming.webm", kOpusAudioOnlyWebM, |
1053 kAppendWholeFile); | 1142 kAppendWholeFile); |
1054 StartHashedPipelineWithMediaSource(&source); | 1143 StartPipelineWithMediaSource(&source, kHashed); |
1055 | 1144 |
1056 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 1145 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
1057 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 1146 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
1058 EXPECT_EQ(kOpusEndTrimmingWebMFileDurationMs, | 1147 EXPECT_EQ(kOpusEndTrimmingWebMFileDurationMs, |
1059 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 1148 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
1060 | 1149 |
1061 base::TimeDelta start_seek_time = base::TimeDelta::FromMilliseconds(1000); | 1150 base::TimeDelta start_seek_time = base::TimeDelta::FromMilliseconds(1000); |
1062 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(2000); | 1151 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(2000); |
1063 | 1152 |
1064 Play(); | 1153 Play(); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1259 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 1348 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
1260 EXPECT_EQ(325, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 1349 EXPECT_EQ(325, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
1261 | 1350 |
1262 Play(); | 1351 Play(); |
1263 | 1352 |
1264 EXPECT_TRUE(WaitUntilOnEnded()); | 1353 EXPECT_TRUE(WaitUntilOnEnded()); |
1265 } | 1354 } |
1266 | 1355 |
1267 TEST_F(PipelineIntegrationTest, MediaSource_ADTS_TimestampOffset) { | 1356 TEST_F(PipelineIntegrationTest, MediaSource_ADTS_TimestampOffset) { |
1268 MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile); | 1357 MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile); |
1269 StartHashedPipelineWithMediaSource(&source); | 1358 StartPipelineWithMediaSource(&source, kHashed); |
1270 EXPECT_EQ(325, source.last_timestamp_offset().InMilliseconds()); | 1359 EXPECT_EQ(325, source.last_timestamp_offset().InMilliseconds()); |
1271 | 1360 |
1272 // Trim off multiple frames off the beginning of the segment which will cause | 1361 // Trim off multiple frames off the beginning of the segment which will cause |
1273 // the first decoded frame to be incorrect if preroll isn't implemented. | 1362 // the first decoded frame to be incorrect if preroll isn't implemented. |
1274 const base::TimeDelta adts_preroll_duration = | 1363 const base::TimeDelta adts_preroll_duration = |
1275 base::TimeDelta::FromSecondsD(2.5 * 1024 / 44100); | 1364 base::TimeDelta::FromSecondsD(2.5 * 1024 / 44100); |
1276 const base::TimeDelta append_time = | 1365 const base::TimeDelta append_time = |
1277 source.last_timestamp_offset() - adts_preroll_duration; | 1366 source.last_timestamp_offset() - adts_preroll_duration; |
1278 | 1367 |
1279 scoped_refptr<DecoderBuffer> second_file = ReadTestDataFile("sfx.adts"); | 1368 scoped_refptr<DecoderBuffer> second_file = ReadTestDataFile("sfx.adts"); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1374 | 1463 |
1375 INSTANTIATE_TEST_CASE_P( | 1464 INSTANTIATE_TEST_CASE_P( |
1376 VBRSeeks_NoTOC, | 1465 VBRSeeks_NoTOC, |
1377 Mp3FastSeekIntegrationTest, | 1466 Mp3FastSeekIntegrationTest, |
1378 ::testing::Values(Mp3FastSeekParams("bear-audio-10s-VBR-no-TOC.mp3", | 1467 ::testing::Values(Mp3FastSeekParams("bear-audio-10s-VBR-no-TOC.mp3", |
1379 "-0.22,0.80,1.19,0.73,-0.31,-1.12,"))); | 1468 "-0.22,0.80,1.19,0.73,-0.31,-1.12,"))); |
1380 #endif // !defined(DISABLE_CLOCKLESS_TESTS) | 1469 #endif // !defined(DISABLE_CLOCKLESS_TESTS) |
1381 | 1470 |
1382 TEST_F(PipelineIntegrationTest, MediaSource_MP3) { | 1471 TEST_F(PipelineIntegrationTest, MediaSource_MP3) { |
1383 MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile); | 1472 MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile); |
1384 StartHashedPipelineWithMediaSource(&source); | 1473 StartPipelineWithMediaSource(&source, kHashed); |
1385 source.EndOfStream(); | 1474 source.EndOfStream(); |
1386 | 1475 |
1387 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 1476 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
1388 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 1477 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
1389 EXPECT_EQ(313, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 1478 EXPECT_EQ(313, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
1390 | 1479 |
1391 Play(); | 1480 Play(); |
1392 | 1481 |
1393 EXPECT_TRUE(WaitUntilOnEnded()); | 1482 EXPECT_TRUE(WaitUntilOnEnded()); |
1394 | 1483 |
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2020 | 2109 |
2021 TEST_F(PipelineIntegrationTest, BasicPlaybackPositiveStartTime) { | 2110 TEST_F(PipelineIntegrationTest, BasicPlaybackPositiveStartTime) { |
2022 ASSERT_EQ(PIPELINE_OK, Start("nonzero-start-time.webm")); | 2111 ASSERT_EQ(PIPELINE_OK, Start("nonzero-start-time.webm")); |
2023 Play(); | 2112 Play(); |
2024 ASSERT_TRUE(WaitUntilOnEnded()); | 2113 ASSERT_TRUE(WaitUntilOnEnded()); |
2025 ASSERT_EQ(base::TimeDelta::FromMicroseconds(396000), | 2114 ASSERT_EQ(base::TimeDelta::FromMicroseconds(396000), |
2026 demuxer_->GetStartTime()); | 2115 demuxer_->GetStartTime()); |
2027 } | 2116 } |
2028 | 2117 |
2029 } // namespace media | 2118 } // namespace media |
OLD | NEW |