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

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: Created 7 years, 3 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
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"
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 filter_collection_->SetDemuxer(demuxer_.get()); 87 filter_collection_->SetDemuxer(demuxer_.get());
88 88
89 video_renderer_ = new MockVideoRenderer(); 89 video_renderer_ = new MockVideoRenderer();
90 scoped_ptr<VideoRenderer> video_renderer(video_renderer_); 90 scoped_ptr<VideoRenderer> video_renderer(video_renderer_);
91 filter_collection_->SetVideoRenderer(video_renderer.Pass()); 91 filter_collection_->SetVideoRenderer(video_renderer.Pass());
92 92
93 audio_renderer_ = new MockAudioRenderer(); 93 audio_renderer_ = new MockAudioRenderer();
94 scoped_ptr<AudioRenderer> audio_renderer(audio_renderer_); 94 scoped_ptr<AudioRenderer> audio_renderer(audio_renderer_);
95 filter_collection_->SetAudioRenderer(audio_renderer.Pass()); 95 filter_collection_->SetAudioRenderer(audio_renderer.Pass());
96 96
97 text_renderer_ = new MockTextRenderer();
98 scoped_ptr<TextRenderer> text_renderer(text_renderer_);
99 filter_collection_->SetTextRenderer(text_renderer.Pass());
100
97 // InitializeDemuxer() adds overriding expectations for expected non-NULL 101 // InitializeDemuxer() adds overriding expectations for expected non-NULL
98 // streams. 102 // streams.
99 DemuxerStream* null_pointer = NULL; 103 DemuxerStream* null_pointer = NULL;
100 EXPECT_CALL(*demuxer_, GetStream(_)) 104 EXPECT_CALL(*demuxer_, GetStream(_))
101 .WillRepeatedly(Return(null_pointer)); 105 .WillRepeatedly(Return(null_pointer));
102 106
103 EXPECT_CALL(*demuxer_, GetStartTime()) 107 EXPECT_CALL(*demuxer_, GetStartTime())
104 .WillRepeatedly(Return(base::TimeDelta())); 108 .WillRepeatedly(Return(base::TimeDelta()));
105 } 109 }
106 110
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _)) 171 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _))
168 .WillOnce(DoAll(RunCallback<1>(PIPELINE_OK), 172 .WillOnce(DoAll(RunCallback<1>(PIPELINE_OK),
169 WithArg<6>(RunClosure<0>()))); // |disabled_cb|. 173 WithArg<6>(RunClosure<0>()))); // |disabled_cb|.
170 } else { 174 } else {
171 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _)) 175 EXPECT_CALL(*audio_renderer_, Initialize(stream, _, _, _, _, _, _, _))
172 .WillOnce(DoAll(SaveArg<4>(&audio_time_cb_), 176 .WillOnce(DoAll(SaveArg<4>(&audio_time_cb_),
173 RunCallback<1>(PIPELINE_OK))); 177 RunCallback<1>(PIPELINE_OK)));
174 } 178 }
175 } 179 }
176 180
181 // Sets up expectations to allow the text renderer to initialize.
182 void InitializeTextRenderer() {
183 EXPECT_CALL(*text_renderer_, Initialize(demuxer_.get(), _, _))
184 .WillOnce(RunCallback<1>(PIPELINE_OK));
185
186 // Startup sequence.
187 EXPECT_CALL(*text_renderer_, Play(_))
188 .WillOnce(RunClosure<0>());
189 }
190
177 // Sets up expectations on the callback and initializes the pipeline. Called 191 // Sets up expectations on the callback and initializes the pipeline. Called
178 // after tests have set expectations any filters they wish to use. 192 // after tests have set expectations any filters they wish to use.
179 void InitializePipeline(PipelineStatus start_status) { 193 void InitializePipeline(PipelineStatus start_status) {
180 EXPECT_CALL(callbacks_, OnStart(start_status)); 194 EXPECT_CALL(callbacks_, OnStart(start_status));
181 195
182 if (start_status == PIPELINE_OK) { 196 if (start_status == PIPELINE_OK) {
183 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kHaveMetadata)); 197 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kHaveMetadata));
184 EXPECT_CALL(*demuxer_, SetPlaybackRate(0.0f)); 198 EXPECT_CALL(*demuxer_, SetPlaybackRate(0.0f));
185 199
186 if (audio_stream_) { 200 if (audio_stream_) {
(...skipping 23 matching lines...) Expand all
210 224
211 void CreateAudioStream() { 225 void CreateAudioStream() {
212 audio_stream_ = CreateStream(DemuxerStream::AUDIO); 226 audio_stream_ = CreateStream(DemuxerStream::AUDIO);
213 } 227 }
214 228
215 void CreateVideoStream() { 229 void CreateVideoStream() {
216 video_stream_ = CreateStream(DemuxerStream::VIDEO); 230 video_stream_ = CreateStream(DemuxerStream::VIDEO);
217 video_stream_->set_video_decoder_config(video_decoder_config_); 231 video_stream_->set_video_decoder_config(video_decoder_config_);
218 } 232 }
219 233
234 void CreateTextStream() {
235 text_stream_ = CreateStream(DemuxerStream::TEXT);
236 }
237
220 MockDemuxerStream* audio_stream() { 238 MockDemuxerStream* audio_stream() {
221 return audio_stream_.get(); 239 return audio_stream_.get();
222 } 240 }
223 241
224 MockDemuxerStream* video_stream() { 242 MockDemuxerStream* video_stream() {
225 return video_stream_.get(); 243 return video_stream_.get();
226 } 244 }
227 245
246 MockDemuxerStream* text_stream() {
247 return text_stream_.get();
248 }
249
228 void ExpectSeek(const base::TimeDelta& seek_time) { 250 void ExpectSeek(const base::TimeDelta& seek_time) {
229 // Every filter should receive a call to Seek(). 251 // Every filter should receive a call to Seek().
230 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 252 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
231 .WillOnce(RunCallback<1>(PIPELINE_OK)); 253 .WillOnce(RunCallback<1>(PIPELINE_OK));
232 EXPECT_CALL(*demuxer_, SetPlaybackRate(_)); 254 EXPECT_CALL(*demuxer_, SetPlaybackRate(_));
233 255
234 if (audio_stream_) { 256 if (audio_stream_) {
235 EXPECT_CALL(*audio_renderer_, Pause(_)) 257 EXPECT_CALL(*audio_renderer_, Pause(_))
236 .WillOnce(RunClosure<0>()); 258 .WillOnce(RunClosure<0>());
237 EXPECT_CALL(*audio_renderer_, Flush(_)) 259 EXPECT_CALL(*audio_renderer_, Flush(_))
(...skipping 11 matching lines...) Expand all
249 .WillOnce(RunClosure<0>()); 271 .WillOnce(RunClosure<0>());
250 EXPECT_CALL(*video_renderer_, Flush(_)) 272 EXPECT_CALL(*video_renderer_, Flush(_))
251 .WillOnce(RunClosure<0>()); 273 .WillOnce(RunClosure<0>());
252 EXPECT_CALL(*video_renderer_, Preroll(seek_time, _)) 274 EXPECT_CALL(*video_renderer_, Preroll(seek_time, _))
253 .WillOnce(RunCallback<1>(PIPELINE_OK)); 275 .WillOnce(RunCallback<1>(PIPELINE_OK));
254 EXPECT_CALL(*video_renderer_, SetPlaybackRate(_)); 276 EXPECT_CALL(*video_renderer_, SetPlaybackRate(_));
255 EXPECT_CALL(*video_renderer_, Play(_)) 277 EXPECT_CALL(*video_renderer_, Play(_))
256 .WillOnce(RunClosure<0>()); 278 .WillOnce(RunClosure<0>());
257 } 279 }
258 280
281 if (text_stream_) {
282 EXPECT_CALL(*text_renderer_, Pause(_))
283 .WillOnce(RunClosure<0>());
284 EXPECT_CALL(*text_renderer_, Play(_))
285 .WillOnce(RunClosure<0>());
286 }
287
259 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted)); 288 EXPECT_CALL(callbacks_, OnBufferingState(Pipeline::kPrerollCompleted));
260 289
261 // We expect a successful seek callback. 290 // We expect a successful seek callback.
262 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 291 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
263 } 292 }
264 293
265 void DoSeek(const base::TimeDelta& seek_time) { 294 void DoSeek(const base::TimeDelta& seek_time) {
266 pipeline_->Seek(seek_time, 295 pipeline_->Seek(seek_time,
267 base::Bind(&CallbackHelper::OnSeek, 296 base::Bind(&CallbackHelper::OnSeek,
268 base::Unretained(&callbacks_))); 297 base::Unretained(&callbacks_)));
269 298
270 // We expect the time to be updated only after the seek has completed. 299 // We expect the time to be updated only after the seek has completed.
271 EXPECT_NE(seek_time, pipeline_->GetMediaTime()); 300 EXPECT_NE(seek_time, pipeline_->GetMediaTime());
272 message_loop_.RunUntilIdle(); 301 message_loop_.RunUntilIdle();
273 EXPECT_EQ(seek_time, pipeline_->GetMediaTime()); 302 EXPECT_EQ(seek_time, pipeline_->GetMediaTime());
274 } 303 }
275 304
276 void ExpectStop() { 305 void ExpectStop() {
277 if (demuxer_) 306 if (demuxer_)
278 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>()); 307 EXPECT_CALL(*demuxer_, Stop(_)).WillOnce(RunClosure<0>());
279 308
280 if (audio_stream_) 309 if (audio_stream_)
281 EXPECT_CALL(*audio_renderer_, Stop(_)).WillOnce(RunClosure<0>()); 310 EXPECT_CALL(*audio_renderer_, Stop(_)).WillOnce(RunClosure<0>());
282 311
283 if (video_stream_) 312 if (video_stream_)
284 EXPECT_CALL(*video_renderer_, Stop(_)).WillOnce(RunClosure<0>()); 313 EXPECT_CALL(*video_renderer_, Stop(_)).WillOnce(RunClosure<0>());
314
315 if (text_stream_)
316 EXPECT_CALL(*text_renderer_, Stop(_)).WillOnce(RunClosure<0>());
285 } 317 }
286 318
287 // Fixture members. 319 // Fixture members.
288 StrictMock<CallbackHelper> callbacks_; 320 StrictMock<CallbackHelper> callbacks_;
289 base::SimpleTestTickClock test_tick_clock_; 321 base::SimpleTestTickClock test_tick_clock_;
290 base::MessageLoop message_loop_; 322 base::MessageLoop message_loop_;
291 scoped_ptr<Pipeline> pipeline_; 323 scoped_ptr<Pipeline> pipeline_;
292 324
293 scoped_ptr<FilterCollection> filter_collection_; 325 scoped_ptr<FilterCollection> filter_collection_;
294 scoped_ptr<MockDemuxer> demuxer_; 326 scoped_ptr<MockDemuxer> demuxer_;
295 MockVideoRenderer* video_renderer_; 327 MockVideoRenderer* video_renderer_;
296 MockAudioRenderer* audio_renderer_; 328 MockAudioRenderer* audio_renderer_;
329 MockTextRenderer* text_renderer_;
297 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_; 330 scoped_ptr<StrictMock<MockDemuxerStream> > audio_stream_;
298 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_; 331 scoped_ptr<StrictMock<MockDemuxerStream> > video_stream_;
332 scoped_ptr<StrictMock<MockDemuxerStream> > text_stream_;
299 AudioRenderer::TimeCB audio_time_cb_; 333 AudioRenderer::TimeCB audio_time_cb_;
300 VideoDecoderConfig video_decoder_config_; 334 VideoDecoderConfig video_decoder_config_;
301 335
302 private: 336 private:
303 DISALLOW_COPY_AND_ASSIGN(PipelineTest); 337 DISALLOW_COPY_AND_ASSIGN(PipelineTest);
304 }; 338 };
305 339
306 // Test that playback controls methods no-op when the pipeline hasn't been 340 // Test that playback controls methods no-op when the pipeline hasn't been
307 // started. 341 // started.
308 TEST_F(PipelineTest, NotStarted) { 342 TEST_F(PipelineTest, NotStarted) {
309 const base::TimeDelta kZero; 343 const base::TimeDelta kZero;
310 344
311 EXPECT_FALSE(pipeline_->IsRunning()); 345 EXPECT_FALSE(pipeline_->IsRunning());
312 EXPECT_FALSE(pipeline_->HasAudio()); 346 EXPECT_FALSE(pipeline_->HasAudio());
313 EXPECT_FALSE(pipeline_->HasVideo()); 347 EXPECT_FALSE(pipeline_->HasVideo());
348 EXPECT_FALSE(pipeline_->HasText());
314 349
315 // Setting should still work. 350 // Setting should still work.
316 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate()); 351 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate());
317 pipeline_->SetPlaybackRate(-1.0f); 352 pipeline_->SetPlaybackRate(-1.0f);
318 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate()); 353 EXPECT_EQ(0.0f, pipeline_->GetPlaybackRate());
319 pipeline_->SetPlaybackRate(1.0f); 354 pipeline_->SetPlaybackRate(1.0f);
320 EXPECT_EQ(1.0f, pipeline_->GetPlaybackRate()); 355 EXPECT_EQ(1.0f, pipeline_->GetPlaybackRate());
321 356
322 // Setting should still work. 357 // Setting should still work.
323 EXPECT_EQ(1.0f, pipeline_->GetVolume()); 358 EXPECT_EQ(1.0f, pipeline_->GetVolume());
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 CreateAudioStream(); 422 CreateAudioStream();
388 MockDemuxerStreamVector streams; 423 MockDemuxerStreamVector streams;
389 streams.push_back(audio_stream()); 424 streams.push_back(audio_stream());
390 425
391 InitializeDemuxer(&streams); 426 InitializeDemuxer(&streams);
392 InitializeAudioRenderer(audio_stream(), false); 427 InitializeAudioRenderer(audio_stream(), false);
393 428
394 InitializePipeline(PIPELINE_OK); 429 InitializePipeline(PIPELINE_OK);
395 EXPECT_TRUE(pipeline_->HasAudio()); 430 EXPECT_TRUE(pipeline_->HasAudio());
396 EXPECT_FALSE(pipeline_->HasVideo()); 431 EXPECT_FALSE(pipeline_->HasVideo());
432 EXPECT_FALSE(pipeline_->HasText());
397 } 433 }
398 434
399 TEST_F(PipelineTest, VideoStream) { 435 TEST_F(PipelineTest, VideoStream) {
400 CreateVideoStream(); 436 CreateVideoStream();
401 MockDemuxerStreamVector streams; 437 MockDemuxerStreamVector streams;
402 streams.push_back(video_stream()); 438 streams.push_back(video_stream());
403 439
404 InitializeDemuxer(&streams); 440 InitializeDemuxer(&streams);
405 InitializeVideoRenderer(video_stream()); 441 InitializeVideoRenderer(video_stream());
406 442
407 InitializePipeline(PIPELINE_OK); 443 InitializePipeline(PIPELINE_OK);
408 EXPECT_FALSE(pipeline_->HasAudio()); 444 EXPECT_FALSE(pipeline_->HasAudio());
409 EXPECT_TRUE(pipeline_->HasVideo()); 445 EXPECT_TRUE(pipeline_->HasVideo());
446 EXPECT_FALSE(pipeline_->HasText());
410 } 447 }
411 448
412 TEST_F(PipelineTest, AudioVideoStream) { 449 TEST_F(PipelineTest, AudioVideoStream) {
413 CreateAudioStream(); 450 CreateAudioStream();
414 CreateVideoStream(); 451 CreateVideoStream();
415 MockDemuxerStreamVector streams; 452 MockDemuxerStreamVector streams;
416 streams.push_back(audio_stream()); 453 streams.push_back(audio_stream());
417 streams.push_back(video_stream()); 454 streams.push_back(video_stream());
418 455
419 InitializeDemuxer(&streams); 456 InitializeDemuxer(&streams);
420 InitializeAudioRenderer(audio_stream(), false); 457 InitializeAudioRenderer(audio_stream(), false);
421 InitializeVideoRenderer(video_stream()); 458 InitializeVideoRenderer(video_stream());
422 459
423 InitializePipeline(PIPELINE_OK); 460 InitializePipeline(PIPELINE_OK);
424 EXPECT_TRUE(pipeline_->HasAudio()); 461 EXPECT_TRUE(pipeline_->HasAudio());
425 EXPECT_TRUE(pipeline_->HasVideo()); 462 EXPECT_TRUE(pipeline_->HasVideo());
463 EXPECT_FALSE(pipeline_->HasText());
464 }
465
466 TEST_F(PipelineTest, VideoTextStream) {
fgalligan1 2013/09/04 22:23:09 Maybe add a Text only stream test that will fail.
467 CreateVideoStream();
468 CreateTextStream();
469 MockDemuxerStreamVector streams;
470 streams.push_back(video_stream());
471 streams.push_back(text_stream());
472
473 InitializeDemuxer(&streams);
474 InitializeVideoRenderer(video_stream());
475 InitializeTextRenderer();
476
477 InitializePipeline(PIPELINE_OK);
478 EXPECT_FALSE(pipeline_->HasAudio());
479 EXPECT_TRUE(pipeline_->HasVideo());
480 EXPECT_TRUE(pipeline_->HasText());
426 } 481 }
427 482
428 TEST_F(PipelineTest, Seek) { 483 TEST_F(PipelineTest, Seek) {
429 CreateAudioStream(); 484 CreateAudioStream();
430 CreateVideoStream(); 485 CreateVideoStream();
486 CreateTextStream();
431 MockDemuxerStreamVector streams; 487 MockDemuxerStreamVector streams;
432 streams.push_back(audio_stream()); 488 streams.push_back(audio_stream());
433 streams.push_back(video_stream()); 489 streams.push_back(video_stream());
490 streams.push_back(text_stream());
434 491
435 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000)); 492 InitializeDemuxer(&streams, base::TimeDelta::FromSeconds(3000));
436 InitializeAudioRenderer(audio_stream(), false); 493 InitializeAudioRenderer(audio_stream(), false);
437 InitializeVideoRenderer(video_stream()); 494 InitializeVideoRenderer(video_stream());
495 InitializeTextRenderer();
438 496
439 // Initialize then seek! 497 // Initialize then seek!
440 InitializePipeline(PIPELINE_OK); 498 InitializePipeline(PIPELINE_OK);
441 499
442 // Every filter should receive a call to Seek(). 500 // Every filter should receive a call to Seek().
443 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000); 501 base::TimeDelta expected = base::TimeDelta::FromSeconds(2000);
444 ExpectSeek(expected); 502 ExpectSeek(expected);
445 DoSeek(expected); 503 DoSeek(expected);
446 } 504 }
447 505
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 streams.push_back(audio_stream()); 594 streams.push_back(audio_stream());
537 streams.push_back(video_stream()); 595 streams.push_back(video_stream());
538 596
539 InitializeDemuxer(&streams); 597 InitializeDemuxer(&streams);
540 InitializeAudioRenderer(audio_stream(), false); 598 InitializeAudioRenderer(audio_stream(), false);
541 InitializeVideoRenderer(video_stream()); 599 InitializeVideoRenderer(video_stream());
542 600
543 InitializePipeline(PIPELINE_OK); 601 InitializePipeline(PIPELINE_OK);
544 EXPECT_TRUE(pipeline_->HasAudio()); 602 EXPECT_TRUE(pipeline_->HasAudio());
545 EXPECT_TRUE(pipeline_->HasVideo()); 603 EXPECT_TRUE(pipeline_->HasVideo());
604 EXPECT_FALSE(pipeline_->HasText());
546 605
547 EXPECT_CALL(*demuxer_, OnAudioRendererDisabled()); 606 EXPECT_CALL(*demuxer_, OnAudioRendererDisabled());
548 pipeline_->OnAudioDisabled(); 607 pipeline_->OnAudioDisabled();
549 608
550 // Verify that ended event is fired when video ends. 609 // Verify that ended event is fired when video ends.
551 EXPECT_CALL(callbacks_, OnEnded()); 610 EXPECT_CALL(callbacks_, OnEnded());
552 pipeline_->OnVideoRendererEnded(); 611 pipeline_->OnVideoRendererEnded();
553 } 612 }
554 613
555 TEST_F(PipelineTest, DisableAudioRendererDuringInit) { 614 TEST_F(PipelineTest, DisableAudioRendererDuringInit) {
556 CreateAudioStream(); 615 CreateAudioStream();
557 CreateVideoStream(); 616 CreateVideoStream();
558 MockDemuxerStreamVector streams; 617 MockDemuxerStreamVector streams;
559 streams.push_back(audio_stream()); 618 streams.push_back(audio_stream());
560 streams.push_back(video_stream()); 619 streams.push_back(video_stream());
561 620
562 InitializeDemuxer(&streams); 621 InitializeDemuxer(&streams);
563 InitializeAudioRenderer(audio_stream(), true); 622 InitializeAudioRenderer(audio_stream(), true);
564 InitializeVideoRenderer(video_stream()); 623 InitializeVideoRenderer(video_stream());
565 624
566 EXPECT_CALL(*demuxer_, OnAudioRendererDisabled()); 625 EXPECT_CALL(*demuxer_, OnAudioRendererDisabled());
567 626
568 InitializePipeline(PIPELINE_OK); 627 InitializePipeline(PIPELINE_OK);
569 EXPECT_FALSE(pipeline_->HasAudio()); 628 EXPECT_FALSE(pipeline_->HasAudio());
570 EXPECT_TRUE(pipeline_->HasVideo()); 629 EXPECT_TRUE(pipeline_->HasVideo());
630 EXPECT_FALSE(pipeline_->HasText());
571 631
572 // Verify that ended event is fired when video ends. 632 // Verify that ended event is fired when video ends.
573 EXPECT_CALL(callbacks_, OnEnded()); 633 EXPECT_CALL(callbacks_, OnEnded());
574 pipeline_->OnVideoRendererEnded(); 634 pipeline_->OnVideoRendererEnded();
575 } 635 }
576 636
577 TEST_F(PipelineTest, EndedCallback) { 637 TEST_F(PipelineTest, EndedCallback) {
578 CreateAudioStream(); 638 CreateAudioStream();
579 CreateVideoStream(); 639 CreateVideoStream();
640 CreateTextStream();
580 MockDemuxerStreamVector streams; 641 MockDemuxerStreamVector streams;
581 streams.push_back(audio_stream()); 642 streams.push_back(audio_stream());
582 streams.push_back(video_stream()); 643 streams.push_back(video_stream());
644 streams.push_back(text_stream());
583 645
584 InitializeDemuxer(&streams); 646 InitializeDemuxer(&streams);
585 InitializeAudioRenderer(audio_stream(), false); 647 InitializeAudioRenderer(audio_stream(), false);
586 InitializeVideoRenderer(video_stream()); 648 InitializeVideoRenderer(video_stream());
649 InitializeTextRenderer();
587 InitializePipeline(PIPELINE_OK); 650 InitializePipeline(PIPELINE_OK);
588 651
589 // The ended callback shouldn't run until both renderers have ended. 652 // The ended callback shouldn't run until all renderers have ended.
590 pipeline_->OnAudioRendererEnded(); 653 pipeline_->OnAudioRendererEnded();
591 message_loop_.RunUntilIdle(); 654 message_loop_.RunUntilIdle();
592 655
656 pipeline_->OnTextRendererEnded();
657 message_loop_.RunUntilIdle();
658
593 EXPECT_CALL(callbacks_, OnEnded()); 659 EXPECT_CALL(callbacks_, OnEnded());
594 pipeline_->OnVideoRendererEnded(); 660 pipeline_->OnVideoRendererEnded();
595 message_loop_.RunUntilIdle(); 661 message_loop_.RunUntilIdle();
596 } 662 }
597 663
598 TEST_F(PipelineTest, AudioStreamShorterThanVideo) { 664 TEST_F(PipelineTest, AudioStreamShorterThanVideo) {
599 base::TimeDelta duration = base::TimeDelta::FromSeconds(10); 665 base::TimeDelta duration = base::TimeDelta::FromSeconds(10);
600 666
601 CreateAudioStream(); 667 CreateAudioStream();
602 CreateVideoStream(); 668 CreateVideoStream();
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
740 MockDemuxerStreamVector streams; 806 MockDemuxerStreamVector streams;
741 streams.push_back(video_stream()); 807 streams.push_back(video_stream());
742 808
743 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); 809 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100);
744 InitializeDemuxer(&streams, kDuration); 810 InitializeDemuxer(&streams, kDuration);
745 InitializeVideoRenderer(video_stream()); 811 InitializeVideoRenderer(video_stream());
746 812
747 InitializePipeline(PIPELINE_OK); 813 InitializePipeline(PIPELINE_OK);
748 EXPECT_FALSE(pipeline_->HasAudio()); 814 EXPECT_FALSE(pipeline_->HasAudio());
749 EXPECT_TRUE(pipeline_->HasVideo()); 815 EXPECT_TRUE(pipeline_->HasVideo());
816 EXPECT_FALSE(pipeline_->HasText());
750 817
751 EXPECT_EQ(base::TimeDelta(), pipeline_->GetMediaTime()); 818 EXPECT_EQ(base::TimeDelta(), pipeline_->GetMediaTime());
752 } 819 }
753 820
754 TEST_F(PipelineTest, StartTimeIsNonZero) { 821 TEST_F(PipelineTest, StartTimeIsNonZero) {
755 const base::TimeDelta kStartTime = base::TimeDelta::FromSeconds(4); 822 const base::TimeDelta kStartTime = base::TimeDelta::FromSeconds(4);
756 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100); 823 const base::TimeDelta kDuration = base::TimeDelta::FromSeconds(100);
757 824
758 EXPECT_CALL(*demuxer_, GetStartTime()) 825 EXPECT_CALL(*demuxer_, GetStartTime())
759 .WillRepeatedly(Return(kStartTime)); 826 .WillRepeatedly(Return(kStartTime));
760 827
761 CreateVideoStream(); 828 CreateVideoStream();
762 MockDemuxerStreamVector streams; 829 MockDemuxerStreamVector streams;
763 streams.push_back(video_stream()); 830 streams.push_back(video_stream());
764 831
765 InitializeDemuxer(&streams, kDuration); 832 InitializeDemuxer(&streams, kDuration);
766 InitializeVideoRenderer(video_stream()); 833 InitializeVideoRenderer(video_stream());
767 834
768 InitializePipeline(PIPELINE_OK); 835 InitializePipeline(PIPELINE_OK);
769 EXPECT_FALSE(pipeline_->HasAudio()); 836 EXPECT_FALSE(pipeline_->HasAudio());
770 EXPECT_TRUE(pipeline_->HasVideo()); 837 EXPECT_TRUE(pipeline_->HasVideo());
838 EXPECT_FALSE(pipeline_->HasText());
771 839
772 EXPECT_EQ(kStartTime, pipeline_->GetMediaTime()); 840 EXPECT_EQ(kStartTime, pipeline_->GetMediaTime());
773 } 841 }
774 842
775 static void RunTimeCB(const AudioRenderer::TimeCB& time_cb, 843 static void RunTimeCB(const AudioRenderer::TimeCB& time_cb,
776 int time_in_ms, 844 int time_in_ms,
777 int max_time_in_ms) { 845 int max_time_in_ms) {
778 time_cb.Run(base::TimeDelta::FromMilliseconds(time_in_ms), 846 time_cb.Run(base::TimeDelta::FromMilliseconds(time_in_ms),
779 base::TimeDelta::FromMilliseconds(max_time_in_ms)); 847 base::TimeDelta::FromMilliseconds(max_time_in_ms));
780 } 848 }
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
1184 INSTANTIATE_TEARDOWN_TEST(Error, Pausing); 1252 INSTANTIATE_TEARDOWN_TEST(Error, Pausing);
1185 INSTANTIATE_TEARDOWN_TEST(Error, Flushing); 1253 INSTANTIATE_TEARDOWN_TEST(Error, Flushing);
1186 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); 1254 INSTANTIATE_TEARDOWN_TEST(Error, Seeking);
1187 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling); 1255 INSTANTIATE_TEARDOWN_TEST(Error, Prerolling);
1188 INSTANTIATE_TEARDOWN_TEST(Error, Starting); 1256 INSTANTIATE_TEARDOWN_TEST(Error, Starting);
1189 INSTANTIATE_TEARDOWN_TEST(Error, Playing); 1257 INSTANTIATE_TEARDOWN_TEST(Error, Playing);
1190 1258
1191 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); 1259 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing);
1192 1260
1193 } // namespace media 1261 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698