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 |