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 "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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |