| 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 | 194 |
| 195 // Sets up expectations on the callback and initializes the pipeline. Called | 195 // Sets up expectations on the callback and initializes the pipeline. Called |
| 196 // after tests have set expectations any filters they wish to use. | 196 // after tests have set expectations any filters they wish to use. |
| 197 void StartPipeline(PipelineStatus start_status) { | 197 void StartPipeline(PipelineStatus start_status) { |
| 198 EXPECT_CALL(callbacks_, OnStart(start_status)); | 198 EXPECT_CALL(callbacks_, OnStart(start_status)); |
| 199 | 199 |
| 200 if (start_status == PIPELINE_OK) { | 200 if (start_status == PIPELINE_OK) { |
| 201 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_)); | 201 EXPECT_CALL(callbacks_, OnMetadata(_)).WillOnce(SaveArg<0>(&metadata_)); |
| 202 | 202 |
| 203 if (audio_stream_) { | 203 if (audio_stream_) { |
| 204 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f)); | 204 EXPECT_CALL(*audio_renderer_, GetTimeSource()) |
| 205 .WillOnce(Return(&time_source_)); |
| 206 EXPECT_CALL(time_source_, SetPlaybackRate(0.0f)); |
| 207 EXPECT_CALL(time_source_, SetMediaTime(base::TimeDelta())); |
| 208 EXPECT_CALL(time_source_, StartTicking()); |
| 205 EXPECT_CALL(*audio_renderer_, SetVolume(1.0f)); | 209 EXPECT_CALL(*audio_renderer_, SetVolume(1.0f)); |
| 206 EXPECT_CALL(*audio_renderer_, SetMediaTime(base::TimeDelta())); | |
| 207 EXPECT_CALL(*audio_renderer_, StartPlaying()) | 210 EXPECT_CALL(*audio_renderer_, StartPlaying()) |
| 208 .WillOnce(SetBufferingState(&audio_buffering_state_cb_, | 211 .WillOnce(SetBufferingState(&audio_buffering_state_cb_, |
| 209 BUFFERING_HAVE_ENOUGH)); | 212 BUFFERING_HAVE_ENOUGH)); |
| 210 EXPECT_CALL(*audio_renderer_, StartRendering()); | |
| 211 } | 213 } |
| 212 | 214 |
| 213 if (video_stream_) { | 215 if (video_stream_) { |
| 214 EXPECT_CALL(*video_renderer_, StartPlaying()) | 216 EXPECT_CALL(*video_renderer_, StartPlaying()) |
| 215 .WillOnce(SetBufferingState(&video_buffering_state_cb_, | 217 .WillOnce(SetBufferingState(&video_buffering_state_cb_, |
| 216 BUFFERING_HAVE_ENOUGH)); | 218 BUFFERING_HAVE_ENOUGH)); |
| 217 } | 219 } |
| 218 | 220 |
| 219 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); | 221 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
| 220 } | 222 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 return text_stream_.get(); | 261 return text_stream_.get(); |
| 260 } | 262 } |
| 261 | 263 |
| 262 void ExpectSeek(const base::TimeDelta& seek_time, bool underflowed) { | 264 void ExpectSeek(const base::TimeDelta& seek_time, bool underflowed) { |
| 263 // Every filter should receive a call to Seek(). | 265 // Every filter should receive a call to Seek(). |
| 264 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) | 266 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) |
| 265 .WillOnce(RunCallback<1>(PIPELINE_OK)); | 267 .WillOnce(RunCallback<1>(PIPELINE_OK)); |
| 266 | 268 |
| 267 if (audio_stream_) { | 269 if (audio_stream_) { |
| 268 if (!underflowed) | 270 if (!underflowed) |
| 269 EXPECT_CALL(*audio_renderer_, StopRendering()); | 271 EXPECT_CALL(time_source_, StopTicking()); |
| 270 EXPECT_CALL(*audio_renderer_, Flush(_)) | 272 EXPECT_CALL(*audio_renderer_, Flush(_)) |
| 271 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, | 273 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, |
| 272 BUFFERING_HAVE_NOTHING), | 274 BUFFERING_HAVE_NOTHING), |
| 273 RunClosure<0>())); | 275 RunClosure<0>())); |
| 274 EXPECT_CALL(*audio_renderer_, SetMediaTime(seek_time)); | 276 EXPECT_CALL(time_source_, SetMediaTime(seek_time)); |
| 277 EXPECT_CALL(time_source_, SetPlaybackRate(_)); |
| 278 EXPECT_CALL(time_source_, StartTicking()); |
| 275 EXPECT_CALL(*audio_renderer_, StartPlaying()) | 279 EXPECT_CALL(*audio_renderer_, StartPlaying()) |
| 276 .WillOnce(SetBufferingState(&audio_buffering_state_cb_, | 280 .WillOnce(SetBufferingState(&audio_buffering_state_cb_, |
| 277 BUFFERING_HAVE_ENOUGH)); | 281 BUFFERING_HAVE_ENOUGH)); |
| 278 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(_)); | |
| 279 EXPECT_CALL(*audio_renderer_, SetVolume(_)); | 282 EXPECT_CALL(*audio_renderer_, SetVolume(_)); |
| 280 EXPECT_CALL(*audio_renderer_, StartRendering()); | |
| 281 } | 283 } |
| 282 | 284 |
| 283 if (video_stream_) { | 285 if (video_stream_) { |
| 284 EXPECT_CALL(*video_renderer_, Flush(_)) | 286 EXPECT_CALL(*video_renderer_, Flush(_)) |
| 285 .WillOnce(DoAll(SetBufferingState(&video_buffering_state_cb_, | 287 .WillOnce(DoAll(SetBufferingState(&video_buffering_state_cb_, |
| 286 BUFFERING_HAVE_NOTHING), | 288 BUFFERING_HAVE_NOTHING), |
| 287 RunClosure<0>())); | 289 RunClosure<0>())); |
| 288 EXPECT_CALL(*video_renderer_, StartPlaying()) | 290 EXPECT_CALL(*video_renderer_, StartPlaying()) |
| 289 .WillOnce(SetBufferingState(&video_buffering_state_cb_, | 291 .WillOnce(SetBufferingState(&video_buffering_state_cb_, |
| 290 BUFFERING_HAVE_ENOUGH)); | 292 BUFFERING_HAVE_ENOUGH)); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 // Fixture members. | 331 // Fixture members. |
| 330 StrictMock<CallbackHelper> callbacks_; | 332 StrictMock<CallbackHelper> callbacks_; |
| 331 base::SimpleTestTickClock test_tick_clock_; | 333 base::SimpleTestTickClock test_tick_clock_; |
| 332 base::MessageLoop message_loop_; | 334 base::MessageLoop message_loop_; |
| 333 scoped_ptr<Pipeline> pipeline_; | 335 scoped_ptr<Pipeline> pipeline_; |
| 334 | 336 |
| 335 scoped_ptr<FilterCollection> filter_collection_; | 337 scoped_ptr<FilterCollection> filter_collection_; |
| 336 scoped_ptr<StrictMock<MockDemuxer> > demuxer_; | 338 scoped_ptr<StrictMock<MockDemuxer> > demuxer_; |
| 337 StrictMock<MockVideoRenderer>* video_renderer_; | 339 StrictMock<MockVideoRenderer>* video_renderer_; |
| 338 StrictMock<MockAudioRenderer>* audio_renderer_; | 340 StrictMock<MockAudioRenderer>* audio_renderer_; |
| 341 StrictMock<MockTimeSource> time_source_; |
| 339 StrictMock<CallbackHelper> text_renderer_callbacks_; | 342 StrictMock<CallbackHelper> text_renderer_callbacks_; |
| 340 TextRenderer* text_renderer_; | 343 TextRenderer* text_renderer_; |
| 341 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; | 344 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; |
| 342 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; | 345 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; |
| 343 scoped_ptr<FakeTextTrackStream> text_stream_; | 346 scoped_ptr<FakeTextTrackStream> text_stream_; |
| 344 AudioRenderer::TimeCB audio_time_cb_; | 347 AudioRenderer::TimeCB audio_time_cb_; |
| 345 BufferingStateCB audio_buffering_state_cb_; | 348 BufferingStateCB audio_buffering_state_cb_; |
| 346 BufferingStateCB video_buffering_state_cb_; | 349 BufferingStateCB video_buffering_state_cb_; |
| 347 base::Closure audio_ended_cb_; | 350 base::Closure audio_ended_cb_; |
| 348 base::Closure video_ended_cb_; | 351 base::Closure video_ended_cb_; |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 | 604 |
| 602 AddTextStream(); | 605 AddTextStream(); |
| 603 | 606 |
| 604 // The ended callback shouldn't run until all renderers have ended. | 607 // The ended callback shouldn't run until all renderers have ended. |
| 605 audio_ended_cb_.Run(); | 608 audio_ended_cb_.Run(); |
| 606 message_loop_.RunUntilIdle(); | 609 message_loop_.RunUntilIdle(); |
| 607 | 610 |
| 608 video_ended_cb_.Run(); | 611 video_ended_cb_.Run(); |
| 609 message_loop_.RunUntilIdle(); | 612 message_loop_.RunUntilIdle(); |
| 610 | 613 |
| 611 EXPECT_CALL(*audio_renderer_, StopRendering()); | 614 EXPECT_CALL(time_source_, StopTicking()); |
| 612 EXPECT_CALL(callbacks_, OnEnded()); | 615 EXPECT_CALL(callbacks_, OnEnded()); |
| 613 text_stream()->SendEosNotification(); | 616 text_stream()->SendEosNotification(); |
| 614 message_loop_.RunUntilIdle(); | 617 message_loop_.RunUntilIdle(); |
| 615 } | 618 } |
| 616 | 619 |
| 617 TEST_F(PipelineTest, AudioStreamShorterThanVideo) { | 620 TEST_F(PipelineTest, AudioStreamShorterThanVideo) { |
| 618 base::TimeDelta duration = base::TimeDelta::FromSeconds(10); | 621 base::TimeDelta duration = base::TimeDelta::FromSeconds(10); |
| 619 | 622 |
| 620 CreateAudioStream(); | 623 CreateAudioStream(); |
| 621 CreateVideoStream(); | 624 CreateVideoStream(); |
| 622 MockDemuxerStreamVector streams; | 625 MockDemuxerStreamVector streams; |
| 623 streams.push_back(audio_stream()); | 626 streams.push_back(audio_stream()); |
| 624 streams.push_back(video_stream()); | 627 streams.push_back(video_stream()); |
| 625 | 628 |
| 626 // Replace what's used for interpolating to simulate wall clock time. | 629 // Replace what's used for interpolating to simulate wall clock time. |
| 627 pipeline_->SetTimeDeltaInterpolatorForTesting( | 630 pipeline_->SetTimeDeltaInterpolatorForTesting( |
| 628 new TimeDeltaInterpolator(&test_tick_clock_)); | 631 new TimeDeltaInterpolator(&test_tick_clock_)); |
| 629 | 632 |
| 630 SetDemuxerExpectations(&streams, duration); | 633 SetDemuxerExpectations(&streams, duration); |
| 631 SetAudioRendererExpectations(audio_stream()); | 634 SetAudioRendererExpectations(audio_stream()); |
| 632 SetVideoRendererExpectations(video_stream()); | 635 SetVideoRendererExpectations(video_stream()); |
| 633 StartPipeline(PIPELINE_OK); | 636 StartPipeline(PIPELINE_OK); |
| 634 | 637 |
| 635 EXPECT_EQ(0, pipeline_->GetMediaTime().ToInternalValue()); | 638 EXPECT_EQ(0, pipeline_->GetMediaTime().ToInternalValue()); |
| 636 | 639 |
| 637 float playback_rate = 1.0f; | 640 float playback_rate = 1.0f; |
| 638 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(playback_rate)); | 641 EXPECT_CALL(time_source_, SetPlaybackRate(playback_rate)); |
| 639 pipeline_->SetPlaybackRate(playback_rate); | 642 pipeline_->SetPlaybackRate(playback_rate); |
| 640 message_loop_.RunUntilIdle(); | 643 message_loop_.RunUntilIdle(); |
| 641 | 644 |
| 642 InSequence s; | 645 InSequence s; |
| 643 | 646 |
| 644 // Verify that the clock doesn't advance since it hasn't been started by | 647 // Verify that the clock doesn't advance since it hasn't been started by |
| 645 // a time update from the audio stream. | 648 // a time update from the audio stream. |
| 646 int64 start_time = pipeline_->GetMediaTime().ToInternalValue(); | 649 int64 start_time = pipeline_->GetMediaTime().ToInternalValue(); |
| 647 test_tick_clock_.Advance(base::TimeDelta::FromMilliseconds(100)); | 650 test_tick_clock_.Advance(base::TimeDelta::FromMilliseconds(100)); |
| 648 EXPECT_EQ(pipeline_->GetMediaTime().ToInternalValue(), start_time); | 651 EXPECT_EQ(pipeline_->GetMediaTime().ToInternalValue(), start_time); |
| 649 | 652 |
| 650 // Signal end of audio stream. | 653 // Signal end of audio stream. |
| 651 audio_ended_cb_.Run(); | 654 audio_ended_cb_.Run(); |
| 652 message_loop_.RunUntilIdle(); | 655 message_loop_.RunUntilIdle(); |
| 653 | 656 |
| 654 // Verify that the clock advances. | 657 // Verify that the clock advances. |
| 655 start_time = pipeline_->GetMediaTime().ToInternalValue(); | 658 start_time = pipeline_->GetMediaTime().ToInternalValue(); |
| 656 test_tick_clock_.Advance(base::TimeDelta::FromMilliseconds(100)); | 659 test_tick_clock_.Advance(base::TimeDelta::FromMilliseconds(100)); |
| 657 EXPECT_GT(pipeline_->GetMediaTime().ToInternalValue(), start_time); | 660 EXPECT_GT(pipeline_->GetMediaTime().ToInternalValue(), start_time); |
| 658 | 661 |
| 659 // Signal end of video stream and make sure OnEnded() callback occurs. | 662 // Signal end of video stream and make sure OnEnded() callback occurs. |
| 660 EXPECT_CALL(*audio_renderer_, StopRendering()); | 663 EXPECT_CALL(time_source_, StopTicking()); |
| 661 EXPECT_CALL(callbacks_, OnEnded()); | 664 EXPECT_CALL(callbacks_, OnEnded()); |
| 662 video_ended_cb_.Run(); | 665 video_ended_cb_.Run(); |
| 663 } | 666 } |
| 664 | 667 |
| 665 TEST_F(PipelineTest, ErrorDuringSeek) { | 668 TEST_F(PipelineTest, ErrorDuringSeek) { |
| 666 CreateAudioStream(); | 669 CreateAudioStream(); |
| 667 MockDemuxerStreamVector streams; | 670 MockDemuxerStreamVector streams; |
| 668 streams.push_back(audio_stream()); | 671 streams.push_back(audio_stream()); |
| 669 | 672 |
| 670 SetDemuxerExpectations(&streams); | 673 SetDemuxerExpectations(&streams); |
| 671 SetAudioRendererExpectations(audio_stream()); | 674 SetAudioRendererExpectations(audio_stream()); |
| 672 StartPipeline(PIPELINE_OK); | 675 StartPipeline(PIPELINE_OK); |
| 673 | 676 |
| 674 float playback_rate = 1.0f; | 677 float playback_rate = 1.0f; |
| 675 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(playback_rate)); | 678 EXPECT_CALL(time_source_, SetPlaybackRate(playback_rate)); |
| 676 pipeline_->SetPlaybackRate(playback_rate); | 679 pipeline_->SetPlaybackRate(playback_rate); |
| 677 message_loop_.RunUntilIdle(); | 680 message_loop_.RunUntilIdle(); |
| 678 | 681 |
| 679 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); | 682 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); |
| 680 | 683 |
| 681 // Preroll() isn't called as the demuxer errors out first. | 684 // Preroll() isn't called as the demuxer errors out first. |
| 682 EXPECT_CALL(*audio_renderer_, StopRendering()); | 685 EXPECT_CALL(time_source_, StopTicking()); |
| 683 EXPECT_CALL(*audio_renderer_, Flush(_)) | 686 EXPECT_CALL(*audio_renderer_, Flush(_)) |
| 684 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, | 687 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, |
| 685 BUFFERING_HAVE_NOTHING), | 688 BUFFERING_HAVE_NOTHING), |
| 686 RunClosure<0>())); | 689 RunClosure<0>())); |
| 687 EXPECT_CALL(*audio_renderer_, Stop(_)) | 690 EXPECT_CALL(*audio_renderer_, Stop(_)) |
| 688 .WillOnce(RunClosure<0>()); | 691 .WillOnce(RunClosure<0>()); |
| 689 | 692 |
| 690 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) | 693 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) |
| 691 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); | 694 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); |
| 692 EXPECT_CALL(*demuxer_, Stop(_)) | 695 EXPECT_CALL(*demuxer_, Stop(_)) |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 | 731 |
| 729 // Trigger additional requests on the pipeline during tear down from error. | 732 // Trigger additional requests on the pipeline during tear down from error. |
| 730 base::Callback<void(PipelineStatus)> cb = base::Bind( | 733 base::Callback<void(PipelineStatus)> cb = base::Bind( |
| 731 &TestNoCallsAfterError, pipeline_.get(), &message_loop_); | 734 &TestNoCallsAfterError, pipeline_.get(), &message_loop_); |
| 732 ON_CALL(callbacks_, OnError(_)) | 735 ON_CALL(callbacks_, OnError(_)) |
| 733 .WillByDefault(Invoke(&cb, &base::Callback<void(PipelineStatus)>::Run)); | 736 .WillByDefault(Invoke(&cb, &base::Callback<void(PipelineStatus)>::Run)); |
| 734 | 737 |
| 735 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); | 738 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); |
| 736 | 739 |
| 737 // Seek() isn't called as the demuxer errors out first. | 740 // Seek() isn't called as the demuxer errors out first. |
| 738 EXPECT_CALL(*audio_renderer_, StopRendering()); | 741 EXPECT_CALL(time_source_, StopTicking()); |
| 739 EXPECT_CALL(*audio_renderer_, Flush(_)) | 742 EXPECT_CALL(*audio_renderer_, Flush(_)) |
| 740 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, | 743 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, |
| 741 BUFFERING_HAVE_NOTHING), | 744 BUFFERING_HAVE_NOTHING), |
| 742 RunClosure<0>())); | 745 RunClosure<0>())); |
| 743 EXPECT_CALL(*audio_renderer_, Stop(_)) | 746 EXPECT_CALL(*audio_renderer_, Stop(_)) |
| 744 .WillOnce(RunClosure<0>()); | 747 .WillOnce(RunClosure<0>()); |
| 745 | 748 |
| 746 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) | 749 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) |
| 747 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); | 750 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); |
| 748 EXPECT_CALL(*demuxer_, Stop(_)) | 751 EXPECT_CALL(*demuxer_, Stop(_)) |
| (...skipping 15 matching lines...) Expand all Loading... |
| 764 TEST_F(PipelineTest, AudioTimeUpdateDuringSeek) { | 767 TEST_F(PipelineTest, AudioTimeUpdateDuringSeek) { |
| 765 CreateAudioStream(); | 768 CreateAudioStream(); |
| 766 MockDemuxerStreamVector streams; | 769 MockDemuxerStreamVector streams; |
| 767 streams.push_back(audio_stream()); | 770 streams.push_back(audio_stream()); |
| 768 | 771 |
| 769 SetDemuxerExpectations(&streams); | 772 SetDemuxerExpectations(&streams); |
| 770 SetAudioRendererExpectations(audio_stream()); | 773 SetAudioRendererExpectations(audio_stream()); |
| 771 StartPipeline(PIPELINE_OK); | 774 StartPipeline(PIPELINE_OK); |
| 772 | 775 |
| 773 float playback_rate = 1.0f; | 776 float playback_rate = 1.0f; |
| 774 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(playback_rate)); | 777 EXPECT_CALL(time_source_, SetPlaybackRate(playback_rate)); |
| 775 pipeline_->SetPlaybackRate(playback_rate); | 778 pipeline_->SetPlaybackRate(playback_rate); |
| 776 message_loop_.RunUntilIdle(); | 779 message_loop_.RunUntilIdle(); |
| 777 | 780 |
| 778 // Provide an initial time update so that the pipeline transitions out of the | 781 // Provide an initial time update so that the pipeline transitions out of the |
| 779 // "waiting for time update" state. | 782 // "waiting for time update" state. |
| 780 audio_time_cb_.Run(base::TimeDelta::FromMilliseconds(100), | 783 audio_time_cb_.Run(base::TimeDelta::FromMilliseconds(100), |
| 781 base::TimeDelta::FromMilliseconds(500)); | 784 base::TimeDelta::FromMilliseconds(500)); |
| 782 | 785 |
| 783 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); | 786 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); |
| 784 | 787 |
| 785 // Arrange to trigger a time update while the demuxer is in the middle of | 788 // Arrange to trigger a time update while the demuxer is in the middle of |
| 786 // seeking. This update should be ignored by the pipeline and the clock should | 789 // seeking. This update should be ignored by the pipeline and the clock should |
| 787 // not get updated. | 790 // not get updated. |
| 788 base::Closure closure = base::Bind(&RunTimeCB, audio_time_cb_, 300, 700); | 791 base::Closure closure = base::Bind(&RunTimeCB, audio_time_cb_, 300, 700); |
| 789 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) | 792 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) |
| 790 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run), | 793 .WillOnce(DoAll(InvokeWithoutArgs(&closure, &base::Closure::Run), |
| 791 RunCallback<1>(PIPELINE_OK))); | 794 RunCallback<1>(PIPELINE_OK))); |
| 792 | 795 |
| 793 EXPECT_CALL(*audio_renderer_, StopRendering()); | 796 EXPECT_CALL(time_source_, StopTicking()); |
| 794 EXPECT_CALL(*audio_renderer_, Flush(_)) | 797 EXPECT_CALL(*audio_renderer_, Flush(_)) |
| 795 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, | 798 .WillOnce(DoAll(SetBufferingState(&audio_buffering_state_cb_, |
| 796 BUFFERING_HAVE_NOTHING), | 799 BUFFERING_HAVE_NOTHING), |
| 797 RunClosure<0>())); | 800 RunClosure<0>())); |
| 798 EXPECT_CALL(*audio_renderer_, SetMediaTime(seek_time)); | 801 EXPECT_CALL(time_source_, SetMediaTime(seek_time)); |
| 802 EXPECT_CALL(time_source_, SetPlaybackRate(_)); |
| 803 EXPECT_CALL(time_source_, StartTicking()); |
| 799 EXPECT_CALL(*audio_renderer_, StartPlaying()) | 804 EXPECT_CALL(*audio_renderer_, StartPlaying()) |
| 800 .WillOnce(SetBufferingState(&audio_buffering_state_cb_, | 805 .WillOnce(SetBufferingState(&audio_buffering_state_cb_, |
| 801 BUFFERING_HAVE_ENOUGH)); | 806 BUFFERING_HAVE_ENOUGH)); |
| 802 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(_)); | |
| 803 EXPECT_CALL(*audio_renderer_, SetVolume(_)); | 807 EXPECT_CALL(*audio_renderer_, SetVolume(_)); |
| 804 EXPECT_CALL(*audio_renderer_, StartRendering()); | |
| 805 | 808 |
| 806 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); | 809 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); |
| 807 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); | 810 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
| 808 DoSeek(seek_time); | 811 DoSeek(seek_time); |
| 809 | 812 |
| 810 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); | 813 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); |
| 811 | 814 |
| 812 // Now that the seek is complete, verify that time updates advance the current | 815 // Now that the seek is complete, verify that time updates advance the current |
| 813 // time. | 816 // time. |
| 814 base::TimeDelta new_time = seek_time + base::TimeDelta::FromMilliseconds(100); | 817 base::TimeDelta new_time = seek_time + base::TimeDelta::FromMilliseconds(100); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 842 MockDemuxerStreamVector streams; | 845 MockDemuxerStreamVector streams; |
| 843 streams.push_back(audio_stream()); | 846 streams.push_back(audio_stream()); |
| 844 streams.push_back(video_stream()); | 847 streams.push_back(video_stream()); |
| 845 | 848 |
| 846 SetDemuxerExpectations(&streams); | 849 SetDemuxerExpectations(&streams); |
| 847 SetAudioRendererExpectations(audio_stream()); | 850 SetAudioRendererExpectations(audio_stream()); |
| 848 SetVideoRendererExpectations(video_stream()); | 851 SetVideoRendererExpectations(video_stream()); |
| 849 StartPipeline(PIPELINE_OK); | 852 StartPipeline(PIPELINE_OK); |
| 850 | 853 |
| 851 // Simulate underflow. | 854 // Simulate underflow. |
| 852 EXPECT_CALL(*audio_renderer_, StopRendering()); | 855 EXPECT_CALL(time_source_, StopTicking()); |
| 853 audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); | 856 audio_buffering_state_cb_.Run(BUFFERING_HAVE_NOTHING); |
| 854 | 857 |
| 855 // Seek while underflowed. We shouldn't call StopRendering() again. | 858 // Seek while underflowed. We shouldn't call StopTicking() again. |
| 856 base::TimeDelta expected = base::TimeDelta::FromSeconds(5); | 859 base::TimeDelta expected = base::TimeDelta::FromSeconds(5); |
| 857 ExpectSeek(expected, true); | 860 ExpectSeek(expected, true); |
| 858 DoSeek(expected); | 861 DoSeek(expected); |
| 859 } | 862 } |
| 860 | 863 |
| 861 class PipelineTeardownTest : public PipelineTest { | 864 class PipelineTeardownTest : public PipelineTest { |
| 862 public: | 865 public: |
| 863 enum TeardownState { | 866 enum TeardownState { |
| 864 kInitDemuxer, | 867 kInitDemuxer, |
| 865 kInitAudioRenderer, | 868 kInitAudioRenderer, |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 989 return status; | 992 return status; |
| 990 } | 993 } |
| 991 | 994 |
| 992 EXPECT_CALL(*video_renderer_, Initialize(_, _, _, _, _, _, _, _, _, _)) | 995 EXPECT_CALL(*video_renderer_, Initialize(_, _, _, _, _, _, _, _, _, _)) |
| 993 .WillOnce(DoAll(SaveArg<5>(&video_buffering_state_cb_), | 996 .WillOnce(DoAll(SaveArg<5>(&video_buffering_state_cb_), |
| 994 RunCallback<2>(PIPELINE_OK))); | 997 RunCallback<2>(PIPELINE_OK))); |
| 995 | 998 |
| 996 EXPECT_CALL(callbacks_, OnMetadata(_)); | 999 EXPECT_CALL(callbacks_, OnMetadata(_)); |
| 997 | 1000 |
| 998 // If we get here it's a successful initialization. | 1001 // If we get here it's a successful initialization. |
| 999 EXPECT_CALL(*audio_renderer_, SetMediaTime(base::TimeDelta())); | 1002 EXPECT_CALL(*audio_renderer_, GetTimeSource()) |
| 1003 .WillOnce(Return(&time_source_)); |
| 1004 EXPECT_CALL(time_source_, SetMediaTime(base::TimeDelta())); |
| 1005 EXPECT_CALL(time_source_, SetPlaybackRate(0.0f)); |
| 1006 EXPECT_CALL(time_source_, StartTicking()); |
| 1007 EXPECT_CALL(*audio_renderer_, SetVolume(1.0f)); |
| 1000 EXPECT_CALL(*audio_renderer_, StartPlaying()) | 1008 EXPECT_CALL(*audio_renderer_, StartPlaying()) |
| 1001 .WillOnce(SetBufferingState(&audio_buffering_state_cb_, | 1009 .WillOnce(SetBufferingState(&audio_buffering_state_cb_, |
| 1002 BUFFERING_HAVE_ENOUGH)); | 1010 BUFFERING_HAVE_ENOUGH)); |
| 1003 EXPECT_CALL(*video_renderer_, StartPlaying()) | 1011 EXPECT_CALL(*video_renderer_, StartPlaying()) |
| 1004 .WillOnce(SetBufferingState(&video_buffering_state_cb_, | 1012 .WillOnce(SetBufferingState(&video_buffering_state_cb_, |
| 1005 BUFFERING_HAVE_ENOUGH)); | 1013 BUFFERING_HAVE_ENOUGH)); |
| 1006 | 1014 |
| 1007 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f)); | |
| 1008 EXPECT_CALL(*audio_renderer_, SetVolume(1.0f)); | |
| 1009 EXPECT_CALL(*audio_renderer_, StartRendering()); | |
| 1010 | |
| 1011 if (status == PIPELINE_OK) | 1015 if (status == PIPELINE_OK) |
| 1012 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); | 1016 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
| 1013 | 1017 |
| 1014 return status; | 1018 return status; |
| 1015 } | 1019 } |
| 1016 | 1020 |
| 1017 void DoSeek(TeardownState state, StopOrError stop_or_error) { | 1021 void DoSeek(TeardownState state, StopOrError stop_or_error) { |
| 1018 InSequence s; | 1022 InSequence s; |
| 1019 PipelineStatus status = SetSeekExpectations(state, stop_or_error); | 1023 PipelineStatus status = SetSeekExpectations(state, stop_or_error); |
| 1020 | 1024 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1031 &CallbackHelper::OnSeek, base::Unretained(&callbacks_))); | 1035 &CallbackHelper::OnSeek, base::Unretained(&callbacks_))); |
| 1032 message_loop_.RunUntilIdle(); | 1036 message_loop_.RunUntilIdle(); |
| 1033 } | 1037 } |
| 1034 | 1038 |
| 1035 PipelineStatus SetSeekExpectations(TeardownState state, | 1039 PipelineStatus SetSeekExpectations(TeardownState state, |
| 1036 StopOrError stop_or_error) { | 1040 StopOrError stop_or_error) { |
| 1037 PipelineStatus status = PIPELINE_OK; | 1041 PipelineStatus status = PIPELINE_OK; |
| 1038 base::Closure stop_cb = base::Bind( | 1042 base::Closure stop_cb = base::Bind( |
| 1039 &CallbackHelper::OnStop, base::Unretained(&callbacks_)); | 1043 &CallbackHelper::OnStop, base::Unretained(&callbacks_)); |
| 1040 | 1044 |
| 1041 EXPECT_CALL(*audio_renderer_, StopRendering()); | 1045 EXPECT_CALL(time_source_, StopTicking()); |
| 1042 | 1046 |
| 1043 if (state == kFlushing) { | 1047 if (state == kFlushing) { |
| 1044 if (stop_or_error == kStop) { | 1048 if (stop_or_error == kStop) { |
| 1045 EXPECT_CALL(*audio_renderer_, Flush(_)) | 1049 EXPECT_CALL(*audio_renderer_, Flush(_)) |
| 1046 .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), | 1050 .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), |
| 1047 SetBufferingState(&audio_buffering_state_cb_, | 1051 SetBufferingState(&audio_buffering_state_cb_, |
| 1048 BUFFERING_HAVE_NOTHING), | 1052 BUFFERING_HAVE_NOTHING), |
| 1049 RunClosure<0>())); | 1053 RunClosure<0>())); |
| 1050 } else { | 1054 } else { |
| 1051 status = PIPELINE_ERROR_READ; | 1055 status = PIPELINE_ERROR_READ; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1134 INSTANTIATE_TEARDOWN_TEST(Error, InitDemuxer); | 1138 INSTANTIATE_TEARDOWN_TEST(Error, InitDemuxer); |
| 1135 INSTANTIATE_TEARDOWN_TEST(Error, InitAudioRenderer); | 1139 INSTANTIATE_TEARDOWN_TEST(Error, InitAudioRenderer); |
| 1136 INSTANTIATE_TEARDOWN_TEST(Error, InitVideoRenderer); | 1140 INSTANTIATE_TEARDOWN_TEST(Error, InitVideoRenderer); |
| 1137 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); | 1141 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); |
| 1138 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); | 1142 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); |
| 1139 INSTANTIATE_TEARDOWN_TEST(Error, Playing); | 1143 INSTANTIATE_TEARDOWN_TEST(Error, Playing); |
| 1140 | 1144 |
| 1141 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); | 1145 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); |
| 1142 | 1146 |
| 1143 } // namespace media | 1147 } // namespace media |
| OLD | NEW |