| Index: media/filters/chunk_demuxer_unittest.cc
|
| diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc
|
| index 71e2e786bf9fd1482f744a125110b9e65b76155c..4352184e4c985fbb3bacc364a7a9102b2995e9b6 100644
|
| --- a/media/filters/chunk_demuxer_unittest.cc
|
| +++ b/media/filters/chunk_demuxer_unittest.cc
|
| @@ -104,6 +104,10 @@ static void WriteInt64(uint8* buffer, int64 number) {
|
| }
|
| }
|
|
|
| +base::TimeDelta DummyGetMediaTime(base::TimeDelta time) {
|
| + return time;
|
| +}
|
| +
|
| MATCHER_P(HasTimestamp, timestamp_in_ms, "") {
|
| return arg.get() && !arg->end_of_stream() &&
|
| arg->timestamp().InMilliseconds() == timestamp_in_ms;
|
| @@ -3335,7 +3339,7 @@ TEST_F(ChunkDemuxerTest, SetMemoryLimitType) {
|
|
|
| // Set different memory limits for audio and video.
|
| demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize);
|
| - demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, 5 * kBlockSize);
|
| + demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, 5 * kBlockSize + 1);
|
|
|
| base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(1000);
|
|
|
| @@ -3343,6 +3347,9 @@ TEST_F(ChunkDemuxerTest, SetMemoryLimitType) {
|
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10);
|
| AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 5);
|
|
|
| + // We should be right at buffer limit, should pass
|
| + EXPECT_TRUE(demuxer_->EvictFrames());
|
| +
|
| CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,230) }");
|
| CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,165) }");
|
|
|
| @@ -3355,6 +3362,9 @@ TEST_F(ChunkDemuxerTest, SetMemoryLimitType) {
|
| AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
|
| seek_time.InMilliseconds(), 5);
|
|
|
| + // We should delete first append, and be exactly at buffer limit
|
| + EXPECT_TRUE(demuxer_->EvictFrames());
|
| +
|
| // Verify that the old data, and nothing more, has been garbage collected.
|
| CheckExpectedRanges(DemuxerStream::AUDIO, "{ [1000,1230) }");
|
| CheckExpectedRanges(DemuxerStream::VIDEO, "{ [1000,1165) }");
|
| @@ -3379,12 +3389,13 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek) {
|
| // Signal that the second seek is starting.
|
| demuxer_->StartWaitingForSeek(seek_time2);
|
|
|
| - // Append data to satisfy the second seek. This append triggers
|
| - // the garbage collection logic since we set the memory limit to
|
| - // 5 blocks.
|
| + // Append data to satisfy the second seek.
|
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
|
| seek_time2.InMilliseconds(), 5);
|
|
|
| + // Should remove first append
|
| + EXPECT_TRUE(demuxer_->EvictFrames());
|
| +
|
| // Verify that the buffers that cover |seek_time2| do not get
|
| // garbage collected.
|
| CheckExpectedRanges(kSourceId, "{ [500,615) }");
|
| @@ -3392,15 +3403,48 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek) {
|
| // Complete the seek.
|
| demuxer_->Seek(seek_time2, NewExpectedStatusCB(PIPELINE_OK));
|
|
|
| -
|
| // Append more data and make sure that the blocks for |seek_time2|
|
| // don't get removed.
|
| - //
|
| - // NOTE: The current GC algorithm tries to preserve the GOP at the
|
| - // current position as well as the last appended GOP. This is
|
| - // why there are 2 ranges in the expectations.
|
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5);
|
| - CheckExpectedRanges(kSourceId, "{ [500,592) [792,815) }");
|
| +
|
| + // We should not delete things between head and last append, so buffer
|
| + // remains overfull.
|
| + EXPECT_FALSE(demuxer_->EvictFrames());
|
| +
|
| + CheckExpectedRanges(kSourceId, "{ [500,615) [700,815) }");
|
| +}
|
| +
|
| +TEST_F(ChunkDemuxerTest, GCKeepPlayhead) {
|
| + ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
|
| +
|
| + // Set different memory limits for audio and video.
|
| + demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 5 * kBlockSize);
|
| +
|
| + // Set media time provider to report playback head at 0ms
|
| + demuxer_->SetMediaTimeProvider(
|
| + base::Bind(DummyGetMediaTime, base::TimeDelta()));
|
| +
|
| + // Append data at the start that can be garbage collected:
|
| + AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10);
|
| +
|
| + // We expect garbage collection to fail, as we don't want to spontaneously
|
| + // create gaps in source buffer stream. This could screw up playback for many
|
| + // clients, who don't bother to check ranges after append.
|
| + EXPECT_FALSE(demuxer_->EvictFrames());
|
| + CheckExpectedRanges(kSourceId, "{ [0,230) }");
|
| +
|
| + // Seek, confirm that media time holds us at zero
|
| + base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(207);
|
| + Seek(seek_time);
|
| +
|
| + EXPECT_FALSE(demuxer_->EvictFrames());
|
| + CheckExpectedRanges(kSourceId, "{ [0,230) }");
|
| +
|
| + // Progress media time, show that we can collect up to that point
|
| + demuxer_->SetMediaTimeProvider(
|
| + base::Bind(DummyGetMediaTime, base::TimeDelta::FromMilliseconds(69)));
|
| + EXPECT_FALSE(demuxer_->EvictFrames());
|
| + CheckExpectedRanges(kSourceId, "{ [69,230) }");
|
| }
|
|
|
| TEST_F(ChunkDemuxerTest, AppendWindow_Video) {
|
|
|