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

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

Issue 1955843002: Move Renderer permanent callbacks into RendererClient interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressed comments Created 4 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
« no previous file with comments | « media/base/pipeline_impl.cc ('k') | media/base/renderer.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 "media/base/pipeline_impl.h" 5 #include "media/base/pipeline_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 } 49 }
50 50
51 ACTION_P(Stop, pipeline) { 51 ACTION_P(Stop, pipeline) {
52 pipeline->Stop(); 52 pipeline->Stop();
53 } 53 }
54 54
55 ACTION_P2(SetError, pipeline, status) { 55 ACTION_P2(SetError, pipeline, status) {
56 pipeline->SetErrorForTesting(status); 56 pipeline->SetErrorForTesting(status);
57 } 57 }
58 58
59 ACTION_P2(SetBufferingState, cb, buffering_state) { 59 ACTION_P2(SetBufferingState, renderer_client, buffering_state) {
60 cb->Run(buffering_state); 60 (*renderer_client)->OnBufferingStateChange(buffering_state);
61 } 61 }
62 62
63 ACTION_TEMPLATE(PostCallback, 63 ACTION_TEMPLATE(PostCallback,
64 HAS_1_TEMPLATE_PARAMS(int, k), 64 HAS_1_TEMPLATE_PARAMS(int, k),
65 AND_1_VALUE_PARAMS(p0)) { 65 AND_1_VALUE_PARAMS(p0)) {
66 return base::MessageLoop::current()->PostTask( 66 return base::MessageLoop::current()->PostTask(
67 FROM_HERE, base::Bind(::std::tr1::get<k>(args), p0)); 67 FROM_HERE, base::Bind(::std::tr1::get<k>(args), p0));
68 } 68 }
69 69
70 // TODO(scherkus): even though some filters are initialized on separate 70 // TODO(scherkus): even though some filters are initialized on separate
(...skipping 28 matching lines...) Expand all
99 99
100 private: 100 private:
101 DISALLOW_COPY_AND_ASSIGN(CallbackHelper); 101 DISALLOW_COPY_AND_ASSIGN(CallbackHelper);
102 }; 102 };
103 103
104 PipelineImplTest() 104 PipelineImplTest()
105 : pipeline_( 105 : pipeline_(
106 new PipelineImpl(message_loop_.task_runner(), new MediaLog())), 106 new PipelineImpl(message_loop_.task_runner(), new MediaLog())),
107 demuxer_(new StrictMock<MockDemuxer>()), 107 demuxer_(new StrictMock<MockDemuxer>()),
108 scoped_renderer_(new StrictMock<MockRenderer>()), 108 scoped_renderer_(new StrictMock<MockRenderer>()),
109 renderer_(scoped_renderer_.get()) { 109 renderer_(scoped_renderer_.get()),
110 renderer_client_(nullptr) {
110 // SetDemuxerExpectations() adds overriding expectations for expected 111 // SetDemuxerExpectations() adds overriding expectations for expected
111 // non-NULL streams. 112 // non-NULL streams.
112 DemuxerStream* null_pointer = NULL; 113 DemuxerStream* null_pointer = NULL;
113 EXPECT_CALL(*demuxer_, GetStream(_)).WillRepeatedly(Return(null_pointer)); 114 EXPECT_CALL(*demuxer_, GetStream(_)).WillRepeatedly(Return(null_pointer));
114 115
115 EXPECT_CALL(*demuxer_, GetTimelineOffset()) 116 EXPECT_CALL(*demuxer_, GetTimelineOffset())
116 .WillRepeatedly(Return(base::Time())); 117 .WillRepeatedly(Return(base::Time()));
117 118
118 EXPECT_CALL(*renderer_, GetMediaTime()) 119 EXPECT_CALL(*renderer_, GetMediaTime())
119 .WillRepeatedly(Return(base::TimeDelta())); 120 .WillRepeatedly(Return(base::TimeDelta()));
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 171
171 std::unique_ptr<StrictMock<MockDemuxerStream>> CreateStream( 172 std::unique_ptr<StrictMock<MockDemuxerStream>> CreateStream(
172 DemuxerStream::Type type) { 173 DemuxerStream::Type type) {
173 std::unique_ptr<StrictMock<MockDemuxerStream>> stream( 174 std::unique_ptr<StrictMock<MockDemuxerStream>> stream(
174 new StrictMock<MockDemuxerStream>(type)); 175 new StrictMock<MockDemuxerStream>(type));
175 return stream; 176 return stream;
176 } 177 }
177 178
178 // Sets up expectations to allow the video renderer to initialize. 179 // Sets up expectations to allow the video renderer to initialize.
179 void SetRendererExpectations() { 180 void SetRendererExpectations() {
180 EXPECT_CALL(*renderer_, Initialize(_, _, _, _, _, _, _)) 181 EXPECT_CALL(*renderer_, Initialize(_, _, _))
181 .WillOnce(DoAll(SaveArg<2>(&statistics_cb_), 182 .WillOnce(
182 SaveArg<3>(&buffering_state_cb_), 183 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK)));
183 SaveArg<4>(&ended_cb_), PostCallback<1>(PIPELINE_OK)));
184 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream())); 184 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream()));
185 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream())); 185 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream()));
186 } 186 }
187 187
188 void AddTextStream() { 188 void AddTextStream() {
189 EXPECT_CALL(callbacks_, OnAddTextTrack(_, _)) 189 EXPECT_CALL(callbacks_, OnAddTextTrack(_, _))
190 .WillOnce(Invoke(this, &PipelineImplTest::DoOnAddTextTrack)); 190 .WillOnce(Invoke(this, &PipelineImplTest::DoOnAddTextTrack));
191 static_cast<DemuxerHost*>(pipeline_.get()) 191 static_cast<DemuxerHost*>(pipeline_.get())
192 ->AddTextStream(text_stream(), 192 ->AddTextStream(text_stream(),
193 TextTrackConfig(kTextSubtitles, "", "", "")); 193 TextTrackConfig(kTextSubtitles, "", "", ""));
(...skipping 11 matching lines...) Expand all
205 // after tests have set expectations any filters they wish to use. 205 // after tests have set expectations any filters they wish to use.
206 void StartPipelineAndExpect(PipelineStatus start_status) { 206 void StartPipelineAndExpect(PipelineStatus start_status) {
207 EXPECT_CALL(callbacks_, OnStart(start_status)); 207 EXPECT_CALL(callbacks_, OnStart(start_status));
208 208
209 if (start_status == PIPELINE_OK) { 209 if (start_status == PIPELINE_OK) {
210 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_)); 210 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_));
211 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0)); 211 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0));
212 EXPECT_CALL(*renderer_, SetVolume(1.0f)); 212 EXPECT_CALL(*renderer_, SetVolume(1.0f));
213 EXPECT_CALL(*renderer_, StartPlayingFrom(start_time_)) 213 EXPECT_CALL(*renderer_, StartPlayingFrom(start_time_))
214 .WillOnce( 214 .WillOnce(
215 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_ENOUGH)); 215 SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH));
216 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 216 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
217 } 217 }
218 218
219 StartPipeline(); 219 StartPipeline();
220 message_loop_.RunUntilIdle(); 220 message_loop_.RunUntilIdle();
221 } 221 }
222 222
223 void CreateAudioStream() { 223 void CreateAudioStream() {
224 audio_stream_ = CreateStream(DemuxerStream::AUDIO); 224 audio_stream_ = CreateStream(DemuxerStream::AUDIO);
225 } 225 }
(...skipping 13 matching lines...) Expand all
239 239
240 MockDemuxerStream* video_stream() { return video_stream_.get(); } 240 MockDemuxerStream* video_stream() { return video_stream_.get(); }
241 241
242 FakeTextTrackStream* text_stream() { return text_stream_.get(); } 242 FakeTextTrackStream* text_stream() { return text_stream_.get(); }
243 243
244 void ExpectSeek(const base::TimeDelta& seek_time, bool underflowed) { 244 void ExpectSeek(const base::TimeDelta& seek_time, bool underflowed) {
245 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 245 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
246 .WillOnce(RunCallback<1>(PIPELINE_OK)); 246 .WillOnce(RunCallback<1>(PIPELINE_OK));
247 247
248 EXPECT_CALL(*renderer_, Flush(_)) 248 EXPECT_CALL(*renderer_, Flush(_))
249 .WillOnce(DoAll( 249 .WillOnce(
250 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_NOTHING), 250 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
251 RunClosure<0>())); 251 RunClosure<0>()));
252 EXPECT_CALL(*renderer_, SetPlaybackRate(_)); 252 EXPECT_CALL(*renderer_, SetPlaybackRate(_));
253 EXPECT_CALL(*renderer_, SetVolume(_)); 253 EXPECT_CALL(*renderer_, SetVolume(_));
254 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time)) 254 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time))
255 .WillOnce( 255 .WillOnce(SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH));
256 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_ENOUGH));
257 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 256 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
258 257
259 // We expect a successful seek callback followed by a buffering update. 258 // We expect a successful seek callback followed by a buffering update.
260 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 259 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
261 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 260 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
262 } 261 }
263 262
264 void DoSeek(const base::TimeDelta& seek_time) { 263 void DoSeek(const base::TimeDelta& seek_time) {
265 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, 264 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
266 base::Unretained(&callbacks_))); 265 base::Unretained(&callbacks_)));
267 message_loop_.RunUntilIdle(); 266 message_loop_.RunUntilIdle();
268 } 267 }
269 268
270 void ExpectSuspend() { 269 void ExpectSuspend() {
271 EXPECT_CALL(*renderer_, SetPlaybackRate(0)); 270 EXPECT_CALL(*renderer_, SetPlaybackRate(0));
272 EXPECT_CALL(*renderer_, Flush(_)) 271 EXPECT_CALL(*renderer_, Flush(_))
273 .WillOnce(DoAll( 272 .WillOnce(
274 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_NOTHING), 273 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
275 RunClosure<0>())); 274 RunClosure<0>()));
276 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 275 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
277 EXPECT_CALL(callbacks_, OnSuspend(PIPELINE_OK)); 276 EXPECT_CALL(callbacks_, OnSuspend(PIPELINE_OK));
278 } 277 }
279 278
280 void DoSuspend() { 279 void DoSuspend() {
281 pipeline_->Suspend( 280 pipeline_->Suspend(
282 base::Bind(&CallbackHelper::OnSuspend, base::Unretained(&callbacks_))); 281 base::Bind(&CallbackHelper::OnSuspend, base::Unretained(&callbacks_)));
283 message_loop_.RunUntilIdle(); 282 message_loop_.RunUntilIdle();
284 283
285 // |renderer_| has been deleted, replace it. 284 // |renderer_| has been deleted, replace it.
286 scoped_renderer_.reset(new StrictMock<MockRenderer>()), 285 scoped_renderer_.reset(new StrictMock<MockRenderer>()),
287 renderer_ = scoped_renderer_.get(); 286 renderer_ = scoped_renderer_.get();
288 } 287 }
289 288
290 void ExpectResume(const base::TimeDelta& seek_time) { 289 void ExpectResume(const base::TimeDelta& seek_time) {
291 SetRendererExpectations(); 290 SetRendererExpectations();
292 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 291 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
293 .WillOnce(RunCallback<1>(PIPELINE_OK)); 292 .WillOnce(RunCallback<1>(PIPELINE_OK));
294 EXPECT_CALL(*renderer_, SetPlaybackRate(_)); 293 EXPECT_CALL(*renderer_, SetPlaybackRate(_));
295 EXPECT_CALL(*renderer_, SetVolume(_)); 294 EXPECT_CALL(*renderer_, SetVolume(_));
296 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time)) 295 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time))
297 .WillOnce( 296 .WillOnce(SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH));
298 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_ENOUGH));
299 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 297 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
300 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK)); 298 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK));
301 } 299 }
302 300
303 void DoResume(const base::TimeDelta& seek_time) { 301 void DoResume(const base::TimeDelta& seek_time) {
304 pipeline_->Resume( 302 pipeline_->Resume(
305 std::move(scoped_renderer_), seek_time, 303 std::move(scoped_renderer_), seek_time,
306 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_))); 304 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_)));
307 message_loop_.RunUntilIdle(); 305 message_loop_.RunUntilIdle();
308 } 306 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 std::unique_ptr<PipelineImpl> pipeline_; 343 std::unique_ptr<PipelineImpl> pipeline_;
346 344
347 std::unique_ptr<StrictMock<MockDemuxer>> demuxer_; 345 std::unique_ptr<StrictMock<MockDemuxer>> demuxer_;
348 std::unique_ptr<StrictMock<MockRenderer>> scoped_renderer_; 346 std::unique_ptr<StrictMock<MockRenderer>> scoped_renderer_;
349 StrictMock<MockRenderer>* renderer_; 347 StrictMock<MockRenderer>* renderer_;
350 StrictMock<CallbackHelper> text_renderer_callbacks_; 348 StrictMock<CallbackHelper> text_renderer_callbacks_;
351 TextRenderer* text_renderer_; 349 TextRenderer* text_renderer_;
352 std::unique_ptr<StrictMock<MockDemuxerStream>> audio_stream_; 350 std::unique_ptr<StrictMock<MockDemuxerStream>> audio_stream_;
353 std::unique_ptr<StrictMock<MockDemuxerStream>> video_stream_; 351 std::unique_ptr<StrictMock<MockDemuxerStream>> video_stream_;
354 std::unique_ptr<FakeTextTrackStream> text_stream_; 352 std::unique_ptr<FakeTextTrackStream> text_stream_;
355 BufferingStateCB buffering_state_cb_; 353 RendererClient* renderer_client_;
356 base::Closure ended_cb_;
357 StatisticsCB statistics_cb_;
358 VideoDecoderConfig video_decoder_config_; 354 VideoDecoderConfig video_decoder_config_;
359 PipelineMetadata metadata_; 355 PipelineMetadata metadata_;
360 base::TimeDelta start_time_; 356 base::TimeDelta start_time_;
361 357
362 private: 358 private:
363 DISALLOW_COPY_AND_ASSIGN(PipelineImplTest); 359 DISALLOW_COPY_AND_ASSIGN(PipelineImplTest);
364 }; 360 };
365 361
366 // Test that playback controls methods no-op when the pipeline hasn't been 362 // Test that playback controls methods no-op when the pipeline hasn't been
367 // started. 363 // started.
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 573
578 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); 574 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000));
579 SetRendererExpectations(); 575 SetRendererExpectations();
580 576
581 StartPipelineAndExpect(PIPELINE_OK); 577 StartPipelineAndExpect(PIPELINE_OK);
582 578
583 // Inject some fake memory usage to verify its cleared after suspend. 579 // Inject some fake memory usage to verify its cleared after suspend.
584 PipelineStatistics stats; 580 PipelineStatistics stats;
585 stats.audio_memory_usage = 12345; 581 stats.audio_memory_usage = 12345;
586 stats.video_memory_usage = 67890; 582 stats.video_memory_usage = 67890;
587 statistics_cb_.Run(stats); 583 renderer_client_->OnStatisticsUpdate(stats);
588 EXPECT_EQ(stats.audio_memory_usage, 584 EXPECT_EQ(stats.audio_memory_usage,
589 pipeline_->GetStatistics().audio_memory_usage); 585 pipeline_->GetStatistics().audio_memory_usage);
590 EXPECT_EQ(stats.video_memory_usage, 586 EXPECT_EQ(stats.video_memory_usage,
591 pipeline_->GetStatistics().video_memory_usage); 587 pipeline_->GetStatistics().video_memory_usage);
592 588
593 ExpectSuspend(); 589 ExpectSuspend();
594 DoSuspend(); 590 DoSuspend();
595 591
596 EXPECT_EQ(pipeline_->GetStatistics().audio_memory_usage, 0); 592 EXPECT_EQ(pipeline_->GetStatistics().audio_memory_usage, 0);
597 EXPECT_EQ(pipeline_->GetStatistics().video_memory_usage, 0); 593 EXPECT_EQ(pipeline_->GetStatistics().video_memory_usage, 0);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 streams.push_back(audio_stream()); 671 streams.push_back(audio_stream());
676 streams.push_back(video_stream()); 672 streams.push_back(video_stream());
677 673
678 SetDemuxerExpectations(&streams); 674 SetDemuxerExpectations(&streams);
679 SetRendererExpectations(); 675 SetRendererExpectations();
680 StartPipelineAndExpect(PIPELINE_OK); 676 StartPipelineAndExpect(PIPELINE_OK);
681 677
682 AddTextStream(); 678 AddTextStream();
683 679
684 // The ended callback shouldn't run until all renderers have ended. 680 // The ended callback shouldn't run until all renderers have ended.
685 ended_cb_.Run(); 681 renderer_client_->OnEnded();
686 message_loop_.RunUntilIdle(); 682 message_loop_.RunUntilIdle();
687 683
688 EXPECT_CALL(callbacks_, OnEnded()); 684 EXPECT_CALL(callbacks_, OnEnded());
689 text_stream()->SendEosNotification(); 685 text_stream()->SendEosNotification();
690 message_loop_.RunUntilIdle(); 686 message_loop_.RunUntilIdle();
691 } 687 }
692 688
693 TEST_F(PipelineImplTest, ErrorDuringSeek) { 689 TEST_F(PipelineImplTest, ErrorDuringSeek) {
694 CreateAudioStream(); 690 CreateAudioStream();
695 MockDemuxerStreamVector streams; 691 MockDemuxerStreamVector streams;
696 streams.push_back(audio_stream()); 692 streams.push_back(audio_stream());
697 693
698 SetDemuxerExpectations(&streams); 694 SetDemuxerExpectations(&streams);
699 SetRendererExpectations(); 695 SetRendererExpectations();
700 StartPipelineAndExpect(PIPELINE_OK); 696 StartPipelineAndExpect(PIPELINE_OK);
701 697
702 double playback_rate = 1.0; 698 double playback_rate = 1.0;
703 EXPECT_CALL(*renderer_, SetPlaybackRate(playback_rate)); 699 EXPECT_CALL(*renderer_, SetPlaybackRate(playback_rate));
704 pipeline_->SetPlaybackRate(playback_rate); 700 pipeline_->SetPlaybackRate(playback_rate);
705 message_loop_.RunUntilIdle(); 701 message_loop_.RunUntilIdle();
706 702
707 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); 703 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
708 704
709 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 705 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
710 EXPECT_CALL(*renderer_, Flush(_)) 706 EXPECT_CALL(*renderer_, Flush(_))
711 .WillOnce( 707 .WillOnce(
712 DoAll(SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_NOTHING), 708 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
713 RunClosure<0>())); 709 RunClosure<0>()));
714 710
715 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 711 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
716 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); 712 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
717 EXPECT_CALL(*demuxer_, Stop()); 713 EXPECT_CALL(*demuxer_, Stop());
718 714
719 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, 715 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
720 base::Unretained(&callbacks_))); 716 base::Unretained(&callbacks_)));
721 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); 717 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
722 message_loop_.RunUntilIdle(); 718 message_loop_.RunUntilIdle();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 base::Callback<void(PipelineStatus)> cb = 750 base::Callback<void(PipelineStatus)> cb =
755 base::Bind(&TestNoCallsAfterError, pipeline_.get(), &message_loop_); 751 base::Bind(&TestNoCallsAfterError, pipeline_.get(), &message_loop_);
756 ON_CALL(callbacks_, OnError(_)) 752 ON_CALL(callbacks_, OnError(_))
757 .WillByDefault(Invoke(&cb, &base::Callback<void(PipelineStatus)>::Run)); 753 .WillByDefault(Invoke(&cb, &base::Callback<void(PipelineStatus)>::Run));
758 754
759 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); 755 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
760 756
761 // Seek() isn't called as the demuxer errors out first. 757 // Seek() isn't called as the demuxer errors out first.
762 EXPECT_CALL(*renderer_, Flush(_)) 758 EXPECT_CALL(*renderer_, Flush(_))
763 .WillOnce( 759 .WillOnce(
764 DoAll(SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_NOTHING), 760 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
765 RunClosure<0>())); 761 RunClosure<0>()));
766 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 762 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
767 763
768 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 764 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
769 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); 765 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
770 EXPECT_CALL(*demuxer_, Stop()); 766 EXPECT_CALL(*demuxer_, Stop());
771 767
772 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, 768 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
773 base::Unretained(&callbacks_))); 769 base::Unretained(&callbacks_)));
774 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); 770 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
(...skipping 19 matching lines...) Expand all
794 MockDemuxerStreamVector streams; 790 MockDemuxerStreamVector streams;
795 streams.push_back(audio_stream()); 791 streams.push_back(audio_stream());
796 streams.push_back(video_stream()); 792 streams.push_back(video_stream());
797 793
798 SetDemuxerExpectations(&streams); 794 SetDemuxerExpectations(&streams);
799 SetRendererExpectations(); 795 SetRendererExpectations();
800 StartPipelineAndExpect(PIPELINE_OK); 796 StartPipelineAndExpect(PIPELINE_OK);
801 797
802 // Simulate underflow. 798 // Simulate underflow.
803 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 799 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
804 buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); 800 renderer_client_->OnBufferingStateChange(BUFFERING_HAVE_NOTHING);
805 message_loop_.RunUntilIdle(); 801 message_loop_.RunUntilIdle();
806 802
807 // Seek while underflowed. 803 // Seek while underflowed.
808 base::TimeDelta expected = base::TimeDelta::FromSeconds(5); 804 base::TimeDelta expected = base::TimeDelta::FromSeconds(5);
809 ExpectSeek(expected, true); 805 ExpectSeek(expected, true);
810 DoSeek(expected); 806 DoSeek(expected);
811 } 807 }
812 808
813 TEST_F(PipelineImplTest, PositiveStartTime) { 809 TEST_F(PipelineImplTest, PositiveStartTime) {
814 start_time_ = base::TimeDelta::FromSeconds(1); 810 start_time_ = base::TimeDelta::FromSeconds(1);
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 MockDemuxerStreamVector streams; 902 MockDemuxerStreamVector streams;
907 streams.push_back(audio_stream()); 903 streams.push_back(audio_stream());
908 streams.push_back(video_stream()); 904 streams.push_back(video_stream());
909 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); 905 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000));
910 906
911 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(true)); 907 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(true));
912 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(true)); 908 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(true));
913 909
914 if (state == kInitRenderer) { 910 if (state == kInitRenderer) {
915 if (stop_or_error == kStop) { 911 if (stop_or_error == kStop) {
916 EXPECT_CALL(*renderer_, Initialize(_, _, _, _, _, _, _)) 912 EXPECT_CALL(*renderer_, Initialize(_, _, _))
917 .WillOnce( 913 .WillOnce(
918 DoAll(Stop(pipeline_.get()), PostCallback<1>(PIPELINE_OK))); 914 DoAll(Stop(pipeline_.get()), PostCallback<2>(PIPELINE_OK)));
919 // Note: OnStart or OnMetadata callback are not called 915 // Note: OnStart or OnMetadata callback are not called
920 // after pipeline is stopped. 916 // after pipeline is stopped.
921 } else { 917 } else {
922 EXPECT_CALL(*renderer_, Initialize(_, _, _, _, _, _, _)) 918 EXPECT_CALL(*renderer_, Initialize(_, _, _))
923 .WillOnce(PostCallback<1>(PIPELINE_ERROR_INITIALIZATION_FAILED)); 919 .WillOnce(PostCallback<2>(PIPELINE_ERROR_INITIALIZATION_FAILED));
924 EXPECT_CALL(callbacks_, OnMetadata(_)); 920 EXPECT_CALL(callbacks_, OnMetadata(_));
925 EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_INITIALIZATION_FAILED)); 921 EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_INITIALIZATION_FAILED));
926 } 922 }
927 923
928 EXPECT_CALL(*demuxer_, Stop()); 924 EXPECT_CALL(*demuxer_, Stop());
929 return; 925 return;
930 } 926 }
931 927
932 EXPECT_CALL(*renderer_, Initialize(_, _, _, _, _, _, _)) 928 EXPECT_CALL(*renderer_, Initialize(_, _, _))
933 .WillOnce(DoAll(SaveArg<3>(&buffering_state_cb_), 929 .WillOnce(
934 PostCallback<1>(PIPELINE_OK))); 930 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK)));
935 931
936 // If we get here it's a successful initialization. 932 // If we get here it's a successful initialization.
937 EXPECT_CALL(callbacks_, OnStart(PIPELINE_OK)); 933 EXPECT_CALL(callbacks_, OnStart(PIPELINE_OK));
938 EXPECT_CALL(callbacks_, OnMetadata(_)); 934 EXPECT_CALL(callbacks_, OnMetadata(_));
939 935
940 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0)); 936 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0));
941 EXPECT_CALL(*renderer_, SetVolume(1.0f)); 937 EXPECT_CALL(*renderer_, SetVolume(1.0f));
942 EXPECT_CALL(*renderer_, StartPlayingFrom(base::TimeDelta())) 938 EXPECT_CALL(*renderer_, StartPlayingFrom(base::TimeDelta()))
943 .WillOnce( 939 .WillOnce(SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH));
944 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_ENOUGH));
945 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 940 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
946 } 941 }
947 942
948 void DoSeek(TeardownState state, StopOrError stop_or_error) { 943 void DoSeek(TeardownState state, StopOrError stop_or_error) {
949 SetSeekExpectations(state, stop_or_error); 944 SetSeekExpectations(state, stop_or_error);
950 945
951 EXPECT_CALL(*demuxer_, Stop()); 946 EXPECT_CALL(*demuxer_, Stop());
952 947
953 pipeline_->Seek( 948 pipeline_->Seek(
954 base::TimeDelta::FromSeconds(10), 949 base::TimeDelta::FromSeconds(10),
955 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); 950 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
956 message_loop_.RunUntilIdle(); 951 message_loop_.RunUntilIdle();
957 } 952 }
958 953
959 void SetSeekExpectations(TeardownState state, StopOrError stop_or_error) { 954 void SetSeekExpectations(TeardownState state, StopOrError stop_or_error) {
960 if (state == kFlushing) { 955 if (state == kFlushing) {
961 if (stop_or_error == kStop) { 956 if (stop_or_error == kStop) {
962 EXPECT_CALL(*renderer_, Flush(_)) 957 EXPECT_CALL(*renderer_, Flush(_))
963 .WillOnce(DoAll( 958 .WillOnce(DoAll(
964 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_NOTHING), 959 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
965 Stop(pipeline_.get()), RunClosure<0>())); 960 Stop(pipeline_.get()), RunClosure<0>()));
966 // Note: OnBufferingStateChange or OnSeek callbacks are not called 961 // Note: OnBufferingStateChange or OnSeek callbacks are not called
967 // after pipeline is stopped. 962 // after pipeline is stopped.
968 } else { 963 } else {
969 EXPECT_CALL(*renderer_, Flush(_)) 964 EXPECT_CALL(*renderer_, Flush(_))
970 .WillOnce(DoAll( 965 .WillOnce(DoAll(
971 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_NOTHING), 966 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
972 SetError(pipeline_.get(), PIPELINE_ERROR_READ), 967 SetError(pipeline_.get(), PIPELINE_ERROR_READ),
973 RunClosure<0>())); 968 RunClosure<0>()));
974 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 969 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
975 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); 970 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
976 } 971 }
977 return; 972 return;
978 } 973 }
979 974
980 EXPECT_CALL(*renderer_, Flush(_)) 975 EXPECT_CALL(*renderer_, Flush(_))
981 .WillOnce(DoAll( 976 .WillOnce(
982 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_NOTHING), 977 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
983 RunClosure<0>())); 978 RunClosure<0>()));
984 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 979 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
985 980
986 if (state == kSeeking) { 981 if (state == kSeeking) {
987 if (stop_or_error == kStop) { 982 if (stop_or_error == kStop) {
988 EXPECT_CALL(*demuxer_, Seek(_, _)) 983 EXPECT_CALL(*demuxer_, Seek(_, _))
989 .WillOnce( 984 .WillOnce(
990 DoAll(Stop(pipeline_.get()), RunCallback<1>(PIPELINE_OK))); 985 DoAll(Stop(pipeline_.get()), RunCallback<1>(PIPELINE_OK)));
991 // Note: OnSeek callback is not called after pipeline is stopped. 986 // Note: OnSeek callback is not called after pipeline is stopped.
992 } else { 987 } else {
993 EXPECT_CALL(*demuxer_, Seek(_, _)) 988 EXPECT_CALL(*demuxer_, Seek(_, _))
(...skipping 23 matching lines...) Expand all
1017 // kSuspended, kSuspending never throw errors, since Resume() is always able 1012 // kSuspended, kSuspending never throw errors, since Resume() is always able
1018 // to restore the pipeline to a pristine state. 1013 // to restore the pipeline to a pristine state.
1019 DoStopOrError(stop_or_error, false); 1014 DoStopOrError(stop_or_error, false);
1020 } 1015 }
1021 1016
1022 void SetSuspendExpectations(TeardownState state, StopOrError stop_or_error) { 1017 void SetSuspendExpectations(TeardownState state, StopOrError stop_or_error) {
1023 EXPECT_CALL(*renderer_, SetPlaybackRate(0)); 1018 EXPECT_CALL(*renderer_, SetPlaybackRate(0));
1024 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 1019 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
1025 EXPECT_CALL(callbacks_, OnSuspend(PIPELINE_OK)); 1020 EXPECT_CALL(callbacks_, OnSuspend(PIPELINE_OK));
1026 EXPECT_CALL(*renderer_, Flush(_)) 1021 EXPECT_CALL(*renderer_, Flush(_))
1027 .WillOnce(DoAll( 1022 .WillOnce(
1028 SetBufferingState(&buffering_state_cb_, BUFFERING_HAVE_NOTHING), 1023 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
1029 RunClosure<0>())); 1024 RunClosure<0>()));
1030 if (state == kResuming) { 1025 if (state == kResuming) {
1031 if (stop_or_error == kStop) { 1026 if (stop_or_error == kStop) {
1032 EXPECT_CALL(*demuxer_, Seek(_, _)) 1027 EXPECT_CALL(*demuxer_, Seek(_, _))
1033 .WillOnce( 1028 .WillOnce(
1034 DoAll(Stop(pipeline_.get()), RunCallback<1>(PIPELINE_OK))); 1029 DoAll(Stop(pipeline_.get()), RunCallback<1>(PIPELINE_OK)));
1035 // Note: OnResume callback is not called after pipeline is stopped. 1030 // Note: OnResume callback is not called after pipeline is stopped.
1036 } else { 1031 } else {
1037 EXPECT_CALL(*demuxer_, Seek(_, _)) 1032 EXPECT_CALL(*demuxer_, Seek(_, _))
1038 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); 1033 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
1039 EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ)); 1034 EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ));
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); 1091 INSTANTIATE_TEARDOWN_TEST(Error, Seeking);
1097 INSTANTIATE_TEARDOWN_TEST(Error, Playing); 1092 INSTANTIATE_TEARDOWN_TEST(Error, Playing);
1098 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); 1093 INSTANTIATE_TEARDOWN_TEST(Error, Suspending);
1099 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); 1094 INSTANTIATE_TEARDOWN_TEST(Error, Suspended);
1100 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); 1095 INSTANTIATE_TEARDOWN_TEST(Error, Resuming);
1101 1096
1102 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); 1097 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing);
1103 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); 1098 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended);
1104 1099
1105 } // namespace media 1100 } // namespace media
OLDNEW
« no previous file with comments | « media/base/pipeline_impl.cc ('k') | media/base/renderer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698