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

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: 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) {
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
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
OLDNEW
« media/filters/chunk_demuxer.cc ('K') | « media/filters/chunk_demuxer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698