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

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

Issue 9968117: Move Demuxer::set_host() to Initialize(). (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: fixes Created 8 years, 8 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
« no previous file with comments | « media/base/pipeline.cc ('k') | media/filters/chunk_demuxer.h » ('j') | 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 <string> 5 #include <string>
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"
11 #include "media/base/clock.h" 11 #include "media/base/clock.h"
12 #include "media/base/filter_host.h" 12 #include "media/base/filter_host.h"
13 #include "media/base/filters.h" 13 #include "media/base/filters.h"
14 #include "media/base/media_log.h" 14 #include "media/base/media_log.h"
15 #include "media/base/pipeline.h" 15 #include "media/base/pipeline.h"
16 #include "media/base/mock_callback.h" 16 #include "media/base/mock_callback.h"
17 #include "media/base/mock_filters.h" 17 #include "media/base/mock_filters.h"
18 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
19 #include "ui/gfx/size.h" 19 #include "ui/gfx/size.h"
20 20
21 using ::testing::_; 21 using ::testing::_;
22 using ::testing::DeleteArg; 22 using ::testing::DeleteArg;
23 using ::testing::DoAll;
23 using ::testing::InSequence; 24 using ::testing::InSequence;
24 using ::testing::Invoke; 25 using ::testing::Invoke;
25 using ::testing::InvokeArgument;
26 using ::testing::Mock; 26 using ::testing::Mock;
27 using ::testing::NotNull; 27 using ::testing::NotNull;
28 using ::testing::Return; 28 using ::testing::Return;
29 using ::testing::ReturnRef; 29 using ::testing::ReturnRef;
30 using ::testing::StrictMock; 30 using ::testing::StrictMock;
31 using ::testing::WithArg; 31 using ::testing::WithArg;
32 32
33 namespace media { 33 namespace media {
34 34
35 // Total bytes of the data source. 35 // Demuxer properties.
36 static const int kTotalBytes = 1024; 36 static const int kTotalBytes = 1024;
37 static const int kBufferedBytes = 1024;
38 static const int kBitrate = 1234;
39 static const bool kLocalSource = false;
40 static const bool kSeekable = true;
37 41
38 // Buffered bytes of the data source. 42 ACTION_P(InitializeDemuxerWithError, error) {
39 static const int kBufferedBytes = 1024; 43 arg1.Run(error);
44 }
45
46 ACTION_P(SetDemuxerProperties, duration) {
47 arg0->SetTotalBytes(kTotalBytes);
48 arg0->SetBufferedBytes(kBufferedBytes);
49 arg0->SetDuration(duration);
50 }
40 51
41 // Used for setting expectations on pipeline callbacks. Using a StrictMock 52 // Used for setting expectations on pipeline callbacks. Using a StrictMock
42 // also lets us test for missing callbacks. 53 // also lets us test for missing callbacks.
43 class CallbackHelper { 54 class CallbackHelper {
44 public: 55 public:
45 CallbackHelper() {} 56 CallbackHelper() {}
46 virtual ~CallbackHelper() {} 57 virtual ~CallbackHelper() {}
47 58
48 MOCK_METHOD1(OnStart, void(PipelineStatus)); 59 MOCK_METHOD1(OnStart, void(PipelineStatus));
49 MOCK_METHOD1(OnSeek, void(PipelineStatus)); 60 MOCK_METHOD1(OnSeek, void(PipelineStatus));
(...skipping 10 matching lines...) Expand all
60 // is executed on |message_loop_| and the mock filters instantly call 71 // is executed on |message_loop_| and the mock filters instantly call
61 // InitializationComplete(), which keeps the pipeline humming along. If 72 // InitializationComplete(), which keeps the pipeline humming along. If
62 // either filters don't call InitializationComplete() immediately or filter 73 // either filters don't call InitializationComplete() immediately or filter
63 // initialization is moved to a separate thread this test will become flaky. 74 // initialization is moved to a separate thread this test will become flaky.
64 class PipelineTest : public ::testing::Test { 75 class PipelineTest : public ::testing::Test {
65 public: 76 public:
66 PipelineTest() 77 PipelineTest()
67 : pipeline_(new Pipeline(&message_loop_, new MediaLog())) { 78 : pipeline_(new Pipeline(&message_loop_, new MediaLog())) {
68 mocks_.reset(new MockFilterCollection()); 79 mocks_.reset(new MockFilterCollection());
69 80
70 // InitializeDemuxer adds overriding expectations for expected non-NULL 81 // InitializeDemuxer() adds overriding expectations for expected non-NULL
71 // streams. 82 // streams.
72 DemuxerStream* null_pointer = NULL; 83 DemuxerStream* null_pointer = NULL;
73 EXPECT_CALL(*mocks_->demuxer(), GetStream(_)) 84 EXPECT_CALL(*mocks_->demuxer(), GetStream(_))
74 .WillRepeatedly(Return(null_pointer)); 85 .WillRepeatedly(Return(null_pointer));
75 86
76 EXPECT_CALL(*mocks_->demuxer(), GetStartTime()) 87 EXPECT_CALL(*mocks_->demuxer(), GetStartTime())
77 .WillRepeatedly(Return(base::TimeDelta())); 88 .WillRepeatedly(Return(base::TimeDelta()));
78 } 89 }
79 90
80 virtual ~PipelineTest() { 91 virtual ~PipelineTest() {
81 if (!pipeline_->IsRunning()) { 92 if (!pipeline_->IsRunning()) {
82 return; 93 return;
83 } 94 }
84 95
85 // Expect a stop callback if we were started. 96 // Expect a stop callback if we were started.
86 EXPECT_CALL(callbacks_, OnStop()); 97 EXPECT_CALL(callbacks_, OnStop());
87 pipeline_->Stop(base::Bind(&CallbackHelper::OnStop, 98 pipeline_->Stop(base::Bind(&CallbackHelper::OnStop,
88 base::Unretained(&callbacks_))); 99 base::Unretained(&callbacks_)));
89 message_loop_.RunAllPending(); 100 message_loop_.RunAllPending();
90 101
91 pipeline_ = NULL; 102 pipeline_ = NULL;
92 mocks_.reset(); 103 mocks_.reset();
93 } 104 }
94 105
95 protected: 106 protected:
96 // Sets up expectations to allow the demuxer to initialize. 107 // Sets up expectations to allow the demuxer to initialize.
97 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; 108 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector;
98 void InitializeDemuxer(MockDemuxerStreamVector* streams, 109 void InitializeDemuxer(MockDemuxerStreamVector* streams,
99 const base::TimeDelta& duration) { 110 const base::TimeDelta& duration) {
100 EXPECT_CALL(*mocks_->demuxer(), Initialize(_)) 111 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
101 .WillOnce(Invoke(&RunPipelineStatusCB)); 112 .WillOnce(DoAll(SetDemuxerProperties(duration),
102 mocks_->demuxer()->SetTotalAndBufferedBytesAndDuration( 113 Invoke(&RunPipelineStatusCB2)));
103 kTotalBytes, kBufferedBytes, duration);
104 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f)); 114 EXPECT_CALL(*mocks_->demuxer(), SetPlaybackRate(0.0f));
105 EXPECT_CALL(*mocks_->demuxer(), Seek(mocks_->demuxer()->GetStartTime(), _)) 115 EXPECT_CALL(*mocks_->demuxer(), Seek(mocks_->demuxer()->GetStartTime(), _))
106 .WillOnce(Invoke(&RunPipelineStatusCB2)); 116 .WillOnce(Invoke(&RunPipelineStatusCB2));
107 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 117 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
108 .WillOnce(Invoke(&RunStopFilterCallback)); 118 .WillOnce(Invoke(&RunStopFilterCallback));
109 119
120 // Demuxer properties.
121 EXPECT_CALL(*mocks_->demuxer(), GetBitrate())
122 .WillRepeatedly(Return(kBitrate));
123 EXPECT_CALL(*mocks_->demuxer(), IsLocalSource())
124 .WillRepeatedly(Return(kLocalSource));
125 EXPECT_CALL(*mocks_->demuxer(), IsSeekable())
126 .WillRepeatedly(Return(kSeekable));
127
110 // Configure the demuxer to return the streams. 128 // Configure the demuxer to return the streams.
111 for (size_t i = 0; i < streams->size(); ++i) { 129 for (size_t i = 0; i < streams->size(); ++i) {
112 scoped_refptr<DemuxerStream> stream((*streams)[i]); 130 scoped_refptr<DemuxerStream> stream((*streams)[i]);
113 EXPECT_CALL(*mocks_->demuxer(), GetStream(stream->type())) 131 EXPECT_CALL(*mocks_->demuxer(), GetStream(stream->type()))
114 .WillRepeatedly(Return(stream)); 132 .WillRepeatedly(Return(stream));
115 } 133 }
116 } 134 }
117 135
136 void InitializeDemuxer(MockDemuxerStreamVector* streams) {
137 // Initialize with a default non-zero duration.
138 InitializeDemuxer(streams, base::TimeDelta::FromSeconds(10));
139 }
140
118 StrictMock<MockDemuxerStream>* CreateStream(DemuxerStream::Type type) { 141 StrictMock<MockDemuxerStream>* CreateStream(DemuxerStream::Type type) {
119 StrictMock<MockDemuxerStream>* stream = 142 StrictMock<MockDemuxerStream>* stream =
120 new StrictMock<MockDemuxerStream>(); 143 new StrictMock<MockDemuxerStream>();
121 EXPECT_CALL(*stream, type()) 144 EXPECT_CALL(*stream, type())
122 .WillRepeatedly(Return(type)); 145 .WillRepeatedly(Return(type));
123 return stream; 146 return stream;
124 } 147 }
125 148
126 // Sets up expectations to allow the video decoder to initialize. 149 // Sets up expectations to allow the video decoder to initialize.
127 void InitializeVideoDecoder(MockDemuxerStream* stream) { 150 void InitializeVideoDecoder(MockDemuxerStream* stream) {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 297
275 // Should always get set to zero. 298 // Should always get set to zero.
276 gfx::Size size(1, 1); 299 gfx::Size size(1, 1);
277 pipeline_->GetNaturalVideoSize(&size); 300 pipeline_->GetNaturalVideoSize(&size);
278 EXPECT_EQ(0, size.width()); 301 EXPECT_EQ(0, size.width());
279 EXPECT_EQ(0, size.height()); 302 EXPECT_EQ(0, size.height());
280 } 303 }
281 304
282 TEST_F(PipelineTest, NeverInitializes) { 305 TEST_F(PipelineTest, NeverInitializes) {
283 // Don't execute the callback passed into Initialize(). 306 // Don't execute the callback passed into Initialize().
284 EXPECT_CALL(*mocks_->demuxer(), Initialize(_)); 307 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _));
285 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 308 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
286 .WillOnce(Invoke(&RunStopFilterCallback)); 309 .WillOnce(Invoke(&RunStopFilterCallback));
287 310
288 // This test hangs during initialization by never calling 311 // This test hangs during initialization by never calling
289 // InitializationComplete(). StrictMock<> will ensure that the callback is 312 // InitializationComplete(). StrictMock<> will ensure that the callback is
290 // never executed. 313 // never executed.
291 pipeline_->Start( 314 pipeline_->Start(
292 mocks_->Create().Pass(), 315 mocks_->Create().Pass(),
293 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), 316 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
294 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), 317 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
(...skipping 20 matching lines...) Expand all
315 collection.Pass(), 338 collection.Pass(),
316 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), 339 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
317 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), 340 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
318 NetworkEventCB(), 341 NetworkEventCB(),
319 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_))); 342 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)));
320 message_loop_.RunAllPending(); 343 message_loop_.RunAllPending();
321 EXPECT_FALSE(pipeline_->IsInitialized()); 344 EXPECT_FALSE(pipeline_->IsInitialized());
322 } 345 }
323 346
324 TEST_F(PipelineTest, URLNotFound) { 347 TEST_F(PipelineTest, URLNotFound) {
325 EXPECT_CALL(*mocks_->demuxer(), Initialize(_)) 348 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
326 .WillOnce(RunPipelineStatusCBWithError( 349 .WillOnce(InitializeDemuxerWithError(PIPELINE_ERROR_URL_NOT_FOUND));
327 PIPELINE_ERROR_URL_NOT_FOUND));
328 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 350 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
329 .WillOnce(Invoke(&RunStopFilterCallback)); 351 .WillOnce(Invoke(&RunStopFilterCallback));
330 352
331 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND); 353 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND);
332 EXPECT_FALSE(pipeline_->IsInitialized()); 354 EXPECT_FALSE(pipeline_->IsInitialized());
333 } 355 }
334 356
335 TEST_F(PipelineTest, NoStreams) { 357 TEST_F(PipelineTest, NoStreams) {
336 EXPECT_CALL(*mocks_->demuxer(), Initialize(_)) 358 EXPECT_CALL(*mocks_->demuxer(), Initialize(_, _))
337 .WillOnce(Invoke(&RunPipelineStatusCB)); 359 .WillOnce(Invoke(&RunPipelineStatusCB2));
338 EXPECT_CALL(*mocks_->demuxer(), Stop(_)) 360 EXPECT_CALL(*mocks_->demuxer(), Stop(_))
339 .WillOnce(Invoke(&RunStopFilterCallback)); 361 .WillOnce(Invoke(&RunStopFilterCallback));
340 362
341 InitializePipeline(PIPELINE_ERROR_COULD_NOT_RENDER); 363 InitializePipeline(PIPELINE_ERROR_COULD_NOT_RENDER);
342 EXPECT_FALSE(pipeline_->IsInitialized()); 364 EXPECT_FALSE(pipeline_->IsInitialized());
343 } 365 }
344 366
345 TEST_F(PipelineTest, AudioStream) { 367 TEST_F(PipelineTest, AudioStream) {
346 CreateAudioStream(); 368 CreateAudioStream();
347 MockDemuxerStreamVector streams; 369 MockDemuxerStreamVector streams;
348 streams.push_back(audio_stream()); 370 streams.push_back(audio_stream());
349 371
350 InitializeDemuxer(&streams, base::TimeDelta()); 372 InitializeDemuxer(&streams);
351 InitializeAudioDecoder(audio_stream()); 373 InitializeAudioDecoder(audio_stream());
352 InitializeAudioRenderer(); 374 InitializeAudioRenderer();
353 375
354 InitializePipeline(PIPELINE_OK); 376 InitializePipeline(PIPELINE_OK);
355 EXPECT_TRUE(pipeline_->IsInitialized()); 377 EXPECT_TRUE(pipeline_->IsInitialized());
356 EXPECT_TRUE(pipeline_->HasAudio()); 378 EXPECT_TRUE(pipeline_->HasAudio());
357 EXPECT_FALSE(pipeline_->HasVideo()); 379 EXPECT_FALSE(pipeline_->HasVideo());
358 } 380 }
359 381
360 TEST_F(PipelineTest, VideoStream) { 382 TEST_F(PipelineTest, VideoStream) {
361 CreateVideoStream(); 383 CreateVideoStream();
362 MockDemuxerStreamVector streams; 384 MockDemuxerStreamVector streams;
363 streams.push_back(video_stream()); 385 streams.push_back(video_stream());
364 386
365 InitializeDemuxer(&streams, base::TimeDelta()); 387 InitializeDemuxer(&streams);
366 InitializeVideoDecoder(video_stream()); 388 InitializeVideoDecoder(video_stream());
367 InitializeVideoRenderer(); 389 InitializeVideoRenderer();
368 390
369 InitializePipeline(PIPELINE_OK); 391 InitializePipeline(PIPELINE_OK);
370 EXPECT_TRUE(pipeline_->IsInitialized()); 392 EXPECT_TRUE(pipeline_->IsInitialized());
371 EXPECT_FALSE(pipeline_->HasAudio()); 393 EXPECT_FALSE(pipeline_->HasAudio());
372 EXPECT_TRUE(pipeline_->HasVideo()); 394 EXPECT_TRUE(pipeline_->HasVideo());
373 } 395 }
374 396
375 TEST_F(PipelineTest, AudioVideoStream) { 397 TEST_F(PipelineTest, AudioVideoStream) {
376 CreateAudioStream(); 398 CreateAudioStream();
377 CreateVideoStream(); 399 CreateVideoStream();
378 MockDemuxerStreamVector streams; 400 MockDemuxerStreamVector streams;
379 streams.push_back(audio_stream()); 401 streams.push_back(audio_stream());
380 streams.push_back(video_stream()); 402 streams.push_back(video_stream());
381 403
382 InitializeDemuxer(&streams, base::TimeDelta()); 404 InitializeDemuxer(&streams);
383 InitializeAudioDecoder(audio_stream()); 405 InitializeAudioDecoder(audio_stream());
384 InitializeAudioRenderer(); 406 InitializeAudioRenderer();
385 InitializeVideoDecoder(video_stream()); 407 InitializeVideoDecoder(video_stream());
386 InitializeVideoRenderer(); 408 InitializeVideoRenderer();
387 409
388 InitializePipeline(PIPELINE_OK); 410 InitializePipeline(PIPELINE_OK);
389 EXPECT_TRUE(pipeline_->IsInitialized()); 411 EXPECT_TRUE(pipeline_->IsInitialized());
390 EXPECT_TRUE(pipeline_->HasAudio()); 412 EXPECT_TRUE(pipeline_->HasAudio());
391 EXPECT_TRUE(pipeline_->HasVideo()); 413 EXPECT_TRUE(pipeline_->HasVideo());
392 } 414 }
(...skipping 18 matching lines...) Expand all
411 // Initialize then seek! 433 // Initialize then seek!
412 InitializePipeline(PIPELINE_OK); 434 InitializePipeline(PIPELINE_OK);
413 DoSeek(expected); 435 DoSeek(expected);
414 } 436 }
415 437
416 TEST_F(PipelineTest, SetVolume) { 438 TEST_F(PipelineTest, SetVolume) {
417 CreateAudioStream(); 439 CreateAudioStream();
418 MockDemuxerStreamVector streams; 440 MockDemuxerStreamVector streams;
419 streams.push_back(audio_stream()); 441 streams.push_back(audio_stream());
420 442
421 InitializeDemuxer(&streams, base::TimeDelta()); 443 InitializeDemuxer(&streams);
422 InitializeAudioDecoder(audio_stream()); 444 InitializeAudioDecoder(audio_stream());
423 InitializeAudioRenderer(); 445 InitializeAudioRenderer();
424 446
425 // The audio renderer should receive a call to SetVolume(). 447 // The audio renderer should receive a call to SetVolume().
426 float expected = 0.5f; 448 float expected = 0.5f;
427 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(expected)); 449 EXPECT_CALL(*mocks_->audio_renderer(), SetVolume(expected));
428 450
429 // Initialize then set volume! 451 // Initialize then set volume!
430 InitializePipeline(PIPELINE_OK); 452 InitializePipeline(PIPELINE_OK);
431 pipeline_->SetVolume(expected); 453 pipeline_->SetVolume(expected);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 pipeline_->GetBufferedTime().ToInternalValue()); 537 pipeline_->GetBufferedTime().ToInternalValue());
516 } 538 }
517 539
518 TEST_F(PipelineTest, DisableAudioRenderer) { 540 TEST_F(PipelineTest, DisableAudioRenderer) {
519 CreateAudioStream(); 541 CreateAudioStream();
520 CreateVideoStream(); 542 CreateVideoStream();
521 MockDemuxerStreamVector streams; 543 MockDemuxerStreamVector streams;
522 streams.push_back(audio_stream()); 544 streams.push_back(audio_stream());
523 streams.push_back(video_stream()); 545 streams.push_back(video_stream());
524 546
525 InitializeDemuxer(&streams, base::TimeDelta()); 547 InitializeDemuxer(&streams);
526 InitializeAudioDecoder(audio_stream()); 548 InitializeAudioDecoder(audio_stream());
527 InitializeAudioRenderer(); 549 InitializeAudioRenderer();
528 InitializeVideoDecoder(video_stream()); 550 InitializeVideoDecoder(video_stream());
529 InitializeVideoRenderer(); 551 InitializeVideoRenderer();
530 552
531 InitializePipeline(PIPELINE_OK); 553 InitializePipeline(PIPELINE_OK);
532 EXPECT_TRUE(pipeline_->IsInitialized()); 554 EXPECT_TRUE(pipeline_->IsInitialized());
533 EXPECT_TRUE(pipeline_->HasAudio()); 555 EXPECT_TRUE(pipeline_->HasAudio());
534 EXPECT_TRUE(pipeline_->HasVideo()); 556 EXPECT_TRUE(pipeline_->HasVideo());
535 557
(...skipping 16 matching lines...) Expand all
552 host->NotifyEnded(); 574 host->NotifyEnded();
553 } 575 }
554 576
555 TEST_F(PipelineTest, DisableAudioRendererDuringInit) { 577 TEST_F(PipelineTest, DisableAudioRendererDuringInit) {
556 CreateAudioStream(); 578 CreateAudioStream();
557 CreateVideoStream(); 579 CreateVideoStream();
558 MockDemuxerStreamVector streams; 580 MockDemuxerStreamVector streams;
559 streams.push_back(audio_stream()); 581 streams.push_back(audio_stream());
560 streams.push_back(video_stream()); 582 streams.push_back(video_stream());
561 583
562 InitializeDemuxer(&streams, base::TimeDelta()); 584 InitializeDemuxer(&streams);
563 InitializeAudioDecoder(audio_stream()); 585 InitializeAudioDecoder(audio_stream());
564 InitializeAudioRenderer(true); 586 InitializeAudioRenderer(true);
565 InitializeVideoDecoder(video_stream()); 587 InitializeVideoDecoder(video_stream());
566 InitializeVideoRenderer(); 588 InitializeVideoRenderer();
567 589
568 EXPECT_CALL(*mocks_->demuxer(), 590 EXPECT_CALL(*mocks_->demuxer(),
569 OnAudioRendererDisabled()); 591 OnAudioRendererDisabled());
570 EXPECT_CALL(*mocks_->audio_renderer(), 592 EXPECT_CALL(*mocks_->audio_renderer(),
571 OnAudioRendererDisabled()); 593 OnAudioRendererDisabled());
572 EXPECT_CALL(*mocks_->video_renderer(), 594 EXPECT_CALL(*mocks_->video_renderer(),
(...skipping 12 matching lines...) Expand all
585 host->NotifyEnded(); 607 host->NotifyEnded();
586 } 608 }
587 609
588 TEST_F(PipelineTest, EndedCallback) { 610 TEST_F(PipelineTest, EndedCallback) {
589 CreateAudioStream(); 611 CreateAudioStream();
590 CreateVideoStream(); 612 CreateVideoStream();
591 MockDemuxerStreamVector streams; 613 MockDemuxerStreamVector streams;
592 streams.push_back(audio_stream()); 614 streams.push_back(audio_stream());
593 streams.push_back(video_stream()); 615 streams.push_back(video_stream());
594 616
595 InitializeDemuxer(&streams, base::TimeDelta()); 617 InitializeDemuxer(&streams);
596 InitializeAudioDecoder(audio_stream()); 618 InitializeAudioDecoder(audio_stream());
597 InitializeAudioRenderer(); 619 InitializeAudioRenderer();
598 InitializeVideoDecoder(video_stream()); 620 InitializeVideoDecoder(video_stream());
599 InitializeVideoRenderer(); 621 InitializeVideoRenderer();
600 InitializePipeline(PIPELINE_OK); 622 InitializePipeline(PIPELINE_OK);
601 623
602 // For convenience to simulate filters calling the methods. 624 // For convenience to simulate filters calling the methods.
603 FilterHost* host = pipeline_; 625 FilterHost* host = pipeline_;
604 626
605 // Due to short circuit evaluation we only need to test a subset of cases. 627 // Due to short circuit evaluation we only need to test a subset of cases.
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 InitializeVideoRenderer(); 829 InitializeVideoRenderer();
808 830
809 InitializePipeline(PIPELINE_OK); 831 InitializePipeline(PIPELINE_OK);
810 EXPECT_TRUE(pipeline_->IsInitialized()); 832 EXPECT_TRUE(pipeline_->IsInitialized());
811 EXPECT_FALSE(pipeline_->HasAudio()); 833 EXPECT_FALSE(pipeline_->HasAudio());
812 EXPECT_TRUE(pipeline_->HasVideo()); 834 EXPECT_TRUE(pipeline_->HasVideo());
813 835
814 EXPECT_EQ(kStartTime, pipeline_->GetCurrentTime()); 836 EXPECT_EQ(kStartTime, pipeline_->GetCurrentTime());
815 } 837 }
816 838
839 TEST_F(PipelineTest, DemuxerProperties) {
840 CreateAudioStream();
841 CreateVideoStream();
842 MockDemuxerStreamVector streams;
843 streams.push_back(audio_stream());
844 streams.push_back(video_stream());
845
846 InitializeDemuxer(&streams);
847 InitializeAudioDecoder(audio_stream());
848 InitializeAudioRenderer();
849 InitializeVideoDecoder(video_stream());
850 InitializeVideoRenderer();
851 InitializePipeline(PIPELINE_OK);
852
853 EXPECT_EQ(kLocalSource, pipeline_->IsLocalSource());
854 EXPECT_EQ(!kSeekable, pipeline_->IsStreaming());
855 }
856
817 class FlexibleCallbackRunner : public base::DelegateSimpleThread::Delegate { 857 class FlexibleCallbackRunner : public base::DelegateSimpleThread::Delegate {
818 public: 858 public:
819 FlexibleCallbackRunner(base::TimeDelta delay, PipelineStatus status, 859 FlexibleCallbackRunner(base::TimeDelta delay, PipelineStatus status,
820 const PipelineStatusCB& status_cb) 860 const PipelineStatusCB& status_cb)
821 : delay_(delay), 861 : delay_(delay),
822 status_(status), 862 status_(status),
823 status_cb_(status_cb) { 863 status_cb_(status_cb) {
824 if (delay_ < base::TimeDelta()) { 864 if (delay_ < base::TimeDelta()) {
825 status_cb_.Run(status_); 865 status_cb_.Run(status_);
826 return; 866 return;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(0)); 901 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(0));
862 } 902 }
863 903
864 // Test that different-thread, some-delay callback (the expected common case) 904 // Test that different-thread, some-delay callback (the expected common case)
865 // works correctly. 905 // works correctly.
866 TEST(PipelineStatusNotificationTest, DelayedCallback) { 906 TEST(PipelineStatusNotificationTest, DelayedCallback) {
867 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20)); 907 TestPipelineStatusNotification(base::TimeDelta::FromMilliseconds(20));
868 } 908 }
869 909
870 } // namespace media 910 } // namespace media
OLDNEW
« no previous file with comments | « media/base/pipeline.cc ('k') | media/filters/chunk_demuxer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698