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

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

Issue 10539115: Calculate the buffered ranges in ChunkDemuxer::GetBufferedRanges() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: response to CR Created 8 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
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 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
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) {
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 =
acolwell GONE FROM CHROMIUM 2012/06/13 00:33:40 nit: if you use a const_iterator here I'm pretty s
annacc 2012/06/13 03:35:43 Ah, thanks.
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698