diff options
Diffstat (limited to 'chromium/media/base/pipeline_unittest.cc')
-rw-r--r-- | chromium/media/base/pipeline_unittest.cc | 119 |
1 files changed, 101 insertions, 18 deletions
diff --git a/chromium/media/base/pipeline_unittest.cc b/chromium/media/base/pipeline_unittest.cc index 4c8640c7807..a7a8cae316c 100644 --- a/chromium/media/base/pipeline_unittest.cc +++ b/chromium/media/base/pipeline_unittest.cc @@ -11,11 +11,14 @@ #include "base/threading/simple_thread.h" #include "base/time/clock.h" #include "media/base/clock.h" +#include "media/base/fake_text_track_stream.h" #include "media/base/gmock_callback_support.h" #include "media/base/media_log.h" #include "media/base/mock_filters.h" #include "media/base/pipeline.h" #include "media/base/test_helpers.h" +#include "media/base/text_renderer.h" +#include "media/base/text_track_config.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/size.h" @@ -36,8 +39,7 @@ using ::testing::WithArg; namespace media { // Demuxer properties. -static const int kTotalBytes = 1024; -static const int kBitrate = 1234; +const int kTotalBytes = 1024; ACTION_P(SetDemuxerProperties, duration) { arg0->SetTotalBytes(kTotalBytes); @@ -94,6 +96,13 @@ class PipelineTest : public ::testing::Test { scoped_ptr<AudioRenderer> audio_renderer(audio_renderer_); filter_collection_->SetAudioRenderer(audio_renderer.Pass()); + text_renderer_ = new TextRenderer( + message_loop_.message_loop_proxy(), + base::Bind(&PipelineTest::OnAddTextTrack, + base::Unretained(this))); + scoped_ptr<TextRenderer> text_renderer(text_renderer_); + filter_collection_->SetTextRenderer(text_renderer.Pass()); + // InitializeDemuxer() adds overriding expectations for expected non-NULL // streams. DemuxerStream* null_pointer = NULL; @@ -110,6 +119,13 @@ class PipelineTest : public ::testing::Test { ExpectStop(); + // The mock demuxer doesn't stop the fake text track stream, + // so just stop it manually. + if (text_stream_) { + text_stream_->Stop(); + message_loop_.RunUntilIdle(); + } + // Expect a stop callback if we were started. EXPECT_CALL(callbacks_, OnStop()); pipeline_->Stop(base::Bind(&CallbackHelper::OnStop, @@ -123,7 +139,7 @@ class PipelineTest : public ::testing::Test { void InitializeDemuxer(MockDemuxerStreamVector* streams, const base::TimeDelta& duration) { EXPECT_CALL(callbacks_, OnDurationChange()); - EXPECT_CALL(*demuxer_, Initialize(_, _)) + EXPECT_CALL(*demuxer_, Initialize(_, _, _)) .WillOnce(DoAll(SetDemuxerProperties(duration), RunCallback<1>(PIPELINE_OK))); @@ -174,6 +190,13 @@ class PipelineTest : public ::testing::Test { } } + void AddTextStream() { + EXPECT_CALL(*this, OnAddTextTrack(_,_)) + .WillOnce(Invoke(this, &PipelineTest::DoOnAddTextTrack)); + static_cast<DemuxerHost*>(pipeline_.get())->AddTextStream(text_stream(), + TextTrackConfig(kTextSubtitles, "", "", "")); + } + // Sets up expectations on the callback and initializes the pipeline. Called // after tests have set expectations any filters they wish to use. void InitializePipeline(PipelineStatus start_status) { @@ -181,7 +204,6 @@ class PipelineTest : public ::testing::Test { if (start_status == PIPELINE_OK) { EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kHaveMetadata)); - EXPECT_CALL(*demuxer_, SetPlaybackRate(0.0f)); if (audio_stream_) { EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f)); @@ -217,6 +239,11 @@ class PipelineTest : public ::testing::Test { video_stream_->set_video_decoder_config(video_decoder_config_); } + void CreateTextStream() { + scoped_ptr<FakeTextTrackStream> text_stream(new FakeTextTrackStream); + text_stream_ = text_stream.Pass(); + } + MockDemuxerStream* audio_stream() { return audio_stream_.get(); } @@ -225,11 +252,14 @@ class PipelineTest : public ::testing::Test { return video_stream_.get(); } + FakeTextTrackStream* text_stream() { + return text_stream_.get(); + } + void ExpectSeek(const base::TimeDelta& seek_time) { // Every filter should receive a call to Seek(). EXPECT_CALL(*demuxer_, Seek(seek_time, _)) .WillOnce(RunCallback<1>(PIPELINE_OK)); - EXPECT_CALL(*demuxer_, SetPlaybackRate(_)); if (audio_stream_) { EXPECT_CALL(*audio_renderer_, Pause(_)) @@ -284,6 +314,15 @@ class PipelineTest : public ::testing::Test { EXPECT_CALL(*video_renderer_, Stop(_)).WillOnce(RunClosure<0>()); } + MOCK_METHOD2(OnAddTextTrack, void(const TextTrackConfig&, + const AddTextTrackDoneCB&)); + + void DoOnAddTextTrack(const TextTrackConfig& config, + const AddTextTrackDoneCB& done_cb) { + scoped_ptr<TextTrack> text_track(new MockTextTrack); + done_cb.Run(text_track.Pass()); + } + // Fixture members. StrictMock<CallbackHelper> callbacks_; base::SimpleTestTickClock test_tick_clock_; @@ -294,8 +333,11 @@ class PipelineTest : public ::testing::Test { scoped_ptr<MockDemuxer> demuxer_; MockVideoRenderer* video_renderer_; MockAudioRenderer* audio_renderer_; + StrictMock<CallbackHelper> text_renderer_callbacks_; + TextRenderer* text_renderer_; scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; + scoped_ptr<FakeTextTrackStream> text_stream_; AudioRenderer::TimeCB audio_time_cb_; VideoDecoderConfig video_decoder_config_; @@ -341,7 +383,7 @@ TEST_F(PipelineTest, NotStarted) { TEST_F(PipelineTest, NeverInitializes) { // Don't execute the callback passed into Initialize(). - EXPECT_CALL(*demuxer_, Initialize(_, _)); + EXPECT_CALL(*demuxer_, Initialize(_, _, _)); // This test hangs during initialization by never calling // InitializationComplete(). StrictMock<> will ensure that the callback is @@ -366,7 +408,7 @@ TEST_F(PipelineTest, NeverInitializes) { } TEST_F(PipelineTest, URLNotFound) { - EXPECT_CALL(*demuxer_, Initialize(_, _)) + EXPECT_CALL(*demuxer_, Initialize(_, _, _)) .WillOnce(RunCallback<1>(PIPELINE_ERROR_URL_NOT_FOUND)); EXPECT_CALL(*demuxer_, Stop(_)) .WillOnce(RunClosure<0>()); @@ -375,7 +417,7 @@ TEST_F(PipelineTest, URLNotFound) { } TEST_F(PipelineTest, NoStreams) { - EXPECT_CALL(*demuxer_, Initialize(_, _)) + EXPECT_CALL(*demuxer_, Initialize(_, _, _)) .WillOnce(RunCallback<1>(PIPELINE_OK)); EXPECT_CALL(*demuxer_, Stop(_)) .WillOnce(RunClosure<0>()); @@ -425,9 +467,47 @@ TEST_F(PipelineTest, AudioVideoStream) { EXPECT_TRUE(pipeline_->HasVideo()); } +TEST_F(PipelineTest, VideoTextStream) { + CreateVideoStream(); + CreateTextStream(); + MockDemuxerStreamVector streams; + streams.push_back(video_stream()); + + InitializeDemuxer(&streams); + InitializeVideoRenderer(video_stream()); + + InitializePipeline(PIPELINE_OK); + EXPECT_FALSE(pipeline_->HasAudio()); + EXPECT_TRUE(pipeline_->HasVideo()); + + AddTextStream(); + message_loop_.RunUntilIdle(); +} + +TEST_F(PipelineTest, VideoAudioTextStream) { + CreateVideoStream(); + CreateAudioStream(); + CreateTextStream(); + MockDemuxerStreamVector streams; + streams.push_back(video_stream()); + streams.push_back(audio_stream()); + + InitializeDemuxer(&streams); + InitializeVideoRenderer(video_stream()); + InitializeAudioRenderer(audio_stream(), false); + + InitializePipeline(PIPELINE_OK); + EXPECT_TRUE(pipeline_->HasAudio()); + EXPECT_TRUE(pipeline_->HasVideo()); + + AddTextStream(); + message_loop_.RunUntilIdle(); +} + TEST_F(PipelineTest, Seek) { CreateAudioStream(); CreateVideoStream(); + CreateTextStream(); MockDemuxerStreamVector streams; streams.push_back(audio_stream()); streams.push_back(video_stream()); @@ -439,6 +519,9 @@ TEST_F(PipelineTest, Seek) { // Initialize then seek! InitializePipeline(PIPELINE_OK); + AddTextStream(); + message_loop_.RunUntilIdle(); + // Every filter should receive a call to Seek(). base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); ExpectSeek(expected); @@ -577,6 +660,7 @@ TEST_F(PipelineTest, DisableAudioRendererDuringInit) { TEST_F(PipelineTest, EndedCallback) { CreateAudioStream(); CreateVideoStream(); + CreateTextStream(); MockDemuxerStreamVector streams; streams.push_back(audio_stream()); streams.push_back(video_stream()); @@ -586,13 +670,18 @@ TEST_F(PipelineTest, EndedCallback) { InitializeVideoRenderer(video_stream()); InitializePipeline(PIPELINE_OK); - // The ended callback shouldn't run until both renderers have ended. + AddTextStream(); + + // The ended callback shouldn't run until all renderers have ended. pipeline_->OnAudioRendererEnded(); message_loop_.RunUntilIdle(); - EXPECT_CALL(callbacks_, OnEnded()); pipeline_->OnVideoRendererEnded(); message_loop_.RunUntilIdle(); + + EXPECT_CALL(callbacks_, OnEnded()); + text_stream()->SendEosNotification(); + message_loop_.RunUntilIdle(); } TEST_F(PipelineTest, AudioStreamShorterThanVideo) { @@ -616,7 +705,6 @@ TEST_F(PipelineTest, AudioStreamShorterThanVideo) { EXPECT_EQ(0, pipeline_->GetMediaTime().ToInternalValue()); float playback_rate = 1.0f; - EXPECT_CALL(*demuxer_, SetPlaybackRate(playback_rate)); EXPECT_CALL(*video_renderer_, SetPlaybackRate(playback_rate)); EXPECT_CALL(*audio_renderer_, SetPlaybackRate(playback_rate)); pipeline_->SetPlaybackRate(playback_rate); @@ -654,7 +742,6 @@ TEST_F(PipelineTest, ErrorDuringSeek) { InitializePipeline(PIPELINE_OK); float playback_rate = 1.0f; - EXPECT_CALL(*demuxer_, SetPlaybackRate(playback_rate)); EXPECT_CALL(*audio_renderer_, SetPlaybackRate(playback_rate)); pipeline_->SetPlaybackRate(playback_rate); message_loop_.RunUntilIdle(); @@ -789,7 +876,6 @@ TEST_F(PipelineTest, AudioTimeUpdateDuringSeek) { InitializePipeline(PIPELINE_OK); float playback_rate = 1.0f; - EXPECT_CALL(*demuxer_, SetPlaybackRate(playback_rate)); EXPECT_CALL(*audio_renderer_, SetPlaybackRate(playback_rate)); pipeline_->SetPlaybackRate(playback_rate); message_loop_.RunUntilIdle(); @@ -815,7 +901,6 @@ TEST_F(PipelineTest, AudioTimeUpdateDuringSeek) { .WillOnce(RunClosure<0>()); EXPECT_CALL(*audio_renderer_, Preroll(seek_time, _)) .WillOnce(RunCallback<1>(PIPELINE_OK)); - EXPECT_CALL(*demuxer_, SetPlaybackRate(_)); EXPECT_CALL(*audio_renderer_, SetPlaybackRate(_)); EXPECT_CALL(*audio_renderer_, SetVolume(_)); EXPECT_CALL(*audio_renderer_, Play(_)) @@ -930,13 +1015,13 @@ class PipelineTeardownTest : public PipelineTest { if (state == kInitDemuxer) { if (stop_or_error == kStop) { - EXPECT_CALL(*demuxer_, Initialize(_, _)) + EXPECT_CALL(*demuxer_, Initialize(_, _, _)) .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), RunCallback<1>(PIPELINE_OK))); EXPECT_CALL(callbacks_, OnStop()); } else { status = DEMUXER_ERROR_COULD_NOT_OPEN; - EXPECT_CALL(*demuxer_, Initialize(_, _)) + EXPECT_CALL(*demuxer_, Initialize(_, _, _)) .WillOnce(RunCallback<1>(status)); } @@ -1000,7 +1085,6 @@ class PipelineTeardownTest : public PipelineTest { EXPECT_CALL(*video_renderer_, Preroll(base::TimeDelta(), _)) .WillOnce(RunCallback<1>(PIPELINE_OK)); - EXPECT_CALL(*demuxer_, SetPlaybackRate(0.0f)); EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f)); EXPECT_CALL(*video_renderer_, SetPlaybackRate(0.0f)); EXPECT_CALL(*audio_renderer_, SetVolume(1.0f)); @@ -1109,7 +1193,6 @@ class PipelineTeardownTest : public PipelineTest { .WillOnce(RunCallback<1>(PIPELINE_OK)); // Playback rate and volume are updated prior to starting. - EXPECT_CALL(*demuxer_, SetPlaybackRate(0.0f)); EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f)); EXPECT_CALL(*video_renderer_, SetPlaybackRate(0.0f)); EXPECT_CALL(*audio_renderer_, SetVolume(1.0f)); |