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

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

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