OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/bind.h" | 5 #include "base/bind.h" |
6 #include "media/base/mock_callback.h" | 6 #include "media/base/mock_callback.h" |
7 #include "media/base/mock_filter_host.h" | 7 #include "media/base/mock_filter_host.h" |
8 #include "media/base/test_data_util.h" | 8 #include "media/base/test_data_util.h" |
9 #include "media/filters/chunk_demuxer.h" | 9 #include "media/filters/chunk_demuxer.h" |
10 #include "media/filters/chunk_demuxer_client.h" | 10 #include "media/filters/chunk_demuxer_client.h" |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 AddSimpleBlock(&cb, kVideoTrackNum, 0); | 457 AddSimpleBlock(&cb, kVideoTrackNum, 0); |
458 AddSimpleBlock(&cb, kAudioTrackNum, 23); | 458 AddSimpleBlock(&cb, kAudioTrackNum, 23); |
459 AddSimpleBlock(&cb, kVideoTrackNum, 33); | 459 AddSimpleBlock(&cb, kVideoTrackNum, 33); |
460 scoped_ptr<Cluster> cluster(cb.Finish()); | 460 scoped_ptr<Cluster> cluster(cb.Finish()); |
461 AppendData(cluster->data(), cluster->size()); | 461 AppendData(cluster->data(), cluster->size()); |
462 | 462 |
463 EXPECT_CALL(mock_filter_host_, SetError(PIPELINE_ERROR_NETWORK)); | 463 EXPECT_CALL(mock_filter_host_, SetError(PIPELINE_ERROR_NETWORK)); |
464 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); | 464 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); |
465 } | 465 } |
466 | 466 |
| 467 // Helper class to reduce duplicate code when testing end of stream |
| 468 // Read() behavior. |
| 469 class EndOfStreamHelper { |
| 470 public: |
| 471 EndOfStreamHelper(const scoped_refptr<Demuxer> demuxer) |
| 472 : demuxer_(demuxer), |
| 473 audio_read_done_(false), |
| 474 video_read_done_(false) { |
| 475 } |
| 476 |
| 477 // Request a read on the audio and video streams. |
| 478 void RequestReads() { |
| 479 EXPECT_FALSE(audio_read_done_); |
| 480 EXPECT_FALSE(video_read_done_); |
| 481 |
| 482 scoped_refptr<DemuxerStream> audio = |
| 483 demuxer_->GetStream(DemuxerStream::AUDIO); |
| 484 scoped_refptr<DemuxerStream> video = |
| 485 demuxer_->GetStream(DemuxerStream::VIDEO); |
| 486 |
| 487 audio->Read(base::Bind(&OnEndOfStreamReadDone, |
| 488 &audio_read_done_)); |
| 489 |
| 490 video->Read(base::Bind(&OnEndOfStreamReadDone, |
| 491 &video_read_done_)); |
| 492 } |
| 493 |
| 494 // Check to see if |audio_read_done_| and |video_read_done_| variables |
| 495 // match |expected|. |
| 496 void CheckIfReadDonesWereCalled(bool expected) { |
| 497 EXPECT_EQ(expected, audio_read_done_); |
| 498 EXPECT_EQ(expected, video_read_done_); |
| 499 } |
| 500 |
| 501 private: |
| 502 static void OnEndOfStreamReadDone(bool* called, Buffer* buffer) { |
| 503 EXPECT_TRUE(buffer->IsEndOfStream()); |
| 504 *called = true; |
| 505 } |
| 506 |
| 507 scoped_refptr<Demuxer> demuxer_; |
| 508 bool audio_read_done_; |
| 509 bool video_read_done_; |
| 510 |
| 511 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); |
| 512 }; |
| 513 |
| 514 // Make sure that all pending reads that we don't have media data for get an |
| 515 // "end of stream" buffer when EndOfStream() is called. |
| 516 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) { |
| 517 InitDemuxer(true, true); |
| 518 |
| 519 scoped_refptr<DemuxerStream> audio = |
| 520 demuxer_->GetStream(DemuxerStream::AUDIO); |
| 521 scoped_refptr<DemuxerStream> video = |
| 522 demuxer_->GetStream(DemuxerStream::VIDEO); |
| 523 |
| 524 bool audio_read_done_1 = false; |
| 525 bool video_read_done_1 = false; |
| 526 EndOfStreamHelper end_of_stream_helper_1(demuxer_); |
| 527 EndOfStreamHelper end_of_stream_helper_2(demuxer_); |
| 528 |
| 529 audio->Read(base::Bind(&OnReadDone, |
| 530 base::TimeDelta::FromMilliseconds(32), |
| 531 &audio_read_done_1)); |
| 532 |
| 533 video->Read(base::Bind(&OnReadDone, |
| 534 base::TimeDelta::FromMilliseconds(123), |
| 535 &video_read_done_1)); |
| 536 |
| 537 end_of_stream_helper_1.RequestReads(); |
| 538 end_of_stream_helper_2.RequestReads(); |
| 539 |
| 540 ClusterBuilder cb; |
| 541 cb.SetClusterTimecode(0); |
| 542 AddSimpleBlock(&cb, kAudioTrackNum, 32); |
| 543 AddSimpleBlock(&cb, kVideoTrackNum, 123); |
| 544 scoped_ptr<Cluster> cluster(cb.Finish()); |
| 545 |
| 546 AppendData(cluster->data(), cluster->size()); |
| 547 |
| 548 EXPECT_TRUE(audio_read_done_1); |
| 549 EXPECT_TRUE(video_read_done_1); |
| 550 end_of_stream_helper_1.CheckIfReadDonesWereCalled(false); |
| 551 end_of_stream_helper_2.CheckIfReadDonesWereCalled(false); |
| 552 |
| 553 demuxer_->EndOfStream(PIPELINE_OK); |
| 554 |
| 555 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true); |
| 556 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); |
| 557 } |
| 558 |
| 559 // Make sure that all Read() calls after we get an EndOfStream() |
| 560 // call return an "end of stream" buffer. |
| 561 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { |
| 562 InitDemuxer(true, true); |
| 563 |
| 564 scoped_refptr<DemuxerStream> audio = |
| 565 demuxer_->GetStream(DemuxerStream::AUDIO); |
| 566 scoped_refptr<DemuxerStream> video = |
| 567 demuxer_->GetStream(DemuxerStream::VIDEO); |
| 568 |
| 569 bool audio_read_done_1 = false; |
| 570 bool video_read_done_1 = false; |
| 571 EndOfStreamHelper end_of_stream_helper_1(demuxer_); |
| 572 EndOfStreamHelper end_of_stream_helper_2(demuxer_); |
| 573 EndOfStreamHelper end_of_stream_helper_3(demuxer_); |
| 574 |
| 575 audio->Read(base::Bind(&OnReadDone, |
| 576 base::TimeDelta::FromMilliseconds(32), |
| 577 &audio_read_done_1)); |
| 578 |
| 579 video->Read(base::Bind(&OnReadDone, |
| 580 base::TimeDelta::FromMilliseconds(123), |
| 581 &video_read_done_1)); |
| 582 |
| 583 end_of_stream_helper_1.RequestReads(); |
| 584 |
| 585 ClusterBuilder cb; |
| 586 cb.SetClusterTimecode(0); |
| 587 AddSimpleBlock(&cb, kAudioTrackNum, 32); |
| 588 AddSimpleBlock(&cb, kVideoTrackNum, 123); |
| 589 scoped_ptr<Cluster> cluster(cb.Finish()); |
| 590 |
| 591 AppendData(cluster->data(), cluster->size()); |
| 592 |
| 593 EXPECT_TRUE(audio_read_done_1); |
| 594 EXPECT_TRUE(video_read_done_1); |
| 595 end_of_stream_helper_1.CheckIfReadDonesWereCalled(false); |
| 596 |
| 597 demuxer_->EndOfStream(PIPELINE_OK); |
| 598 |
| 599 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true); |
| 600 |
| 601 // Request a few more reads and make sure we immediately get |
| 602 // end of stream buffers. |
| 603 end_of_stream_helper_2.RequestReads(); |
| 604 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); |
| 605 |
| 606 end_of_stream_helper_3.RequestReads(); |
| 607 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true); |
| 608 } |
| 609 |
467 } // namespace media | 610 } // namespace media |
OLD | NEW |