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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 .WillRepeatedly(Return(null_pointer)); | 96 .WillRepeatedly(Return(null_pointer)); |
97 | 97 |
98 EXPECT_CALL(*demuxer_, GetTimelineOffset()) | 98 EXPECT_CALL(*demuxer_, GetTimelineOffset()) |
99 .WillRepeatedly(Return(base::Time())); | 99 .WillRepeatedly(Return(base::Time())); |
100 | 100 |
101 EXPECT_CALL(*demuxer_, GetLiveness()) | 101 EXPECT_CALL(*demuxer_, GetLiveness()) |
102 .WillRepeatedly(Return(Demuxer::LIVENESS_UNKNOWN)); | 102 .WillRepeatedly(Return(Demuxer::LIVENESS_UNKNOWN)); |
103 | 103 |
104 EXPECT_CALL(*renderer_, GetMediaTime()) | 104 EXPECT_CALL(*renderer_, GetMediaTime()) |
105 .WillRepeatedly(Return(base::TimeDelta())); | 105 .WillRepeatedly(Return(base::TimeDelta())); |
| 106 |
| 107 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_)); |
106 } | 108 } |
107 | 109 |
108 virtual ~PipelineTest() { | 110 virtual ~PipelineTest() { |
109 if (!pipeline_ || !pipeline_->IsRunning()) | 111 if (!pipeline_ || !pipeline_->IsRunning()) |
110 return; | 112 return; |
111 | 113 |
112 ExpectDemuxerStop(); | 114 ExpectDemuxerStop(); |
113 | 115 |
114 // The mock demuxer doesn't stop the fake text track stream, | 116 // The mock demuxer doesn't stop the fake text track stream, |
115 // so just stop it manually. | 117 // so just stop it manually. |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 | 198 |
197 // Sets up expectations on the callback and initializes the pipeline. Called | 199 // Sets up expectations on the callback and initializes the pipeline. Called |
198 // after tests have set expectations any filters they wish to use. | 200 // after tests have set expectations any filters they wish to use. |
199 void StartPipelineAndExpect(PipelineStatus start_status) { | 201 void StartPipelineAndExpect(PipelineStatus start_status) { |
200 EXPECT_CALL(callbacks_, OnStart(start_status)); | 202 EXPECT_CALL(callbacks_, OnStart(start_status)); |
201 | 203 |
202 if (start_status == PIPELINE_OK) { | 204 if (start_status == PIPELINE_OK) { |
203 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_)); | 205 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_)); |
204 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0f)); | 206 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0f)); |
205 EXPECT_CALL(*renderer_, SetVolume(1.0f)); | 207 EXPECT_CALL(*renderer_, SetVolume(1.0f)); |
206 EXPECT_CALL(*renderer_, StartPlayingFrom(base::TimeDelta())) | 208 EXPECT_CALL(*renderer_, StartPlayingFrom(start_time_)) |
207 .WillOnce(SetBufferingState(&buffering_state_cb_, | 209 .WillOnce(SetBufferingState(&buffering_state_cb_, |
208 BUFFERING_HAVE_ENOUGH)); | 210 BUFFERING_HAVE_ENOUGH)); |
209 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); | 211 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
210 } | 212 } |
211 | 213 |
212 StartPipeline(); | 214 StartPipeline(); |
213 message_loop_.RunUntilIdle(); | 215 message_loop_.RunUntilIdle(); |
214 } | 216 } |
215 | 217 |
216 void CreateAudioStream() { | 218 void CreateAudioStream() { |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 StrictMock<MockRenderer>* renderer_; | 308 StrictMock<MockRenderer>* renderer_; |
307 StrictMock<CallbackHelper> text_renderer_callbacks_; | 309 StrictMock<CallbackHelper> text_renderer_callbacks_; |
308 TextRenderer* text_renderer_; | 310 TextRenderer* text_renderer_; |
309 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; | 311 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; |
310 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; | 312 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; |
311 scoped_ptr<FakeTextTrackStream> text_stream_; | 313 scoped_ptr<FakeTextTrackStream> text_stream_; |
312 BufferingStateCB buffering_state_cb_; | 314 BufferingStateCB buffering_state_cb_; |
313 base::Closure ended_cb_; | 315 base::Closure ended_cb_; |
314 VideoDecoderConfig video_decoder_config_; | 316 VideoDecoderConfig video_decoder_config_; |
315 PipelineMetadata metadata_; | 317 PipelineMetadata metadata_; |
| 318 base::TimeDelta start_time_; |
316 | 319 |
317 private: | 320 private: |
318 DISALLOW_COPY_AND_ASSIGN(PipelineTest); | 321 DISALLOW_COPY_AND_ASSIGN(PipelineTest); |
319 }; | 322 }; |
320 | 323 |
321 // Test that playback controls methods no-op when the pipeline hasn't been | 324 // Test that playback controls methods no-op when the pipeline hasn't been |
322 // started. | 325 // started. |
323 TEST_F(PipelineTest, NotStarted) { | 326 TEST_F(PipelineTest, NotStarted) { |
324 const base::TimeDelta kZero; | 327 const base::TimeDelta kZero; |
325 | 328 |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 // Simulate underflow. | 738 // Simulate underflow. |
736 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); | 739 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); |
737 buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); | 740 buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
738 | 741 |
739 // Seek while underflowed. | 742 // Seek while underflowed. |
740 base::TimeDelta expected = base::TimeDelta::FromSeconds(5); | 743 base::TimeDelta expected = base::TimeDelta::FromSeconds(5); |
741 ExpectSeek(expected, true); | 744 ExpectSeek(expected, true); |
742 DoSeek(expected); | 745 DoSeek(expected); |
743 } | 746 } |
744 | 747 |
| 748 TEST_F(PipelineTest, PositiveStartTime) { |
| 749 start_time_ = base::TimeDelta::FromSeconds(1); |
| 750 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_)); |
| 751 CreateAudioStream(); |
| 752 MockDemuxerStreamVector streams; |
| 753 streams.push_back(audio_stream()); |
| 754 SetDemuxerExpectations(&streams); |
| 755 SetRendererExpectations(); |
| 756 StartPipelineAndExpect(PIPELINE_OK); |
| 757 ExpectDemuxerStop(); |
| 758 ExpectPipelineStopAndDestroyPipeline(); |
| 759 pipeline_->Stop( |
| 760 base::Bind(&CallbackHelper::OnStop, base::Unretained(&callbacks_))); |
| 761 message_loop_.RunUntilIdle(); |
| 762 } |
| 763 |
745 class PipelineTeardownTest : public PipelineTest { | 764 class PipelineTeardownTest : public PipelineTest { |
746 public: | 765 public: |
747 enum TeardownState { | 766 enum TeardownState { |
748 kInitDemuxer, | 767 kInitDemuxer, |
749 kInitRenderer, | 768 kInitRenderer, |
750 kFlushing, | 769 kFlushing, |
751 kSeeking, | 770 kSeeking, |
752 kPlaying, | 771 kPlaying, |
753 }; | 772 }; |
754 | 773 |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
974 | 993 |
975 INSTANTIATE_TEARDOWN_TEST(Error, InitDemuxer); | 994 INSTANTIATE_TEARDOWN_TEST(Error, InitDemuxer); |
976 INSTANTIATE_TEARDOWN_TEST(Error, InitRenderer); | 995 INSTANTIATE_TEARDOWN_TEST(Error, InitRenderer); |
977 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); | 996 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); |
978 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); | 997 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); |
979 INSTANTIATE_TEARDOWN_TEST(Error, Playing); | 998 INSTANTIATE_TEARDOWN_TEST(Error, Playing); |
980 | 999 |
981 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); | 1000 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); |
982 | 1001 |
983 } // namespace media | 1002 } // namespace media |
OLD | NEW |