Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: media/base/pipeline_unittest.cc

Issue 291093013: Revert of Update AudioRenderer API to fire changes in BufferingState. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/base/pipeline.cc ('k') | media/filters/audio_renderer_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 } 44 }
45 45
46 ACTION_P2(Stop, pipeline, stop_cb) { 46 ACTION_P2(Stop, pipeline, stop_cb) {
47 pipeline->Stop(stop_cb); 47 pipeline->Stop(stop_cb);
48 } 48 }
49 49
50 ACTION_P2(SetError, pipeline, status) { 50 ACTION_P2(SetError, pipeline, status) {
51 pipeline->SetErrorForTesting(status); 51 pipeline->SetErrorForTesting(status);
52 } 52 }
53 53
54 ACTION_P2(SetBufferingState, cb, buffering_state) {
55 cb->Run(buffering_state);
56 }
57
58 // Used for setting expectations on pipeline callbacks. Using a StrictMock 54 // Used for setting expectations on pipeline callbacks. Using a StrictMock
59 // also lets us test for missing callbacks. 55 // also lets us test for missing callbacks.
60 class CallbackHelper { 56 class CallbackHelper {
61 public: 57 public:
62 CallbackHelper() {} 58 CallbackHelper() {}
63 virtual ~CallbackHelper() {} 59 virtual ~CallbackHelper() {}
64 60
65 MOCK_METHOD1(OnStart, void(PipelineStatus)); 61 MOCK_METHOD1(OnStart, void(PipelineStatus));
66 MOCK_METHOD1(OnSeek, void(PipelineStatus)); 62 MOCK_METHOD1(OnSeek, void(PipelineStatus));
67 MOCK_METHOD0(OnStop, void()); 63 MOCK_METHOD0(OnStop, void());
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 // Startup sequence. 176 // Startup sequence.
181 EXPECT_CALL(*video_renderer_, Preroll(demuxer_->GetStartTime(), _)) 177 EXPECT_CALL(*video_renderer_, Preroll(demuxer_->GetStartTime(), _))
182 .WillOnce(RunCallback<1>(PIPELINE_OK)); 178 .WillOnce(RunCallback<1>(PIPELINE_OK));
183 EXPECT_CALL(*video_renderer_, Play(_)) 179 EXPECT_CALL(*video_renderer_, Play(_))
184 .WillOnce(RunClosure<0>()); 180 .WillOnce(RunClosure<0>());
185 } 181 }
186 182
187 // Sets up expectations to allow the audio renderer to initialize. 183 // Sets up expectations to allow the audio renderer to initialize.
188 void InitializeAudioRenderer(DemuxerStream* stream) { 184 void InitializeAudioRenderer(DemuxerStream* stream) {
189 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _)) 185 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _))
190 .WillOnce(DoAll(SaveArg<3>(&audio_time_cb_), 186 .WillOnce(DoAll(SaveArg<4>(&audio_time_cb_),
191 SaveArg<4>(&audio_buffering_state_cb_),
192 RunCallback<1>(PIPELINE_OK))); 187 RunCallback<1>(PIPELINE_OK)));
193 } 188 }
194 189
195 void AddTextStream() { 190 void AddTextStream() {
196 EXPECT_CALL(*this, OnAddTextTrack(_,_)) 191 EXPECT_CALL(*this, OnAddTextTrack(_,_))
197 .WillOnce(Invoke(this, &PipelineTest::DoOnAddTextTrack)); 192 .WillOnce(Invoke(this, &PipelineTest::DoOnAddTextTrack));
198 static_cast<DemuxerHost*>(pipeline_.get())->AddTextStream(text_stream(), 193 static_cast<DemuxerHost*>(pipeline_.get())->AddTextStream(text_stream(),
199 TextTrackConfig(kTextSubtitles, "", "", "")); 194 TextTrackConfig(kTextSubtitles, "", "", ""));
200 } 195 }
201 196
202 // Sets up expectations on the callback and initializes the pipeline. Called 197 // Sets up expectations on the callback and initializes the pipeline. Called
203 // after tests have set expectations any filters they wish to use. 198 // after tests have set expectations any filters they wish to use.
204 void InitializePipeline(PipelineStatus start_status) { 199 void InitializePipeline(PipelineStatus start_status) {
205 EXPECT_CALL(callbacks_, OnStart(start_status)); 200 EXPECT_CALL(callbacks_, OnStart(start_status));
206 201
207 if (start_status == PIPELINE_OK) { 202 if (start_status == PIPELINE_OK) {
208 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_)); 203 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_));
209 204
210 if (audio_stream_) { 205 if (audio_stream_) {
211 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f)); 206 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f));
212 EXPECT_CALL(*audio_renderer_, SetVolume(1.0f)); 207 EXPECT_CALL(*audio_renderer_, SetVolume(1.0f));
213 EXPECT_CALL(*audio_renderer_, StartPlayingFrom(base::TimeDelta())) 208
214 .WillOnce(SetBufferingState(&audio_buffering_state_cb_, 209 // Startup sequence.
215 BUFFERING_HAVE_ENOUGH)); 210 EXPECT_CALL(*audio_renderer_, Preroll(base::TimeDelta(), _))
211 .WillOnce(RunCallback<1>(PIPELINE_OK));
216 EXPECT_CALL(*audio_renderer_, StartRendering()); 212 EXPECT_CALL(*audio_renderer_, StartRendering());
217 } 213 }
218 EXPECT_CALL(callbacks_, OnPrerollCompleted()); 214 EXPECT_CALL(callbacks_, OnPrerollCompleted());
219 } 215 }
220 216
221 pipeline_->Start( 217 pipeline_->Start(
222 filter_collection_.Pass(), 218 filter_collection_.Pass(),
223 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), 219 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
224 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), 220 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
225 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)), 221 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)),
(...skipping 25 matching lines...) Expand all
251 } 247 }
252 248
253 MockDemuxerStream* video_stream() { 249 MockDemuxerStream* video_stream() {
254 return video_stream_.get(); 250 return video_stream_.get();
255 } 251 }
256 252
257 FakeTextTrackStream* text_stream() { 253 FakeTextTrackStream* text_stream() {
258 return text_stream_.get(); 254 return text_stream_.get();
259 } 255 }
260 256
261 void ExpectSeek(const base::TimeDelta& seek_time, bool underflowed) { 257 void ExpectSeek(const base::TimeDelta& seek_time) {
262 // Every filter should receive a call to Seek(). 258 // Every filter should receive a call to Seek().
263 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 259 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
264 .WillOnce(RunCallback<1>(PIPELINE_OK)); 260 .WillOnce(RunCallback<1>(PIPELINE_OK));
265 261
266 if (audio_stream_) { 262 if (audio_stream_) {
267 if (!underflowed) 263 EXPECT_CALL(*audio_renderer_, StopRendering());
268 EXPECT_CALL(*audio_renderer_, StopRendering());
269 EXPECT_CALL(*audio_renderer_, Flush(_)) 264 EXPECT_CALL(*audio_renderer_, Flush(_))
270 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, 265 .WillOnce(RunClosure<0>());
271 BUFFERING_HAVE_NOTHING), 266 EXPECT_CALL(*audio_renderer_, Preroll(seek_time, _))
272 RunClosure<0>())); 267 .WillOnce(RunCallback<1>(PIPELINE_OK));
273 EXPECT_CALL(*audio_renderer_, StartPlayingFrom(seek_time))
274 .WillOnce(SetBufferingState(&audio_buffering_state_cb_,
275 BUFFERING_HAVE_ENOUGH));
276 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(_)); 268 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(_));
277 EXPECT_CALL(*audio_renderer_, SetVolume(_)); 269 EXPECT_CALL(*audio_renderer_, SetVolume(_));
278 EXPECT_CALL(*audio_renderer_, StartRendering()); 270 EXPECT_CALL(*audio_renderer_, StartRendering());
279 } 271 }
280 272
281 if (video_stream_) { 273 if (video_stream_) {
282 EXPECT_CALL(*video_renderer_, Flush(_)) 274 EXPECT_CALL(*video_renderer_, Flush(_))
283 .WillOnce(RunClosure<0>()); 275 .WillOnce(RunClosure<0>());
284 EXPECT_CALL(*video_renderer_, Preroll(seek_time, _)) 276 EXPECT_CALL(*video_renderer_, Preroll(seek_time, _))
285 .WillOnce(RunCallback<1>(PIPELINE_OK)); 277 .WillOnce(RunCallback<1>(PIPELINE_OK));
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 scoped_ptr<FilterCollection> filter_collection_; 326 scoped_ptr<FilterCollection> filter_collection_;
335 scoped_ptr<MockDemuxer> demuxer_; 327 scoped_ptr<MockDemuxer> demuxer_;
336 MockVideoRenderer* video_renderer_; 328 MockVideoRenderer* video_renderer_;
337 MockAudioRenderer* audio_renderer_; 329 MockAudioRenderer* audio_renderer_;
338 StrictMock<CallbackHelper> text_renderer_callbacks_; 330 StrictMock<CallbackHelper> text_renderer_callbacks_;
339 TextRenderer* text_renderer_; 331 TextRenderer* text_renderer_;
340 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; 332 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_;
341 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; 333 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_;
342 scoped_ptr<FakeTextTrackStream> text_stream_; 334 scoped_ptr<FakeTextTrackStream> text_stream_;
343 AudioRenderer::TimeCB audio_time_cb_; 335 AudioRenderer::TimeCB audio_time_cb_;
344 AudioRenderer::BufferingStateCB audio_buffering_state_cb_;
345 VideoDecoderConfig video_decoder_config_; 336 VideoDecoderConfig video_decoder_config_;
346 PipelineMetadata metadata_; 337 PipelineMetadata metadata_;
347 338
348 private: 339 private:
349 DISALLOW_COPY_AND_ASSIGN(PipelineTest); 340 DISALLOW_COPY_AND_ASSIGN(PipelineTest);
350 }; 341 };
351 342
352 // Test that playback controls methods no-op when the pipeline hasn't been 343 // Test that playback controls methods no-op when the pipeline hasn't been
353 // started. 344 // started.
354 TEST_F(PipelineTest, NotStarted) { 345 TEST_F(PipelineTest, NotStarted) {
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 InitializeVideoRenderer(video_stream()); 503 InitializeVideoRenderer(video_stream());
513 504
514 // Initialize then seek! 505 // Initialize then seek!
515 InitializePipeline(PIPELINE_OK); 506 InitializePipeline(PIPELINE_OK);
516 507
517 AddTextStream(); 508 AddTextStream();
518 message_loop_.RunUntilIdle(); 509 message_loop_.RunUntilIdle();
519 510
520 // Every filter should receive a call to Seek(). 511 // Every filter should receive a call to Seek().
521 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); 512 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000);
522 ExpectSeek(expected, false); 513 ExpectSeek(expected);
523 DoSeek(expected); 514 DoSeek(expected);
524 } 515 }
525 516
526 TEST_F(PipelineTest, SetVolume) { 517 TEST_F(PipelineTest, SetVolume) {
527 CreateAudioStream(); 518 CreateAudioStream();
528 MockDemuxerStreamVector streams; 519 MockDemuxerStreamVector streams;
529 streams.push_back(audio_stream()); 520 streams.push_back(audio_stream());
530 521
531 InitializeDemuxer(&streams); 522 InitializeDemuxer(&streams);
532 InitializeAudioRenderer(audio_stream()); 523 InitializeAudioRenderer(audio_stream());
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 561
571 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 562 EXPECT_FALSE(pipeline_->DidLoadingProgress());
572 pipeline_->AddBufferedTimeRange(base::TimeDelta(), kDuration / 8); 563 pipeline_->AddBufferedTimeRange(base::TimeDelta(), kDuration / 8);
573 EXPECT_TRUE(pipeline_->DidLoadingProgress()); 564 EXPECT_TRUE(pipeline_->DidLoadingProgress());
574 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 565 EXPECT_FALSE(pipeline_->DidLoadingProgress());
575 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); 566 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size());
576 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); 567 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0));
577 EXPECT_EQ(kDuration / 8, pipeline_->GetBufferedTimeRanges().end(0)); 568 EXPECT_EQ(kDuration / 8, pipeline_->GetBufferedTimeRanges().end(0));
578 569
579 base::TimeDelta kSeekTime = kDuration / 2; 570 base::TimeDelta kSeekTime = kDuration / 2;
580 ExpectSeek(kSeekTime, false); 571 ExpectSeek(kSeekTime);
581 DoSeek(kSeekTime); 572 DoSeek(kSeekTime);
582 573
583 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 574 EXPECT_FALSE(pipeline_->DidLoadingProgress());
584 } 575 }
585 576
586 TEST_F(PipelineTest, EndedCallback) { 577 TEST_F(PipelineTest, EndedCallback) {
587 CreateAudioStream(); 578 CreateAudioStream();
588 CreateVideoStream(); 579 CreateVideoStream();
589 CreateTextStream(); 580 CreateTextStream();
590 MockDemuxerStreamVector streams; 581 MockDemuxerStreamVector streams;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 float playback_rate = 1.0f; 663 float playback_rate = 1.0f;
673 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(playback_rate)); 664 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(playback_rate));
674 pipeline_->SetPlaybackRate(playback_rate); 665 pipeline_->SetPlaybackRate(playback_rate);
675 message_loop_.RunUntilIdle(); 666 message_loop_.RunUntilIdle();
676 667
677 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); 668 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
678 669
679 // Preroll() isn't called as the demuxer errors out first. 670 // Preroll() isn't called as the demuxer errors out first.
680 EXPECT_CALL(*audio_renderer_, StopRendering()); 671 EXPECT_CALL(*audio_renderer_, StopRendering());
681 EXPECT_CALL(*audio_renderer_, Flush(_)) 672 EXPECT_CALL(*audio_renderer_, Flush(_))
682 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, 673 .WillOnce(RunClosure<0>());
683 BUFFERING_HAVE_NOTHING),
684 RunClosure<0>()));
685 EXPECT_CALL(*audio_renderer_, Stop(_)) 674 EXPECT_CALL(*audio_renderer_, Stop(_))
686 .WillOnce(RunClosure<0>()); 675 .WillOnce(RunClosure<0>());
687 676
688 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 677 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
689 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); 678 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
690 EXPECT_CALL(*demuxer_, Stop(_)) 679 EXPECT_CALL(*demuxer_, Stop(_))
691 .WillOnce(RunClosure<0>()); 680 .WillOnce(RunClosure<0>());
692 681
693 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, 682 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
694 base::Unretained(&callbacks_))); 683 base::Unretained(&callbacks_)));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 base::Callback<void(PipelineStatus)> cb = base::Bind( 717 base::Callback<void(PipelineStatus)> cb = base::Bind(
729 &TestNoCallsAfterError, pipeline_.get(), &message_loop_); 718 &TestNoCallsAfterError, pipeline_.get(), &message_loop_);
730 ON_CALL(callbacks_, OnError(_)) 719 ON_CALL(callbacks_, OnError(_))
731 .WillByDefault(Invoke(&cb, &base::Callback<void(PipelineStatus)>::Run)); 720 .WillByDefault(Invoke(&cb, &base::Callback<void(PipelineStatus)>::Run));
732 721
733 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); 722 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
734 723
735 // Seek() isn't called as the demuxer errors out first. 724 // Seek() isn't called as the demuxer errors out first.
736 EXPECT_CALL(*audio_renderer_, StopRendering()); 725 EXPECT_CALL(*audio_renderer_, StopRendering());
737 EXPECT_CALL(*audio_renderer_, Flush(_)) 726 EXPECT_CALL(*audio_renderer_, Flush(_))
738 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, 727 .WillOnce(RunClosure<0>());
739 BUFFERING_HAVE_NOTHING),
740 RunClosure<0>()));
741 EXPECT_CALL(*audio_renderer_, Stop(_)) 728 EXPECT_CALL(*audio_renderer_, Stop(_))
742 .WillOnce(RunClosure<0>()); 729 .WillOnce(RunClosure<0>());
743 730
744 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 731 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
745 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); 732 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
746 EXPECT_CALL(*demuxer_, Stop(_)) 733 EXPECT_CALL(*demuxer_, Stop(_))
747 .WillOnce(RunClosure<0>()); 734 .WillOnce(RunClosure<0>());
748 735
749 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, 736 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
750 base::Unretained(&callbacks_))); 737 base::Unretained(&callbacks_)));
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 // Arrange to trigger a time update while the demuxer is in the middle of 807 // Arrange to trigger a time update while the demuxer is in the middle of
821 // seeking. This update should be ignored by the pipeline and the clock should 808 // seeking. This update should be ignored by the pipeline and the clock should
822 // not get updated. 809 // not get updated.
823 base::Closure closure = base::Bind(&RunTimeCB, audio_time_cb_, 300, 700); 810 base::Closure closure = base::Bind(&RunTimeCB, audio_time_cb_, 300, 700);
824 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 811 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
825 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run), 812 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run),
826 RunCallback<1>(PIPELINE_OK))); 813 RunCallback<1>(PIPELINE_OK)));
827 814
828 EXPECT_CALL(*audio_renderer_, StopRendering()); 815 EXPECT_CALL(*audio_renderer_, StopRendering());
829 EXPECT_CALL(*audio_renderer_, Flush(_)) 816 EXPECT_CALL(*audio_renderer_, Flush(_))
830 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, 817 .WillOnce(RunClosure<0>());
831 BUFFERING_HAVE_NOTHING), 818 EXPECT_CALL(*audio_renderer_, Preroll(seek_time, _))
832 RunClosure<0>())); 819 .WillOnce(RunCallback<1>(PIPELINE_OK));
833 EXPECT_CALL(*audio_renderer_, StartPlayingFrom(seek_time))
834 .WillOnce(SetBufferingState(&audio_buffering_state_cb_,
835 BUFFERING_HAVE_ENOUGH));
836 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(_)); 820 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(_));
837 EXPECT_CALL(*audio_renderer_, SetVolume(_)); 821 EXPECT_CALL(*audio_renderer_, SetVolume(_));
838 EXPECT_CALL(*audio_renderer_, StartRendering()); 822 EXPECT_CALL(*audio_renderer_, StartRendering());
839 823
840 EXPECT_CALL(callbacks_, OnPrerollCompleted()); 824 EXPECT_CALL(callbacks_, OnPrerollCompleted());
841 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 825 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
842 DoSeek(seek_time); 826 DoSeek(seek_time);
843 827
844 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); 828 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time);
845 829
(...skipping 17 matching lines...) Expand all
863 InitializeAudioRenderer(audio_stream()); 847 InitializeAudioRenderer(audio_stream());
864 InitializePipeline(PIPELINE_OK); 848 InitializePipeline(PIPELINE_OK);
865 849
866 ExpectStop(); 850 ExpectStop();
867 851
868 Pipeline* pipeline = pipeline_.get(); 852 Pipeline* pipeline = pipeline_.get();
869 pipeline->Stop(base::Bind(&DeletePipeline, base::Passed(&pipeline_))); 853 pipeline->Stop(base::Bind(&DeletePipeline, base::Passed(&pipeline_)));
870 message_loop_.RunUntilIdle(); 854 message_loop_.RunUntilIdle();
871 } 855 }
872 856
873 TEST_F(PipelineTest, Underflow) {
874 CreateAudioStream();
875 CreateVideoStream();
876 MockDemuxerStreamVector streams;
877 streams.push_back(audio_stream());
878 streams.push_back(video_stream());
879
880 InitializeDemuxer(&streams);
881 InitializeAudioRenderer(audio_stream());
882 InitializeVideoRenderer(video_stream());
883 InitializePipeline(PIPELINE_OK);
884
885 // Simulate underflow.
886 EXPECT_CALL(*audio_renderer_, StopRendering());
887 audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING);
888
889 // Seek while underflowed. We shouldn't call StopRendering() again.
890 base::TimeDelta expected = base::TimeDelta::FromSeconds(5);
891 ExpectSeek(expected, true);
892 DoSeek(expected);
893 }
894
895 class PipelineTeardownTest : public PipelineTest { 857 class PipelineTeardownTest : public PipelineTest {
896 public: 858 public:
897 enum TeardownState { 859 enum TeardownState {
898 kInitDemuxer, 860 kInitDemuxer,
899 kInitAudioRenderer, 861 kInitAudioRenderer,
900 kInitVideoRenderer, 862 kInitVideoRenderer,
901 kFlushing, 863 kFlushing,
902 kSeeking, 864 kSeeking,
903 kPrerolling, 865 kPrerolling,
904 kPlaying, 866 kPlaying,
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _)) 959 EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _))
998 .WillOnce(RunCallback<1>(status)); 960 .WillOnce(RunCallback<1>(status));
999 } 961 }
1000 962
1001 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>()); 963 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>());
1002 EXPECT_CALL(*audio_renderer_, Stop(_)).WillOnce(RunClosure<0>()); 964 EXPECT_CALL(*audio_renderer_, Stop(_)).WillOnce(RunClosure<0>());
1003 return status; 965 return status;
1004 } 966 }
1005 967
1006 EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _)) 968 EXPECT_CALL(*audio_renderer_, Initialize(_, _, _, _, _, _, _))
1007 .WillOnce(DoAll(SaveArg<4>(&audio_buffering_state_cb_), 969 .WillOnce(RunCallback<1>(PIPELINE_OK));
1008 RunCallback<1>(PIPELINE_OK)));
1009 970
1010 if (state == kInitVideoRenderer) { 971 if (state == kInitVideoRenderer) {
1011 if (stop_or_error == kStop) { 972 if (stop_or_error == kStop) {
1012 EXPECT_CALL(*video_renderer_, Initialize(_, _, _, _, _, _, _, _, _)) 973 EXPECT_CALL(*video_renderer_, Initialize(_, _, _, _, _, _, _, _, _))
1013 .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), 974 .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb),
1014 RunCallback<2>(PIPELINE_OK))); 975 RunCallback<2>(PIPELINE_OK)));
1015 EXPECT_CALL(callbacks_, OnStop()); 976 EXPECT_CALL(callbacks_, OnStop());
1016 } else { 977 } else {
1017 status = PIPELINE_ERROR_INITIALIZATION_FAILED; 978 status = PIPELINE_ERROR_INITIALIZATION_FAILED;
1018 EXPECT_CALL(*video_renderer_, Initialize(_, _, _, _, _, _, _, _, _)) 979 EXPECT_CALL(*video_renderer_, Initialize(_, _, _, _, _, _, _, _, _))
1019 .WillOnce(RunCallback<2>(status)); 980 .WillOnce(RunCallback<2>(status));
1020 } 981 }
1021 982
1022 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>()); 983 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>());
1023 EXPECT_CALL(*audio_renderer_, Stop(_)).WillOnce(RunClosure<0>()); 984 EXPECT_CALL(*audio_renderer_, Stop(_)).WillOnce(RunClosure<0>());
1024 EXPECT_CALL(*video_renderer_, Stop(_)).WillOnce(RunClosure<0>()); 985 EXPECT_CALL(*video_renderer_, Stop(_)).WillOnce(RunClosure<0>());
1025 return status; 986 return status;
1026 } 987 }
1027 988
1028 EXPECT_CALL(*video_renderer_, Initialize(_, _, _, _, _, _, _, _, _)) 989 EXPECT_CALL(*video_renderer_, Initialize(_, _, _, _, _, _, _, _, _))
1029 .WillOnce(RunCallback<2>(PIPELINE_OK)); 990 .WillOnce(RunCallback<2>(PIPELINE_OK));
1030 991
1031 EXPECT_CALL(callbacks_, OnMetadata(_)); 992 EXPECT_CALL(callbacks_, OnMetadata(_));
1032 993
1033 // If we get here it's a successful initialization. 994 // If we get here it's a successful initialization.
1034 EXPECT_CALL(*audio_renderer_, StartPlayingFrom(base::TimeDelta())) 995 EXPECT_CALL(*audio_renderer_, Preroll(base::TimeDelta(), _))
1035 .WillOnce(SetBufferingState(&audio_buffering_state_cb_, 996 .WillOnce(RunCallback<1>(PIPELINE_OK));
1036 BUFFERING_HAVE_ENOUGH));
1037 EXPECT_CALL(*video_renderer_, Preroll(base::TimeDelta(), _)) 997 EXPECT_CALL(*video_renderer_, Preroll(base::TimeDelta(), _))
1038 .WillOnce(RunCallback<1>(PIPELINE_OK)); 998 .WillOnce(RunCallback<1>(PIPELINE_OK));
1039 999
1040 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f)); 1000 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f));
1041 EXPECT_CALL(*video_renderer_, SetPlaybackRate(0.0f)); 1001 EXPECT_CALL(*video_renderer_, SetPlaybackRate(0.0f));
1042 EXPECT_CALL(*audio_renderer_, SetVolume(1.0f)); 1002 EXPECT_CALL(*audio_renderer_, SetVolume(1.0f));
1043 1003
1044 EXPECT_CALL(*audio_renderer_, StartRendering()); 1004 EXPECT_CALL(*audio_renderer_, StartRendering());
1045 EXPECT_CALL(*video_renderer_, Play(_)) 1005 EXPECT_CALL(*video_renderer_, Play(_))
1046 .WillOnce(RunClosure<0>()); 1006 .WillOnce(RunClosure<0>());
(...skipping 26 matching lines...) Expand all
1073 StopOrError stop_or_error) { 1033 StopOrError stop_or_error) {
1074 PipelineStatus status = PIPELINE_OK; 1034 PipelineStatus status = PIPELINE_OK;
1075 base::Closure stop_cb = base::Bind( 1035 base::Closure stop_cb = base::Bind(
1076 &CallbackHelper::OnStop, base::Unretained(&callbacks_)); 1036 &CallbackHelper::OnStop, base::Unretained(&callbacks_));
1077 1037
1078 EXPECT_CALL(*audio_renderer_, StopRendering()); 1038 EXPECT_CALL(*audio_renderer_, StopRendering());
1079 1039
1080 if (state == kFlushing) { 1040 if (state == kFlushing) {
1081 if (stop_or_error == kStop) { 1041 if (stop_or_error == kStop) {
1082 EXPECT_CALL(*audio_renderer_, Flush(_)) 1042 EXPECT_CALL(*audio_renderer_, Flush(_))
1083 .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), 1043 .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), RunClosure<0>()));
1084 SetBufferingState(&audio_buffering_state_cb_,
1085 BUFFERING_HAVE_NOTHING),
1086 RunClosure<0>()));
1087 } else { 1044 } else {
1088 status = PIPELINE_ERROR_READ; 1045 status = PIPELINE_ERROR_READ;
1089 EXPECT_CALL(*audio_renderer_, Flush(_)).WillOnce( 1046 EXPECT_CALL(*audio_renderer_, Flush(_)).WillOnce(
1090 DoAll(SetError(pipeline_.get(), status), 1047 DoAll(SetError(pipeline_.get(), status), RunClosure<0>()));
1091 SetBufferingState(&audio_buffering_state_cb_,
1092 BUFFERING_HAVE_NOTHING),
1093 RunClosure<0>()));
1094 } 1048 }
1095 1049
1096 return status; 1050 return status;
1097 } 1051 }
1098 1052
1099 EXPECT_CALL(*audio_renderer_, Flush(_)) 1053 EXPECT_CALL(*audio_renderer_, Flush(_)).WillOnce(RunClosure<0>());
1100 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_,
1101 BUFFERING_HAVE_NOTHING),
1102 RunClosure<0>()));
1103 EXPECT_CALL(*video_renderer_, Flush(_)).WillOnce(RunClosure<0>()); 1054 EXPECT_CALL(*video_renderer_, Flush(_)).WillOnce(RunClosure<0>());
1104 1055
1105 if (state == kSeeking) { 1056 if (state == kSeeking) {
1106 if (stop_or_error == kStop) { 1057 if (stop_or_error == kStop) {
1107 EXPECT_CALL(*demuxer_, Seek(_, _)) 1058 EXPECT_CALL(*demuxer_, Seek(_, _))
1108 .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), 1059 .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb),
1109 RunCallback<1>(PIPELINE_OK))); 1060 RunCallback<1>(PIPELINE_OK)));
1110 } else { 1061 } else {
1111 status = PIPELINE_ERROR_READ; 1062 status = PIPELINE_ERROR_READ;
1112 EXPECT_CALL(*demuxer_, Seek(_, _)) 1063 EXPECT_CALL(*demuxer_, Seek(_, _))
1113 .WillOnce(RunCallback<1>(status)); 1064 .WillOnce(RunCallback<1>(status));
1114 } 1065 }
1115 1066
1116 return status; 1067 return status;
1117 } 1068 }
1118 1069
1119 EXPECT_CALL(*demuxer_, Seek(_, _)) 1070 EXPECT_CALL(*demuxer_, Seek(_, _))
1120 .WillOnce(RunCallback<1>(PIPELINE_OK)); 1071 .WillOnce(RunCallback<1>(PIPELINE_OK));
1121 1072
1122 if (state == kPrerolling) { 1073 if (state == kPrerolling) {
1123 if (stop_or_error == kStop) { 1074 if (stop_or_error == kStop) {
1124 EXPECT_CALL(*audio_renderer_, StartPlayingFrom(_)) 1075 EXPECT_CALL(*audio_renderer_, Preroll(_, _))
1125 .WillOnce(Stop(pipeline_.get(), stop_cb)); 1076 .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb),
1077 RunCallback<1>(PIPELINE_OK)));
1126 } else { 1078 } else {
1127 status = PIPELINE_ERROR_READ; 1079 status = PIPELINE_ERROR_READ;
1128 EXPECT_CALL(*audio_renderer_, StartPlayingFrom(_)) 1080 EXPECT_CALL(*audio_renderer_, Preroll(_, _))
1129 .WillOnce(SetError(pipeline_.get(), status)); 1081 .WillOnce(RunCallback<1>(status));
1130 } 1082 }
1131 1083
1132 return status; 1084 return status;
1133 } 1085 }
1134 1086
1135 EXPECT_CALL(*audio_renderer_, StartPlayingFrom(_)); 1087 EXPECT_CALL(*audio_renderer_, Preroll(_, _))
1088 .WillOnce(RunCallback<1>(PIPELINE_OK));
1136 EXPECT_CALL(*video_renderer_, Preroll(_, _)) 1089 EXPECT_CALL(*video_renderer_, Preroll(_, _))
1137 .WillOnce(RunCallback<1>(PIPELINE_OK)); 1090 .WillOnce(RunCallback<1>(PIPELINE_OK));
1138 1091
1139 // Playback rate and volume are updated prior to starting. 1092 // Playback rate and volume are updated prior to starting.
1140 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f)); 1093 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f));
1141 EXPECT_CALL(*video_renderer_, SetPlaybackRate(0.0f)); 1094 EXPECT_CALL(*video_renderer_, SetPlaybackRate(0.0f));
1142 EXPECT_CALL(*audio_renderer_, SetVolume(1.0f)); 1095 EXPECT_CALL(*audio_renderer_, SetVolume(1.0f));
1143 1096
1144 NOTREACHED() << "State not supported: " << state; 1097 NOTREACHED() << "State not supported: " << state;
1145 return status; 1098 return status;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 INSTANTIATE_TEARDOWN_TEST(Error, InitAudioRenderer); 1148 INSTANTIATE_TEARDOWN_TEST(Error, InitAudioRenderer);
1196 INSTANTIATE_TEARDOWN_TEST(Error, InitVideoRenderer); 1149 INSTANTIATE_TEARDOWN_TEST(Error, InitVideoRenderer);
1197 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); 1150 INSTANTIATE_TEARDOWN_TEST(Error, Flushing);
1198 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); 1151 INSTANTIATE_TEARDOWN_TEST(Error, Seeking);
1199 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling); 1152 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling);
1200 INSTANTIATE_TEARDOWN_TEST(Error, Playing); 1153 INSTANTIATE_TEARDOWN_TEST(Error, Playing);
1201 1154
1202 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); 1155 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing);
1203 1156
1204 } // namespace media 1157 } // namespace media
OLDNEW
« no previous file with comments | « media/base/pipeline.cc ('k') | media/filters/audio_renderer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698