OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |