Chromium Code Reviews| Index: media/filters/chunk_demuxer_unittest.cc |
| diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc |
| index 83064ade1bb78e2885781e4876c0b797d4e65b75..6b400c6c460be1327e06b5e36253c15c53224873 100644 |
| --- a/media/filters/chunk_demuxer_unittest.cc |
| +++ b/media/filters/chunk_demuxer_unittest.cc |
| @@ -449,6 +449,28 @@ class ChunkDemuxerTest : public testing::Test { |
| } |
| } |
| + std::pair<base::TimeDelta, base::TimeDelta> CreateRange( |
| + int start_time, int block_count, int block_duration) { |
| + return std::make_pair(base::TimeDelta::FromMilliseconds(start_time), |
| + base::TimeDelta::FromMilliseconds(start_time + |
| + (block_count * block_duration))); |
| + } |
| + |
| + 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.
|
| + ChunkDemuxer::Ranges actual_times; |
| + demuxer_->GetBufferedRanges(kSourceId, &actual_times); |
| + EXPECT_EQ(expected_times.size(), actual_times.size()); |
| + |
| + for (ChunkDemuxer::Ranges::iterator actual_itr = |
| + actual_times.begin(), expected_itr = expected_times.begin(); |
| + actual_itr != actual_times.end() && |
| + expected_itr != expected_times.end(); |
| + actual_itr++, expected_itr++) { |
| + EXPECT_EQ(expected_itr->first, actual_itr->first); |
| + EXPECT_EQ(expected_itr->second, actual_itr->second); |
| + } |
| + } |
| + |
| MOCK_METHOD1(ReadDone, void(const scoped_refptr<DecoderBuffer>&)); |
| void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { |
| @@ -1379,4 +1401,177 @@ TEST_F(ChunkDemuxerTest, TestSeekAudioAndVideoSources) { |
| EXPECT_TRUE(video_read_done); |
| } |
| +// Test ranges in an audio-only stream. |
| +TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { |
| + EXPECT_CALL(*client_, DemuxerOpened(_)); |
| + demuxer_->Initialize( |
| + &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); |
| + |
| + ASSERT_EQ(AddId(kSourceId, true, false), ChunkDemuxer::kOk); |
| + ASSERT_TRUE(AppendInitSegment(true, false, false)); |
| + |
| + // Test a simple cluster. |
| + scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 4, |
| + kAudioTrackNum, kAudioBlockDuration)); |
|
acolwell GONE FROM CHROMIUM
2012/06/12 22:48:13
nit: fix indent
annacc
2012/06/13 00:00:01
Done.
|
| + |
| + ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size())); |
| + |
| + ChunkDemuxer::Ranges expected; |
| + expected.push_back(CreateRange(0, 4, kAudioBlockDuration)); |
| + CheckExpectedRanges(expected); |
| + |
| + // Append a disjoint cluster to check for two separate ranges. |
| + scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(150, 3, |
| + kAudioTrackNum, kAudioBlockDuration)); |
|
acolwell GONE FROM CHROMIUM
2012/06/12 22:48:13
nit: fix indent
annacc
2012/06/13 00:00:01
Done.
|
| + |
| + ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size())); |
| + |
| + 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.
|
| + CheckExpectedRanges(expected); |
| +} |
| + |
| +// Test ranges in a video-only stream. |
| +TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { |
| + EXPECT_CALL(*client_, DemuxerOpened(_)); |
| + demuxer_->Initialize( |
| + &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); |
| + |
| + ASSERT_EQ(AddId(kSourceId, false, true), ChunkDemuxer::kOk); |
| + ASSERT_TRUE(AppendInitSegment(false, true, false)); |
| + |
| + // Test a simple cluster. |
| + scoped_ptr<Cluster> cluster_1(GenerateSingleStreamCluster(0, 4, |
| + kVideoTrackNum, kVideoBlockDuration)); |
|
acolwell GONE FROM CHROMIUM
2012/06/12 22:48:13
nit: fix indent.
annacc
2012/06/13 00:00:01
Done.
|
| + |
| + ASSERT_TRUE(AppendData(cluster_1->data(), cluster_1->size())); |
| + |
| + ChunkDemuxer::Ranges expected; |
| + 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.
|
| + CheckExpectedRanges(expected); |
| + |
| + // Append a disjoint cluster to check for two separate ranges. |
| + scoped_ptr<Cluster> cluster_2(GenerateSingleStreamCluster(150, 3, |
| + kVideoTrackNum, kVideoBlockDuration)); |
|
acolwell GONE FROM CHROMIUM
2012/06/12 22:48:13
nit: fix indent.
annacc
2012/06/13 00:00:01
Done.
|
| + |
| + ASSERT_TRUE(AppendData(cluster_2->data(), cluster_2->size())); |
| + |
| + expected.push_back(CreateRange(150, 3, kVideoBlockDuration)); |
| + CheckExpectedRanges(expected); |
| +} |
| + |
| +TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { |
| + ASSERT_TRUE(InitDemuxer(true, true, false)); |
| + |
| + // Audio: 0 -> 23 |
| + // Video: 0 -> 33 |
| + // Buffered Range: 0 -> 23 |
| + // Audio block duration is smaller than video block duration, |
| + // so the buffered ranges should correspond to the audio blocks. |
| + scoped_ptr<Cluster> cluster_a0( |
| + GenerateSingleStreamCluster(0, 1, kAudioTrackNum, kAudioBlockDuration)); |
| + |
| + scoped_ptr<Cluster> cluster_v0( |
| + GenerateSingleStreamCluster(0, 1, kVideoTrackNum, kVideoBlockDuration)); |
| + |
| + ASSERT_TRUE(AppendData(cluster_a0->data(), cluster_a0->size())); |
| + ASSERT_TRUE(AppendData(cluster_v0->data(), cluster_v0->size())); |
| + |
| + ChunkDemuxer::Ranges expected; |
| + expected.push_back(CreateRange(0, 1, kAudioBlockDuration)); |
| + CheckExpectedRanges(expected); |
| + |
| + // Audio: 100 -> 150 |
| + // Video: 120 -> 170 |
| + // Buffered Range: 120 -> 150 (end overlap) |
| + scoped_ptr<Cluster> cluster_a1( |
| + GenerateSingleStreamCluster(100, 1, kAudioTrackNum, 50)); |
| + |
| + scoped_ptr<Cluster> cluster_v1( |
| + GenerateSingleStreamCluster(120, 1, kVideoTrackNum, 50)); |
| + |
| + ASSERT_TRUE(AppendData(cluster_a1->data(), cluster_a1->size())); |
| + ASSERT_TRUE(AppendData(cluster_v1->data(), cluster_v1->size())); |
| + |
| + expected.push_back(CreateRange(120, 1, 30)); |
| + CheckExpectedRanges(expected); |
| + |
| + // Audio: 220 -> 290 |
| + // Video: 200 -> 270 |
| + // Buffered Range: 220 -> 270 (front overlap) |
| + scoped_ptr<Cluster> cluster_a2( |
| + GenerateSingleStreamCluster(220, 1, kAudioTrackNum, 70)); |
| + |
| + scoped_ptr<Cluster> cluster_v2( |
| + GenerateSingleStreamCluster(200, 1, kVideoTrackNum, 70)); |
| + |
| + ASSERT_TRUE(AppendData(cluster_a2->data(), cluster_a2->size())); |
| + ASSERT_TRUE(AppendData(cluster_v2->data(), cluster_v2->size())); |
| + |
| + expected.push_back(CreateRange(220, 1, 50)); |
| + CheckExpectedRanges(expected); |
| + |
| + // Audio: 320 -> 350 |
| + // Video: 300 -> 370 |
| + // Buffered Range: 320 -> 350 (complete overlap, audio) |
| + scoped_ptr<Cluster> cluster_a3( |
| + GenerateSingleStreamCluster(320, 1, kAudioTrackNum, 30)); |
| + |
| + scoped_ptr<Cluster> cluster_v3( |
| + GenerateSingleStreamCluster(300, 1, kVideoTrackNum, 70)); |
| + |
| + ASSERT_TRUE(AppendData(cluster_a3->data(), cluster_a3->size())); |
| + ASSERT_TRUE(AppendData(cluster_v3->data(), cluster_v3->size())); |
| + |
| + expected.push_back(CreateRange(320, 1, 30)); |
| + CheckExpectedRanges(expected); |
| + |
| + // Audio: 400 -> 470 |
| + // Video: 420 -> 450 |
| + // Buffered Range: 420 -> 450 (complete overlap, video) |
| + scoped_ptr<Cluster> cluster_a4( |
| + GenerateSingleStreamCluster(400, 1, kAudioTrackNum, 70)); |
| + |
| + scoped_ptr<Cluster> cluster_v4( |
| + GenerateSingleStreamCluster(420, 1, kVideoTrackNum, 30)); |
| + |
| + ASSERT_TRUE(AppendData(cluster_a4->data(), cluster_a4->size())); |
| + ASSERT_TRUE(AppendData(cluster_v4->data(), cluster_v4->size())); |
| + |
| + expected.push_back(CreateRange(420, 1, 30)); |
| + CheckExpectedRanges(expected); |
| + |
| + // Appending within buffered range should not affect buffered ranges. |
| + scoped_ptr<Cluster> cluster_a5( |
| + GenerateSingleStreamCluster(430, 1, kAudioTrackNum, 20)); |
| + ASSERT_TRUE(AppendData(cluster_a5->data(), cluster_a5->size())); |
| + CheckExpectedRanges(expected); |
| + |
| + // Appending to single stream outside buffered ranges should not affect |
| + // buffered ranges. |
| + scoped_ptr<Cluster> cluster_v5( |
| + GenerateSingleStreamCluster(530, 1, kVideoTrackNum, 10)); |
| + ASSERT_TRUE(AppendData(cluster_v5->data(), cluster_v5->size())); |
| + CheckExpectedRanges(expected); |
| +} |
| + |
| +// Once EndOfStream() is called, GetBufferedRanges should not cut off any |
| +// over-hanging tails at the end of the ranges as this is likely due to block |
| +// duration differences. |
| +TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { |
| + ASSERT_TRUE(InitDemuxer(true, true, false)); |
| + |
| + scoped_ptr<Cluster> cluster_a( |
| + GenerateSingleStreamCluster(0, 1, kAudioTrackNum, 90)); |
| + scoped_ptr<Cluster> cluster_v( |
| + GenerateSingleStreamCluster(0, 1, kVideoTrackNum, 100)); |
| + |
| + ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); |
| + ASSERT_TRUE(AppendData(cluster_v->data(), cluster_v->size())); |
| + |
| + demuxer_->EndOfStream(PIPELINE_OK); |
| + ChunkDemuxer::Ranges expected; |
| + expected.push_back(CreateRange(0, 1, 100)); |
| + CheckExpectedRanges(expected); |
| +} |
| + |
| } // namespace media |