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 <algorithm> | 5 #include <algorithm> |
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 "media/base/audio_decoder_config.h" | 9 #include "media/base/audio_decoder_config.h" |
10 #include "media/base/decoder_buffer.h" | 10 #include "media/base/decoder_buffer.h" |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 // segment. | 453 // segment. |
454 AppendData(bear1->GetData(), 4370); | 454 AppendData(bear1->GetData(), 4370); |
455 AppendData(bear1->GetData() + 72737, 28183); | 455 AppendData(bear1->GetData() + 72737, 28183); |
456 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); | 456 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); |
457 | 457 |
458 demuxer_->EndOfStream(PIPELINE_OK); | 458 demuxer_->EndOfStream(PIPELINE_OK); |
459 return true; | 459 return true; |
460 } | 460 } |
461 | 461 |
462 void ShutdownDemuxer() { | 462 void ShutdownDemuxer() { |
463 if (demuxer_) | 463 if (demuxer_) { |
464 demuxer_->Shutdown(); | 464 demuxer_->Shutdown(); |
| 465 message_loop_.RunUntilIdle(); |
| 466 } |
465 } | 467 } |
466 | 468 |
467 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode) { | 469 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode) { |
468 uint8 data[] = { 0x00 }; | 470 uint8 data[] = { 0x00 }; |
469 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data)); | 471 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data)); |
470 } | 472 } |
471 | 473 |
472 scoped_ptr<Cluster> GenerateCluster(int timecode, int block_count) { | 474 scoped_ptr<Cluster> GenerateCluster(int timecode, int block_count) { |
473 return GenerateCluster(timecode, timecode, block_count); | 475 return GenerateCluster(timecode, timecode, block_count); |
474 } | 476 } |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
886 NewExpectedStatusCB(PIPELINE_OK)); | 888 NewExpectedStatusCB(PIPELINE_OK)); |
887 | 889 |
888 EXPECT_CALL(*this, Checkpoint(2)); | 890 EXPECT_CALL(*this, Checkpoint(2)); |
889 | 891 |
890 scoped_ptr<Cluster> cluster(kDefaultSecondCluster()); | 892 scoped_ptr<Cluster> cluster(kDefaultSecondCluster()); |
891 | 893 |
892 Checkpoint(1); | 894 Checkpoint(1); |
893 | 895 |
894 AppendData(cluster->data(), cluster->size()); | 896 AppendData(cluster->data(), cluster->size()); |
895 | 897 |
| 898 message_loop_.RunUntilIdle(); |
| 899 |
896 Checkpoint(2); | 900 Checkpoint(2); |
897 } | 901 } |
898 | 902 |
899 // Test that parsing errors are handled for clusters appended after init. | 903 // Test that parsing errors are handled for clusters appended after init. |
900 TEST_F(ChunkDemuxerTest, TestErrorWhileParsingClusterAfterInit) { | 904 TEST_F(ChunkDemuxerTest, TestErrorWhileParsingClusterAfterInit) { |
901 ASSERT_TRUE(InitDemuxer(true, true)); | 905 ASSERT_TRUE(InitDemuxer(true, true)); |
902 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster()); | 906 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster()); |
903 AppendData(first_cluster->data(), first_cluster->size()); | 907 AppendData(first_cluster->data(), first_cluster->size()); |
904 | 908 |
905 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); | 909 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); |
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1726 | 1730 |
1727 AppendData(cluster_a1->data(), cluster_a1->size()); | 1731 AppendData(cluster_a1->data(), cluster_a1->size()); |
1728 AppendData(cluster_v1->data(), cluster_v1->size()); | 1732 AppendData(cluster_v1->data(), cluster_v1->size()); |
1729 | 1733 |
1730 // Seeking past the end of video. | 1734 // Seeking past the end of video. |
1731 // Note: audio data is available for that seek point. | 1735 // Note: audio data is available for that seek point. |
1732 bool seek_cb_was_called = false; | 1736 bool seek_cb_was_called = false; |
1733 demuxer_->StartWaitingForSeek(); | 1737 demuxer_->StartWaitingForSeek(); |
1734 demuxer_->Seek(base::TimeDelta::FromMilliseconds(110), | 1738 demuxer_->Seek(base::TimeDelta::FromMilliseconds(110), |
1735 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); | 1739 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); |
| 1740 message_loop_.RunUntilIdle(); |
| 1741 |
1736 EXPECT_FALSE(seek_cb_was_called); | 1742 EXPECT_FALSE(seek_cb_was_called); |
1737 | 1743 |
1738 EXPECT_CALL(host_, SetDuration( | 1744 EXPECT_CALL(host_, SetDuration( |
1739 base::TimeDelta::FromMilliseconds(120))); | 1745 base::TimeDelta::FromMilliseconds(120))); |
1740 demuxer_->EndOfStream(PIPELINE_OK); | 1746 demuxer_->EndOfStream(PIPELINE_OK); |
| 1747 message_loop_.RunUntilIdle(); |
| 1748 |
1741 EXPECT_TRUE(seek_cb_was_called); | 1749 EXPECT_TRUE(seek_cb_was_called); |
1742 | 1750 |
1743 ShutdownDemuxer(); | 1751 ShutdownDemuxer(); |
1744 } | 1752 } |
1745 | 1753 |
1746 // Test that EndOfStream is ignored if coming during a pending seek | 1754 // Test that EndOfStream is ignored if coming during a pending seek |
1747 // whose seek time is before some existing ranges. | 1755 // whose seek time is before some existing ranges. |
1748 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringPendingSeek) { | 1756 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringPendingSeek) { |
1749 ASSERT_TRUE(InitDemuxer(true, true)); | 1757 ASSERT_TRUE(InitDemuxer(true, true)); |
1750 | 1758 |
1751 scoped_ptr<Cluster> cluster_a1( | 1759 scoped_ptr<Cluster> cluster_a1( |
1752 GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10)); | 1760 GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10)); |
1753 scoped_ptr<Cluster> cluster_v1( | 1761 scoped_ptr<Cluster> cluster_v1( |
1754 GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5)); | 1762 GenerateSingleStreamCluster(0, 100, kVideoTrackNum, 5)); |
1755 | 1763 |
1756 scoped_ptr<Cluster> cluster_a2( | 1764 scoped_ptr<Cluster> cluster_a2( |
1757 GenerateSingleStreamCluster(200, 300, kAudioTrackNum, 10)); | 1765 GenerateSingleStreamCluster(200, 300, kAudioTrackNum, 10)); |
1758 scoped_ptr<Cluster> cluster_v2( | 1766 scoped_ptr<Cluster> cluster_v2( |
1759 GenerateSingleStreamCluster(200, 300, kVideoTrackNum, 5)); | 1767 GenerateSingleStreamCluster(200, 300, kVideoTrackNum, 5)); |
1760 | 1768 |
1761 AppendData(cluster_a1->data(), cluster_a1->size()); | 1769 AppendData(cluster_a1->data(), cluster_a1->size()); |
1762 AppendData(cluster_v1->data(), cluster_v1->size()); | 1770 AppendData(cluster_v1->data(), cluster_v1->size()); |
1763 AppendData(cluster_a2->data(), cluster_a2->size()); | 1771 AppendData(cluster_a2->data(), cluster_a2->size()); |
1764 AppendData(cluster_v2->data(), cluster_v2->size()); | 1772 AppendData(cluster_v2->data(), cluster_v2->size()); |
1765 | 1773 |
1766 bool seek_cb_was_called = false; | 1774 bool seek_cb_was_called = false; |
1767 demuxer_->StartWaitingForSeek(); | 1775 demuxer_->StartWaitingForSeek(); |
1768 demuxer_->Seek(base::TimeDelta::FromMilliseconds(160), | 1776 demuxer_->Seek(base::TimeDelta::FromMilliseconds(160), |
1769 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); | 1777 base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); |
| 1778 message_loop_.RunUntilIdle(); |
| 1779 |
1770 EXPECT_FALSE(seek_cb_was_called); | 1780 EXPECT_FALSE(seek_cb_was_called); |
1771 | 1781 |
1772 EXPECT_CALL(host_, SetDuration( | 1782 EXPECT_CALL(host_, SetDuration( |
1773 base::TimeDelta::FromMilliseconds(300))); | 1783 base::TimeDelta::FromMilliseconds(300))); |
1774 demuxer_->EndOfStream(PIPELINE_OK); | 1784 demuxer_->EndOfStream(PIPELINE_OK); |
| 1785 message_loop_.RunUntilIdle(); |
| 1786 |
1775 EXPECT_FALSE(seek_cb_was_called); | 1787 EXPECT_FALSE(seek_cb_was_called); |
1776 | 1788 |
1777 scoped_ptr<Cluster> cluster_a3( | 1789 scoped_ptr<Cluster> cluster_a3( |
1778 GenerateSingleStreamCluster(140, 180, kAudioTrackNum, 10)); | 1790 GenerateSingleStreamCluster(140, 180, kAudioTrackNum, 10)); |
1779 scoped_ptr<Cluster> cluster_v3( | 1791 scoped_ptr<Cluster> cluster_v3( |
1780 GenerateSingleStreamCluster(140, 180, kVideoTrackNum, 5)); | 1792 GenerateSingleStreamCluster(140, 180, kVideoTrackNum, 5)); |
1781 AppendData(cluster_a3->data(), cluster_a3->size()); | 1793 AppendData(cluster_a3->data(), cluster_a3->size()); |
1782 AppendData(cluster_v3->data(), cluster_v3->size()); | 1794 AppendData(cluster_v3->data(), cluster_v3->size()); |
| 1795 |
| 1796 message_loop_.RunUntilIdle(); |
| 1797 |
1783 EXPECT_TRUE(seek_cb_was_called); | 1798 EXPECT_TRUE(seek_cb_was_called); |
1784 | 1799 |
1785 ShutdownDemuxer(); | 1800 ShutdownDemuxer(); |
1786 } | 1801 } |
1787 | 1802 |
1788 // Test ranges in an audio-only stream. | 1803 // Test ranges in an audio-only stream. |
1789 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { | 1804 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { |
1790 EXPECT_CALL(*this, DemuxerOpened()); | 1805 EXPECT_CALL(*this, DemuxerOpened()); |
1791 demuxer_->Initialize( | 1806 demuxer_->Initialize( |
1792 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); | 1807 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); |
(...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2552 EXPECT_FALSE(audio_read_done); | 2567 EXPECT_FALSE(audio_read_done); |
2553 EXPECT_FALSE(video_read_done); | 2568 EXPECT_FALSE(video_read_done); |
2554 | 2569 |
2555 demuxer_->EndOfStream(PIPELINE_OK); | 2570 demuxer_->EndOfStream(PIPELINE_OK); |
2556 | 2571 |
2557 EXPECT_TRUE(audio_read_done); | 2572 EXPECT_TRUE(audio_read_done); |
2558 EXPECT_TRUE(video_read_done); | 2573 EXPECT_TRUE(video_read_done); |
2559 } | 2574 } |
2560 | 2575 |
2561 } // namespace media | 2576 } // namespace media |
OLD | NEW |