| 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 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 783 scoped_ptr<uint8[]> init_data, int init_data_size) { | 783 scoped_ptr<uint8[]> init_data, int init_data_size) { |
| 784 NeedKeyMock(type, init_data.get(), init_data_size); | 784 NeedKeyMock(type, init_data.get(), init_data_size); |
| 785 } | 785 } |
| 786 | 786 |
| 787 scoped_ptr<TextTrack> OnTextTrack(TextKind kind, | 787 scoped_ptr<TextTrack> OnTextTrack(TextKind kind, |
| 788 const std::string& label, | 788 const std::string& label, |
| 789 const std::string& language) { | 789 const std::string& language) { |
| 790 return scoped_ptr<TextTrack>(); | 790 return scoped_ptr<TextTrack>(); |
| 791 } | 791 } |
| 792 | 792 |
| 793 void Seek(base::TimeDelta seek_time) { |
| 794 demuxer_->StartWaitingForSeek(); |
| 795 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); |
| 796 message_loop_.RunUntilIdle(); |
| 797 } |
| 798 |
| 793 base::MessageLoop message_loop_; | 799 base::MessageLoop message_loop_; |
| 794 MockDemuxerHost host_; | 800 MockDemuxerHost host_; |
| 795 | 801 |
| 796 scoped_ptr<ChunkDemuxer> demuxer_; | 802 scoped_ptr<ChunkDemuxer> demuxer_; |
| 797 | 803 |
| 798 private: | 804 private: |
| 799 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); | 805 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); |
| 800 }; | 806 }; |
| 801 | 807 |
| 802 TEST_F(ChunkDemuxerTest, TestInit) { | 808 TEST_F(ChunkDemuxerTest, TestInit) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 877 // arrives. | 883 // arrives. |
| 878 TEST_F(ChunkDemuxerTest, TestAppendDataAfterSeek) { | 884 TEST_F(ChunkDemuxerTest, TestAppendDataAfterSeek) { |
| 879 ASSERT_TRUE(InitDemuxer(true, true)); | 885 ASSERT_TRUE(InitDemuxer(true, true)); |
| 880 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster()); | 886 scoped_ptr<Cluster> first_cluster(kDefaultFirstCluster()); |
| 881 AppendData(first_cluster->data(), first_cluster->size()); | 887 AppendData(first_cluster->data(), first_cluster->size()); |
| 882 | 888 |
| 883 InSequence s; | 889 InSequence s; |
| 884 | 890 |
| 885 EXPECT_CALL(*this, Checkpoint(1)); | 891 EXPECT_CALL(*this, Checkpoint(1)); |
| 886 | 892 |
| 887 demuxer_->Seek(base::TimeDelta::FromMilliseconds(46), | 893 Seek(base::TimeDelta::FromMilliseconds(46)); |
| 888 NewExpectedStatusCB(PIPELINE_OK)); | |
| 889 | 894 |
| 890 EXPECT_CALL(*this, Checkpoint(2)); | 895 EXPECT_CALL(*this, Checkpoint(2)); |
| 891 | 896 |
| 892 scoped_ptr<Cluster> cluster(kDefaultSecondCluster()); | 897 scoped_ptr<Cluster> cluster(kDefaultSecondCluster()); |
| 893 | 898 |
| 894 Checkpoint(1); | 899 Checkpoint(1); |
| 895 | 900 |
| 896 AppendData(cluster->data(), cluster->size()); | 901 AppendData(cluster->data(), cluster->size()); |
| 897 | 902 |
| 898 message_loop_.RunUntilIdle(); | 903 message_loop_.RunUntilIdle(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 928 AppendData(cluster_a->data(), first_append_size); | 933 AppendData(cluster_a->data(), first_append_size); |
| 929 | 934 |
| 930 ExpectRead(DemuxerStream::AUDIO, 0); | 935 ExpectRead(DemuxerStream::AUDIO, 0); |
| 931 ExpectRead(DemuxerStream::VIDEO, 0); | 936 ExpectRead(DemuxerStream::VIDEO, 0); |
| 932 ExpectRead(DemuxerStream::AUDIO, kAudioBlockDuration); | 937 ExpectRead(DemuxerStream::AUDIO, kAudioBlockDuration); |
| 933 // Note: We skip trying to read a video buffer here because computing | 938 // Note: We skip trying to read a video buffer here because computing |
| 934 // the duration for this block relies on successfully parsing the last block | 939 // the duration for this block relies on successfully parsing the last block |
| 935 // in the cluster the cluster. | 940 // in the cluster the cluster. |
| 936 ExpectRead(DemuxerStream::AUDIO, 2 * kAudioBlockDuration); | 941 ExpectRead(DemuxerStream::AUDIO, 2 * kAudioBlockDuration); |
| 937 | 942 |
| 938 demuxer_->StartWaitingForSeek(); | 943 Seek(base::TimeDelta::FromSeconds(5)); |
| 939 demuxer_->Seek(base::TimeDelta::FromSeconds(5), | |
| 940 NewExpectedStatusCB(PIPELINE_OK)); | |
| 941 | 944 |
| 942 // Append the rest of the cluster. | 945 // Append the rest of the cluster. |
| 943 AppendData(cluster_a->data() + first_append_size, second_append_size); | 946 AppendData(cluster_a->data() + first_append_size, second_append_size); |
| 944 | 947 |
| 945 // Append the new cluster and verify that only the blocks | 948 // Append the new cluster and verify that only the blocks |
| 946 // in the new cluster are returned. | 949 // in the new cluster are returned. |
| 947 scoped_ptr<Cluster> cluster_b(GenerateCluster(5000, 6)); | 950 scoped_ptr<Cluster> cluster_b(GenerateCluster(5000, 6)); |
| 948 AppendData(cluster_b->data(), cluster_b->size()); | 951 AppendData(cluster_b->data(), cluster_b->size()); |
| 949 GenerateExpectedReads(5000, 6); | 952 GenerateExpectedReads(5000, 6); |
| 950 } | 953 } |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1261 } | 1264 } |
| 1262 | 1265 |
| 1263 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringCanceledSeek) { | 1266 TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringCanceledSeek) { |
| 1264 ASSERT_TRUE(InitDemuxer(true, true)); | 1267 ASSERT_TRUE(InitDemuxer(true, true)); |
| 1265 | 1268 |
| 1266 AppendCluster(0, 10); | 1269 AppendCluster(0, 10); |
| 1267 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138))); | 1270 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138))); |
| 1268 demuxer_->EndOfStream(PIPELINE_OK); | 1271 demuxer_->EndOfStream(PIPELINE_OK); |
| 1269 | 1272 |
| 1270 // Start the first seek. | 1273 // Start the first seek. |
| 1271 demuxer_->StartWaitingForSeek(); | 1274 Seek(base::TimeDelta::FromMilliseconds(20)); |
| 1272 | |
| 1273 // Simulate the pipeline finally calling Seek(). | |
| 1274 demuxer_->Seek(base::TimeDelta::FromMilliseconds(20), | |
| 1275 NewExpectedStatusCB(PIPELINE_OK)); | |
| 1276 | 1275 |
| 1277 // Simulate another seek being requested before the first | 1276 // Simulate another seek being requested before the first |
| 1278 // seek has finished prerolling. | 1277 // seek has finished prerolling. |
| 1279 demuxer_->CancelPendingSeek(); | 1278 demuxer_->CancelPendingSeek(); |
| 1280 | 1279 |
| 1281 // Finish second seek. | 1280 // Finish second seek. |
| 1282 demuxer_->StartWaitingForSeek(); | 1281 Seek(base::TimeDelta::FromMilliseconds(30)); |
| 1283 demuxer_->Seek(base::TimeDelta::FromMilliseconds(30), | |
| 1284 NewExpectedStatusCB(PIPELINE_OK)); | |
| 1285 | 1282 |
| 1286 DemuxerStream::Status status; | 1283 DemuxerStream::Status status; |
| 1287 base::TimeDelta last_timestamp; | 1284 base::TimeDelta last_timestamp; |
| 1288 | 1285 |
| 1289 // Make sure audio can reach end of stream. | 1286 // Make sure audio can reach end of stream. |
| 1290 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); | 1287 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); |
| 1291 ASSERT_EQ(status, DemuxerStream::kOk); | 1288 ASSERT_EQ(status, DemuxerStream::kOk); |
| 1292 | 1289 |
| 1293 // Make sure video can reach end of stream. | 1290 // Make sure video can reach end of stream. |
| 1294 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); | 1291 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1594 } | 1591 } |
| 1595 | 1592 |
| 1596 TEST_F(ChunkDemuxerTest, TestSeekCanceled) { | 1593 TEST_F(ChunkDemuxerTest, TestSeekCanceled) { |
| 1597 ASSERT_TRUE(InitDemuxer(true, true)); | 1594 ASSERT_TRUE(InitDemuxer(true, true)); |
| 1598 | 1595 |
| 1599 // Append cluster at the beginning of the stream. | 1596 // Append cluster at the beginning of the stream. |
| 1600 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4)); | 1597 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4)); |
| 1601 AppendData(start_cluster->data(), start_cluster->size()); | 1598 AppendData(start_cluster->data(), start_cluster->size()); |
| 1602 | 1599 |
| 1603 // Seek to an unbuffered region. | 1600 // Seek to an unbuffered region. |
| 1604 demuxer_->StartWaitingForSeek(); | 1601 Seek(base::TimeDelta::FromSeconds(50)); |
| 1605 demuxer_->Seek(base::TimeDelta::FromSeconds(50), | |
| 1606 NewExpectedStatusCB(PIPELINE_OK)); | |
| 1607 | 1602 |
| 1608 // Attempt to read in unbuffered area; should not fulfill the read. | 1603 // Attempt to read in unbuffered area; should not fulfill the read. |
| 1609 bool audio_read_done = false; | 1604 bool audio_read_done = false; |
| 1610 bool video_read_done = false; | 1605 bool video_read_done = false; |
| 1611 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); | 1606 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); |
| 1612 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); | 1607 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); |
| 1613 EXPECT_FALSE(audio_read_done); | 1608 EXPECT_FALSE(audio_read_done); |
| 1614 EXPECT_FALSE(video_read_done); | 1609 EXPECT_FALSE(video_read_done); |
| 1615 | 1610 |
| 1616 // Now cancel the pending seek, which should flush the reads with empty | 1611 // Now cancel the pending seek, which should flush the reads with empty |
| 1617 // buffers. | 1612 // buffers. |
| 1618 demuxer_->CancelPendingSeek(); | 1613 demuxer_->CancelPendingSeek(); |
| 1619 EXPECT_TRUE(audio_read_done); | 1614 EXPECT_TRUE(audio_read_done); |
| 1620 EXPECT_TRUE(video_read_done); | 1615 EXPECT_TRUE(video_read_done); |
| 1621 | 1616 |
| 1622 // A seek back to the buffered region should succeed. | 1617 // A seek back to the buffered region should succeed. |
| 1623 demuxer_->StartWaitingForSeek(); | 1618 Seek(base::TimeDelta::FromSeconds(0)); |
| 1624 demuxer_->Seek(base::TimeDelta::FromSeconds(0), | |
| 1625 NewExpectedStatusCB(PIPELINE_OK)); | |
| 1626 GenerateExpectedReads(0, 4); | 1619 GenerateExpectedReads(0, 4); |
| 1627 } | 1620 } |
| 1628 | 1621 |
| 1629 TEST_F(ChunkDemuxerTest, TestSeekCanceledWhileWaitingForSeek) { | 1622 TEST_F(ChunkDemuxerTest, TestSeekCanceledWhileWaitingForSeek) { |
| 1630 ASSERT_TRUE(InitDemuxer(true, true)); | 1623 ASSERT_TRUE(InitDemuxer(true, true)); |
| 1631 | 1624 |
| 1632 // Append cluster at the beginning of the stream. | 1625 // Append cluster at the beginning of the stream. |
| 1633 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4)); | 1626 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4)); |
| 1634 AppendData(start_cluster->data(), start_cluster->size()); | 1627 AppendData(start_cluster->data(), start_cluster->size()); |
| 1635 | 1628 |
| 1636 // Start waiting for a seek. | 1629 // Start waiting for a seek. |
| 1637 demuxer_->StartWaitingForSeek(); | 1630 demuxer_->StartWaitingForSeek(); |
| 1638 | 1631 |
| 1639 // Now cancel the upcoming seek to an unbuffered region. | 1632 // Now cancel the upcoming seek to an unbuffered region. |
| 1640 demuxer_->CancelPendingSeek(); | 1633 demuxer_->CancelPendingSeek(); |
| 1641 demuxer_->Seek(base::TimeDelta::FromSeconds(50), | 1634 demuxer_->Seek(base::TimeDelta::FromSeconds(50), |
| 1642 NewExpectedStatusCB(PIPELINE_OK)); | 1635 NewExpectedStatusCB(PIPELINE_OK)); |
| 1643 | 1636 |
| 1644 // Read requests should be fulfilled with empty buffers. | 1637 // Read requests should be fulfilled with empty buffers. |
| 1645 bool audio_read_done = false; | 1638 bool audio_read_done = false; |
| 1646 bool video_read_done = false; | 1639 bool video_read_done = false; |
| 1647 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); | 1640 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); |
| 1648 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); | 1641 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); |
| 1649 EXPECT_TRUE(audio_read_done); | 1642 EXPECT_TRUE(audio_read_done); |
| 1650 EXPECT_TRUE(video_read_done); | 1643 EXPECT_TRUE(video_read_done); |
| 1651 | 1644 |
| 1652 // A seek back to the buffered region should succeed. | 1645 // A seek back to the buffered region should succeed. |
| 1653 demuxer_->StartWaitingForSeek(); | 1646 Seek(base::TimeDelta::FromSeconds(0)); |
| 1654 demuxer_->Seek(base::TimeDelta::FromSeconds(0), | |
| 1655 NewExpectedStatusCB(PIPELINE_OK)); | |
| 1656 GenerateExpectedReads(0, 4); | 1647 GenerateExpectedReads(0, 4); |
| 1657 } | 1648 } |
| 1658 | 1649 |
| 1659 // Test that Seek() successfully seeks to all source IDs. | 1650 // Test that Seek() successfully seeks to all source IDs. |
| 1660 TEST_F(ChunkDemuxerTest, TestSeekAudioAndVideoSources) { | 1651 TEST_F(ChunkDemuxerTest, TestSeekAudioAndVideoSources) { |
| 1661 std::string audio_id = "audio1"; | 1652 std::string audio_id = "audio1"; |
| 1662 std::string video_id = "video1"; | 1653 std::string video_id = "video1"; |
| 1663 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); | 1654 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); |
| 1664 | 1655 |
| 1665 scoped_ptr<Cluster> cluster_a1( | 1656 scoped_ptr<Cluster> cluster_a1( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1677 ReadAudio(base::Bind(&OnReadDone, | 1668 ReadAudio(base::Bind(&OnReadDone, |
| 1678 base::TimeDelta::FromMilliseconds(0), | 1669 base::TimeDelta::FromMilliseconds(0), |
| 1679 &audio_read_done)); | 1670 &audio_read_done)); |
| 1680 ReadVideo(base::Bind(&OnReadDone, | 1671 ReadVideo(base::Bind(&OnReadDone, |
| 1681 base::TimeDelta::FromMilliseconds(0), | 1672 base::TimeDelta::FromMilliseconds(0), |
| 1682 &video_read_done)); | 1673 &video_read_done)); |
| 1683 EXPECT_TRUE(audio_read_done); | 1674 EXPECT_TRUE(audio_read_done); |
| 1684 EXPECT_TRUE(video_read_done); | 1675 EXPECT_TRUE(video_read_done); |
| 1685 | 1676 |
| 1686 // Seek to 3 (an unbuffered region). | 1677 // Seek to 3 (an unbuffered region). |
| 1687 demuxer_->StartWaitingForSeek(); | 1678 Seek(base::TimeDelta::FromSeconds(3)); |
| 1688 demuxer_->Seek(base::TimeDelta::FromSeconds(3), | |
| 1689 NewExpectedStatusCB(PIPELINE_OK)); | |
| 1690 | 1679 |
| 1691 audio_read_done = false; | 1680 audio_read_done = false; |
| 1692 video_read_done = false; | 1681 video_read_done = false; |
| 1693 ReadAudio(base::Bind(&OnReadDone, | 1682 ReadAudio(base::Bind(&OnReadDone, |
| 1694 base::TimeDelta::FromSeconds(3), | 1683 base::TimeDelta::FromSeconds(3), |
| 1695 &audio_read_done)); | 1684 &audio_read_done)); |
| 1696 ReadVideo(base::Bind(&OnReadDone, | 1685 ReadVideo(base::Bind(&OnReadDone, |
| 1697 base::TimeDelta::FromSeconds(3), | 1686 base::TimeDelta::FromSeconds(3), |
| 1698 &video_read_done)); | 1687 &video_read_done)); |
| 1699 // Read()s should not return until after data is appended at the Seek point. | 1688 // Read()s should not return until after data is appended at the Seek point. |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1964 CheckExpectedRanges("{ [0,100) }"); | 1953 CheckExpectedRanges("{ [0,100) }"); |
| 1965 } | 1954 } |
| 1966 | 1955 |
| 1967 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodes) { | 1956 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodes) { |
| 1968 ASSERT_TRUE(InitDemuxer(true, true)); | 1957 ASSERT_TRUE(InitDemuxer(true, true)); |
| 1969 | 1958 |
| 1970 // Create a cluster where the video timecode begins 25ms after the audio. | 1959 // Create a cluster where the video timecode begins 25ms after the audio. |
| 1971 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 25, 8)); | 1960 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 25, 8)); |
| 1972 AppendData(start_cluster->data(), start_cluster->size()); | 1961 AppendData(start_cluster->data(), start_cluster->size()); |
| 1973 | 1962 |
| 1974 demuxer_->Seek(base::TimeDelta::FromSeconds(0), | 1963 Seek(base::TimeDelta::FromSeconds(0)); |
| 1975 NewExpectedStatusCB(PIPELINE_OK)); | |
| 1976 GenerateExpectedReads(0, 25, 8); | 1964 GenerateExpectedReads(0, 25, 8); |
| 1977 | 1965 |
| 1978 // Seek to 5 seconds. | 1966 // Seek to 5 seconds. |
| 1979 demuxer_->StartWaitingForSeek(); | 1967 Seek(base::TimeDelta::FromSeconds(5)); |
| 1980 demuxer_->Seek(base::TimeDelta::FromSeconds(5), | |
| 1981 NewExpectedStatusCB(PIPELINE_OK)); | |
| 1982 | 1968 |
| 1983 // Generate a cluster to fulfill this seek, where audio timecode begins 25ms | 1969 // Generate a cluster to fulfill this seek, where audio timecode begins 25ms |
| 1984 // after the video. | 1970 // after the video. |
| 1985 scoped_ptr<Cluster> middle_cluster(GenerateCluster(5025, 5000, 8)); | 1971 scoped_ptr<Cluster> middle_cluster(GenerateCluster(5025, 5000, 8)); |
| 1986 AppendData(middle_cluster->data(), middle_cluster->size()); | 1972 AppendData(middle_cluster->data(), middle_cluster->size()); |
| 1987 GenerateExpectedReads(5025, 5000, 8); | 1973 GenerateExpectedReads(5025, 5000, 8); |
| 1988 } | 1974 } |
| 1989 | 1975 |
| 1990 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodesSeparateSources) { | 1976 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodesSeparateSources) { |
| 1991 std::string audio_id = "audio1"; | 1977 std::string audio_id = "audio1"; |
| 1992 std::string video_id = "video1"; | 1978 std::string video_id = "video1"; |
| 1993 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); | 1979 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); |
| 1994 | 1980 |
| 1995 // Generate two streams where the video stream starts 5ms after the audio | 1981 // Generate two streams where the video stream starts 5ms after the audio |
| 1996 // stream and append them. | 1982 // stream and append them. |
| 1997 scoped_ptr<Cluster> cluster_v( | 1983 scoped_ptr<Cluster> cluster_v( |
| 1998 GenerateSingleStreamCluster(30, 4 * kVideoBlockDuration + 30, | 1984 GenerateSingleStreamCluster(30, 4 * kVideoBlockDuration + 30, |
| 1999 kVideoTrackNum, kVideoBlockDuration)); | 1985 kVideoTrackNum, kVideoBlockDuration)); |
| 2000 scoped_ptr<Cluster> cluster_a( | 1986 scoped_ptr<Cluster> cluster_a( |
| 2001 GenerateSingleStreamCluster(25, 4 * kAudioBlockDuration + 25, | 1987 GenerateSingleStreamCluster(25, 4 * kAudioBlockDuration + 25, |
| 2002 kAudioTrackNum, kAudioBlockDuration)); | 1988 kAudioTrackNum, kAudioBlockDuration)); |
| 2003 AppendData(audio_id, cluster_a->data(), cluster_a->size()); | 1989 AppendData(audio_id, cluster_a->data(), cluster_a->size()); |
| 2004 AppendData(video_id, cluster_v->data(), cluster_v->size()); | 1990 AppendData(video_id, cluster_v->data(), cluster_v->size()); |
| 2005 | 1991 |
| 2006 // Both streams should be able to fulfill a seek to 25. | 1992 // Both streams should be able to fulfill a seek to 25. |
| 2007 demuxer_->Seek(base::TimeDelta::FromMilliseconds(25), | 1993 Seek(base::TimeDelta::FromMilliseconds(25)); |
| 2008 NewExpectedStatusCB(PIPELINE_OK)); | |
| 2009 GenerateAudioStreamExpectedReads(25, 4); | 1994 GenerateAudioStreamExpectedReads(25, 4); |
| 2010 GenerateVideoStreamExpectedReads(30, 4); | 1995 GenerateVideoStreamExpectedReads(30, 4); |
| 2011 } | 1996 } |
| 2012 | 1997 |
| 2013 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodesOutOfRange) { | 1998 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodesOutOfRange) { |
| 2014 std::string audio_id = "audio1"; | 1999 std::string audio_id = "audio1"; |
| 2015 std::string video_id = "video1"; | 2000 std::string video_id = "video1"; |
| 2016 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); | 2001 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); |
| 2017 | 2002 |
| 2018 // Generate two streams where the video stream starts 10s after the audio | 2003 // Generate two streams where the video stream starts 10s after the audio |
| 2019 // stream and append them. | 2004 // stream and append them. |
| 2020 scoped_ptr<Cluster> cluster_v( | 2005 scoped_ptr<Cluster> cluster_v( |
| 2021 GenerateSingleStreamCluster(10000, 4 * kVideoBlockDuration + 10000, | 2006 GenerateSingleStreamCluster(10000, 4 * kVideoBlockDuration + 10000, |
| 2022 kVideoTrackNum, kVideoBlockDuration)); | 2007 kVideoTrackNum, kVideoBlockDuration)); |
| 2023 scoped_ptr<Cluster> cluster_a( | 2008 scoped_ptr<Cluster> cluster_a( |
| 2024 GenerateSingleStreamCluster(0, 4 * kAudioBlockDuration + 0, | 2009 GenerateSingleStreamCluster(0, 4 * kAudioBlockDuration + 0, |
| 2025 kAudioTrackNum, kAudioBlockDuration)); | 2010 kAudioTrackNum, kAudioBlockDuration)); |
| 2026 AppendData(audio_id, cluster_a->data(), cluster_a->size()); | 2011 AppendData(audio_id, cluster_a->data(), cluster_a->size()); |
| 2027 AppendData(video_id, cluster_v->data(), cluster_v->size()); | 2012 AppendData(video_id, cluster_v->data(), cluster_v->size()); |
| 2028 | 2013 |
| 2029 // Should not be able to fulfill a seek to 0. | 2014 // Should not be able to fulfill a seek to 0. |
| 2015 demuxer_->StartWaitingForSeek(); |
| 2030 demuxer_->Seek(base::TimeDelta::FromMilliseconds(0), | 2016 demuxer_->Seek(base::TimeDelta::FromMilliseconds(0), |
| 2031 NewExpectedStatusCB(PIPELINE_ERROR_ABORT)); | 2017 NewExpectedStatusCB(PIPELINE_ERROR_ABORT)); |
| 2032 ExpectRead(DemuxerStream::AUDIO, 0); | 2018 ExpectRead(DemuxerStream::AUDIO, 0); |
| 2033 ExpectEndOfStream(DemuxerStream::VIDEO); | 2019 ExpectEndOfStream(DemuxerStream::VIDEO); |
| 2034 } | 2020 } |
| 2035 | 2021 |
| 2036 TEST_F(ChunkDemuxerTest, TestClusterWithNoBuffers) { | 2022 TEST_F(ChunkDemuxerTest, TestClusterWithNoBuffers) { |
| 2037 ASSERT_TRUE(InitDemuxer(true, true)); | 2023 ASSERT_TRUE(InitDemuxer(true, true)); |
| 2038 | 2024 |
| 2039 // Generate and append an empty cluster beginning at 0. | 2025 // Generate and append an empty cluster beginning at 0. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2109 // Verify that we can read audio & video to the end w/o problems. | 2095 // Verify that we can read audio & video to the end w/o problems. |
| 2110 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); | 2096 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); |
| 2111 EXPECT_EQ(DemuxerStream::kOk, status); | 2097 EXPECT_EQ(DemuxerStream::kOk, status); |
| 2112 EXPECT_EQ(kLastAudioTimestamp, last_timestamp); | 2098 EXPECT_EQ(kLastAudioTimestamp, last_timestamp); |
| 2113 | 2099 |
| 2114 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); | 2100 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); |
| 2115 EXPECT_EQ(DemuxerStream::kOk, status); | 2101 EXPECT_EQ(DemuxerStream::kOk, status); |
| 2116 EXPECT_EQ(kLastVideoTimestamp, last_timestamp); | 2102 EXPECT_EQ(kLastVideoTimestamp, last_timestamp); |
| 2117 | 2103 |
| 2118 // Seek back to 0 and verify that we can read to the end again.. | 2104 // Seek back to 0 and verify that we can read to the end again.. |
| 2119 demuxer_->StartWaitingForSeek(); | 2105 Seek(base::TimeDelta::FromMilliseconds(0)); |
| 2120 demuxer_->Seek(base::TimeDelta::FromMilliseconds(0), | |
| 2121 NewExpectedStatusCB(PIPELINE_OK)); | |
| 2122 | 2106 |
| 2123 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); | 2107 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); |
| 2124 EXPECT_EQ(DemuxerStream::kOk, status); | 2108 EXPECT_EQ(DemuxerStream::kOk, status); |
| 2125 EXPECT_EQ(kLastAudioTimestamp, last_timestamp); | 2109 EXPECT_EQ(kLastAudioTimestamp, last_timestamp); |
| 2126 | 2110 |
| 2127 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); | 2111 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); |
| 2128 EXPECT_EQ(DemuxerStream::kOk, status); | 2112 EXPECT_EQ(DemuxerStream::kOk, status); |
| 2129 EXPECT_EQ(kLastVideoTimestamp, last_timestamp); | 2113 EXPECT_EQ(kLastVideoTimestamp, last_timestamp); |
| 2130 } | 2114 } |
| 2131 | 2115 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2271 | 2255 |
| 2272 // Fetch initial video config and verify it matches what we expect. | 2256 // Fetch initial video config and verify it matches what we expect. |
| 2273 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); | 2257 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); |
| 2274 ASSERT_TRUE(video_config_1.IsValidConfig()); | 2258 ASSERT_TRUE(video_config_1.IsValidConfig()); |
| 2275 EXPECT_EQ(video_config_1.natural_size().width(), 320); | 2259 EXPECT_EQ(video_config_1.natural_size().width(), 320); |
| 2276 EXPECT_EQ(video_config_1.natural_size().height(), 240); | 2260 EXPECT_EQ(video_config_1.natural_size().height(), 240); |
| 2277 | 2261 |
| 2278 ExpectRead(DemuxerStream::VIDEO, 0); | 2262 ExpectRead(DemuxerStream::VIDEO, 0); |
| 2279 | 2263 |
| 2280 // Seek to a location with a different config. | 2264 // Seek to a location with a different config. |
| 2281 demuxer_->Seek(base::TimeDelta::FromMilliseconds(527), | 2265 Seek(base::TimeDelta::FromMilliseconds(527)); |
| 2282 NewExpectedStatusCB(PIPELINE_OK)); | |
| 2283 | 2266 |
| 2284 // Verify that the config change is signalled. | 2267 // Verify that the config change is signalled. |
| 2285 ExpectConfigChanged(DemuxerStream::VIDEO); | 2268 ExpectConfigChanged(DemuxerStream::VIDEO); |
| 2286 | 2269 |
| 2287 // Fetch the new decoder config and verify it is what we expect. | 2270 // Fetch the new decoder config and verify it is what we expect. |
| 2288 const VideoDecoderConfig& video_config_2 = video->video_decoder_config(); | 2271 const VideoDecoderConfig& video_config_2 = video->video_decoder_config(); |
| 2289 ASSERT_TRUE(video_config_2.IsValidConfig()); | 2272 ASSERT_TRUE(video_config_2.IsValidConfig()); |
| 2290 EXPECT_EQ(video_config_2.natural_size().width(), 640); | 2273 EXPECT_EQ(video_config_2.natural_size().width(), 640); |
| 2291 EXPECT_EQ(video_config_2.natural_size().height(), 360); | 2274 EXPECT_EQ(video_config_2.natural_size().height(), 360); |
| 2292 | 2275 |
| 2293 // Verify that Read() will return a buffer now. | 2276 // Verify that Read() will return a buffer now. |
| 2294 ExpectRead(DemuxerStream::VIDEO, 527); | 2277 ExpectRead(DemuxerStream::VIDEO, 527); |
| 2295 | 2278 |
| 2296 // Seek back to the beginning and verify we get another config change. | 2279 // Seek back to the beginning and verify we get another config change. |
| 2297 demuxer_->Seek(base::TimeDelta::FromMilliseconds(0), | 2280 Seek(base::TimeDelta::FromMilliseconds(0)); |
| 2298 NewExpectedStatusCB(PIPELINE_OK)); | |
| 2299 ExpectConfigChanged(DemuxerStream::VIDEO); | 2281 ExpectConfigChanged(DemuxerStream::VIDEO); |
| 2300 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); | 2282 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); |
| 2301 ExpectRead(DemuxerStream::VIDEO, 0); | 2283 ExpectRead(DemuxerStream::VIDEO, 0); |
| 2302 | 2284 |
| 2303 // Seek to a location that requires a config change and then | 2285 // Seek to a location that requires a config change and then |
| 2304 // seek to a new location that has the same configuration as | 2286 // seek to a new location that has the same configuration as |
| 2305 // the start of the file without a Read() in the middle. | 2287 // the start of the file without a Read() in the middle. |
| 2306 demuxer_->Seek(base::TimeDelta::FromMilliseconds(527), | 2288 Seek(base::TimeDelta::FromMilliseconds(527)); |
| 2307 NewExpectedStatusCB(PIPELINE_OK)); | 2289 Seek(base::TimeDelta::FromMilliseconds(801)); |
| 2308 demuxer_->Seek(base::TimeDelta::FromMilliseconds(801), | |
| 2309 NewExpectedStatusCB(PIPELINE_OK)); | |
| 2310 | 2290 |
| 2311 // Verify that no config change is signalled. | 2291 // Verify that no config change is signalled. |
| 2312 ExpectRead(DemuxerStream::VIDEO, 801); | 2292 ExpectRead(DemuxerStream::VIDEO, 801); |
| 2313 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); | 2293 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); |
| 2314 } | 2294 } |
| 2315 | 2295 |
| 2316 TEST_F(ChunkDemuxerTest, TestTimestampPositiveOffset) { | 2296 TEST_F(ChunkDemuxerTest, TestTimestampPositiveOffset) { |
| 2317 ASSERT_TRUE(InitDemuxer(true, true)); | 2297 ASSERT_TRUE(InitDemuxer(true, true)); |
| 2318 | 2298 |
| 2319 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2299 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
| 2320 kSourceId, base::TimeDelta::FromSeconds(30))); | 2300 kSourceId, base::TimeDelta::FromSeconds(30))); |
| 2321 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); | 2301 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); |
| 2322 AppendData(cluster->data(), cluster->size()); | 2302 AppendData(cluster->data(), cluster->size()); |
| 2323 | 2303 |
| 2324 demuxer_->StartWaitingForSeek(); | 2304 Seek(base::TimeDelta::FromMilliseconds(30000)); |
| 2325 demuxer_->Seek(base::TimeDelta::FromMilliseconds(30000), | |
| 2326 NewExpectedStatusCB(PIPELINE_OK)); | |
| 2327 | 2305 |
| 2328 GenerateExpectedReads(30000, 2); | 2306 GenerateExpectedReads(30000, 2); |
| 2329 } | 2307 } |
| 2330 | 2308 |
| 2331 TEST_F(ChunkDemuxerTest, TestTimestampNegativeOffset) { | 2309 TEST_F(ChunkDemuxerTest, TestTimestampNegativeOffset) { |
| 2332 ASSERT_TRUE(InitDemuxer(true, true)); | 2310 ASSERT_TRUE(InitDemuxer(true, true)); |
| 2333 | 2311 |
| 2334 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2312 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
| 2335 kSourceId, base::TimeDelta::FromSeconds(-1))); | 2313 kSourceId, base::TimeDelta::FromSeconds(-1))); |
| 2336 scoped_ptr<Cluster> cluster = GenerateCluster(1000, 2); | 2314 scoped_ptr<Cluster> cluster = GenerateCluster(1000, 2); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2364 | 2342 |
| 2365 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2343 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
| 2366 audio_id, base::TimeDelta::FromMilliseconds(-2500))); | 2344 audio_id, base::TimeDelta::FromMilliseconds(-2500))); |
| 2367 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2345 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
| 2368 video_id, base::TimeDelta::FromMilliseconds(-2500))); | 2346 video_id, base::TimeDelta::FromMilliseconds(-2500))); |
| 2369 AppendData(audio_id, cluster_a1->data(), cluster_a1->size()); | 2347 AppendData(audio_id, cluster_a1->data(), cluster_a1->size()); |
| 2370 AppendData(video_id, cluster_v1->data(), cluster_v1->size()); | 2348 AppendData(video_id, cluster_v1->data(), cluster_v1->size()); |
| 2371 GenerateAudioStreamExpectedReads(0, 4); | 2349 GenerateAudioStreamExpectedReads(0, 4); |
| 2372 GenerateVideoStreamExpectedReads(0, 4); | 2350 GenerateVideoStreamExpectedReads(0, 4); |
| 2373 | 2351 |
| 2374 demuxer_->StartWaitingForSeek(); | 2352 Seek(base::TimeDelta::FromMilliseconds(27300)); |
| 2375 demuxer_->Seek(base::TimeDelta::FromMilliseconds(27300), | |
| 2376 NewExpectedStatusCB(PIPELINE_OK)); | |
| 2377 | 2353 |
| 2378 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2354 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
| 2379 audio_id, base::TimeDelta::FromMilliseconds(27300))); | 2355 audio_id, base::TimeDelta::FromMilliseconds(27300))); |
| 2380 ASSERT_TRUE(demuxer_->SetTimestampOffset( | 2356 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
| 2381 video_id, base::TimeDelta::FromMilliseconds(27300))); | 2357 video_id, base::TimeDelta::FromMilliseconds(27300))); |
| 2382 AppendData(audio_id, cluster_a2->data(), cluster_a2->size()); | 2358 AppendData(audio_id, cluster_a2->data(), cluster_a2->size()); |
| 2383 AppendData(video_id, cluster_v2->data(), cluster_v2->size()); | 2359 AppendData(video_id, cluster_v2->data(), cluster_v2->size()); |
| 2384 GenerateVideoStreamExpectedReads(27300, 4); | 2360 GenerateVideoStreamExpectedReads(27300, 4); |
| 2385 GenerateAudioStreamExpectedReads(27300, 4); | 2361 GenerateAudioStreamExpectedReads(27300, 4); |
| 2386 } | 2362 } |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2566 // Verify that the reads don't complete. | 2542 // Verify that the reads don't complete. |
| 2567 EXPECT_FALSE(audio_read_done); | 2543 EXPECT_FALSE(audio_read_done); |
| 2568 EXPECT_FALSE(video_read_done); | 2544 EXPECT_FALSE(video_read_done); |
| 2569 | 2545 |
| 2570 demuxer_->EndOfStream(PIPELINE_OK); | 2546 demuxer_->EndOfStream(PIPELINE_OK); |
| 2571 | 2547 |
| 2572 EXPECT_TRUE(audio_read_done); | 2548 EXPECT_TRUE(audio_read_done); |
| 2573 EXPECT_TRUE(video_read_done); | 2549 EXPECT_TRUE(video_read_done); |
| 2574 } | 2550 } |
| 2575 | 2551 |
| 2552 TEST_F(ChunkDemuxerTest, TestCanceledSeekDuringInitialPreroll) { |
| 2553 ASSERT_TRUE(InitDemuxer(true, true)); |
| 2554 |
| 2555 // Cancel preroll. |
| 2556 demuxer_->CancelPendingSeek(); |
| 2557 |
| 2558 // Initiate the seek to the new location. |
| 2559 int seek_time_in_ms = 200; |
| 2560 Seek(base::TimeDelta::FromMilliseconds(seek_time_in_ms)); |
| 2561 |
| 2562 // Append data to satisfy the seek. |
| 2563 AppendCluster(seek_time_in_ms, 10); |
| 2564 } |
| 2565 |
| 2576 } // namespace media | 2566 } // namespace media |
| OLD | NEW |