Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Side by Side Diff: media/base/pipeline_unittest.cc

Issue 10831214: Fix Pipeline to properly handle errors during initialization. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« media/base/pipeline.cc ('K') | « media/base/pipeline.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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.h" 8 #include "base/message_loop.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/threading/simple_thread.h" 10 #include "base/threading/simple_thread.h"
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 message_loop_.RunAllPending(); 124 message_loop_.RunAllPending();
125 125
126 pipeline_ = NULL; 126 pipeline_ = NULL;
127 mocks_.reset(); 127 mocks_.reset();
128 } 128 }
129 129
130 protected: 130 protected:
131 // Sets up expectations to allow the demuxer to initialize. 131 // Sets up expectations to allow the demuxer to initialize.
132 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; 132 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector;
133 void InitializeDemuxer(MockDemuxerStreamVector* streams, 133 void InitializeDemuxer(MockDemuxerStreamVector* streams,
134 const base::TimeDelta& duration) { 134 const base::TimeDelta& duration,
135 bool expect_set_playback_rate) {
135 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _)) 136 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
136 .WillOnce(DoAll(SetDemuxerProperties(duration), 137 .WillOnce(DoAll(SetDemuxerProperties(duration),
137 RunPipelineStatusCB1())); 138 RunPipelineStatusCB1()));
138 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f)); 139 if (expect_set_playback_rate)
scherkus (not reviewing) 2012/08/08 21:15:02 instead of a bool, can this block can get moves to
acolwell GONE FROM CHROMIUM 2012/08/08 21:40:59 Yes it can. Done.
140 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f));
139 141
140 // Configure the demuxer to return the streams. 142 // Configure the demuxer to return the streams.
141 for (size_t i = 0; i < streams->size(); ++i) { 143 for (size_t i = 0; i < streams->size(); ++i) {
142 scoped_refptr<DemuxerStream> stream((*streams)[i]); 144 scoped_refptr<DemuxerStream> stream((*streams)[i]);
143 EXPECT_CALL(*mocks_->demuxer(), GetStream(stream->type())) 145 EXPECT_CALL(*mocks_->demuxer(), GetStream(stream->type()))
144 .WillRepeatedly(Return(stream)); 146 .WillRepeatedly(Return(stream));
145 } 147 }
146 } 148 }
147 149
148 void InitializeDemuxer(MockDemuxerStreamVector* streams) { 150 void InitializeDemuxer(MockDemuxerStreamVector* streams) {
149 // Initialize with a default non-zero duration. 151 // Initialize with a default non-zero duration.
150 InitializeDemuxer(streams, base::TimeDelta::FromSeconds(10)); 152 InitializeDemuxer(streams, base::TimeDelta::FromSeconds(10), true);
153 }
154
155 void InitializeDemuxer(MockDemuxerStreamVector* streams,
156 bool expect_set_playback_rate) {
157 // Initialize with a default non-zero duration.
158 InitializeDemuxer(streams, base::TimeDelta::FromSeconds(10),
159 expect_set_playback_rate);
151 } 160 }
152 161
153 StrictMock<MockDemuxerStream>* CreateStream(DemuxerStream::Type type) { 162 StrictMock<MockDemuxerStream>* CreateStream(DemuxerStream::Type type) {
154 StrictMock<MockDemuxerStream>* stream = 163 StrictMock<MockDemuxerStream>* stream =
155 new StrictMock<MockDemuxerStream>(); 164 new StrictMock<MockDemuxerStream>();
156 EXPECT_CALL(*stream, type()) 165 EXPECT_CALL(*stream, type())
157 .WillRepeatedly(Return(type)); 166 .WillRepeatedly(Return(type));
158 return stream; 167 return stream;
159 } 168 }
160 169
(...skipping 20 matching lines...) Expand all
181 190
182 // Startup sequence. 191 // Startup sequence.
183 EXPECT_CALL(*mocks_->video_renderer(), 192 EXPECT_CALL(*mocks_->video_renderer(),
184 Preroll(mocks_->demuxer()->GetStartTime(), _)) 193 Preroll(mocks_->demuxer()->GetStartTime(), _))
185 .WillOnce(RunPipelineStatusCB1()); 194 .WillOnce(RunPipelineStatusCB1());
186 EXPECT_CALL(*mocks_->video_renderer(), Play(_)) 195 EXPECT_CALL(*mocks_->video_renderer(), Play(_))
187 .WillOnce(RunClosure()); 196 .WillOnce(RunClosure());
188 } 197 }
189 198
190 // Sets up expectations to allow the audio renderer to initialize. 199 // Sets up expectations to allow the audio renderer to initialize.
191 void InitializeAudioRenderer(bool disable_after_init_cb = false) { 200 void InitializeAudioRenderer() {
201 InitializeAudioRenderer(false, true);
202 }
203
204 void InitializeAudioRenderer(bool disable_after_init_cb,
205 bool expect_to_play) {
192 if (disable_after_init_cb) { 206 if (disable_after_init_cb) {
193 EXPECT_CALL(*mocks_->audio_renderer(), Initialize( 207 EXPECT_CALL(*mocks_->audio_renderer(), Initialize(
194 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()), 208 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()),
195 _, _, _, _, _, _)) 209 _, _, _, _, _, _))
196 .WillOnce(DoAll(RunPipelineStatusCB1(), 210 .WillOnce(DoAll(RunPipelineStatusCB1(),
197 WithArg<5>(RunClosure()))); // |disabled_cb|. 211 WithArg<5>(RunClosure()))); // |disabled_cb|.
198 } else { 212 } else {
199 EXPECT_CALL(*mocks_->audio_renderer(), Initialize( 213 EXPECT_CALL(*mocks_->audio_renderer(), Initialize(
200 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()), 214 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()),
201 _, _, _, _, _, _)) 215 _, _, _, _, _, _))
202 .WillOnce(DoAll(SaveArg<3>(&audio_time_cb_), 216 .WillOnce(DoAll(SaveArg<3>(&audio_time_cb_),
203 RunPipelineStatusCB1())); 217 RunPipelineStatusCB1()));
204 } 218 }
205 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f));
206 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f));
207 219
208 // Startup sequence. 220 if (expect_to_play) {
209 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _)) 221 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(0.0f));
scherkus (not reviewing) 2012/08/08 21:15:02 ditto (move to InitializePipeline when start_statu
acolwell GONE FROM CHROMIUM 2012/08/08 21:40:59 Done.
210 .WillOnce(RunPipelineStatusCB1()); 222 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(1.0f));
211 EXPECT_CALL(*mocks_->audio_renderer(), Play(_)) 223
212 .WillOnce(RunClosure()); 224 // Startup sequence.
225 EXPECT_CALL(*mocks_->audio_renderer(), Preroll(base::TimeDelta(), _))
226 .WillOnce(RunPipelineStatusCB1());
227 EXPECT_CALL(*mocks_->audio_renderer(), Play(_))
228 .WillOnce(RunClosure());
229 }
213 } 230 }
214 231
215 // Sets up expectations on the callback and initializes the pipeline. Called 232 // Sets up expectations on the callback and initializes the pipeline. Called
216 // after tests have set expectations any filters they wish to use. 233 // after tests have set expectations any filters they wish to use.
217 void InitializePipeline(PipelineStatus start_status) { 234 void InitializePipeline(PipelineStatus start_status) {
218 EXPECT_CALL(callbacks_, OnStart(start_status)); 235 EXPECT_CALL(callbacks_, OnStart(start_status));
219 236
220 pipeline_->Start( 237 pipeline_->Start(
221 mocks_->Create().Pass(), 238 mocks_->Create().Pass(),
222 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), 239 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 EXPECT_TRUE(pipeline_->HasVideo()); 459 EXPECT_TRUE(pipeline_->HasVideo());
443 } 460 }
444 461
445 TEST_F(PipelineTest, Seek) { 462 TEST_F(PipelineTest, Seek) {
446 CreateAudioStream(); 463 CreateAudioStream();
447 CreateVideoStream(); 464 CreateVideoStream();
448 MockDemuxerStreamVector streams; 465 MockDemuxerStreamVector streams;
449 streams.push_back(audio_stream()); 466 streams.push_back(audio_stream());
450 streams.push_back(video_stream()); 467 streams.push_back(video_stream());
451 468
452 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); 469 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000), true);
453 InitializeAudioDecoder(audio_stream()); 470 InitializeAudioDecoder(audio_stream());
454 InitializeAudioRenderer(); 471 InitializeAudioRenderer();
455 InitializeVideoDecoder(video_stream()); 472 InitializeVideoDecoder(video_stream());
456 InitializeVideoRenderer(); 473 InitializeVideoRenderer();
457 474
458 // Initialize then seek! 475 // Initialize then seek!
459 InitializePipeline(PIPELINE_OK); 476 InitializePipeline(PIPELINE_OK);
460 477
461 // Every filter should receive a call to Seek(). 478 // Every filter should receive a call to Seek().
462 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); 479 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000);
(...skipping 18 matching lines...) Expand all
481 InitializePipeline(PIPELINE_OK); 498 InitializePipeline(PIPELINE_OK);
482 pipeline_->SetVolume(expected); 499 pipeline_->SetVolume(expected);
483 } 500 }
484 501
485 TEST_F(PipelineTest, Properties) { 502 TEST_F(PipelineTest, Properties) {
486 CreateVideoStream(); 503 CreateVideoStream();
487 MockDemuxerStreamVector streams; 504 MockDemuxerStreamVector streams;
488 streams.push_back(video_stream()); 505 streams.push_back(video_stream());
489 506
490 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); 507 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100);
491 InitializeDemuxer(&streams, kDuration); 508 InitializeDemuxer(&streams, kDuration, true);
492 InitializeVideoDecoder(video_stream()); 509 InitializeVideoDecoder(video_stream());
493 InitializeVideoRenderer(); 510 InitializeVideoRenderer();
494 511
495 InitializePipeline(PIPELINE_OK); 512 InitializePipeline(PIPELINE_OK);
496 EXPECT_TRUE(pipeline_->IsInitialized()); 513 EXPECT_TRUE(pipeline_->IsInitialized());
497 EXPECT_EQ(kDuration.ToInternalValue(), 514 EXPECT_EQ(kDuration.ToInternalValue(),
498 pipeline_->GetMediaDuration().ToInternalValue()); 515 pipeline_->GetMediaDuration().ToInternalValue());
499 EXPECT_EQ(kTotalBytes, pipeline_->GetTotalBytes()); 516 EXPECT_EQ(kTotalBytes, pipeline_->GetTotalBytes());
500 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 517 EXPECT_FALSE(pipeline_->DidLoadingProgress());
501 } 518 }
502 519
503 TEST_F(PipelineTest, GetBufferedTimeRanges) { 520 TEST_F(PipelineTest, GetBufferedTimeRanges) {
504 CreateVideoStream(); 521 CreateVideoStream();
505 MockDemuxerStreamVector streams; 522 MockDemuxerStreamVector streams;
506 streams.push_back(video_stream()); 523 streams.push_back(video_stream());
507 524
508 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); 525 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100);
509 InitializeDemuxer(&streams, kDuration); 526 InitializeDemuxer(&streams, kDuration, true);
510 InitializeVideoDecoder(video_stream()); 527 InitializeVideoDecoder(video_stream());
511 InitializeVideoRenderer(); 528 InitializeVideoRenderer();
512 529
513 InitializePipeline(PIPELINE_OK); 530 InitializePipeline(PIPELINE_OK);
514 EXPECT_TRUE(pipeline_->IsInitialized()); 531 EXPECT_TRUE(pipeline_->IsInitialized());
515 532
516 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size()); 533 EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size());
517 534
518 EXPECT_FALSE(pipeline_->DidLoadingProgress()); 535 EXPECT_FALSE(pipeline_->DidLoadingProgress());
519 pipeline_->AddBufferedByteRange(0, kTotalBytes / 8); 536 pipeline_->AddBufferedByteRange(0, kTotalBytes / 8);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 600
584 TEST_F(PipelineTest, DisableAudioRendererDuringInit) { 601 TEST_F(PipelineTest, DisableAudioRendererDuringInit) {
585 CreateAudioStream(); 602 CreateAudioStream();
586 CreateVideoStream(); 603 CreateVideoStream();
587 MockDemuxerStreamVector streams; 604 MockDemuxerStreamVector streams;
588 streams.push_back(audio_stream()); 605 streams.push_back(audio_stream());
589 streams.push_back(video_stream()); 606 streams.push_back(video_stream());
590 607
591 InitializeDemuxer(&streams); 608 InitializeDemuxer(&streams);
592 InitializeAudioDecoder(audio_stream()); 609 InitializeAudioDecoder(audio_stream());
593 InitializeAudioRenderer(true); 610 InitializeAudioRenderer(true, true);
594 InitializeVideoDecoder(video_stream()); 611 InitializeVideoDecoder(video_stream());
595 InitializeVideoRenderer(); 612 InitializeVideoRenderer();
596 613
597 EXPECT_CALL(*mocks_->demuxer(), 614 EXPECT_CALL(*mocks_->demuxer(),
598 OnAudioRendererDisabled()); 615 OnAudioRendererDisabled());
599 616
600 InitializePipeline(PIPELINE_OK); 617 InitializePipeline(PIPELINE_OK);
601 EXPECT_TRUE(pipeline_->IsInitialized()); 618 EXPECT_TRUE(pipeline_->IsInitialized());
602 EXPECT_FALSE(pipeline_->HasAudio()); 619 EXPECT_FALSE(pipeline_->HasAudio());
603 EXPECT_TRUE(pipeline_->HasVideo()); 620 EXPECT_TRUE(pipeline_->HasVideo());
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 CreateAudioStream(); 672 CreateAudioStream();
656 CreateVideoStream(); 673 CreateVideoStream();
657 MockDemuxerStreamVector streams; 674 MockDemuxerStreamVector streams;
658 streams.push_back(audio_stream()); 675 streams.push_back(audio_stream());
659 streams.push_back(video_stream()); 676 streams.push_back(video_stream());
660 677
661 // Replace the clock so we can simulate wallclock time advancing w/o using 678 // Replace the clock so we can simulate wallclock time advancing w/o using
662 // Sleep(). 679 // Sleep().
663 pipeline_->SetClockForTesting(new Clock(&StaticClockFunction)); 680 pipeline_->SetClockForTesting(new Clock(&StaticClockFunction));
664 681
665 InitializeDemuxer(&streams, duration); 682 InitializeDemuxer(&streams, duration, true);
666 InitializeAudioDecoder(audio_stream()); 683 InitializeAudioDecoder(audio_stream());
667 InitializeAudioRenderer(); 684 InitializeAudioRenderer();
668 InitializeVideoDecoder(video_stream()); 685 InitializeVideoDecoder(video_stream());
669 InitializeVideoRenderer(); 686 InitializeVideoRenderer();
670 InitializePipeline(PIPELINE_OK); 687 InitializePipeline(PIPELINE_OK);
671 688
672 EXPECT_EQ(0, pipeline_->GetMediaTime().ToInternalValue()); 689 EXPECT_EQ(0, pipeline_->GetMediaTime().ToInternalValue());
673 690
674 float playback_rate = 1.0f; 691 float playback_rate = 1.0f;
675 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate)); 692 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate));
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 .WillOnce(Return(true)); 725 .WillOnce(Return(true));
709 EXPECT_CALL(callbacks_, OnEnded(PIPELINE_OK)); 726 EXPECT_CALL(callbacks_, OnEnded(PIPELINE_OK));
710 pipeline_->OnRendererEnded(); 727 pipeline_->OnRendererEnded();
711 } 728 }
712 729
713 TEST_F(PipelineTest, ErrorDuringSeek) { 730 TEST_F(PipelineTest, ErrorDuringSeek) {
714 CreateAudioStream(); 731 CreateAudioStream();
715 MockDemuxerStreamVector streams; 732 MockDemuxerStreamVector streams;
716 streams.push_back(audio_stream()); 733 streams.push_back(audio_stream());
717 734
718 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(10)); 735 InitializeDemuxer(&streams);
719 InitializeAudioDecoder(audio_stream()); 736 InitializeAudioDecoder(audio_stream());
720 InitializeAudioRenderer(); 737 InitializeAudioRenderer();
721 InitializePipeline(PIPELINE_OK); 738 InitializePipeline(PIPELINE_OK);
722 739
723 float playback_rate = 1.0f; 740 float playback_rate = 1.0f;
724 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate)); 741 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate));
725 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate)); 742 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate));
726 pipeline_->SetPlaybackRate(playback_rate); 743 pipeline_->SetPlaybackRate(playback_rate);
727 message_loop_.RunAllPending(); 744 message_loop_.RunAllPending();
728 745
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 781
765 // No additional tasks should be queued as a result of these calls. 782 // No additional tasks should be queued as a result of these calls.
766 message_loop->AssertIdle(); 783 message_loop->AssertIdle();
767 } 784 }
768 785
769 TEST_F(PipelineTest, NoMessageDuringTearDownFromError) { 786 TEST_F(PipelineTest, NoMessageDuringTearDownFromError) {
770 CreateAudioStream(); 787 CreateAudioStream();
771 MockDemuxerStreamVector streams; 788 MockDemuxerStreamVector streams;
772 streams.push_back(audio_stream()); 789 streams.push_back(audio_stream());
773 790
774 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(10)); 791 InitializeDemuxer(&streams);
775 InitializeAudioDecoder(audio_stream()); 792 InitializeAudioDecoder(audio_stream());
776 InitializeAudioRenderer(); 793 InitializeAudioRenderer();
777 InitializePipeline(PIPELINE_OK); 794 InitializePipeline(PIPELINE_OK);
778 795
779 // Trigger additional requests on the pipeline during tear down from error. 796 // Trigger additional requests on the pipeline during tear down from error.
780 base::Callback<void(PipelineStatus)> cb = base::Bind( 797 base::Callback<void(PipelineStatus)> cb = base::Bind(
781 &TestNoCallsAfterError, pipeline_, &message_loop_); 798 &TestNoCallsAfterError, pipeline_, &message_loop_);
782 ON_CALL(callbacks_, OnError(_)) 799 ON_CALL(callbacks_, OnError(_))
783 .WillByDefault(Invoke(&cb, &base::Callback<void(PipelineStatus)>::Run)); 800 .WillByDefault(Invoke(&cb, &base::Callback<void(PipelineStatus)>::Run));
784 801
(...skipping 17 matching lines...) Expand all
802 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); 819 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
803 message_loop_.RunAllPending(); 820 message_loop_.RunAllPending();
804 } 821 }
805 822
806 TEST_F(PipelineTest, StartTimeIsZero) { 823 TEST_F(PipelineTest, StartTimeIsZero) {
807 CreateVideoStream(); 824 CreateVideoStream();
808 MockDemuxerStreamVector streams; 825 MockDemuxerStreamVector streams;
809 streams.push_back(video_stream()); 826 streams.push_back(video_stream());
810 827
811 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); 828 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100);
812 InitializeDemuxer(&streams, kDuration); 829 InitializeDemuxer(&streams, kDuration, true);
813 InitializeVideoDecoder(video_stream()); 830 InitializeVideoDecoder(video_stream());
814 InitializeVideoRenderer(); 831 InitializeVideoRenderer();
815 832
816 InitializePipeline(PIPELINE_OK); 833 InitializePipeline(PIPELINE_OK);
817 EXPECT_TRUE(pipeline_->IsInitialized()); 834 EXPECT_TRUE(pipeline_->IsInitialized());
818 EXPECT_FALSE(pipeline_->HasAudio()); 835 EXPECT_FALSE(pipeline_->HasAudio());
819 EXPECT_TRUE(pipeline_->HasVideo()); 836 EXPECT_TRUE(pipeline_->HasVideo());
820 837
821 EXPECT_EQ(base::TimeDelta(), pipeline_->GetMediaTime()); 838 EXPECT_EQ(base::TimeDelta(), pipeline_->GetMediaTime());
822 } 839 }
823 840
824 TEST_F(PipelineTest, StartTimeIsNonZero) { 841 TEST_F(PipelineTest, StartTimeIsNonZero) {
825 const base::TimeDelta kStartTime = base::TimeDelta::FromSeconds(4); 842 const base::TimeDelta kStartTime = base::TimeDelta::FromSeconds(4);
826 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); 843 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100);
827 844
828 EXPECT_CALL(*mocks_->demuxer(), GetStartTime()) 845 EXPECT_CALL(*mocks_->demuxer(), GetStartTime())
829 .WillRepeatedly(Return(kStartTime)); 846 .WillRepeatedly(Return(kStartTime));
830 847
831 CreateVideoStream(); 848 CreateVideoStream();
832 MockDemuxerStreamVector streams; 849 MockDemuxerStreamVector streams;
833 streams.push_back(video_stream()); 850 streams.push_back(video_stream());
834 851
835 InitializeDemuxer(&streams, kDuration); 852 InitializeDemuxer(&streams, kDuration, true);
836 InitializeVideoDecoder(video_stream()); 853 InitializeVideoDecoder(video_stream());
837 InitializeVideoRenderer(); 854 InitializeVideoRenderer();
838 855
839 InitializePipeline(PIPELINE_OK); 856 InitializePipeline(PIPELINE_OK);
840 EXPECT_TRUE(pipeline_->IsInitialized()); 857 EXPECT_TRUE(pipeline_->IsInitialized());
841 EXPECT_FALSE(pipeline_->HasAudio()); 858 EXPECT_FALSE(pipeline_->HasAudio());
842 EXPECT_TRUE(pipeline_->HasVideo()); 859 EXPECT_TRUE(pipeline_->HasVideo());
843 860
844 EXPECT_EQ(kStartTime, pipeline_->GetMediaTime()); 861 EXPECT_EQ(kStartTime, pipeline_->GetMediaTime());
845 } 862 }
846 863
847 static void RunTimeCB(const AudioRenderer::TimeCB& time_cb, 864 static void RunTimeCB(const AudioRenderer::TimeCB& time_cb,
848 int time_in_ms, 865 int time_in_ms,
849 int max_time_in_ms) { 866 int max_time_in_ms) {
850 time_cb.Run(base::TimeDelta::FromMilliseconds(time_in_ms), 867 time_cb.Run(base::TimeDelta::FromMilliseconds(time_in_ms),
851 base::TimeDelta::FromMilliseconds(max_time_in_ms)); 868 base::TimeDelta::FromMilliseconds(max_time_in_ms));
852 } 869 }
853 870
854 TEST_F(PipelineTest, AudioTimeUpdateDuringSeek) { 871 TEST_F(PipelineTest, AudioTimeUpdateDuringSeek) {
855 CreateAudioStream(); 872 CreateAudioStream();
856 MockDemuxerStreamVector streams; 873 MockDemuxerStreamVector streams;
857 streams.push_back(audio_stream()); 874 streams.push_back(audio_stream());
858 875
859 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(10)); 876 InitializeDemuxer(&streams);
860 InitializeAudioDecoder(audio_stream()); 877 InitializeAudioDecoder(audio_stream());
861 InitializeAudioRenderer(); 878 InitializeAudioRenderer();
862 InitializePipeline(PIPELINE_OK); 879 InitializePipeline(PIPELINE_OK);
863 880
864 float playback_rate = 1.0f; 881 float playback_rate = 1.0f;
865 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate)); 882 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(playback_rate));
866 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate)); 883 EXPECT_CALL(*mocks_->audio_renderer(), SetPlaybackRate(playback_rate));
867 pipeline_->SetPlaybackRate(playback_rate); 884 pipeline_->SetPlaybackRate(playback_rate);
868 message_loop_.RunAllPending(); 885 message_loop_.RunAllPending();
869 886
(...skipping 27 matching lines...) Expand all
897 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time); 914 EXPECT_EQ(pipeline_->GetMediaTime(), seek_time);
898 915
899 // Now that the seek is complete, verify that time updates advance the current 916 // Now that the seek is complete, verify that time updates advance the current
900 // time. 917 // time.
901 base::TimeDelta new_time = seek_time + base::TimeDelta::FromMilliseconds(100); 918 base::TimeDelta new_time = seek_time + base::TimeDelta::FromMilliseconds(100);
902 audio_time_cb_.Run(new_time, new_time); 919 audio_time_cb_.Run(new_time, new_time);
903 920
904 EXPECT_EQ(pipeline_->GetMediaTime(), new_time); 921 EXPECT_EQ(pipeline_->GetMediaTime(), new_time);
905 } 922 }
906 923
924 TEST_F(PipelineTest, InitFailure_Demuxer) {
925 PipelineStatus expected_status = DEMUXER_ERROR_COULD_NOT_OPEN;
926 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
927 .WillOnce(RunPipelineStatusCB1WithStatus(expected_status));
928 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
929 .WillOnce(RunClosure());
930 InitializePipeline(expected_status);
931 EXPECT_FALSE(pipeline_->IsInitialized());
932 }
933
934 TEST_F(PipelineTest, InitFailure_AudioDecoder) {
935 CreateAudioStream();
936 MockDemuxerStreamVector streams;
937 streams.push_back(audio_stream());
938
939 InitializeDemuxer(&streams, false);
940
941 PipelineStatus expected_status = PIPELINE_ERROR_DECODE;
942 scoped_refptr<DemuxerStream> stream = streams[0];
943 EXPECT_CALL(*mocks_->audio_decoder(), Initialize(stream, _, _))
944 .WillOnce(RunPipelineStatusCB1WithStatus(expected_status));
945
946 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
947 .WillOnce(RunClosure());
948
949 InitializePipeline(expected_status);
950 EXPECT_FALSE(pipeline_->IsInitialized());
951 EXPECT_FALSE(pipeline_->HasAudio());
952 }
953
954 TEST_F(PipelineTest, InitFailure_AudioRenderer) {
955 CreateAudioStream();
956 MockDemuxerStreamVector streams;
957 streams.push_back(audio_stream());
958
959 InitializeDemuxer(&streams, false);
960 InitializeAudioDecoder(audio_stream());
961
962 PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED;
963 EXPECT_CALL(*mocks_->audio_renderer(), Initialize(
964 scoped_refptr<AudioDecoder>(mocks_->audio_decoder()),
965 _, _, _, _, _, _))
966 .WillOnce(RunPipelineStatusCB1WithStatus(expected_status));
967
968 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
969 .WillOnce(RunClosure());
970 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
971 .WillOnce(RunClosure());
972
973 InitializePipeline(expected_status);
974 EXPECT_FALSE(pipeline_->IsInitialized());
975 EXPECT_TRUE(pipeline_->HasAudio());
976 }
977
978 TEST_F(PipelineTest, InitFailure_VideoDecoder) {
979 CreateAudioStream();
980 CreateVideoStream();
981 MockDemuxerStreamVector streams;
982 streams.push_back(audio_stream());
983 streams.push_back(video_stream());
984
985 InitializeDemuxer(&streams, false);
986 InitializeAudioDecoder(audio_stream());
987 InitializeAudioRenderer(false, false);
988
989 PipelineStatus expected_status = PIPELINE_ERROR_DECODE;
990 scoped_refptr<DemuxerStream> stream = streams[1];
991 EXPECT_CALL(*mocks_->video_decoder(),
992 Initialize(stream, _, _))
993 .WillOnce(RunPipelineStatusCB1WithStatus(expected_status));
994
995 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
996 .WillOnce(RunClosure());
997 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
998 .WillOnce(RunClosure());
999
1000 InitializePipeline(expected_status);
1001 EXPECT_FALSE(pipeline_->IsInitialized());
1002 EXPECT_TRUE(pipeline_->HasAudio());
1003 EXPECT_FALSE(pipeline_->HasVideo());
1004 }
1005
scherkus (not reviewing) 2012/08/08 21:15:02 remove extra blank line
acolwell GONE FROM CHROMIUM 2012/08/08 21:40:59 Done.
1006
1007 TEST_F(PipelineTest, InitFailure_VideoRenderer) {
1008 CreateAudioStream();
1009 CreateVideoStream();
1010 MockDemuxerStreamVector streams;
1011 streams.push_back(audio_stream());
1012 streams.push_back(video_stream());
1013
1014 InitializeDemuxer(&streams, false);
1015 InitializeAudioDecoder(audio_stream());
1016 InitializeAudioRenderer(false, false);
1017 InitializeVideoDecoder(video_stream());
1018
1019 PipelineStatus expected_status = PIPELINE_ERROR_INITIALIZATION_FAILED;
1020 EXPECT_CALL(*mocks_->video_renderer(), Initialize(
1021 scoped_refptr<VideoDecoder>(mocks_->video_decoder()),
1022 _, _, _, _, _, _, _, _))
1023 .WillOnce(RunPipelineStatusCB1WithStatus(expected_status));
1024
1025 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
1026 .WillOnce(RunClosure());
1027 EXPECT_CALL(*mocks_->audio_renderer(), Stop(_))
1028 .WillOnce(RunClosure());
1029 EXPECT_CALL(*mocks_->video_renderer(), Stop(_))
1030 .WillOnce(RunClosure());
1031
1032 InitializePipeline(expected_status);
1033 EXPECT_FALSE(pipeline_->IsInitialized());
1034 EXPECT_TRUE(pipeline_->HasAudio());
1035 EXPECT_TRUE(pipeline_->HasVideo());
1036 }
1037
907 class FlexibleCallbackRunner : public base::DelegateSimpleThread::Delegate { 1038 class FlexibleCallbackRunner : public base::DelegateSimpleThread::Delegate {
908 public: 1039 public:
909 FlexibleCallbackRunner(base::TimeDelta delay, PipelineStatus status, 1040 FlexibleCallbackRunner(base::TimeDelta delay, PipelineStatus status,
910 const PipelineStatusCB& status_cb) 1041 const PipelineStatusCB& status_cb)
911 : delay_(delay), 1042 : delay_(delay),
912 status_(status), 1043 status_(status),
913 status_cb_(status_cb) { 1044 status_cb_(status_cb) {
914 if (delay_ < base::TimeDelta()) { 1045 if (delay_ < base::TimeDelta()) {
915 status_cb_.Run(status_); 1046 status_cb_.Run(status_);
916 return; 1047 return;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(0)); 1082 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(0));
952 } 1083 }
953 1084
954 // Test that different-thread, some-delay callback (the expected common case) 1085 // Test that different-thread, some-delay callback (the expected common case)
955 // works correctly. 1086 // works correctly.
956 TEST(PipelineStatusNotificationTest, DelayedCallback) { 1087 TEST(PipelineStatusNotificationTest, DelayedCallback) {
957 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20)); 1088 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20));
958 } 1089 }
959 1090
960 } // namespace media 1091 } // namespace media
OLDNEW
« media/base/pipeline.cc ('K') | « media/base/pipeline.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698