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

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

Issue 10692053: Remove buffer duration calculation from WebMClusterParser and update SourceBufferStream accordingly (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase ToT + fix clang errors Created 8 years, 5 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') | media/filters/source_buffer_stream.h » ('j') | 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "media/base/audio_decoder_config.h" 6 #include "media/base/audio_decoder_config.h"
7 #include "media/base/decoder_buffer.h" 7 #include "media/base/decoder_buffer.h"
8 #include "media/base/mock_callback.h" 8 #include "media/base/mock_callback.h"
9 #include "media/base/mock_demuxer_host.h" 9 #include "media/base/mock_demuxer_host.h"
10 #include "media/base/test_data_util.h" 10 #include "media/base/test_data_util.h"
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 return demuxer_->AddId(source_id, type, codecs); 229 return demuxer_->AddId(source_id, type, codecs);
230 } 230 }
231 231
232 bool AppendData(const uint8* data, size_t length) { 232 bool AppendData(const uint8* data, size_t length) {
233 return AppendData(kSourceId, data, length); 233 return AppendData(kSourceId, data, length);
234 } 234 }
235 235
236 bool AppendData(const std::string& source_id, 236 bool AppendData(const std::string& source_id,
237 const uint8* data, size_t length) { 237 const uint8* data, size_t length) {
238 CHECK(length); 238 CHECK(length);
239 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()) 239 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber());
240 .WillRepeatedly(SaveArg<1>(&buffered_time_));
241 return demuxer_->AppendData(source_id, data, length); 240 return demuxer_->AppendData(source_id, data, length);
242 } 241 }
243 242
244 bool AppendDataInPieces(const uint8* data, size_t length) { 243 bool AppendDataInPieces(const uint8* data, size_t length) {
245 return AppendDataInPieces(data, length, 7); 244 return AppendDataInPieces(data, length, 7);
246 } 245 }
247 246
248 bool AppendDataInPieces(const uint8* data, size_t length, size_t piece_size) { 247 bool AppendDataInPieces(const uint8* data, size_t length, size_t piece_size) {
249 const uint8* start = data; 248 const uint8* start = data;
250 const uint8* end = data + length; 249 const uint8* end = data + length;
251 while (start < end) { 250 while (start < end) {
252 base::TimeDelta old_buffered_time = buffered_time_;
253 size_t append_size = std::min(piece_size, 251 size_t append_size = std::min(piece_size,
254 static_cast<size_t>(end - start)); 252 static_cast<size_t>(end - start));
255 if (!AppendData(start, append_size)) 253 if (!AppendData(start, append_size))
256 return false; 254 return false;
257 start += append_size; 255 start += append_size;
258
259 EXPECT_GE(buffered_time_, old_buffered_time);
260 } 256 }
261 return true; 257 return true;
262 } 258 }
263 259
264 bool AppendInitSegment(bool has_audio, bool has_video, 260 bool AppendInitSegment(bool has_audio, bool has_video,
265 bool video_content_encoded) { 261 bool video_content_encoded) {
266 return AppendInitSegment(kSourceId, has_audio, has_video, 262 return AppendInitSegment(kSourceId, has_audio, has_video,
267 video_content_encoded); 263 video_content_encoded);
268 } 264 }
269 265
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 &video_read_done)); 561 &video_read_done));
566 562
567 EXPECT_TRUE(video_read_done); 563 EXPECT_TRUE(video_read_done);
568 } 564 }
569 } 565 }
570 566
571 return true; 567 return true;
572 } 568 }
573 569
574 MockDemuxerHost host_; 570 MockDemuxerHost host_;
575 base::TimeDelta buffered_time_;
576 571
577 scoped_ptr<MockChunkDemuxerClient> client_; 572 scoped_ptr<MockChunkDemuxerClient> client_;
578 scoped_refptr<ChunkDemuxer> demuxer_; 573 scoped_refptr<ChunkDemuxer> demuxer_;
579 574
580 private: 575 private:
581 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); 576 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest);
582 }; 577 };
583 578
584 TEST_F(ChunkDemuxerTest, TestInit) { 579 TEST_F(ChunkDemuxerTest, TestInit) {
585 // Test no streams, audio-only, video-only, and audio & video scenarios, 580 // Test no streams, audio-only, video-only, and audio & video scenarios,
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 AddSimpleBlock(&cb, kAudioTrackNum, 5); 816 AddSimpleBlock(&cb, kAudioTrackNum, 5);
822 AddSimpleBlock(&cb, kVideoTrackNum, 5); 817 AddSimpleBlock(&cb, kVideoTrackNum, 5);
823 AddSimpleBlock(&cb, kAudioTrackNum, 4); 818 AddSimpleBlock(&cb, kAudioTrackNum, 4);
824 AddSimpleBlock(&cb, kVideoTrackNum, 7); 819 AddSimpleBlock(&cb, kVideoTrackNum, 7);
825 scoped_ptr<Cluster> cluster(cb.Finish()); 820 scoped_ptr<Cluster> cluster(cb.Finish());
826 821
827 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 822 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
828 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 823 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
829 } 824 }
830 825
831 TEST_F(ChunkDemuxerTest, TestMonotonicallyIncreasingTimestampsAcrossClusters) {
832 ASSERT_TRUE(InitDemuxer(true, true, false));
833
834 ClusterBuilder cb;
835
836 // Test monotonic increasing timestamps on a per stream
837 // basis across clusters.
838 cb.SetClusterTimecode(5);
839 AddSimpleBlock(&cb, kAudioTrackNum, 5);
840 AddSimpleBlock(&cb, kVideoTrackNum, 5);
841 scoped_ptr<Cluster> cluster_a(cb.Finish());
842
843 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
844
845 cb.SetClusterTimecode(4);
846 AddSimpleBlock(&cb, kAudioTrackNum, 4);
847 AddSimpleBlock(&cb, kVideoTrackNum, 7);
848 scoped_ptr<Cluster> cluster_b(cb.Finish());
849
850 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
851 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size()));
852
853 // Verify that AppendData() doesn't accept more data now.
854 scoped_ptr<Cluster> cluster_c(GenerateCluster(10, 2));
855 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_c->data(),
856 cluster_c->size()));
857 }
858
859 // Test the case where a cluster is passed to AppendData() before 826 // Test the case where a cluster is passed to AppendData() before
860 // INFO & TRACKS data. 827 // INFO & TRACKS data.
861 TEST_F(ChunkDemuxerTest, TestClusterBeforeInitSegment) { 828 TEST_F(ChunkDemuxerTest, TestClusterBeforeInitSegment) {
862 EXPECT_CALL(*client_, DemuxerOpened(_)); 829 EXPECT_CALL(*client_, DemuxerOpened(_));
863 demuxer_->Initialize( 830 demuxer_->Initialize(
864 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 831 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
865 832
866 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 833 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
867 834
868 scoped_ptr<Cluster> cluster(GenerateCluster(0, 1)); 835 scoped_ptr<Cluster> cluster(GenerateCluster(0, 1));
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
1093 {67, 6}, 1060 {67, 6},
1094 {100, 9}, 1061 {100, 9},
1095 {133, 12}, 1062 {133, 12},
1096 {kSkip, kSkip}, 1063 {kSkip, kSkip},
1097 }; 1064 };
1098 1065
1099 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps, 1066 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps,
1100 base::TimeDelta::FromMilliseconds(2744))); 1067 base::TimeDelta::FromMilliseconds(2744)));
1101 } 1068 }
1102 1069
1103 TEST_F(ChunkDemuxerTest, TestWebMFile_LiveAudioAndVideo) { 1070 // TODO(acolwell): Fix bear-320x240-live.webm so that all clusters begin with
1071 // keyframes and reenable test. (crbug.com/136438)
1072 TEST_F(ChunkDemuxerTest, DISABLED_TestWebMFile_LiveAudioAndVideo) {
1104 struct BufferTimestamps buffer_timestamps[] = { 1073 struct BufferTimestamps buffer_timestamps[] = {
1105 {0, 0}, 1074 {0, 0},
1106 {33, 3}, 1075 {33, 3},
1107 {67, 6}, 1076 {67, 6},
1108 {100, 9}, 1077 {100, 9},
1109 {133, 12}, 1078 {133, 12},
1110 {kSkip, kSkip}, 1079 {kSkip, kSkip},
1111 }; 1080 };
1112 1081
1113 ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps, 1082 ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps,
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1467 1436
1468 // Test a simple cluster. 1437 // Test a simple cluster.
1469 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 132, 1438 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 132,
1470 kVideoTrackNum, kVideoBlockDuration)); 1439 kVideoTrackNum, kVideoBlockDuration));
1471 1440
1472 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size())); 1441 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size()));
1473 1442
1474 CheckExpectedRanges("{ [0,132) }"); 1443 CheckExpectedRanges("{ [0,132) }");
1475 1444
1476 // Append a disjoint cluster to check for two separate ranges. 1445 // Append a disjoint cluster to check for two separate ranges.
1477 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(150, 249, 1446 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(200, 299,
1478 kVideoTrackNum, kVideoBlockDuration)); 1447 kVideoTrackNum, kVideoBlockDuration));
1479 1448
1480 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size())); 1449 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size()));
1481 1450
1482 CheckExpectedRanges("{ [0,132) [150,249) }"); 1451 CheckExpectedRanges("{ [0,132) [200,299) }");
1483 } 1452 }
1484 1453
1485 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { 1454 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) {
1486 ASSERT_TRUE(InitDemuxer(true, true, false)); 1455 ASSERT_TRUE(InitDemuxer(true, true, false));
1487 1456
1488 // Audio: 0 -> 23 1457 // Audio: 0 -> 23
1489 // Video: 0 -> 33 1458 // Video: 0 -> 33
1490 // Buffered Range: 0 -> 23 1459 // Buffered Range: 0 -> 23
1491 // Audio block duration is smaller than video block duration, 1460 // Audio block duration is smaller than video block duration,
1492 // so the buffered ranges should correspond to the audio blocks. 1461 // so the buffered ranges should correspond to the audio blocks.
1493 scoped_ptr<Cluster> cluster_a0( 1462 scoped_ptr<Cluster> cluster_a0(
1494 GenerateSingleStreamCluster(0, kAudioBlockDuration, kAudioTrackNum, 1463 GenerateSingleStreamCluster(0, kAudioBlockDuration, kAudioTrackNum,
1495 kAudioBlockDuration)); 1464 kAudioBlockDuration));
1496 1465
1497 scoped_ptr<Cluster> cluster_v0( 1466 scoped_ptr<Cluster> cluster_v0(
1498 GenerateSingleStreamCluster(0, kVideoBlockDuration, kVideoTrackNum, 1467 GenerateSingleStreamCluster(0, kVideoBlockDuration, kVideoTrackNum,
1499 kVideoBlockDuration)); 1468 kVideoBlockDuration));
1500 1469
1501 ASSERT_TRUE(AppendData(cluster_a0->data(), cluster_a0->size())); 1470 ASSERT_TRUE(AppendData(cluster_a0->data(), cluster_a0->size()));
1502 ASSERT_TRUE(AppendData(cluster_v0->data(), cluster_v0->size())); 1471 ASSERT_TRUE(AppendData(cluster_v0->data(), cluster_v0->size()));
1503 1472
1504 CheckExpectedRanges("{ [0,23) }"); 1473 CheckExpectedRanges("{ [0,23) }");
1505 1474
1506 // Audio: 100 -> 150 1475 // Audio: 300 -> 400
1507 // Video: 120 -> 170 1476 // Video: 320 -> 420
1508 // Buffered Range: 120 -> 150 (end overlap) 1477 // Buffered Range: 320 -> 400 (end overlap)
1509 scoped_ptr<Cluster> cluster_a1( 1478 scoped_ptr<Cluster> cluster_a1(
1510 GenerateSingleStreamCluster(100, 150, kAudioTrackNum, 50)); 1479 GenerateSingleStreamCluster(300, 400, kAudioTrackNum, 50));
1511 1480
1512 scoped_ptr<Cluster> cluster_v1( 1481 scoped_ptr<Cluster> cluster_v1(
1513 GenerateSingleStreamCluster(120, 170, kVideoTrackNum, 50)); 1482 GenerateSingleStreamCluster(320, 420, kVideoTrackNum, 50));
1514 1483
1515 ASSERT_TRUE(AppendData(cluster_a1->data(), cluster_a1->size())); 1484 ASSERT_TRUE(AppendData(cluster_a1->data(), cluster_a1->size()));
1516 ASSERT_TRUE(AppendData(cluster_v1->data(), cluster_v1->size())); 1485 ASSERT_TRUE(AppendData(cluster_v1->data(), cluster_v1->size()));
1517 1486
1518 CheckExpectedRanges("{ [0,23) [120,150) }"); 1487 CheckExpectedRanges("{ [0,23) [320,400) }");
1519 1488
1520 // Audio: 220 -> 290 1489 // Audio: 520 -> 590
1521 // Video: 200 -> 270 1490 // Video: 500 -> 570
1522 // Buffered Range: 220 -> 270 (front overlap) 1491 // Buffered Range: 520 -> 570 (front overlap)
1523 scoped_ptr<Cluster> cluster_a2( 1492 scoped_ptr<Cluster> cluster_a2(
1524 GenerateSingleStreamCluster(220, 290, kAudioTrackNum, 70)); 1493 GenerateSingleStreamCluster(520, 590, kAudioTrackNum, 70));
1525 1494
1526 scoped_ptr<Cluster> cluster_v2( 1495 scoped_ptr<Cluster> cluster_v2(
1527 GenerateSingleStreamCluster(200, 270, kVideoTrackNum, 70)); 1496 GenerateSingleStreamCluster(500, 570, kVideoTrackNum, 70));
1528 1497
1529 ASSERT_TRUE(AppendData(cluster_a2->data(), cluster_a2->size())); 1498 ASSERT_TRUE(AppendData(cluster_a2->data(), cluster_a2->size()));
1530 ASSERT_TRUE(AppendData(cluster_v2->data(), cluster_v2->size())); 1499 ASSERT_TRUE(AppendData(cluster_v2->data(), cluster_v2->size()));
1531 1500
1532 CheckExpectedRanges("{ [0,23) [120,150) [220,270) }"); 1501 CheckExpectedRanges("{ [0,23) [320,400) [520,570) }");
1533 1502
1534 // Audio: 320 -> 350 1503 // Audio: 720 -> 750
1535 // Video: 300 -> 370 1504 // Video: 700 -> 770
1536 // Buffered Range: 320 -> 350 (complete overlap, audio) 1505 // Buffered Range: 720 -> 750 (complete overlap, audio)
1537 scoped_ptr<Cluster> cluster_a3( 1506 scoped_ptr<Cluster> cluster_a3(
1538 GenerateSingleStreamCluster(320, 350, kAudioTrackNum, 30)); 1507 GenerateSingleStreamCluster(720, 750, kAudioTrackNum, 30));
1539 1508
1540 scoped_ptr<Cluster> cluster_v3( 1509 scoped_ptr<Cluster> cluster_v3(
1541 GenerateSingleStreamCluster(300, 370, kVideoTrackNum, 70)); 1510 GenerateSingleStreamCluster(700, 770, kVideoTrackNum, 70));
1542 1511
1543 ASSERT_TRUE(AppendData(cluster_a3->data(), cluster_a3->size())); 1512 ASSERT_TRUE(AppendData(cluster_a3->data(), cluster_a3->size()));
1544 ASSERT_TRUE(AppendData(cluster_v3->data(), cluster_v3->size())); 1513 ASSERT_TRUE(AppendData(cluster_v3->data(), cluster_v3->size()));
1545 1514
1546 CheckExpectedRanges("{ [0,23) [120,150) [220,270) [320,350) }"); 1515 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) }");
1547 1516
1548 // Audio: 400 -> 470 1517 // Audio: 900 -> 970
1549 // Video: 420 -> 450 1518 // Video: 920 -> 950
1550 // Buffered Range: 420 -> 450 (complete overlap, video) 1519 // Buffered Range: 920 -> 950 (complete overlap, video)
1551 scoped_ptr<Cluster> cluster_a4( 1520 scoped_ptr<Cluster> cluster_a4(
1552 GenerateSingleStreamCluster(400, 470, kAudioTrackNum, 70)); 1521 GenerateSingleStreamCluster(900, 970, kAudioTrackNum, 70));
1553 1522
1554 scoped_ptr<Cluster> cluster_v4( 1523 scoped_ptr<Cluster> cluster_v4(
1555 GenerateSingleStreamCluster(420, 450, kVideoTrackNum, 30)); 1524 GenerateSingleStreamCluster(920, 950, kVideoTrackNum, 30));
1556 1525
1557 ASSERT_TRUE(AppendData(cluster_a4->data(), cluster_a4->size())); 1526 ASSERT_TRUE(AppendData(cluster_a4->data(), cluster_a4->size()));
1558 ASSERT_TRUE(AppendData(cluster_v4->data(), cluster_v4->size())); 1527 ASSERT_TRUE(AppendData(cluster_v4->data(), cluster_v4->size()));
1559 1528
1560 CheckExpectedRanges("{ [0,23) [120,150) [220,270) [320,350) [420,450) }"); 1529 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
1561 1530
1562 // Appending within buffered range should not affect buffered ranges. 1531 // Appending within buffered range should not affect buffered ranges.
1563 scoped_ptr<Cluster> cluster_a5( 1532 scoped_ptr<Cluster> cluster_a5(
1564 GenerateSingleStreamCluster(430, 450, kAudioTrackNum, 20)); 1533 GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20));
1565 ASSERT_TRUE(AppendData(cluster_a5->data(), cluster_a5->size())); 1534 ASSERT_TRUE(AppendData(cluster_a5->data(), cluster_a5->size()));
1566 CheckExpectedRanges("{ [0,23) [120,150) [220,270) [320,350) [420,450) }"); 1535 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
1567 1536
1568 // Appending to single stream outside buffered ranges should not affect 1537 // Appending to single stream outside buffered ranges should not affect
1569 // buffered ranges. 1538 // buffered ranges.
1570 scoped_ptr<Cluster> cluster_v5( 1539 scoped_ptr<Cluster> cluster_v5(
1571 GenerateSingleStreamCluster(530, 540, kVideoTrackNum, 10)); 1540 GenerateSingleStreamCluster(1230, 1240, kVideoTrackNum, 10));
1572 ASSERT_TRUE(AppendData(cluster_v5->data(), cluster_v5->size())); 1541 ASSERT_TRUE(AppendData(cluster_v5->data(), cluster_v5->size()));
1573 CheckExpectedRanges("{ [0,23) [120,150) [220,270) [320,350) [420,450) }"); 1542 CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
1574 } 1543 }
1575 1544
1576 // Once EndOfStream() is called, GetBufferedRanges should not cut off any 1545 // Once EndOfStream() is called, GetBufferedRanges should not cut off any
1577 // over-hanging tails at the end of the ranges as this is likely due to block 1546 // over-hanging tails at the end of the ranges as this is likely due to block
1578 // duration differences. 1547 // duration differences.
1579 TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { 1548 TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) {
1580 ASSERT_TRUE(InitDemuxer(true, true, false)); 1549 ASSERT_TRUE(InitDemuxer(true, true, false));
1581 1550
1582 scoped_ptr<Cluster> cluster_a( 1551 scoped_ptr<Cluster> cluster_a(
1583 GenerateSingleStreamCluster(0, 90, kAudioTrackNum, 90)); 1552 GenerateSingleStreamCluster(0, 90, kAudioTrackNum, 90));
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1656 EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", codecs), expected); 1625 EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", codecs), expected);
1657 } 1626 }
1658 1627
1659 TEST_F(ChunkDemuxerTest, TestEndOfStreamFailures) { 1628 TEST_F(ChunkDemuxerTest, TestEndOfStreamFailures) {
1660 std::string audio_id = "audio"; 1629 std::string audio_id = "audio";
1661 std::string video_id = "video"; 1630 std::string video_id = "video";
1662 1631
1663 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1632 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1664 1633
1665 scoped_ptr<Cluster> cluster_a1( 1634 scoped_ptr<Cluster> cluster_a1(
1666 GenerateSingleStreamCluster(0, 15, kAudioTrackNum, 15)); 1635 GenerateSingleStreamCluster(0, 35, kAudioTrackNum, 35));
1667 scoped_ptr<Cluster> cluster_v1( 1636 scoped_ptr<Cluster> cluster_v1(
1668 GenerateSingleStreamCluster(0, 5, kVideoTrackNum, 5)); 1637 GenerateSingleStreamCluster(0, 10, kVideoTrackNum, 5));
1669 scoped_ptr<Cluster> cluster_v2( 1638 scoped_ptr<Cluster> cluster_v2(
1670 GenerateSingleStreamCluster(5, 10, kVideoTrackNum, 5)); 1639 GenerateSingleStreamCluster(10, 25, kVideoTrackNum, 5));
1671 scoped_ptr<Cluster> cluster_v3( 1640 scoped_ptr<Cluster> cluster_v3(
1672 GenerateSingleStreamCluster(10, 20, kVideoTrackNum, 10)); 1641 GenerateSingleStreamCluster(30, 50, kVideoTrackNum, 10));
1673 1642
1674 ASSERT_TRUE(AppendData(audio_id, cluster_a1->data(), cluster_a1->size())); 1643 ASSERT_TRUE(AppendData(audio_id, cluster_a1->data(), cluster_a1->size()));
1675 ASSERT_TRUE(AppendData(video_id, cluster_v1->data(), cluster_v1->size())); 1644 ASSERT_TRUE(AppendData(video_id, cluster_v1->data(), cluster_v1->size()));
1676 ASSERT_TRUE(AppendData(video_id, cluster_v3->data(), cluster_v3->size())); 1645 ASSERT_TRUE(AppendData(video_id, cluster_v3->data(), cluster_v3->size()));
1677 1646
1678 CheckExpectedRanges(audio_id, "{ [0,15) }"); 1647 CheckExpectedRanges(audio_id, "{ [0,35) }");
1679 CheckExpectedRanges(video_id, "{ [0,5) [10,20) }"); 1648 CheckExpectedRanges(video_id, "{ [0,10) [30,50) }");
1680 1649
1681 // Make sure that end of stream fails because there is a gap between 1650 // Make sure that end of stream fails because there is a gap between
1682 // the current position(0) and the end of the appended data. 1651 // the current position(0) and the end of the appended data.
1683 ASSERT_FALSE(demuxer_->EndOfStream(PIPELINE_OK)); 1652 ASSERT_FALSE(demuxer_->EndOfStream(PIPELINE_OK));
1684 1653
1685 // Seek to an time that is inside the last ranges for both streams 1654 // Seek to an time that is inside the last ranges for both streams
1686 // and verify that the EndOfStream() is successful. 1655 // and verify that the EndOfStream() is successful.
1687 demuxer_->StartWaitingForSeek(); 1656 demuxer_->StartWaitingForSeek();
1688 demuxer_->Seek(base::TimeDelta::FromMilliseconds(10), 1657 demuxer_->Seek(base::TimeDelta::FromMilliseconds(30),
1689 NewExpectedStatusCB(PIPELINE_OK)); 1658 NewExpectedStatusCB(PIPELINE_OK));
1690 1659
1691 ASSERT_TRUE(demuxer_->EndOfStream(PIPELINE_OK)); 1660 ASSERT_TRUE(demuxer_->EndOfStream(PIPELINE_OK));
1692 1661
1693 // Seek back to 0 and verify that EndOfStream() fails again. 1662 // Seek back to 0 and verify that EndOfStream() fails again.
1694 demuxer_->StartWaitingForSeek(); 1663 demuxer_->StartWaitingForSeek();
1695 demuxer_->Seek(base::TimeDelta::FromMilliseconds(0), 1664 demuxer_->Seek(base::TimeDelta::FromMilliseconds(0),
1696 NewExpectedStatusCB(PIPELINE_OK)); 1665 NewExpectedStatusCB(PIPELINE_OK));
1697 1666
1698 ASSERT_FALSE(demuxer_->EndOfStream(PIPELINE_OK)); 1667 ASSERT_FALSE(demuxer_->EndOfStream(PIPELINE_OK));
1699 1668
1700 // Append the missing range and verify that EndOfStream() succeeds now. 1669 // Append the missing range and verify that EndOfStream() succeeds now.
1701 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size())); 1670 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size()));
1702 1671
1703 CheckExpectedRanges(audio_id, "{ [0,15) }"); 1672 CheckExpectedRanges(audio_id, "{ [0,35) }");
1704 CheckExpectedRanges(video_id, "{ [0,20) }"); 1673 CheckExpectedRanges(video_id, "{ [0,50) }");
1705 1674
1706 ASSERT_TRUE(demuxer_->EndOfStream(PIPELINE_OK)); 1675 ASSERT_TRUE(demuxer_->EndOfStream(PIPELINE_OK));
1707 } 1676 }
1708 1677
1709 TEST_F(ChunkDemuxerTest, TestGetBufferedRangesBeforeInitSegment) { 1678 TEST_F(ChunkDemuxerTest, TestGetBufferedRangesBeforeInitSegment) {
1710 EXPECT_CALL(*client_, DemuxerOpened(_)); 1679 EXPECT_CALL(*client_, DemuxerOpened(_));
1711 demuxer_->Initialize(&host_, CreateInitDoneCB(PIPELINE_OK)); 1680 demuxer_->Initialize(&host_, CreateInitDoneCB(PIPELINE_OK));
1712 ASSERT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk); 1681 ASSERT_EQ(AddId("audio", true, false), ChunkDemuxer::kOk);
1713 ASSERT_EQ(AddId("video", false, true), ChunkDemuxer::kOk); 1682 ASSERT_EQ(AddId("video", false, true), ChunkDemuxer::kOk);
1714 1683
1715 CheckExpectedRanges("audio", "{ }"); 1684 CheckExpectedRanges("audio", "{ }");
1716 CheckExpectedRanges("video", "{ }"); 1685 CheckExpectedRanges("video", "{ }");
1717 } 1686 }
1718 1687
1719 } // namespace media 1688 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/filters/source_buffer_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698