Chromium Code Reviews| 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(ChunkDemuxer::Ranges expected_times) { | |
|
acolwell GONE FROM CHROMIUM
2012/06/12 22:48:13
nit: const&
annacc
2012/06/13 00:00:01
I can make it a ref, but not const.
| |
| 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::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)); | |
|
acolwell GONE FROM CHROMIUM
2012/06/12 22:48:13
nit: fix indent
annacc
2012/06/13 00:00:01
Done.
| |
| 1416 | |
| 1417 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size())); | |
| 1418 | |
| 1419 ChunkDemuxer::Ranges expected; | |
| 1420 expected.push_back(CreateRange(0, 4, kAudioBlockDuration)); | |
| 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)); | |
|
acolwell GONE FROM CHROMIUM
2012/06/12 22:48:13
nit: fix indent
annacc
2012/06/13 00:00:01
Done.
| |
| 1426 | |
| 1427 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size())); | |
| 1428 | |
| 1429 expected.push_back(CreateRange(150, 3, kAudioBlockDuration)); | |
|
acolwell GONE FROM CHROMIUM
2012/06/12 22:48:13
nit: perhaps move this up by the cluster_2 decl so
annacc
2012/06/13 00:00:01
Done.
| |
| 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)); | |
|
acolwell GONE FROM CHROMIUM
2012/06/12 22:48:13
nit: fix indent.
annacc
2012/06/13 00:00:01
Done.
| |
| 1445 | |
| 1446 ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size())); | |
| 1447 | |
| 1448 ChunkDemuxer::Ranges expected; | |
| 1449 expected.push_back(CreateRange(0, 4, kVideoBlockDuration)); | |
|
acolwell GONE FROM CHROMIUM
2012/06/12 22:48:13
nit: move this near cluster creation here and all
annacc
2012/06/13 00:00:01
Done.
| |
| 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)); | |
|
acolwell GONE FROM CHROMIUM
2012/06/12 22:48:13
nit: fix indent.
annacc
2012/06/13 00:00:01
Done.
| |
| 1455 | |
| 1456 ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size())); | |
| 1457 | |
| 1458 expected.push_back(CreateRange(150, 3, kVideoBlockDuration)); | |
| 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 ASSERT_TRUE(AppendData(cluster_a0->data(), cluster_a0->size())); | |
| 1477 ASSERT_TRUE(AppendData(cluster_v0->data(), cluster_v0->size())); | |
| 1478 | |
| 1479 ChunkDemuxer::Ranges expected; | |
| 1480 expected.push_back(CreateRange(0, 1, kAudioBlockDuration)); | |
| 1481 CheckExpectedRanges(expected); | |
| 1482 | |
| 1483 // Audio: 100 -> 150 | |
| 1484 // Video: 120 -> 170 | |
| 1485 // Buffered Range: 120 -> 150 (end overlap) | |
| 1486 scoped_ptr<Cluster> cluster_a1( | |
| 1487 GenerateSingleStreamCluster(100, 1, kAudioTrackNum, 50)); | |
| 1488 | |
| 1489 scoped_ptr<Cluster> cluster_v1( | |
| 1490 GenerateSingleStreamCluster(120, 1, kVideoTrackNum, 50)); | |
| 1491 | |
| 1492 ASSERT_TRUE(AppendData(cluster_a1->data(), cluster_a1->size())); | |
| 1493 ASSERT_TRUE(AppendData(cluster_v1->data(), cluster_v1->size())); | |
| 1494 | |
| 1495 expected.push_back(CreateRange(120, 1, 30)); | |
| 1496 CheckExpectedRanges(expected); | |
| 1497 | |
| 1498 // Audio: 220 -> 290 | |
| 1499 // Video: 200 -> 270 | |
| 1500 // Buffered Range: 220 -> 270 (front overlap) | |
| 1501 scoped_ptr<Cluster> cluster_a2( | |
| 1502 GenerateSingleStreamCluster(220, 1, kAudioTrackNum, 70)); | |
| 1503 | |
| 1504 scoped_ptr<Cluster> cluster_v2( | |
| 1505 GenerateSingleStreamCluster(200, 1, kVideoTrackNum, 70)); | |
| 1506 | |
| 1507 ASSERT_TRUE(AppendData(cluster_a2->data(), cluster_a2->size())); | |
| 1508 ASSERT_TRUE(AppendData(cluster_v2->data(), cluster_v2->size())); | |
| 1509 | |
| 1510 expected.push_back(CreateRange(220, 1, 50)); | |
| 1511 CheckExpectedRanges(expected); | |
| 1512 | |
| 1513 // Audio: 320 -> 350 | |
| 1514 // Video: 300 -> 370 | |
| 1515 // Buffered Range: 320 -> 350 (complete overlap, audio) | |
| 1516 scoped_ptr<Cluster> cluster_a3( | |
| 1517 GenerateSingleStreamCluster(320, 1, kAudioTrackNum, 30)); | |
| 1518 | |
| 1519 scoped_ptr<Cluster> cluster_v3( | |
| 1520 GenerateSingleStreamCluster(300, 1, kVideoTrackNum, 70)); | |
| 1521 | |
| 1522 ASSERT_TRUE(AppendData(cluster_a3->data(), cluster_a3->size())); | |
| 1523 ASSERT_TRUE(AppendData(cluster_v3->data(), cluster_v3->size())); | |
| 1524 | |
| 1525 expected.push_back(CreateRange(320, 1, 30)); | |
| 1526 CheckExpectedRanges(expected); | |
| 1527 | |
| 1528 // Audio: 400 -> 470 | |
| 1529 // Video: 420 -> 450 | |
| 1530 // Buffered Range: 420 -> 450 (complete overlap, video) | |
| 1531 scoped_ptr<Cluster> cluster_a4( | |
| 1532 GenerateSingleStreamCluster(400, 1, kAudioTrackNum, 70)); | |
| 1533 | |
| 1534 scoped_ptr<Cluster> cluster_v4( | |
| 1535 GenerateSingleStreamCluster(420, 1, kVideoTrackNum, 30)); | |
| 1536 | |
| 1537 ASSERT_TRUE(AppendData(cluster_a4->data(), cluster_a4->size())); | |
| 1538 ASSERT_TRUE(AppendData(cluster_v4->data(), cluster_v4->size())); | |
| 1539 | |
| 1540 expected.push_back(CreateRange(420, 1, 30)); | |
| 1541 CheckExpectedRanges(expected); | |
| 1542 | |
| 1543 // Appending within buffered range should not affect buffered ranges. | |
| 1544 scoped_ptr<Cluster> cluster_a5( | |
| 1545 GenerateSingleStreamCluster(430, 1, kAudioTrackNum, 20)); | |
| 1546 ASSERT_TRUE(AppendData(cluster_a5->data(), cluster_a5->size())); | |
| 1547 CheckExpectedRanges(expected); | |
| 1548 | |
| 1549 // Appending to single stream outside buffered ranges should not affect | |
| 1550 // buffered ranges. | |
| 1551 scoped_ptr<Cluster> cluster_v5( | |
| 1552 GenerateSingleStreamCluster(530, 1, kVideoTrackNum, 10)); | |
| 1553 ASSERT_TRUE(AppendData(cluster_v5->data(), cluster_v5->size())); | |
| 1554 CheckExpectedRanges(expected); | |
| 1555 } | |
| 1556 | |
| 1557 // Once EndOfStream() is called, GetBufferedRanges should not cut off any | |
| 1558 // over-hanging tails at the end of the ranges as this is likely due to block | |
| 1559 // duration differences. | |
| 1560 TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { | |
| 1561 ASSERT_TRUE(InitDemuxer(true, true, false)); | |
| 1562 | |
| 1563 scoped_ptr<Cluster> cluster_a( | |
| 1564 GenerateSingleStreamCluster(0, 1, kAudioTrackNum, 90)); | |
| 1565 scoped_ptr<Cluster> cluster_v( | |
| 1566 GenerateSingleStreamCluster(0, 1, kVideoTrackNum, 100)); | |
| 1567 | |
| 1568 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); | |
| 1569 ASSERT_TRUE(AppendData(cluster_v->data(), cluster_v->size())); | |
| 1570 | |
| 1571 demuxer_->EndOfStream(PIPELINE_OK); | |
| 1572 ChunkDemuxer::Ranges expected; | |
| 1573 expected.push_back(CreateRange(0, 1, 100)); | |
| 1574 CheckExpectedRanges(expected); | |
| 1575 } | |
| 1576 | |
| 1382 } // namespace media | 1577 } // namespace media |
| OLD | NEW |