Chromium Code Reviews| Index: media/filters/pipeline_integration_test.cc |
| diff --git a/media/filters/pipeline_integration_test.cc b/media/filters/pipeline_integration_test.cc |
| index dfea318086ee6dfeda535419e9868989f5fa4add..4cbed51abba14126be855df77036db09dff53f6f 100644 |
| --- a/media/filters/pipeline_integration_test.cc |
| +++ b/media/filters/pipeline_integration_test.cc |
| @@ -20,6 +20,7 @@ |
| using testing::_; |
| using testing::AnyNumber; |
| using testing::AtMost; |
| +using testing::SaveArg; |
| using testing::Values; |
| namespace media { |
| @@ -73,6 +74,37 @@ const int k1280IsoFileDurationMs = 2736; |
| const int k1280IsoAVC3FileDurationMs = 2736; |
| #endif // defined(USE_PROPRIETARY_CODECS) |
| +// Return a wallclock timeline offset for bear-320x240-live.webm. |
| +static base::Time kLiveWallclockTimelineOffset() { |
| + // The file contians the following UTC timeline offset: |
| + // 2012-11-10 12:34:56.789123456 |
| + // Since base::Time only has a resolution of microseconds, |
| + // construct a base::Time for 2012-11-10 12:34:56.789123. |
| + base::Time::Exploded exploded_time; |
| + exploded_time.year = 2012; |
| + exploded_time.month = 11; |
| + exploded_time.day_of_month = 10; |
| + exploded_time.hour = 12; |
| + exploded_time.minute = 34; |
| + exploded_time.second = 56; |
| + exploded_time.millisecond = 789; |
| + base::Time wallclock_time = base::Time::FromUTCExploded(exploded_time); |
| + |
| + wallclock_time += base::TimeDelta::FromMicroseconds(123); |
| + |
| + return wallclock_time; |
| +} |
| + |
| +// FFmpeg only supports time a resolution of seconds so this |
| +// helper function truncates a base::Time to seconds resolution. |
| +static base::Time TruncateToFFmpegTimeResolution(base::Time t) { |
| + base::Time::Exploded exploded_time; |
| + t.UTCExplode(&exploded_time); |
| + exploded_time.millisecond = 0; |
| + |
| + return base::Time::FromUTCExploded(exploded_time); |
| +} |
| + |
| // Note: Tests using this class only exercise the DecryptingDemuxerStream path. |
| // They do not exercise the Decrypting{Audio|Video}Decoder path. |
| class FakeEncryptedMedia { |
| @@ -409,7 +441,8 @@ class PipelineIntegrationTest |
| public PipelineIntegrationTestBase { |
| public: |
| void StartPipelineWithMediaSource(MockMediaSource* source) { |
| - EXPECT_CALL(*this, OnMetadata(_)).Times(AtMost(1)); |
| + EXPECT_CALL(*this, OnMetadata(_)).Times(AtMost(1)) |
| + .WillRepeatedly(SaveArg<0>(&metadata_)); |
| EXPECT_CALL(*this, OnPrerollCompleted()).Times(AtMost(1)); |
| pipeline_->Start( |
| CreateFilterCollection(source->GetDemuxer(), NULL), |
| @@ -433,7 +466,8 @@ class PipelineIntegrationTest |
| void StartPipelineWithEncryptedMedia( |
| MockMediaSource* source, |
| FakeEncryptedMedia* encrypted_media) { |
| - EXPECT_CALL(*this, OnMetadata(_)).Times(AtMost(1)); |
| + EXPECT_CALL(*this, OnMetadata(_)).Times(AtMost(1)) |
| + .WillRepeatedly(SaveArg<0>(&metadata_)); |
| EXPECT_CALL(*this, OnPrerollCompleted()).Times(AtMost(1)); |
| pipeline_->Start( |
| CreateFilterCollection(source->GetDemuxer(), |
| @@ -504,6 +538,24 @@ TEST_F(PipelineIntegrationTest, BasicPlaybackHashed) { |
| EXPECT_EQ("f0be120a90a811506777c99a2cdf7cc1", GetVideoHash()); |
| EXPECT_EQ("-3.59,-2.06,-0.43,2.15,0.77,-0.95,", GetAudioHash()); |
| + EXPECT_TRUE(demuxer_->GetWallclockTimelineOffset().is_null()); |
| +} |
| + |
| +TEST_F(PipelineIntegrationTest, BasicPlaybackLive) { |
| + ASSERT_TRUE(Start( |
| + GetTestDataFilePath("bear-320x240-live.webm"), PIPELINE_OK, kHashed)); |
| + |
| + Play(); |
| + |
| + ASSERT_TRUE(WaitUntilOnEnded()); |
| + |
| + EXPECT_EQ("f0be120a90a811506777c99a2cdf7cc1", GetVideoHash()); |
| + EXPECT_EQ("-3.59,-2.06,-0.43,2.15,0.77,-0.95,", GetAudioHash()); |
| + |
| + // TODO: Fix FFmpeg code to return higher resolution time values so |
| + // we don't have to truncate our expectations here. |
| + EXPECT_EQ(TruncateToFFmpegTimeResolution(kLiveWallclockTimelineOffset()), |
| + demuxer_->GetWallclockTimelineOffset()); |
| } |
| TEST_F(PipelineIntegrationTest, F32PlaybackHashed) { |
| @@ -542,10 +594,33 @@ TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource) { |
| Play(); |
| ASSERT_TRUE(WaitUntilOnEnded()); |
| + |
| + EXPECT_TRUE(demuxer_->GetWallclockTimelineOffset().is_null()); |
| + source.Abort(); |
| + Stop(); |
| +} |
| + |
| +TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource_Live) { |
| + MockMediaSource source("bear-320x240-live.webm", kWebM, 219221, GetParam()); |
| + StartPipelineWithMediaSource(&source); |
| + source.EndOfStream(); |
| + |
| + EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
| + EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
| + EXPECT_EQ(k320WebMFileDurationMs, |
| + pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
| + |
| + Play(); |
| + |
| + ASSERT_TRUE(WaitUntilOnEnded()); |
| + |
| + EXPECT_EQ(kLiveWallclockTimelineOffset(), |
| + demuxer_->GetWallclockTimelineOffset()); |
| source.Abort(); |
| Stop(); |
| } |
| + |
|
scherkus (not reviewing)
2014/04/15 00:53:40
remove extra blink
acolwell GONE FROM CHROMIUM
2014/04/16 01:01:08
Done.
|
| TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource_VP9_WebM) { |
| MockMediaSource source("bear-vp9.webm", kWebMVP9, 67504, GetParam()); |
| StartPipelineWithMediaSource(&source); |