| 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 |