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

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

Issue 23702007: Render inband text tracks in the media pipeline (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: incorporate aaron's comments (11/12) Created 7 years, 1 month 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
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/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"
11 #include "base/threading/simple_thread.h" 11 #include "base/threading/simple_thread.h"
12 #include "base/time/clock.h" 12 #include "base/time/clock.h"
13 #include "media/base/clock.h" 13 #include "media/base/clock.h"
14 #include "media/base/fake_text_track_stream.h"
14 #include "media/base/gmock_callback_support.h" 15 #include "media/base/gmock_callback_support.h"
15 #include "media/base/media_log.h" 16 #include "media/base/media_log.h"
16 #include "media/base/mock_filters.h" 17 #include "media/base/mock_filters.h"
17 #include "media/base/pipeline.h" 18 #include "media/base/pipeline.h"
18 #include "media/base/test_helpers.h" 19 #include "media/base/test_helpers.h"
20 #include "media/base/text_renderer.h"
21 #include "media/base/text_track_config.h"
19 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
20 #include "ui/gfx/size.h" 23 #include "ui/gfx/size.h"
21 24
22 using ::testing::_; 25 using ::testing::_;
23 using ::testing::DeleteArg; 26 using ::testing::DeleteArg;
24 using ::testing::DoAll; 27 using ::testing::DoAll;
25 // TODO(scherkus): Remove InSequence after refactoring Pipeline. 28 // TODO(scherkus): Remove InSequence after refactoring Pipeline.
26 using ::testing::InSequence; 29 using ::testing::InSequence;
27 using ::testing::Invoke; 30 using ::testing::Invoke;
28 using ::testing::InvokeWithoutArgs; 31 using ::testing::InvokeWithoutArgs;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 filter_collection_->SetDemuxer(demuxer_.get()); 89 filter_collection_->SetDemuxer(demuxer_.get());
87 90
88 video_renderer_ = new MockVideoRenderer(); 91 video_renderer_ = new MockVideoRenderer();
89 scoped_ptr<VideoRenderer> video_renderer(video_renderer_); 92 scoped_ptr<VideoRenderer> video_renderer(video_renderer_);
90 filter_collection_->SetVideoRenderer(video_renderer.Pass()); 93 filter_collection_->SetVideoRenderer(video_renderer.Pass());
91 94
92 audio_renderer_ = new MockAudioRenderer(); 95 audio_renderer_ = new MockAudioRenderer();
93 scoped_ptr<AudioRenderer> audio_renderer(audio_renderer_); 96 scoped_ptr<AudioRenderer> audio_renderer(audio_renderer_);
94 filter_collection_->SetAudioRenderer(audio_renderer.Pass()); 97 filter_collection_->SetAudioRenderer(audio_renderer.Pass());
95 98
99 text_renderer_ = new TextRenderer(
100 message_loop_.message_loop_proxy(),
101 base::Bind(&PipelineTest::OnAddTextTrack,
102 base::Unretained(this)));
103 scoped_ptr<TextRenderer> text_renderer(text_renderer_);
104 filter_collection_->SetTextRenderer(text_renderer.Pass());
105
96 // InitializeDemuxer() adds overriding expectations for expected non-NULL 106 // InitializeDemuxer() adds overriding expectations for expected non-NULL
97 // streams. 107 // streams.
98 DemuxerStream* null_pointer = NULL; 108 DemuxerStream* null_pointer = NULL;
99 EXPECT_CALL(*demuxer_, GetStream(_)) 109 EXPECT_CALL(*demuxer_, GetStream(_))
100 .WillRepeatedly(Return(null_pointer)); 110 .WillRepeatedly(Return(null_pointer));
101 111
102 EXPECT_CALL(*demuxer_, GetStartTime()) 112 EXPECT_CALL(*demuxer_, GetStartTime())
103 .WillRepeatedly(Return(base::TimeDelta())); 113 .WillRepeatedly(Return(base::TimeDelta()));
104 } 114 }
105 115
106 virtual ~PipelineTest() { 116 virtual ~PipelineTest() {
107 if (!pipeline_ || !pipeline_->IsRunning()) 117 if (!pipeline_ || !pipeline_->IsRunning())
108 return; 118 return;
109 119
110 ExpectStop(); 120 ExpectStop();
111 121
122 // The mock demuxer doesn't stop the fake text track stream,
123 // so just stop it manually.
124 if (text_stream_) {
125 text_stream_->Stop();
126 message_loop_.RunUntilIdle();
127 }
128
112 // Expect a stop callback if we were started. 129 // Expect a stop callback if we were started.
113 EXPECT_CALL(callbacks_, OnStop()); 130 EXPECT_CALL(callbacks_, OnStop());
114 pipeline_->Stop(base::Bind(&CallbackHelper::OnStop, 131 pipeline_->Stop(base::Bind(&CallbackHelper::OnStop,
115 base::Unretained(&callbacks_))); 132 base::Unretained(&callbacks_)));
116 message_loop_.RunUntilIdle(); 133 message_loop_.RunUntilIdle();
117 } 134 }
118 135
119 protected: 136 protected:
120 // Sets up expectations to allow the demuxer to initialize. 137 // Sets up expectations to allow the demuxer to initialize.
121 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector; 138 typedef std::vector<MockDemuxerStream*> MockDemuxerStreamVector;
122 void InitializeDemuxer(MockDemuxerStreamVector* streams, 139 void InitializeDemuxer(MockDemuxerStreamVector* streams,
123 const base::TimeDelta& duration) { 140 const base::TimeDelta& duration) {
124 EXPECT_CALL(callbacks_, OnDurationChange()); 141 EXPECT_CALL(callbacks_, OnDurationChange());
125 EXPECT_CALL(*demuxer_, Initialize(_, _)) 142 EXPECT_CALL(*demuxer_, Initialize(_, _, _))
126 .WillOnce(DoAll(SetDemuxerProperties(duration), 143 .WillOnce(DoAll(SetDemuxerProperties(duration),
127 RunCallback<1>(PIPELINE_OK))); 144 RunCallback<1>(PIPELINE_OK)));
128 145
129 // Configure the demuxer to return the streams. 146 // Configure the demuxer to return the streams.
130 for (size_t i = 0; i < streams->size(); ++i) { 147 for (size_t i = 0; i < streams->size(); ++i) {
131 DemuxerStream* stream = (*streams)[i]; 148 DemuxerStream* stream = (*streams)[i];
132 EXPECT_CALL(*demuxer_, GetStream(stream->type())) 149 EXPECT_CALL(*demuxer_, GetStream(stream->type()))
133 .WillRepeatedly(Return(stream)); 150 .WillRepeatedly(Return(stream));
134 } 151 }
135 } 152 }
(...skipping 30 matching lines...) Expand all
166 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _)) 183 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _))
167 .WillOnce(DoAll(RunCallback<1>(PIPELINE_OK), 184 .WillOnce(DoAll(RunCallback<1>(PIPELINE_OK),
168 WithArg<6>(RunClosure<0>()))); // |disabled_cb|. 185 WithArg<6>(RunClosure<0>()))); // |disabled_cb|.
169 } else { 186 } else {
170 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _)) 187 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _))
171 .WillOnce(DoAll(SaveArg<4>(&audio_time_cb_), 188 .WillOnce(DoAll(SaveArg<4>(&audio_time_cb_),
172 RunCallback<1>(PIPELINE_OK))); 189 RunCallback<1>(PIPELINE_OK)));
173 } 190 }
174 } 191 }
175 192
193 void AddTextStream() {
194 EXPECT_CALL(*this, OnAddTextTrack(_,_))
195 .WillOnce(Invoke(this, &PipelineTest::DoOnAddTextTrack));
196 static_cast<DemuxerHost*>(pipeline_.get())->AddTextStream(text_stream(),
197 TextTrackConfig(kTextSubtitles, "", ""));
198 }
199
176 // Sets up expectations on the callback and initializes the pipeline. Called 200 // Sets up expectations on the callback and initializes the pipeline. Called
177 // after tests have set expectations any filters they wish to use. 201 // after tests have set expectations any filters they wish to use.
178 void InitializePipeline(PipelineStatus start_status) { 202 void InitializePipeline(PipelineStatus start_status) {
179 EXPECT_CALL(callbacks_, OnStart(start_status)); 203 EXPECT_CALL(callbacks_, OnStart(start_status));
180 204
181 if (start_status == PIPELINE_OK) { 205 if (start_status == PIPELINE_OK) {
182 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kHaveMetadata)); 206 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kHaveMetadata));
183 207
184 if (audio_stream_) { 208 if (audio_stream_) {
185 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f)); 209 EXPECT_CALL(*audio_renderer_, SetPlaybackRate(0.0f));
(...skipping 22 matching lines...) Expand all
208 232
209 void CreateAudioStream() { 233 void CreateAudioStream() {
210 audio_stream_ = CreateStream(DemuxerStream::AUDIO); 234 audio_stream_ = CreateStream(DemuxerStream::AUDIO);
211 } 235 }
212 236
213 void CreateVideoStream() { 237 void CreateVideoStream() {
214 video_stream_ = CreateStream(DemuxerStream::VIDEO); 238 video_stream_ = CreateStream(DemuxerStream::VIDEO);
215 video_stream_->set_video_decoder_config(video_decoder_config_); 239 video_stream_->set_video_decoder_config(video_decoder_config_);
216 } 240 }
217 241
242 void CreateTextStream() {
243 scoped_ptr<FakeTextTrackStream> text_stream(new FakeTextTrackStream);
244 text_stream_ = text_stream.Pass();
245 }
246
218 MockDemuxerStream* audio_stream() { 247 MockDemuxerStream* audio_stream() {
219 return audio_stream_.get(); 248 return audio_stream_.get();
220 } 249 }
221 250
222 MockDemuxerStream* video_stream() { 251 MockDemuxerStream* video_stream() {
223 return video_stream_.get(); 252 return video_stream_.get();
224 } 253 }
225 254
255 FakeTextTrackStream* text_stream() {
256 return text_stream_.get();
257 }
258
226 void ExpectSeek(const base::TimeDelta& seek_time) { 259 void ExpectSeek(const base::TimeDelta& seek_time) {
227 // Every filter should receive a call to Seek(). 260 // Every filter should receive a call to Seek().
228 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 261 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
229 .WillOnce(RunCallback<1>(PIPELINE_OK)); 262 .WillOnce(RunCallback<1>(PIPELINE_OK));
230 263
231 if (audio_stream_) { 264 if (audio_stream_) {
232 EXPECT_CALL(*audio_renderer_, Pause(_)) 265 EXPECT_CALL(*audio_renderer_, Pause(_))
233 .WillOnce(RunClosure<0>()); 266 .WillOnce(RunClosure<0>());
234 EXPECT_CALL(*audio_renderer_, Flush(_)) 267 EXPECT_CALL(*audio_renderer_, Flush(_))
235 .WillOnce(RunClosure<0>()); 268 .WillOnce(RunClosure<0>());
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 if (demuxer_) 307 if (demuxer_)
275 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>()); 308 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>());
276 309
277 if (audio_stream_) 310 if (audio_stream_)
278 EXPECT_CALL(*audio_renderer_, Stop(_)).WillOnce(RunClosure<0>()); 311 EXPECT_CALL(*audio_renderer_, Stop(_)).WillOnce(RunClosure<0>());
279 312
280 if (video_stream_) 313 if (video_stream_)
281 EXPECT_CALL(*video_renderer_, Stop(_)).WillOnce(RunClosure<0>()); 314 EXPECT_CALL(*video_renderer_, Stop(_)).WillOnce(RunClosure<0>());
282 } 315 }
283 316
317 MOCK_METHOD2(OnAddTextTrack, void(const TextTrackConfig&,
318 const AddTextTrackDoneCB&));
319
320 void DoOnAddTextTrack(const TextTrackConfig& config,
321 const AddTextTrackDoneCB& done_cb) {
322 scoped_ptr<MockTextTrack> text_track(new MockTextTrack);
323 done_cb.Run(text_track.Pass());
324 }
325
284 // Fixture members. 326 // Fixture members.
285 StrictMock<CallbackHelper> callbacks_; 327 StrictMock<CallbackHelper> callbacks_;
286 base::SimpleTestTickClock test_tick_clock_; 328 base::SimpleTestTickClock test_tick_clock_;
287 base::MessageLoop message_loop_; 329 base::MessageLoop message_loop_;
288 scoped_ptr<Pipeline> pipeline_; 330 scoped_ptr<Pipeline> pipeline_;
289 331
290 scoped_ptr<FilterCollection> filter_collection_; 332 scoped_ptr<FilterCollection> filter_collection_;
291 scoped_ptr<MockDemuxer> demuxer_; 333 scoped_ptr<MockDemuxer> demuxer_;
292 MockVideoRenderer* video_renderer_; 334 MockVideoRenderer* video_renderer_;
293 MockAudioRenderer* audio_renderer_; 335 MockAudioRenderer* audio_renderer_;
336 StrictMock<CallbackHelper> text_renderer_callbacks_;
337 TextRenderer* text_renderer_;
294 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; 338 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_;
295 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; 339 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_;
340 scoped_ptr<FakeTextTrackStream> text_stream_;
296 AudioRenderer::TimeCB audio_time_cb_; 341 AudioRenderer::TimeCB audio_time_cb_;
297 VideoDecoderConfig video_decoder_config_; 342 VideoDecoderConfig video_decoder_config_;
298 343
299 private: 344 private:
300 DISALLOW_COPY_AND_ASSIGN(PipelineTest); 345 DISALLOW_COPY_AND_ASSIGN(PipelineTest);
301 }; 346 };
302 347
303 // Test that playback controls methods no-op when the pipeline hasn't been 348 // Test that playback controls methods no-op when the pipeline hasn't been
304 // started. 349 // started.
305 TEST_F(PipelineTest, NotStarted) { 350 TEST_F(PipelineTest, NotStarted) {
(...skipping 25 matching lines...) Expand all
331 376
332 // Should always get set to zero. 377 // Should always get set to zero.
333 gfx::Size size(1, 1); 378 gfx::Size size(1, 1);
334 pipeline_->GetNaturalVideoSize(&size); 379 pipeline_->GetNaturalVideoSize(&size);
335 EXPECT_EQ(0, size.width()); 380 EXPECT_EQ(0, size.width());
336 EXPECT_EQ(0, size.height()); 381 EXPECT_EQ(0, size.height());
337 } 382 }
338 383
339 TEST_F(PipelineTest, NeverInitializes) { 384 TEST_F(PipelineTest, NeverInitializes) {
340 // Don't execute the callback passed into Initialize(). 385 // Don't execute the callback passed into Initialize().
341 EXPECT_CALL(*demuxer_, Initialize(_, _)); 386 EXPECT_CALL(*demuxer_, Initialize(_, _, _));
342 387
343 // This test hangs during initialization by never calling 388 // This test hangs during initialization by never calling
344 // InitializationComplete(). StrictMock<> will ensure that the callback is 389 // InitializationComplete(). StrictMock<> will ensure that the callback is
345 // never executed. 390 // never executed.
346 pipeline_->Start( 391 pipeline_->Start(
347 filter_collection_.Pass(), 392 filter_collection_.Pass(),
348 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)), 393 base::Bind(&CallbackHelper::OnEnded, base::Unretained(&callbacks_)),
349 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)), 394 base::Bind(&CallbackHelper::OnError, base::Unretained(&callbacks_)),
350 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)), 395 base::Bind(&CallbackHelper::OnStart, base::Unretained(&callbacks_)),
351 base::Bind(&CallbackHelper::OnBufferingState, 396 base::Bind(&CallbackHelper::OnBufferingState,
352 base::Unretained(&callbacks_)), 397 base::Unretained(&callbacks_)),
353 base::Bind(&CallbackHelper::OnDurationChange, 398 base::Bind(&CallbackHelper::OnDurationChange,
354 base::Unretained(&callbacks_))); 399 base::Unretained(&callbacks_)));
355 message_loop_.RunUntilIdle(); 400 message_loop_.RunUntilIdle();
356 401
357 402
358 // Because our callback will get executed when the test tears down, we'll 403 // Because our callback will get executed when the test tears down, we'll
359 // verify that nothing has been called, then set our expectation for the call 404 // verify that nothing has been called, then set our expectation for the call
360 // made during tear down. 405 // made during tear down.
361 Mock::VerifyAndClear(&callbacks_); 406 Mock::VerifyAndClear(&callbacks_);
362 EXPECT_CALL(callbacks_, OnStart(PIPELINE_OK)); 407 EXPECT_CALL(callbacks_, OnStart(PIPELINE_OK));
363 } 408 }
364 409
365 TEST_F(PipelineTest, URLNotFound) { 410 TEST_F(PipelineTest, URLNotFound) {
366 EXPECT_CALL(*demuxer_, Initialize(_, _)) 411 EXPECT_CALL(*demuxer_, Initialize(_, _, _))
367 .WillOnce(RunCallback<1>(PIPELINE_ERROR_URL_NOT_FOUND)); 412 .WillOnce(RunCallback<1>(PIPELINE_ERROR_URL_NOT_FOUND));
368 EXPECT_CALL(*demuxer_, Stop(_)) 413 EXPECT_CALL(*demuxer_, Stop(_))
369 .WillOnce(RunClosure<0>()); 414 .WillOnce(RunClosure<0>());
370 415
371 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND); 416 InitializePipeline(PIPELINE_ERROR_URL_NOT_FOUND);
372 } 417 }
373 418
374 TEST_F(PipelineTest, NoStreams) { 419 TEST_F(PipelineTest, NoStreams) {
375 EXPECT_CALL(*demuxer_, Initialize(_, _)) 420 EXPECT_CALL(*demuxer_, Initialize(_, _, _))
376 .WillOnce(RunCallback<1>(PIPELINE_OK)); 421 .WillOnce(RunCallback<1>(PIPELINE_OK));
377 EXPECT_CALL(*demuxer_, Stop(_)) 422 EXPECT_CALL(*demuxer_, Stop(_))
378 .WillOnce(RunClosure<0>()); 423 .WillOnce(RunClosure<0>());
379 424
380 InitializePipeline(PIPELINE_ERROR_COULD_NOT_RENDER); 425 InitializePipeline(PIPELINE_ERROR_COULD_NOT_RENDER);
381 } 426 }
382 427
383 TEST_F(PipelineTest, AudioStream) { 428 TEST_F(PipelineTest, AudioStream) {
384 CreateAudioStream(); 429 CreateAudioStream();
385 MockDemuxerStreamVector streams; 430 MockDemuxerStreamVector streams;
(...skipping 29 matching lines...) Expand all
415 460
416 InitializeDemuxer(&streams); 461 InitializeDemuxer(&streams);
417 InitializeAudioRenderer(audio_stream(), false); 462 InitializeAudioRenderer(audio_stream(), false);
418 InitializeVideoRenderer(video_stream()); 463 InitializeVideoRenderer(video_stream());
419 464
420 InitializePipeline(PIPELINE_OK); 465 InitializePipeline(PIPELINE_OK);
421 EXPECT_TRUE(pipeline_->HasAudio()); 466 EXPECT_TRUE(pipeline_->HasAudio());
422 EXPECT_TRUE(pipeline_->HasVideo()); 467 EXPECT_TRUE(pipeline_->HasVideo());
423 } 468 }
424 469
470 TEST_F(PipelineTest, VideoTextStream) {
471 CreateVideoStream();
472 CreateTextStream();
473 MockDemuxerStreamVector streams;
474 streams.push_back(video_stream());
475
476 InitializeDemuxer(&streams);
477 InitializeVideoRenderer(video_stream());
478
479 InitializePipeline(PIPELINE_OK);
480 EXPECT_FALSE(pipeline_->HasAudio());
481 EXPECT_TRUE(pipeline_->HasVideo());
482
483 AddTextStream();
484 message_loop_.RunUntilIdle();
485 }
486
487 TEST_F(PipelineTest, VideoAudioTextStream) {
488 CreateVideoStream();
489 CreateAudioStream();
490 CreateTextStream();
491 MockDemuxerStreamVector streams;
492 streams.push_back(video_stream());
493 streams.push_back(audio_stream());
494
495 InitializeDemuxer(&streams);
496 InitializeVideoRenderer(video_stream());
497 InitializeAudioRenderer(audio_stream(), false);
498
499 InitializePipeline(PIPELINE_OK);
500 EXPECT_TRUE(pipeline_->HasAudio());
501 EXPECT_TRUE(pipeline_->HasVideo());
502
503 AddTextStream();
504 message_loop_.RunUntilIdle();
505 }
506
425 TEST_F(PipelineTest, Seek) { 507 TEST_F(PipelineTest, Seek) {
426 CreateAudioStream(); 508 CreateAudioStream();
427 CreateVideoStream(); 509 CreateVideoStream();
510 CreateTextStream();
428 MockDemuxerStreamVector streams; 511 MockDemuxerStreamVector streams;
429 streams.push_back(audio_stream()); 512 streams.push_back(audio_stream());
430 streams.push_back(video_stream()); 513 streams.push_back(video_stream());
431 514
432 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); 515 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000));
433 InitializeAudioRenderer(audio_stream(), false); 516 InitializeAudioRenderer(audio_stream(), false);
434 InitializeVideoRenderer(video_stream()); 517 InitializeVideoRenderer(video_stream());
435 518
436 // Initialize then seek! 519 // Initialize then seek!
437 InitializePipeline(PIPELINE_OK); 520 InitializePipeline(PIPELINE_OK);
438 521
522 AddTextStream();
523 message_loop_.RunUntilIdle();
524
439 // Every filter should receive a call to Seek(). 525 // Every filter should receive a call to Seek().
440 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); 526 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000);
441 ExpectSeek(expected); 527 ExpectSeek(expected);
442 DoSeek(expected); 528 DoSeek(expected);
443 } 529 }
444 530
445 TEST_F(PipelineTest, SetVolume) { 531 TEST_F(PipelineTest, SetVolume) {
446 CreateAudioStream(); 532 CreateAudioStream();
447 MockDemuxerStreamVector streams; 533 MockDemuxerStreamVector streams;
448 streams.push_back(audio_stream()); 534 streams.push_back(audio_stream());
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 EXPECT_TRUE(pipeline_->HasVideo()); 653 EXPECT_TRUE(pipeline_->HasVideo());
568 654
569 // Verify that ended event is fired when video ends. 655 // Verify that ended event is fired when video ends.
570 EXPECT_CALL(callbacks_, OnEnded()); 656 EXPECT_CALL(callbacks_, OnEnded());
571 pipeline_->OnVideoRendererEnded(); 657 pipeline_->OnVideoRendererEnded();
572 } 658 }
573 659
574 TEST_F(PipelineTest, EndedCallback) { 660 TEST_F(PipelineTest, EndedCallback) {
575 CreateAudioStream(); 661 CreateAudioStream();
576 CreateVideoStream(); 662 CreateVideoStream();
663 CreateTextStream();
577 MockDemuxerStreamVector streams; 664 MockDemuxerStreamVector streams;
578 streams.push_back(audio_stream()); 665 streams.push_back(audio_stream());
579 streams.push_back(video_stream()); 666 streams.push_back(video_stream());
580 667
581 InitializeDemuxer(&streams); 668 InitializeDemuxer(&streams);
582 InitializeAudioRenderer(audio_stream(), false); 669 InitializeAudioRenderer(audio_stream(), false);
583 InitializeVideoRenderer(video_stream()); 670 InitializeVideoRenderer(video_stream());
584 InitializePipeline(PIPELINE_OK); 671 InitializePipeline(PIPELINE_OK);
585 672
586 // The ended callback shouldn't run until both renderers have ended. 673 AddTextStream();
674
675 // The ended callback shouldn't run until all renderers have ended.
587 pipeline_->OnAudioRendererEnded(); 676 pipeline_->OnAudioRendererEnded();
588 message_loop_.RunUntilIdle(); 677 message_loop_.RunUntilIdle();
589 678
679 pipeline_->OnVideoRendererEnded();
680 message_loop_.RunUntilIdle();
681
590 EXPECT_CALL(callbacks_, OnEnded()); 682 EXPECT_CALL(callbacks_, OnEnded());
591 pipeline_->OnVideoRendererEnded(); 683 text_stream()->SendEosNotification();
592 message_loop_.RunUntilIdle(); 684 message_loop_.RunUntilIdle();
593 } 685 }
594 686
595 TEST_F(PipelineTest, AudioStreamShorterThanVideo) { 687 TEST_F(PipelineTest, AudioStreamShorterThanVideo) {
596 base::TimeDelta duration = base::TimeDelta::FromSeconds(10); 688 base::TimeDelta duration = base::TimeDelta::FromSeconds(10);
597 689
598 CreateAudioStream(); 690 CreateAudioStream();
599 CreateVideoStream(); 691 CreateVideoStream();
600 MockDemuxerStreamVector streams; 692 MockDemuxerStreamVector streams;
601 streams.push_back(audio_stream()); 693 streams.push_back(audio_stream());
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 } 1008 }
917 1009
918 PipelineStatus SetInitializeExpectations(TeardownState state, 1010 PipelineStatus SetInitializeExpectations(TeardownState state,
919 StopOrError stop_or_error) { 1011 StopOrError stop_or_error) {
920 PipelineStatus status = PIPELINE_OK; 1012 PipelineStatus status = PIPELINE_OK;
921 base::Closure stop_cb = base::Bind( 1013 base::Closure stop_cb = base::Bind(
922 &CallbackHelper::OnStop, base::Unretained(&callbacks_)); 1014 &CallbackHelper::OnStop, base::Unretained(&callbacks_));
923 1015
924 if (state == kInitDemuxer) { 1016 if (state == kInitDemuxer) {
925 if (stop_or_error == kStop) { 1017 if (stop_or_error == kStop) {
926 EXPECT_CALL(*demuxer_, Initialize(_, _)) 1018 EXPECT_CALL(*demuxer_, Initialize(_, _, _))
927 .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb), 1019 .WillOnce(DoAll(Stop(pipeline_.get(), stop_cb),
928 RunCallback<1>(PIPELINE_OK))); 1020 RunCallback<1>(PIPELINE_OK)));
929 EXPECT_CALL(callbacks_, OnStop()); 1021 EXPECT_CALL(callbacks_, OnStop());
930 } else { 1022 } else {
931 status = DEMUXER_ERROR_COULD_NOT_OPEN; 1023 status = DEMUXER_ERROR_COULD_NOT_OPEN;
932 EXPECT_CALL(*demuxer_, Initialize(_, _)) 1024 EXPECT_CALL(*demuxer_, Initialize(_, _, _))
933 .WillOnce(RunCallback<1>(status)); 1025 .WillOnce(RunCallback<1>(status));
934 } 1026 }
935 1027
936 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>()); 1028 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>());
937 return status; 1029 return status;
938 } 1030 }
939 1031
940 CreateAudioStream(); 1032 CreateAudioStream();
941 CreateVideoStream(); 1033 CreateVideoStream();
942 MockDemuxerStreamVector streams; 1034 MockDemuxerStreamVector streams;
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
1175 INSTANTIATE_TEARDOWN_TEST(Error, Pausing); 1267 INSTANTIATE_TEARDOWN_TEST(Error, Pausing);
1176 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); 1268 INSTANTIATE_TEARDOWN_TEST(Error, Flushing);
1177 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); 1269 INSTANTIATE_TEARDOWN_TEST(Error, Seeking);
1178 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling); 1270 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling);
1179 INSTANTIATE_TEARDOWN_TEST(Error, Starting); 1271 INSTANTIATE_TEARDOWN_TEST(Error, Starting);
1180 INSTANTIATE_TEARDOWN_TEST(Error, Playing); 1272 INSTANTIATE_TEARDOWN_TEST(Error, Playing);
1181 1273
1182 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); 1274 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing);
1183 1275
1184 } // namespace media 1276 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698