Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: media/filters/chunk_demuxer_unittest.cc

Issue 16867010: Move pending seek cancellation logic from ChunkDemuxerStream to ChunkDemuxer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address CR comments Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698