| 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" |
| 6 |
| 5 #include <stddef.h> | 7 #include <stddef.h> |
| 6 | 8 #include <utility> |
| 7 #include <vector> | 9 #include <vector> |
| 8 | 10 |
| 9 #include "base/bind.h" | 11 #include "base/bind.h" |
| 10 #include "base/macros.h" | 12 #include "base/macros.h" |
| 11 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
| 12 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
| 13 #include "base/test/simple_test_tick_clock.h" | 15 #include "base/test/simple_test_tick_clock.h" |
| 14 #include "base/threading/simple_thread.h" | 16 #include "base/threading/simple_thread.h" |
| 15 #include "base/time/clock.h" | 17 #include "base/time/clock.h" |
| 16 #include "media/base/fake_text_track_stream.h" | 18 #include "media/base/fake_text_track_stream.h" |
| 17 #include "media/base/gmock_callback_support.h" | 19 #include "media/base/gmock_callback_support.h" |
| 18 #include "media/base/media_log.h" | 20 #include "media/base/media_log.h" |
| 19 #include "media/base/mock_filters.h" | 21 #include "media/base/mock_filters.h" |
| 20 #include "media/base/pipeline.h" | |
| 21 #include "media/base/test_helpers.h" | 22 #include "media/base/test_helpers.h" |
| 22 #include "media/base/text_renderer.h" | 23 #include "media/base/text_renderer.h" |
| 23 #include "media/base/text_track_config.h" | 24 #include "media/base/text_track_config.h" |
| 24 #include "media/base/time_delta_interpolator.h" | 25 #include "media/base/time_delta_interpolator.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 26 #include "ui/gfx/geometry/size.h" | 27 #include "ui/gfx/geometry/size.h" |
| 27 | 28 |
| 28 using ::testing::_; | 29 using ::testing::_; |
| 29 using ::testing::AnyNumber; | 30 using ::testing::AnyNumber; |
| 30 using ::testing::DeleteArg; | 31 using ::testing::DeleteArg; |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 | 163 |
| 163 void SetDemuxerExpectations(MockDemuxerStreamVector* streams) { | 164 void SetDemuxerExpectations(MockDemuxerStreamVector* streams) { |
| 164 // Initialize with a default non-zero duration. | 165 // Initialize with a default non-zero duration. |
| 165 SetDemuxerExpectations(streams, base::TimeDelta::FromSeconds(10)); | 166 SetDemuxerExpectations(streams, base::TimeDelta::FromSeconds(10)); |
| 166 } | 167 } |
| 167 | 168 |
| 168 scoped_ptr<StrictMock<MockDemuxerStream> > CreateStream( | 169 scoped_ptr<StrictMock<MockDemuxerStream> > CreateStream( |
| 169 DemuxerStream::Type type) { | 170 DemuxerStream::Type type) { |
| 170 scoped_ptr<StrictMock<MockDemuxerStream> > stream( | 171 scoped_ptr<StrictMock<MockDemuxerStream> > stream( |
| 171 new StrictMock<MockDemuxerStream>(type)); | 172 new StrictMock<MockDemuxerStream>(type)); |
| 172 return stream.Pass(); | 173 return stream; |
| 173 } | 174 } |
| 174 | 175 |
| 175 // Sets up expectations to allow the video renderer to initialize. | 176 // Sets up expectations to allow the video renderer to initialize. |
| 176 void SetRendererExpectations() { | 177 void SetRendererExpectations() { |
| 177 EXPECT_CALL(*renderer_, Initialize(_, _, _, _, _, _, _)) | 178 EXPECT_CALL(*renderer_, Initialize(_, _, _, _, _, _, _)) |
| 178 .WillOnce(DoAll(SaveArg<3>(&buffering_state_cb_), | 179 .WillOnce(DoAll(SaveArg<3>(&buffering_state_cb_), |
| 179 SaveArg<4>(&ended_cb_), | 180 SaveArg<4>(&ended_cb_), |
| 180 PostCallback<1>(PIPELINE_OK))); | 181 PostCallback<1>(PIPELINE_OK))); |
| 181 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream())); | 182 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream())); |
| 182 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream())); | 183 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream())); |
| 183 } | 184 } |
| 184 | 185 |
| 185 void AddTextStream() { | 186 void AddTextStream() { |
| 186 EXPECT_CALL(*this, OnAddTextTrack(_,_)) | 187 EXPECT_CALL(*this, OnAddTextTrack(_,_)) |
| 187 .WillOnce(Invoke(this, &PipelineTest::DoOnAddTextTrack)); | 188 .WillOnce(Invoke(this, &PipelineTest::DoOnAddTextTrack)); |
| 188 static_cast<DemuxerHost*>(pipeline_.get())->AddTextStream(text_stream(), | 189 static_cast<DemuxerHost*>(pipeline_.get())->AddTextStream(text_stream(), |
| 189 TextTrackConfig(kTextSubtitles, "", "", "")); | 190 TextTrackConfig(kTextSubtitles, "", "", "")); |
| 190 message_loop_.RunUntilIdle(); | 191 message_loop_.RunUntilIdle(); |
| 191 } | 192 } |
| 192 | 193 |
| 193 void StartPipeline() { | 194 void StartPipeline() { |
| 194 EXPECT_CALL(*this, OnWaitingForDecryptionKey()).Times(0); | 195 EXPECT_CALL(*this, OnWaitingForDecryptionKey()).Times(0); |
| 195 pipeline_->Start( | 196 pipeline_->Start( |
| 196 demuxer_.get(), scoped_renderer_.Pass(), | 197 demuxer_.get(), std::move(scoped_renderer_), |
| 197 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), | 198 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), |
| 198 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), | 199 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), |
| 199 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)), | 200 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)), |
| 200 base::Bind(&CallbackHelper::OnMetadata, base::Unretained(&callbacks_)), | 201 base::Bind(&CallbackHelper::OnMetadata, base::Unretained(&callbacks_)), |
| 201 base::Bind(&CallbackHelper::OnBufferingStateChange, | 202 base::Bind(&CallbackHelper::OnBufferingStateChange, |
| 202 base::Unretained(&callbacks_)), | 203 base::Unretained(&callbacks_)), |
| 203 base::Bind(&CallbackHelper::OnDurationChange, | 204 base::Bind(&CallbackHelper::OnDurationChange, |
| 204 base::Unretained(&callbacks_)), | 205 base::Unretained(&callbacks_)), |
| 205 base::Bind(&PipelineTest::OnAddTextTrack, base::Unretained(this)), | 206 base::Bind(&PipelineTest::OnAddTextTrack, base::Unretained(this)), |
| 206 base::Bind(&PipelineTest::OnWaitingForDecryptionKey, | 207 base::Bind(&PipelineTest::OnWaitingForDecryptionKey, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 231 } | 232 } |
| 232 | 233 |
| 233 void CreateVideoStream() { | 234 void CreateVideoStream() { |
| 234 video_stream_ = CreateStream(DemuxerStream::VIDEO); | 235 video_stream_ = CreateStream(DemuxerStream::VIDEO); |
| 235 video_stream_->set_video_decoder_config(video_decoder_config_); | 236 video_stream_->set_video_decoder_config(video_decoder_config_); |
| 236 } | 237 } |
| 237 | 238 |
| 238 void CreateTextStream() { | 239 void CreateTextStream() { |
| 239 scoped_ptr<FakeTextTrackStream> text_stream(new FakeTextTrackStream()); | 240 scoped_ptr<FakeTextTrackStream> text_stream(new FakeTextTrackStream()); |
| 240 EXPECT_CALL(*text_stream, OnRead()).Times(AnyNumber()); | 241 EXPECT_CALL(*text_stream, OnRead()).Times(AnyNumber()); |
| 241 text_stream_ = text_stream.Pass(); | 242 text_stream_ = std::move(text_stream); |
| 242 } | 243 } |
| 243 | 244 |
| 244 MockDemuxerStream* audio_stream() { | 245 MockDemuxerStream* audio_stream() { |
| 245 return audio_stream_.get(); | 246 return audio_stream_.get(); |
| 246 } | 247 } |
| 247 | 248 |
| 248 MockDemuxerStream* video_stream() { | 249 MockDemuxerStream* video_stream() { |
| 249 return video_stream_.get(); | 250 return video_stream_.get(); |
| 250 } | 251 } |
| 251 | 252 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 EXPECT_CALL(*renderer_, SetVolume(_)); | 309 EXPECT_CALL(*renderer_, SetVolume(_)); |
| 309 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time)) | 310 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time)) |
| 310 .WillOnce( | 311 .WillOnce( |
| 311 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_ENOUGH)); | 312 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_ENOUGH)); |
| 312 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); | 313 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
| 313 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK)); | 314 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK)); |
| 314 } | 315 } |
| 315 | 316 |
| 316 void DoResume(const base::TimeDelta& seek_time) { | 317 void DoResume(const base::TimeDelta& seek_time) { |
| 317 pipeline_->Resume( | 318 pipeline_->Resume( |
| 318 scoped_renderer_.Pass(), seek_time, | 319 std::move(scoped_renderer_), seek_time, |
| 319 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_))); | 320 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_))); |
| 320 message_loop_.RunUntilIdle(); | 321 message_loop_.RunUntilIdle(); |
| 321 } | 322 } |
| 322 | 323 |
| 323 void DestroyPipeline() { | 324 void DestroyPipeline() { |
| 324 // In real code Pipeline could be destroyed on a different thread. All weak | 325 // In real code Pipeline could be destroyed on a different thread. All weak |
| 325 // pointers must have been invalidated before the stop callback returns. | 326 // pointers must have been invalidated before the stop callback returns. |
| 326 DCHECK(!pipeline_->HasWeakPtrsForTesting()); | 327 DCHECK(!pipeline_->HasWeakPtrsForTesting()); |
| 327 pipeline_.reset(); | 328 pipeline_.reset(); |
| 328 } | 329 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 339 .WillOnce(Invoke(this, &PipelineTest::DestroyPipeline)); | 340 .WillOnce(Invoke(this, &PipelineTest::DestroyPipeline)); |
| 340 } | 341 } |
| 341 | 342 |
| 342 MOCK_METHOD2(OnAddTextTrack, void(const TextTrackConfig&, | 343 MOCK_METHOD2(OnAddTextTrack, void(const TextTrackConfig&, |
| 343 const AddTextTrackDoneCB&)); | 344 const AddTextTrackDoneCB&)); |
| 344 MOCK_METHOD0(OnWaitingForDecryptionKey, void(void)); | 345 MOCK_METHOD0(OnWaitingForDecryptionKey, void(void)); |
| 345 | 346 |
| 346 void DoOnAddTextTrack(const TextTrackConfig& config, | 347 void DoOnAddTextTrack(const TextTrackConfig& config, |
| 347 const AddTextTrackDoneCB& done_cb) { | 348 const AddTextTrackDoneCB& done_cb) { |
| 348 scoped_ptr<TextTrack> text_track(new MockTextTrack); | 349 scoped_ptr<TextTrack> text_track(new MockTextTrack); |
| 349 done_cb.Run(text_track.Pass()); | 350 done_cb.Run(std::move(text_track)); |
| 350 } | 351 } |
| 351 | 352 |
| 352 // Fixture members. | 353 // Fixture members. |
| 353 StrictMock<CallbackHelper> callbacks_; | 354 StrictMock<CallbackHelper> callbacks_; |
| 354 base::SimpleTestTickClock test_tick_clock_; | 355 base::SimpleTestTickClock test_tick_clock_; |
| 355 base::MessageLoop message_loop_; | 356 base::MessageLoop message_loop_; |
| 356 scoped_ptr<Pipeline> pipeline_; | 357 scoped_ptr<Pipeline> pipeline_; |
| 357 | 358 |
| 358 scoped_ptr<StrictMock<MockDemuxer> > demuxer_; | 359 scoped_ptr<StrictMock<MockDemuxer> > demuxer_; |
| 359 scoped_ptr<StrictMock<MockRenderer> > scoped_renderer_; | 360 scoped_ptr<StrictMock<MockRenderer> > scoped_renderer_; |
| (...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1154 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); | 1155 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); |
| 1155 INSTANTIATE_TEARDOWN_TEST(Error, Playing); | 1156 INSTANTIATE_TEARDOWN_TEST(Error, Playing); |
| 1156 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); | 1157 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); |
| 1157 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); | 1158 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); |
| 1158 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); | 1159 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); |
| 1159 | 1160 |
| 1160 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); | 1161 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); |
| 1161 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); | 1162 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); |
| 1162 | 1163 |
| 1163 } // namespace media | 1164 } // namespace media |
| OLD | NEW |