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