| 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 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 DemuxerStream* stream, int block_duration) { | 442 DemuxerStream* stream, int block_duration) { |
| 443 CHECK_GT(block_count, 0); | 443 CHECK_GT(block_count, 0); |
| 444 int stream_timecode = timecode; | 444 int stream_timecode = timecode; |
| 445 | 445 |
| 446 for (int i = 0; i < block_count; i++) { | 446 for (int i = 0; i < block_count; i++) { |
| 447 ExpectRead(stream, stream_timecode); | 447 ExpectRead(stream, stream_timecode); |
| 448 stream_timecode += block_duration; | 448 stream_timecode += block_duration; |
| 449 } | 449 } |
| 450 } | 450 } |
| 451 | 451 |
| 452 std::pair<base::TimeDelta, base::TimeDelta> CreateRange( |
| 453 int start_time, int block_count, int block_duration) { |
| 454 return std::make_pair(base::TimeDelta::FromMilliseconds(start_time), |
| 455 base::TimeDelta::FromMilliseconds(start_time + |
| 456 (block_count * block_duration))); |
| 457 } |
| 458 |
| 459 void CheckExpectedRanges(const ChunkDemuxer::Ranges& expected_times) { |
| 460 ChunkDemuxer::Ranges actual_times; |
| 461 demuxer_->GetBufferedRanges(kSourceId, &actual_times); |
| 462 EXPECT_EQ(expected_times.size(), actual_times.size()); |
| 463 |
| 464 for (ChunkDemuxer::Ranges::const_iterator actual_itr = |
| 465 actual_times.begin(), expected_itr = expected_times.begin(); |
| 466 actual_itr != actual_times.end() && |
| 467 expected_itr != expected_times.end(); |
| 468 actual_itr++, expected_itr++) { |
| 469 EXPECT_EQ(expected_itr->first, actual_itr->first); |
| 470 EXPECT_EQ(expected_itr->second, actual_itr->second); |
| 471 } |
| 472 } |
| 473 |
| 452 MOCK_METHOD1(ReadDone, void(const scoped_refptr<DecoderBuffer>&)); | 474 MOCK_METHOD1(ReadDone, void(const scoped_refptr<DecoderBuffer>&)); |
| 453 | 475 |
| 454 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { | 476 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { |
| 455 EXPECT_CALL(*this, ReadDone(HasTimestamp(timestamp_in_ms))); | 477 EXPECT_CALL(*this, ReadDone(HasTimestamp(timestamp_in_ms))); |
| 456 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, | 478 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, |
| 457 base::Unretained(this))); | 479 base::Unretained(this))); |
| 458 } | 480 } |
| 459 | 481 |
| 460 MOCK_METHOD1(Checkpoint, void(int id)); | 482 MOCK_METHOD1(Checkpoint, void(int id)); |
| 461 | 483 |
| (...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1372 kVideoBlockDuration)); | 1394 kVideoBlockDuration)); |
| 1373 | 1395 |
| 1374 ASSERT_TRUE(AppendData(audio_id, cluster_a2->data(), cluster_a2->size())); | 1396 ASSERT_TRUE(AppendData(audio_id, cluster_a2->data(), cluster_a2->size())); |
| 1375 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size())); | 1397 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size())); |
| 1376 | 1398 |
| 1377 // Read() should return buffers at 3. | 1399 // Read() should return buffers at 3. |
| 1378 EXPECT_TRUE(audio_read_done); | 1400 EXPECT_TRUE(audio_read_done); |
| 1379 EXPECT_TRUE(video_read_done); | 1401 EXPECT_TRUE(video_read_done); |
| 1380 } | 1402 } |
| 1381 | 1403 |
| 1404 // Test ranges in an audio-only stream. |
| 1405 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { |
| 1406 EXPECT_CALL(*client_, DemuxerOpened(_)); |
| 1407 demuxer_->Initialize( |
| 1408 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); |
| 1409 |
| 1410 ASSERT_EQ(AddId(kSourceId, true, false), ChunkDemuxer::kOk); |
| 1411 ASSERT_TRUE(AppendInitSegment(true, false, false)); |
| 1412 |
| 1413 // Test a simple cluster. |
| 1414 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 4, |
| 1415 kAudioTrackNum, kAudioBlockDuration)); |
| 1416 ChunkDemuxer::Ranges expected; |
| 1417 expected.push_back(CreateRange(0, 4, kAudioBlockDuration)); |
| 1418 |
| 1419 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size())); |
| 1420 |
| 1421 CheckExpectedRanges(expected); |
| 1422 |
| 1423 // Append a disjoint cluster to check for two separate ranges. |
| 1424 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(150, 3, |
| 1425 kAudioTrackNum, kAudioBlockDuration)); |
| 1426 expected.push_back(CreateRange(150, 3, kAudioBlockDuration)); |
| 1427 |
| 1428 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size())); |
| 1429 |
| 1430 CheckExpectedRanges(expected); |
| 1431 } |
| 1432 |
| 1433 // Test ranges in a video-only stream. |
| 1434 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { |
| 1435 EXPECT_CALL(*client_, DemuxerOpened(_)); |
| 1436 demuxer_->Initialize( |
| 1437 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); |
| 1438 |
| 1439 ASSERT_EQ(AddId(kSourceId, false, true), ChunkDemuxer::kOk); |
| 1440 ASSERT_TRUE(AppendInitSegment(false, true, false)); |
| 1441 |
| 1442 // Test a simple cluster. |
| 1443 scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 4, |
| 1444 kVideoTrackNum, kVideoBlockDuration)); |
| 1445 ChunkDemuxer::Ranges expected; |
| 1446 expected.push_back(CreateRange(0, 4, kVideoBlockDuration)); |
| 1447 |
| 1448 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size())); |
| 1449 |
| 1450 CheckExpectedRanges(expected); |
| 1451 |
| 1452 // Append a disjoint cluster to check for two separate ranges. |
| 1453 scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(150, 3, |
| 1454 kVideoTrackNum, kVideoBlockDuration)); |
| 1455 expected.push_back(CreateRange(150, 3, kVideoBlockDuration)); |
| 1456 |
| 1457 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size())); |
| 1458 |
| 1459 CheckExpectedRanges(expected); |
| 1460 } |
| 1461 |
| 1462 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { |
| 1463 ASSERT_TRUE(InitDemuxer(true, true, false)); |
| 1464 |
| 1465 // Audio: 0 -> 23 |
| 1466 // Video: 0 -> 33 |
| 1467 // Buffered Range: 0 -> 23 |
| 1468 // Audio block duration is smaller than video block duration, |
| 1469 // so the buffered ranges should correspond to the audio blocks. |
| 1470 scoped_ptr<Cluster> cluster_a0( |
| 1471 GenerateSingleStreamCluster(0, 1, kAudioTrackNum, kAudioBlockDuration)); |
| 1472 |
| 1473 scoped_ptr<Cluster> cluster_v0( |
| 1474 GenerateSingleStreamCluster(0, 1, kVideoTrackNum, kVideoBlockDuration)); |
| 1475 |
| 1476 ChunkDemuxer::Ranges expected; |
| 1477 expected.push_back(CreateRange(0, 1, kAudioBlockDuration)); |
| 1478 |
| 1479 ASSERT_TRUE(AppendData(cluster_a0->data(), cluster_a0->size())); |
| 1480 ASSERT_TRUE(AppendData(cluster_v0->data(), cluster_v0->size())); |
| 1481 |
| 1482 CheckExpectedRanges(expected); |
| 1483 |
| 1484 // Audio: 100 -> 150 |
| 1485 // Video: 120 -> 170 |
| 1486 // Buffered Range: 120 -> 150 (end overlap) |
| 1487 scoped_ptr<Cluster> cluster_a1( |
| 1488 GenerateSingleStreamCluster(100, 1, kAudioTrackNum, 50)); |
| 1489 |
| 1490 scoped_ptr<Cluster> cluster_v1( |
| 1491 GenerateSingleStreamCluster(120, 1, kVideoTrackNum, 50)); |
| 1492 |
| 1493 expected.push_back(CreateRange(120, 1, 30)); |
| 1494 |
| 1495 ASSERT_TRUE(AppendData(cluster_a1->data(), cluster_a1->size())); |
| 1496 ASSERT_TRUE(AppendData(cluster_v1->data(), cluster_v1->size())); |
| 1497 |
| 1498 CheckExpectedRanges(expected); |
| 1499 |
| 1500 // Audio: 220 -> 290 |
| 1501 // Video: 200 -> 270 |
| 1502 // Buffered Range: 220 -> 270 (front overlap) |
| 1503 scoped_ptr<Cluster> cluster_a2( |
| 1504 GenerateSingleStreamCluster(220, 1, kAudioTrackNum, 70)); |
| 1505 |
| 1506 scoped_ptr<Cluster> cluster_v2( |
| 1507 GenerateSingleStreamCluster(200, 1, kVideoTrackNum, 70)); |
| 1508 |
| 1509 expected.push_back(CreateRange(220, 1, 50)); |
| 1510 |
| 1511 ASSERT_TRUE(AppendData(cluster_a2->data(), cluster_a2->size())); |
| 1512 ASSERT_TRUE(AppendData(cluster_v2->data(), cluster_v2->size())); |
| 1513 |
| 1514 CheckExpectedRanges(expected); |
| 1515 |
| 1516 // Audio: 320 -> 350 |
| 1517 // Video: 300 -> 370 |
| 1518 // Buffered Range: 320 -> 350 (complete overlap, audio) |
| 1519 scoped_ptr<Cluster> cluster_a3( |
| 1520 GenerateSingleStreamCluster(320, 1, kAudioTrackNum, 30)); |
| 1521 |
| 1522 scoped_ptr<Cluster> cluster_v3( |
| 1523 GenerateSingleStreamCluster(300, 1, kVideoTrackNum, 70)); |
| 1524 |
| 1525 expected.push_back(CreateRange(320, 1, 30)); |
| 1526 |
| 1527 ASSERT_TRUE(AppendData(cluster_a3->data(), cluster_a3->size())); |
| 1528 ASSERT_TRUE(AppendData(cluster_v3->data(), cluster_v3->size())); |
| 1529 |
| 1530 CheckExpectedRanges(expected); |
| 1531 |
| 1532 // Audio: 400 -> 470 |
| 1533 // Video: 420 -> 450 |
| 1534 // Buffered Range: 420 -> 450 (complete overlap, video) |
| 1535 scoped_ptr<Cluster> cluster_a4( |
| 1536 GenerateSingleStreamCluster(400, 1, kAudioTrackNum, 70)); |
| 1537 |
| 1538 scoped_ptr<Cluster> cluster_v4( |
| 1539 GenerateSingleStreamCluster(420, 1, kVideoTrackNum, 30)); |
| 1540 |
| 1541 expected.push_back(CreateRange(420, 1, 30)); |
| 1542 |
| 1543 ASSERT_TRUE(AppendData(cluster_a4->data(), cluster_a4->size())); |
| 1544 ASSERT_TRUE(AppendData(cluster_v4->data(), cluster_v4->size())); |
| 1545 |
| 1546 CheckExpectedRanges(expected); |
| 1547 |
| 1548 // Appending within buffered range should not affect buffered ranges. |
| 1549 scoped_ptr<Cluster> cluster_a5( |
| 1550 GenerateSingleStreamCluster(430, 1, kAudioTrackNum, 20)); |
| 1551 ASSERT_TRUE(AppendData(cluster_a5->data(), cluster_a5->size())); |
| 1552 CheckExpectedRanges(expected); |
| 1553 |
| 1554 // Appending to single stream outside buffered ranges should not affect |
| 1555 // buffered ranges. |
| 1556 scoped_ptr<Cluster> cluster_v5( |
| 1557 GenerateSingleStreamCluster(530, 1, kVideoTrackNum, 10)); |
| 1558 ASSERT_TRUE(AppendData(cluster_v5->data(), cluster_v5->size())); |
| 1559 CheckExpectedRanges(expected); |
| 1560 } |
| 1561 |
| 1562 // Once EndOfStream() is called, GetBufferedRanges should not cut off any |
| 1563 // over-hanging tails at the end of the ranges as this is likely due to block |
| 1564 // duration differences. |
| 1565 TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { |
| 1566 ASSERT_TRUE(InitDemuxer(true, true, false)); |
| 1567 |
| 1568 scoped_ptr<Cluster> cluster_a( |
| 1569 GenerateSingleStreamCluster(0, 1, kAudioTrackNum, 90)); |
| 1570 scoped_ptr<Cluster> cluster_v( |
| 1571 GenerateSingleStreamCluster(0, 1, kVideoTrackNum, 100)); |
| 1572 ChunkDemuxer::Ranges expected; |
| 1573 expected.push_back(CreateRange(0, 1, 100)); |
| 1574 |
| 1575 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); |
| 1576 ASSERT_TRUE(AppendData(cluster_v->data(), cluster_v->size())); |
| 1577 |
| 1578 demuxer_->EndOfStream(PIPELINE_OK); |
| 1579 CheckExpectedRanges(expected); |
| 1580 } |
| 1581 |
| 1382 } // namespace media | 1582 } // namespace media |
| OLD | NEW |