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