OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/base/pipeline_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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 namespace media { | 45 namespace media { |
46 | 46 |
47 ACTION_P(SetDemuxerProperties, duration) { | 47 ACTION_P(SetDemuxerProperties, duration) { |
48 arg0->SetDuration(duration); | 48 arg0->SetDuration(duration); |
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, renderer_client, status) { |
56 pipeline->SetErrorForTesting(status); | 56 (*renderer_client)->OnError(status); |
57 } | 57 } |
58 | 58 |
59 ACTION_P2(SetBufferingState, renderer_client, buffering_state) { | 59 ACTION_P2(SetBufferingState, renderer_client, buffering_state) { |
60 (*renderer_client)->OnBufferingStateChange(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( |
(...skipping 21 matching lines...) Expand all Loading... |
88 MOCK_METHOD1(OnResume, void(PipelineStatus)); | 88 MOCK_METHOD1(OnResume, void(PipelineStatus)); |
89 | 89 |
90 private: | 90 private: |
91 DISALLOW_COPY_AND_ASSIGN(CallbackHelper); | 91 DISALLOW_COPY_AND_ASSIGN(CallbackHelper); |
92 }; | 92 }; |
93 | 93 |
94 PipelineImplTest() | 94 PipelineImplTest() |
95 : pipeline_( | 95 : pipeline_( |
96 new PipelineImpl(message_loop_.task_runner(), new MediaLog())), | 96 new PipelineImpl(message_loop_.task_runner(), new MediaLog())), |
97 demuxer_(new StrictMock<MockDemuxer>()), | 97 demuxer_(new StrictMock<MockDemuxer>()), |
| 98 demuxer_host_(nullptr), |
98 scoped_renderer_(new StrictMock<MockRenderer>()), | 99 scoped_renderer_(new StrictMock<MockRenderer>()), |
99 renderer_(scoped_renderer_.get()), | 100 renderer_(scoped_renderer_.get()), |
100 renderer_client_(nullptr) { | 101 renderer_client_(nullptr) { |
101 // SetDemuxerExpectations() adds overriding expectations for expected | 102 // SetDemuxerExpectations() adds overriding expectations for expected |
102 // non-NULL streams. | 103 // non-NULL streams. |
103 DemuxerStream* null_pointer = NULL; | 104 DemuxerStream* null_pointer = NULL; |
104 EXPECT_CALL(*demuxer_, GetStream(_)).WillRepeatedly(Return(null_pointer)); | 105 EXPECT_CALL(*demuxer_, GetStream(_)).WillRepeatedly(Return(null_pointer)); |
105 | 106 |
106 EXPECT_CALL(*demuxer_, GetTimelineOffset()) | 107 EXPECT_CALL(*demuxer_, GetTimelineOffset()) |
107 .WillRepeatedly(Return(base::Time())); | 108 .WillRepeatedly(Return(base::Time())); |
108 | 109 |
109 EXPECT_CALL(*renderer_, GetMediaTime()) | 110 EXPECT_CALL(*renderer_, GetMediaTime()) |
110 .WillRepeatedly(Return(base::TimeDelta())); | 111 .WillRepeatedly(Return(base::TimeDelta())); |
111 | 112 |
112 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_)); | 113 EXPECT_CALL(*demuxer_, GetStartTime()).WillRepeatedly(Return(start_time_)); |
113 } | 114 } |
114 | 115 |
115 virtual ~PipelineImplTest() { | 116 virtual ~PipelineImplTest() { |
116 if (!pipeline_ || !pipeline_->IsRunning()) | 117 if (pipeline_->IsRunning()) { |
117 return; | 118 ExpectDemuxerStop(); |
118 | 119 |
119 ExpectDemuxerStop(); | 120 // The mock demuxer doesn't stop the fake text track stream, |
| 121 // so just stop it manually. |
| 122 if (text_stream_) |
| 123 text_stream_->Stop(); |
120 | 124 |
121 // The mock demuxer doesn't stop the fake text track stream, | 125 pipeline_->Stop(); |
122 // so just stop it manually. | |
123 if (text_stream_) { | |
124 text_stream_->Stop(); | |
125 message_loop_.RunUntilIdle(); | |
126 } | 126 } |
127 | 127 |
| 128 pipeline_.reset(); |
128 message_loop_.RunUntilIdle(); | 129 message_loop_.RunUntilIdle(); |
129 pipeline_->Stop(); | |
130 DestroyPipeline(); | |
131 } | 130 } |
132 | 131 |
133 void OnDemuxerError() { | 132 void OnDemuxerError() { demuxer_host_->OnDemuxerError(PIPELINE_ERROR_ABORT); } |
134 // Cast because OnDemuxerError is private in Pipeline. | |
135 static_cast<DemuxerHost*>(pipeline_.get()) | |
136 ->OnDemuxerError(PIPELINE_ERROR_ABORT); | |
137 } | |
138 | 133 |
139 protected: | 134 protected: |
140 // Sets up expectations to allow the demuxer to initialize. | 135 // Sets up expectations to allow the demuxer to initialize. |
141 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; | 136 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; |
142 void SetDemuxerExpectations(MockDemuxerStreamVector* streams, | 137 void SetDemuxerExpectations(MockDemuxerStreamVector* streams, |
143 const base::TimeDelta& duration) { | 138 const base::TimeDelta& duration) { |
144 EXPECT_CALL(callbacks_, OnDurationChange()); | 139 EXPECT_CALL(callbacks_, OnDurationChange()); |
145 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) | 140 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) |
146 .WillOnce(DoAll(SetDemuxerProperties(duration), | 141 .WillOnce(DoAll(SaveArg<0>(&demuxer_host_), |
| 142 SetDemuxerProperties(duration), |
147 PostCallback<1>(PIPELINE_OK))); | 143 PostCallback<1>(PIPELINE_OK))); |
148 | 144 |
149 // Configure the demuxer to return the streams. | 145 // Configure the demuxer to return the streams. |
150 for (size_t i = 0; i < streams->size(); ++i) { | 146 for (size_t i = 0; i < streams->size(); ++i) { |
151 DemuxerStream* stream = (*streams)[i]; | 147 DemuxerStream* stream = (*streams)[i]; |
152 EXPECT_CALL(*demuxer_, GetStream(stream->type())) | 148 EXPECT_CALL(*demuxer_, GetStream(stream->type())) |
153 .WillRepeatedly(Return(stream)); | 149 .WillRepeatedly(Return(stream)); |
154 } | 150 } |
155 } | 151 } |
156 | 152 |
(...skipping 14 matching lines...) Expand all Loading... |
171 EXPECT_CALL(*renderer_, Initialize(_, _, _)) | 167 EXPECT_CALL(*renderer_, Initialize(_, _, _)) |
172 .WillOnce( | 168 .WillOnce( |
173 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK))); | 169 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK))); |
174 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream())); | 170 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(audio_stream())); |
175 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream())); | 171 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(video_stream())); |
176 } | 172 } |
177 | 173 |
178 void AddTextStream() { | 174 void AddTextStream() { |
179 EXPECT_CALL(callbacks_, OnAddTextTrack(_, _)) | 175 EXPECT_CALL(callbacks_, OnAddTextTrack(_, _)) |
180 .WillOnce(Invoke(this, &PipelineImplTest::DoOnAddTextTrack)); | 176 .WillOnce(Invoke(this, &PipelineImplTest::DoOnAddTextTrack)); |
181 static_cast<DemuxerHost*>(pipeline_.get()) | 177 demuxer_host_->AddTextStream(text_stream(), |
182 ->AddTextStream(text_stream(), | 178 TextTrackConfig(kTextSubtitles, "", "", "")); |
183 TextTrackConfig(kTextSubtitles, "", "", "")); | |
184 message_loop_.RunUntilIdle(); | 179 message_loop_.RunUntilIdle(); |
185 } | 180 } |
186 | 181 |
187 void StartPipeline() { | 182 void StartPipeline() { |
188 EXPECT_CALL(callbacks_, OnWaitingForDecryptionKey()).Times(0); | 183 EXPECT_CALL(callbacks_, OnWaitingForDecryptionKey()).Times(0); |
189 pipeline_->Start( | 184 pipeline_->Start( |
190 demuxer_.get(), std::move(scoped_renderer_), &callbacks_, | 185 demuxer_.get(), std::move(scoped_renderer_), &callbacks_, |
191 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); | 186 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); |
192 } | 187 } |
193 | 188 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK)); | 283 EXPECT_CALL(callbacks_, OnResume(PIPELINE_OK)); |
289 } | 284 } |
290 | 285 |
291 void DoResume(const base::TimeDelta& seek_time) { | 286 void DoResume(const base::TimeDelta& seek_time) { |
292 pipeline_->Resume( | 287 pipeline_->Resume( |
293 std::move(scoped_renderer_), seek_time, | 288 std::move(scoped_renderer_), seek_time, |
294 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_))); | 289 base::Bind(&CallbackHelper::OnResume, base::Unretained(&callbacks_))); |
295 message_loop_.RunUntilIdle(); | 290 message_loop_.RunUntilIdle(); |
296 } | 291 } |
297 | 292 |
298 void DestroyPipeline() { | |
299 // In real code Pipeline could be destroyed on a different thread. All weak | |
300 // pointers must have been invalidated before the stop callback returns. | |
301 DCHECK(!pipeline_->HasWeakPtrsForTesting()); | |
302 pipeline_.reset(); | |
303 } | |
304 | |
305 void ExpectDemuxerStop() { | 293 void ExpectDemuxerStop() { |
306 if (demuxer_) | 294 if (demuxer_) |
307 EXPECT_CALL(*demuxer_, Stop()); | 295 EXPECT_CALL(*demuxer_, Stop()); |
308 } | 296 } |
309 | 297 |
310 void DoOnAddTextTrack(const TextTrackConfig& config, | 298 void DoOnAddTextTrack(const TextTrackConfig& config, |
311 const AddTextTrackDoneCB& done_cb) { | 299 const AddTextTrackDoneCB& done_cb) { |
312 std::unique_ptr<TextTrack> text_track(new MockTextTrack); | 300 std::unique_ptr<TextTrack> text_track(new MockTextTrack); |
313 done_cb.Run(std::move(text_track)); | 301 done_cb.Run(std::move(text_track)); |
314 } | 302 } |
315 | 303 |
316 void RunBufferedTimeRangesTest(const base::TimeDelta duration) { | 304 void RunBufferedTimeRangesTest(const base::TimeDelta duration) { |
317 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size()); | 305 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size()); |
318 EXPECT_FALSE(pipeline_->DidLoadingProgress()); | 306 EXPECT_FALSE(pipeline_->DidLoadingProgress()); |
| 307 |
319 Ranges<base::TimeDelta> ranges; | 308 Ranges<base::TimeDelta> ranges; |
320 ranges.Add(base::TimeDelta(), duration); | 309 ranges.Add(base::TimeDelta(), duration); |
321 pipeline_->OnBufferedTimeRangesChanged(ranges); | 310 demuxer_host_->OnBufferedTimeRangesChanged(ranges); |
| 311 message_loop_.RunUntilIdle(); |
| 312 |
322 EXPECT_TRUE(pipeline_->DidLoadingProgress()); | 313 EXPECT_TRUE(pipeline_->DidLoadingProgress()); |
323 EXPECT_FALSE(pipeline_->DidLoadingProgress()); | 314 EXPECT_FALSE(pipeline_->DidLoadingProgress()); |
324 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 315 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
325 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); | 316 EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); |
326 EXPECT_EQ(duration, pipeline_->GetBufferedTimeRanges().end(0)); | 317 EXPECT_EQ(duration, pipeline_->GetBufferedTimeRanges().end(0)); |
327 } | 318 } |
328 | 319 |
329 // Fixture members. | 320 // Fixture members. |
330 StrictMock<CallbackHelper> callbacks_; | 321 StrictMock<CallbackHelper> callbacks_; |
331 base::SimpleTestTickClock test_tick_clock_; | 322 base::SimpleTestTickClock test_tick_clock_; |
332 base::MessageLoop message_loop_; | 323 base::MessageLoop message_loop_; |
333 std::unique_ptr<PipelineImpl> pipeline_; | 324 std::unique_ptr<PipelineImpl> pipeline_; |
334 | 325 |
335 std::unique_ptr<StrictMock<MockDemuxer>> demuxer_; | 326 std::unique_ptr<StrictMock<MockDemuxer>> demuxer_; |
| 327 DemuxerHost* demuxer_host_; |
336 std::unique_ptr<StrictMock<MockRenderer>> scoped_renderer_; | 328 std::unique_ptr<StrictMock<MockRenderer>> scoped_renderer_; |
337 StrictMock<MockRenderer>* renderer_; | 329 StrictMock<MockRenderer>* renderer_; |
338 StrictMock<CallbackHelper> text_renderer_callbacks_; | 330 StrictMock<CallbackHelper> text_renderer_callbacks_; |
339 TextRenderer* text_renderer_; | 331 TextRenderer* text_renderer_; |
340 std::unique_ptr<StrictMock<MockDemuxerStream>> audio_stream_; | 332 std::unique_ptr<StrictMock<MockDemuxerStream>> audio_stream_; |
341 std::unique_ptr<StrictMock<MockDemuxerStream>> video_stream_; | 333 std::unique_ptr<StrictMock<MockDemuxerStream>> video_stream_; |
342 std::unique_ptr<FakeTextTrackStream> text_stream_; | 334 std::unique_ptr<FakeTextTrackStream> text_stream_; |
343 RendererClient* renderer_client_; | 335 RendererClient* renderer_client_; |
344 VideoDecoderConfig video_decoder_config_; | 336 VideoDecoderConfig video_decoder_config_; |
345 PipelineMetadata metadata_; | 337 PipelineMetadata metadata_; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 | 408 |
417 SetDemuxerExpectations(&streams); | 409 SetDemuxerExpectations(&streams); |
418 SetRendererExpectations(); | 410 SetRendererExpectations(); |
419 | 411 |
420 StartPipelineAndExpect(PIPELINE_OK); | 412 StartPipelineAndExpect(PIPELINE_OK); |
421 message_loop_.RunUntilIdle(); | 413 message_loop_.RunUntilIdle(); |
422 | 414 |
423 EXPECT_CALL(*demuxer_, Stop()) | 415 EXPECT_CALL(*demuxer_, Stop()) |
424 .WillOnce(InvokeWithoutArgs(this, &PipelineImplTest::OnDemuxerError)); | 416 .WillOnce(InvokeWithoutArgs(this, &PipelineImplTest::OnDemuxerError)); |
425 pipeline_->Stop(); | 417 pipeline_->Stop(); |
| 418 message_loop_.RunUntilIdle(); |
426 } | 419 } |
427 | 420 |
428 TEST_F(PipelineImplTest, NoStreams) { | 421 TEST_F(PipelineImplTest, NoStreams) { |
429 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) | 422 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) |
430 .WillOnce(PostCallback<1>(PIPELINE_OK)); | 423 .WillOnce(PostCallback<1>(PIPELINE_OK)); |
431 EXPECT_CALL(*demuxer_, Stop()); | 424 EXPECT_CALL(*demuxer_, Stop()); |
432 EXPECT_CALL(callbacks_, OnMetadata(_)); | 425 EXPECT_CALL(callbacks_, OnMetadata(_)); |
433 | 426 |
434 StartPipelineAndExpect(PIPELINE_ERROR_COULD_NOT_RENDER); | 427 StartPipelineAndExpect(PIPELINE_ERROR_COULD_NOT_RENDER); |
435 } | 428 } |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 streams.push_back(audio_stream()); | 528 streams.push_back(audio_stream()); |
536 | 529 |
537 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); | 530 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); |
538 SetRendererExpectations(); | 531 SetRendererExpectations(); |
539 | 532 |
540 // Initialize then seek! | 533 // Initialize then seek! |
541 StartPipelineAndExpect(PIPELINE_OK); | 534 StartPipelineAndExpect(PIPELINE_OK); |
542 | 535 |
543 EXPECT_CALL(*demuxer_, Stop()); | 536 EXPECT_CALL(*demuxer_, Stop()); |
544 EXPECT_CALL(callbacks_, OnError(_)); | 537 EXPECT_CALL(callbacks_, OnError(_)); |
545 | 538 OnDemuxerError(); |
546 static_cast<DemuxerHost*>(pipeline_.get()) | |
547 ->OnDemuxerError(PIPELINE_ERROR_ABORT); | |
548 message_loop_.RunUntilIdle(); | 539 message_loop_.RunUntilIdle(); |
549 | 540 |
550 pipeline_->Seek( | 541 pipeline_->Seek( |
551 base::TimeDelta::FromMilliseconds(100), | 542 base::TimeDelta::FromMilliseconds(100), |
552 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); | 543 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); |
553 message_loop_.RunUntilIdle(); | 544 message_loop_.RunUntilIdle(); |
554 } | 545 } |
555 | 546 |
556 TEST_F(PipelineImplTest, SuspendResume) { | 547 TEST_F(PipelineImplTest, SuspendResume) { |
557 CreateAudioStream(); | 548 CreateAudioStream(); |
558 CreateVideoStream(); | 549 CreateVideoStream(); |
559 CreateTextStream(); | 550 CreateTextStream(); |
560 MockDemuxerStreamVector streams; | 551 MockDemuxerStreamVector streams; |
561 streams.push_back(audio_stream()); | 552 streams.push_back(audio_stream()); |
562 streams.push_back(video_stream()); | 553 streams.push_back(video_stream()); |
563 | 554 |
564 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); | 555 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); |
565 SetRendererExpectations(); | 556 SetRendererExpectations(); |
566 | 557 |
567 StartPipelineAndExpect(PIPELINE_OK); | 558 StartPipelineAndExpect(PIPELINE_OK); |
568 | 559 |
569 // Inject some fake memory usage to verify its cleared after suspend. | 560 // Inject some fake memory usage to verify its cleared after suspend. |
570 PipelineStatistics stats; | 561 PipelineStatistics stats; |
571 stats.audio_memory_usage = 12345; | 562 stats.audio_memory_usage = 12345; |
572 stats.video_memory_usage = 67890; | 563 stats.video_memory_usage = 67890; |
573 renderer_client_->OnStatisticsUpdate(stats); | 564 renderer_client_->OnStatisticsUpdate(stats); |
| 565 message_loop_.RunUntilIdle(); |
| 566 |
574 EXPECT_EQ(stats.audio_memory_usage, | 567 EXPECT_EQ(stats.audio_memory_usage, |
575 pipeline_->GetStatistics().audio_memory_usage); | 568 pipeline_->GetStatistics().audio_memory_usage); |
576 EXPECT_EQ(stats.video_memory_usage, | 569 EXPECT_EQ(stats.video_memory_usage, |
577 pipeline_->GetStatistics().video_memory_usage); | 570 pipeline_->GetStatistics().video_memory_usage); |
578 | 571 |
579 ExpectSuspend(); | 572 ExpectSuspend(); |
580 DoSuspend(); | 573 DoSuspend(); |
581 | 574 |
582 EXPECT_EQ(pipeline_->GetStatistics().audio_memory_usage, 0); | 575 EXPECT_EQ(0, pipeline_->GetStatistics().audio_memory_usage); |
583 EXPECT_EQ(pipeline_->GetStatistics().video_memory_usage, 0); | 576 EXPECT_EQ(0, pipeline_->GetStatistics().video_memory_usage); |
584 | 577 |
585 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); | 578 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); |
586 ExpectResume(expected); | 579 ExpectResume(expected); |
587 DoResume(expected); | 580 DoResume(expected); |
588 } | 581 } |
589 | 582 |
590 TEST_F(PipelineImplTest, SetVolume) { | 583 TEST_F(PipelineImplTest, SetVolume) { |
591 CreateAudioStream(); | 584 CreateAudioStream(); |
592 MockDemuxerStreamVector streams; | 585 MockDemuxerStreamVector streams; |
593 streams.push_back(audio_stream()); | 586 streams.push_back(audio_stream()); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 | 627 |
635 base::TimeDelta kSeekTime = kDuration / 2; | 628 base::TimeDelta kSeekTime = kDuration / 2; |
636 ExpectSeek(kSeekTime, false); | 629 ExpectSeek(kSeekTime, false); |
637 DoSeek(kSeekTime); | 630 DoSeek(kSeekTime); |
638 | 631 |
639 EXPECT_FALSE(pipeline_->DidLoadingProgress()); | 632 EXPECT_FALSE(pipeline_->DidLoadingProgress()); |
640 } | 633 } |
641 | 634 |
642 TEST_F(PipelineImplTest, BufferedTimeRangesCanChangeAfterStop) { | 635 TEST_F(PipelineImplTest, BufferedTimeRangesCanChangeAfterStop) { |
643 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) | 636 EXPECT_CALL(*demuxer_, Initialize(_, _, _)) |
644 .WillOnce(PostCallback<1>(PIPELINE_OK)); | 637 .WillOnce( |
| 638 DoAll(SaveArg<0>(&demuxer_host_), PostCallback<1>(PIPELINE_OK))); |
645 EXPECT_CALL(*demuxer_, Stop()); | 639 EXPECT_CALL(*demuxer_, Stop()); |
646 EXPECT_CALL(callbacks_, OnMetadata(_)); | 640 EXPECT_CALL(callbacks_, OnMetadata(_)); |
647 EXPECT_CALL(callbacks_, OnStart(_)); | 641 EXPECT_CALL(callbacks_, OnStart(_)); |
648 StartPipeline(); | 642 StartPipeline(); |
649 message_loop_.RunUntilIdle(); | 643 message_loop_.RunUntilIdle(); |
650 | 644 |
651 pipeline_->Stop(); | 645 pipeline_->Stop(); |
652 RunBufferedTimeRangesTest(base::TimeDelta::FromSeconds(5)); | 646 RunBufferedTimeRangesTest(base::TimeDelta::FromSeconds(5)); |
653 DestroyPipeline(); | |
654 } | 647 } |
655 | 648 |
656 TEST_F(PipelineImplTest, EndedCallback) { | 649 TEST_F(PipelineImplTest, EndedCallback) { |
657 CreateAudioStream(); | 650 CreateAudioStream(); |
658 CreateVideoStream(); | 651 CreateVideoStream(); |
659 CreateTextStream(); | 652 CreateTextStream(); |
660 MockDemuxerStreamVector streams; | 653 MockDemuxerStreamVector streams; |
661 streams.push_back(audio_stream()); | 654 streams.push_back(audio_stream()); |
662 streams.push_back(video_stream()); | 655 streams.push_back(video_stream()); |
663 | 656 |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
895 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); | 888 SetDemuxerExpectations(&streams, base::TimeDelta::FromSeconds(3000)); |
896 | 889 |
897 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(true)); | 890 EXPECT_CALL(*renderer_, HasAudio()).WillRepeatedly(Return(true)); |
898 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(true)); | 891 EXPECT_CALL(*renderer_, HasVideo()).WillRepeatedly(Return(true)); |
899 | 892 |
900 if (state == kInitRenderer) { | 893 if (state == kInitRenderer) { |
901 if (stop_or_error == kStop) { | 894 if (stop_or_error == kStop) { |
902 EXPECT_CALL(*renderer_, Initialize(_, _, _)) | 895 EXPECT_CALL(*renderer_, Initialize(_, _, _)) |
903 .WillOnce( | 896 .WillOnce( |
904 DoAll(Stop(pipeline_.get()), PostCallback<2>(PIPELINE_OK))); | 897 DoAll(Stop(pipeline_.get()), PostCallback<2>(PIPELINE_OK))); |
905 // Note: OnStart or OnMetadata callback are not called | 898 // Note: OnStart callback is not called after pipeline is stopped. |
906 // after pipeline is stopped. | |
907 } else { | 899 } else { |
908 EXPECT_CALL(*renderer_, Initialize(_, _, _)) | 900 EXPECT_CALL(*renderer_, Initialize(_, _, _)) |
909 .WillOnce(PostCallback<2>(PIPELINE_ERROR_INITIALIZATION_FAILED)); | 901 .WillOnce(PostCallback<2>(PIPELINE_ERROR_INITIALIZATION_FAILED)); |
910 EXPECT_CALL(callbacks_, OnMetadata(_)); | |
911 EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_INITIALIZATION_FAILED)); | 902 EXPECT_CALL(callbacks_, OnStart(PIPELINE_ERROR_INITIALIZATION_FAILED)); |
912 } | 903 } |
913 | 904 |
| 905 EXPECT_CALL(callbacks_, OnMetadata(_)); |
914 EXPECT_CALL(*demuxer_, Stop()); | 906 EXPECT_CALL(*demuxer_, Stop()); |
915 return; | 907 return; |
916 } | 908 } |
917 | 909 |
918 EXPECT_CALL(*renderer_, Initialize(_, _, _)) | 910 EXPECT_CALL(*renderer_, Initialize(_, _, _)) |
919 .WillOnce( | 911 .WillOnce( |
920 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK))); | 912 DoAll(SaveArg<1>(&renderer_client_), PostCallback<2>(PIPELINE_OK))); |
921 | 913 |
922 // If we get here it's a successful initialization. | 914 // If we get here it's a successful initialization. |
923 EXPECT_CALL(callbacks_, OnStart(PIPELINE_OK)); | 915 EXPECT_CALL(callbacks_, OnStart(PIPELINE_OK)); |
(...skipping 23 matching lines...) Expand all Loading... |
947 EXPECT_CALL(*renderer_, Flush(_)) | 939 EXPECT_CALL(*renderer_, Flush(_)) |
948 .WillOnce(DoAll( | 940 .WillOnce(DoAll( |
949 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), | 941 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), |
950 Stop(pipeline_.get()), RunClosure<0>())); | 942 Stop(pipeline_.get()), RunClosure<0>())); |
951 // Note: OnBufferingStateChange or OnSeek callbacks are not called | 943 // Note: OnBufferingStateChange or OnSeek callbacks are not called |
952 // after pipeline is stopped. | 944 // after pipeline is stopped. |
953 } else { | 945 } else { |
954 EXPECT_CALL(*renderer_, Flush(_)) | 946 EXPECT_CALL(*renderer_, Flush(_)) |
955 .WillOnce(DoAll( | 947 .WillOnce(DoAll( |
956 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), | 948 SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), |
957 SetError(pipeline_.get(), PIPELINE_ERROR_READ), | 949 SetError(&renderer_client_, PIPELINE_ERROR_READ), |
958 RunClosure<0>())); | 950 RunClosure<0>())); |
959 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); | 951 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); |
960 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); | 952 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); |
961 } | 953 } |
962 return; | 954 return; |
963 } | 955 } |
964 | 956 |
965 EXPECT_CALL(*renderer_, Flush(_)) | 957 EXPECT_CALL(*renderer_, Flush(_)) |
966 .WillOnce( | 958 .WillOnce( |
967 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), | 959 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1022 EXPECT_CALL(*demuxer_, Seek(_, _)) | 1014 EXPECT_CALL(*demuxer_, Seek(_, _)) |
1023 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); | 1015 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); |
1024 EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ)); | 1016 EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ)); |
1025 } | 1017 } |
1026 } else if (state != kSuspended && state != kSuspending) { | 1018 } else if (state != kSuspended && state != kSuspending) { |
1027 NOTREACHED() << "State not supported: " << state; | 1019 NOTREACHED() << "State not supported: " << state; |
1028 } | 1020 } |
1029 } | 1021 } |
1030 | 1022 |
1031 void DoStopOrError(StopOrError stop_or_error, bool expect_errors) { | 1023 void DoStopOrError(StopOrError stop_or_error, bool expect_errors) { |
1032 InSequence s; | |
1033 | |
1034 switch (stop_or_error) { | 1024 switch (stop_or_error) { |
1035 case kStop: | 1025 case kStop: |
1036 EXPECT_CALL(*demuxer_, Stop()); | 1026 EXPECT_CALL(*demuxer_, Stop()); |
1037 pipeline_->Stop(); | 1027 pipeline_->Stop(); |
1038 break; | 1028 break; |
1039 | 1029 |
1040 case kError: | 1030 case kError: |
1041 if (expect_errors) { | 1031 if (expect_errors) { |
1042 EXPECT_CALL(*demuxer_, Stop()); | 1032 EXPECT_CALL(*demuxer_, Stop()); |
1043 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); | 1033 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); |
1044 } | 1034 } |
1045 pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ); | 1035 renderer_client_->OnError(PIPELINE_ERROR_READ); |
1046 break; | 1036 break; |
1047 | 1037 |
1048 case kErrorAndStop: | 1038 case kErrorAndStop: |
1049 EXPECT_CALL(*demuxer_, Stop()); | 1039 EXPECT_CALL(*demuxer_, Stop()); |
1050 if (expect_errors) | 1040 if (expect_errors) |
1051 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); | 1041 EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_READ)); |
1052 pipeline_->SetErrorForTesting(PIPELINE_ERROR_READ); | 1042 renderer_client_->OnError(PIPELINE_ERROR_READ); |
1053 message_loop_.RunUntilIdle(); | 1043 message_loop_.RunUntilIdle(); |
1054 pipeline_->Stop(); | 1044 pipeline_->Stop(); |
1055 break; | 1045 break; |
1056 } | 1046 } |
1057 | 1047 |
1058 message_loop_.RunUntilIdle(); | 1048 message_loop_.RunUntilIdle(); |
1059 } | 1049 } |
1060 | 1050 |
1061 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest); | 1051 DISALLOW_COPY_AND_ASSIGN(PipelineTeardownTest); |
1062 }; | 1052 }; |
(...skipping 18 matching lines...) Expand all Loading... |
1081 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); | 1071 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); |
1082 INSTANTIATE_TEARDOWN_TEST(Error, Playing); | 1072 INSTANTIATE_TEARDOWN_TEST(Error, Playing); |
1083 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); | 1073 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); |
1084 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); | 1074 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); |
1085 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); | 1075 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); |
1086 | 1076 |
1087 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); | 1077 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); |
1088 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); | 1078 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); |
1089 | 1079 |
1090 } // namespace media | 1080 } // namespace media |
OLD | NEW |