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 "media/base/pipeline.h" | 5 #include "media/base/pipeline.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 MOCK_METHOD1(OnError, void(PipelineStatus)); | 90 MOCK_METHOD1(OnError, void(PipelineStatus)); |
91 MOCK_METHOD1(OnMetadata, void(PipelineMetadata)); | 91 MOCK_METHOD1(OnMetadata, void(PipelineMetadata)); |
92 MOCK_METHOD1(OnBufferingStateChange, void(BufferingState)); | 92 MOCK_METHOD1(OnBufferingStateChange, void(BufferingState)); |
93 MOCK_METHOD0(OnDurationChange, void()); | 93 MOCK_METHOD0(OnDurationChange, void()); |
94 | 94 |
95 private: | 95 private: |
96 DISALLOW_COPY_AND_ASSIGN(CallbackHelper); | 96 DISALLOW_COPY_AND_ASSIGN(CallbackHelper); |
97 }; | 97 }; |
98 | 98 |
99 PipelineTest() | 99 PipelineTest() |
100 : pipeline_(new Pipeline(message_loop_.task_runner(), | 100 : pipeline_( |
101 new MediaLog())), | 101 new PipelineImpl(message_loop_.task_runner(), new MediaLog())), |
102 demuxer_(new StrictMock<MockDemuxer>()), | 102 demuxer_(new StrictMock<MockDemuxer>()), |
103 scoped_renderer_(new StrictMock<MockRenderer>()), | 103 scoped_renderer_(new StrictMock<MockRenderer>()), |
104 renderer_(scoped_renderer_.get()) { | 104 renderer_(scoped_renderer_.get()) { |
105 // SetDemuxerExpectations() adds overriding expectations for expected | 105 // SetDemuxerExpectations() adds overriding expectations for expected |
106 // non-NULL streams. | 106 // non-NULL streams. |
107 DemuxerStream* null_pointer = NULL; | 107 DemuxerStream* null_pointer = NULL; |
108 EXPECT_CALL(*demuxer_, GetStream(_)) | 108 EXPECT_CALL(*demuxer_, GetStream(_)) |
109 .WillRepeatedly(Return(null_pointer)); | 109 .WillRepeatedly(Return(null_pointer)); |
110 | 110 |
111 EXPECT_CALL(*demuxer_, GetTimelineOffset()) | 111 EXPECT_CALL(*demuxer_, GetTimelineOffset()) |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 void AddTextStream() { | 186 void AddTextStream() { |
187 EXPECT_CALL(*this, OnAddTextTrack(_,_)) | 187 EXPECT_CALL(*this, OnAddTextTrack(_,_)) |
188 .WillOnce(Invoke(this, &PipelineTest::DoOnAddTextTrack)); | 188 .WillOnce(Invoke(this, &PipelineTest::DoOnAddTextTrack)); |
189 static_cast<DemuxerHost*>(pipeline_.get())->AddTextStream(text_stream(), | 189 static_cast<DemuxerHost*>(pipeline_.get())->AddTextStream(text_stream(), |
190 TextTrackConfig(kTextSubtitles, "", "", "")); | 190 TextTrackConfig(kTextSubtitles, "", "", "")); |
191 message_loop_.RunUntilIdle(); | 191 message_loop_.RunUntilIdle(); |
192 } | 192 } |
193 | 193 |
194 void StartPipeline() { | 194 void StartPipeline() { |
195 EXPECT_CALL(*this, OnWaitingForDecryptionKey()).Times(0); | 195 EXPECT_CALL(*this, OnWaitingForDecryptionKey()).Times(0); |
| 196 scoped_ptr<Renderer> renderer = std::move(scoped_renderer_); |
196 pipeline_->Start( | 197 pipeline_->Start( |
197 demuxer_.get(), std::move(scoped_renderer_), | 198 demuxer_.get(), &renderer, |
198 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), | 199 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), |
199 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), | 200 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), |
200 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)), | 201 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)), |
201 base::Bind(&CallbackHelper::OnMetadata, base::Unretained(&callbacks_)), | 202 base::Bind(&CallbackHelper::OnMetadata, base::Unretained(&callbacks_)), |
202 base::Bind(&CallbackHelper::OnBufferingStateChange, | 203 base::Bind(&CallbackHelper::OnBufferingStateChange, |
203 base::Unretained(&callbacks_)), | 204 base::Unretained(&callbacks_)), |
204 base::Bind(&CallbackHelper::OnDurationChange, | 205 base::Bind(&CallbackHelper::OnDurationChange, |
205 base::Unretained(&callbacks_)), | 206 base::Unretained(&callbacks_)), |
206 base::Bind(&PipelineTest::OnAddTextTrack, base::Unretained(this)), | 207 base::Bind(&PipelineTest::OnAddTextTrack, base::Unretained(this)), |
207 base::Bind(&PipelineTest::OnWaitingForDecryptionKey, | 208 base::Bind(&PipelineTest::OnWaitingForDecryptionKey, |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 EXPECT_CALL(*renderer_, SetPlaybackRate(_)); | 309 EXPECT_CALL(*renderer_, SetPlaybackRate(_)); |
309 EXPECT_CALL(*renderer_, SetVolume(_)); | 310 EXPECT_CALL(*renderer_, SetVolume(_)); |
310 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time)) | 311 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time)) |
311 .WillOnce( | 312 .WillOnce( |
312 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_ENOUGH)); | 313 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_ENOUGH)); |
313 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); | 314 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
314 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK)); | 315 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK)); |
315 } | 316 } |
316 | 317 |
317 void DoResume(const base::TimeDelta& seek_time) { | 318 void DoResume(const base::TimeDelta& seek_time) { |
| 319 scoped_ptr<Renderer> renderer = std::move(scoped_renderer_); |
318 pipeline_->Resume( | 320 pipeline_->Resume( |
319 std::move(scoped_renderer_), seek_time, | 321 &renderer, seek_time, |
320 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_))); | 322 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_))); |
321 message_loop_.RunUntilIdle(); | 323 message_loop_.RunUntilIdle(); |
322 } | 324 } |
323 | 325 |
324 void DestroyPipeline() { | 326 void DestroyPipeline() { |
325 // In real code Pipeline could be destroyed on a different thread. All weak | 327 // In real code Pipeline could be destroyed on a different thread. All weak |
326 // pointers must have been invalidated before the stop callback returns. | 328 // pointers must have been invalidated before the stop callback returns. |
327 DCHECK(!pipeline_->HasWeakPtrsForTesting()); | 329 DCHECK(!pipeline_->HasWeakPtrsForTesting()); |
328 pipeline_.reset(); | 330 pipeline_.reset(); |
329 } | 331 } |
(...skipping 17 matching lines...) Expand all Loading... |
347 void DoOnAddTextTrack(const TextTrackConfig& config, | 349 void DoOnAddTextTrack(const TextTrackConfig& config, |
348 const AddTextTrackDoneCB& done_cb) { | 350 const AddTextTrackDoneCB& done_cb) { |
349 scoped_ptr<TextTrack> text_track(new MockTextTrack); | 351 scoped_ptr<TextTrack> text_track(new MockTextTrack); |
350 done_cb.Run(std::move(text_track)); | 352 done_cb.Run(std::move(text_track)); |
351 } | 353 } |
352 | 354 |
353 // Fixture members. | 355 // Fixture members. |
354 StrictMock<CallbackHelper> callbacks_; | 356 StrictMock<CallbackHelper> callbacks_; |
355 base::SimpleTestTickClock test_tick_clock_; | 357 base::SimpleTestTickClock test_tick_clock_; |
356 base::MessageLoop message_loop_; | 358 base::MessageLoop message_loop_; |
357 scoped_ptr<Pipeline> pipeline_; | 359 scoped_ptr<PipelineImpl> pipeline_; |
358 | 360 |
359 scoped_ptr<StrictMock<MockDemuxer> > demuxer_; | 361 scoped_ptr<StrictMock<MockDemuxer> > demuxer_; |
360 scoped_ptr<StrictMock<MockRenderer> > scoped_renderer_; | 362 scoped_ptr<StrictMock<MockRenderer> > scoped_renderer_; |
361 StrictMock<MockRenderer>* renderer_; | 363 StrictMock<MockRenderer>* renderer_; |
362 StrictMock<CallbackHelper> text_renderer_callbacks_; | 364 StrictMock<CallbackHelper> text_renderer_callbacks_; |
363 TextRenderer* text_renderer_; | 365 TextRenderer* text_renderer_; |
364 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; | 366 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; |
365 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; | 367 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; |
366 scoped_ptr<FakeTextTrackStream> text_stream_; | 368 scoped_ptr<FakeTextTrackStream> text_stream_; |
367 BufferingStateCB buffering_state_cb_; | 369 BufferingStateCB buffering_state_cb_; |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
727 EXPECT_CALL(*demuxer_, Stop()); | 729 EXPECT_CALL(*demuxer_, Stop()); |
728 | 730 |
729 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, | 731 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, |
730 base::Unretained(&callbacks_))); | 732 base::Unretained(&callbacks_))); |
731 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); | 733 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); |
732 message_loop_.RunUntilIdle(); | 734 message_loop_.RunUntilIdle(); |
733 } | 735 } |
734 | 736 |
735 // Invoked function OnError. This asserts that the pipeline does not enqueue | 737 // Invoked function OnError. This asserts that the pipeline does not enqueue |
736 // non-teardown related tasks while tearing down. | 738 // non-teardown related tasks while tearing down. |
737 static void TestNoCallsAfterError( | 739 static void TestNoCallsAfterError(PipelineImpl* pipeline, |
738 Pipeline* pipeline, base::MessageLoop* message_loop, | 740 base::MessageLoop* message_loop, |
739 PipelineStatus /* status */) { | 741 PipelineStatus /* status */) { |
740 CHECK(pipeline); | 742 CHECK(pipeline); |
741 CHECK(message_loop); | 743 CHECK(message_loop); |
742 | 744 |
743 // When we get to this stage, the message loop should be empty. | 745 // When we get to this stage, the message loop should be empty. |
744 EXPECT_TRUE(message_loop->IsIdleForTesting()); | 746 EXPECT_TRUE(message_loop->IsIdleForTesting()); |
745 | 747 |
746 // Make calls on pipeline after error has occurred. | 748 // Make calls on pipeline after error has occurred. |
747 pipeline->SetPlaybackRate(0.5); | 749 pipeline->SetPlaybackRate(0.5); |
748 pipeline->SetVolume(0.5f); | 750 pipeline->SetVolume(0.5f); |
749 | 751 |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1157 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); | 1159 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); |
1158 INSTANTIATE_TEARDOWN_TEST(Error, Playing); | 1160 INSTANTIATE_TEARDOWN_TEST(Error, Playing); |
1159 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); | 1161 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); |
1160 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); | 1162 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); |
1161 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); | 1163 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); |
1162 | 1164 |
1163 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); | 1165 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); |
1164 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); | 1166 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); |
1165 | 1167 |
1166 } // namespace media | 1168 } // namespace media |
OLD | NEW |