Index: media/test/pipeline_integration_test.cc |
diff --git a/media/test/pipeline_integration_test.cc b/media/test/pipeline_integration_test.cc |
index 2dfb234edcd4de9e1980486c174327abe5b43eec..a71963edf1cd8799b34df4560695052ccf9ea8ef 100644 |
--- a/media/test/pipeline_integration_test.cc |
+++ b/media/test/pipeline_integration_test.cc |
@@ -560,6 +560,19 @@ class MockMediaSource { |
last_timestamp_offset_ = timestamp_offset; |
} |
+ void SetMemoryLimits(size_t limit_bytes) { |
+ chunk_demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, limit_bytes); |
+ chunk_demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, limit_bytes); |
+ } |
+ |
+ void EvictCodedFrames(base::TimeDelta currentMediaTime, size_t newDataSize) { |
+ chunk_demuxer_->EvictCodedFrames(kSourceId, currentMediaTime, newDataSize); |
+ } |
+ |
+ void RemoveRange(base::TimeDelta start, base::TimeDelta end) { |
+ chunk_demuxer_->Remove(kSourceId, start, end); |
+ } |
+ |
void EndOfStream() { |
chunk_demuxer_->MarkEndOfStream(PIPELINE_OK); |
} |
@@ -1088,6 +1101,60 @@ TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_WebM) { |
Stop(); |
} |
+TEST_F(PipelineIntegrationTest, MediaSource_Remove_Updates_BufferedRanges) { |
+ const char* input_filename = "bear-320x240.webm"; |
+ MockMediaSource source(input_filename, kWebM, kAppendWholeFile); |
+ StartPipelineWithMediaSource(&source); |
+ |
+ auto buffered_ranges = pipeline_->GetBufferedTimeRanges(); |
+ EXPECT_EQ(1u, buffered_ranges.size()); |
+ EXPECT_EQ(0, buffered_ranges.start(0).InMilliseconds()); |
+ EXPECT_EQ(k320WebMFileDurationMs, buffered_ranges.end(0).InMilliseconds()); |
+ |
+ source.RemoveRange(base::TimeDelta::FromMilliseconds(1000), |
+ base::TimeDelta::FromMilliseconds(k320WebMFileDurationMs)); |
+ buffered_ranges = pipeline_->GetBufferedTimeRanges(); |
+ EXPECT_EQ(1u, buffered_ranges.size()); |
+ EXPECT_EQ(0, buffered_ranges.start(0).InMilliseconds()); |
+ EXPECT_EQ(1001, buffered_ranges.end(0).InMilliseconds()); |
+ |
+ source.Shutdown(); |
+ Stop(); |
+} |
+ |
+// This test case imitates media playback with advancing media_time and |
+// continuously adding new data. At some point we should reach the buffering |
+// limit, after that MediaSource should evict some buffered data and that |
+// evicted data shold be reflected in the change of media::Pipeline buffered |
+// ranges (returned by GetBufferedTimeRanges). At that point the buffered ranges |
+// will no longer start at 0. |
+TEST_F(PipelineIntegrationTest, MediaSource_FillUp_Buffer) { |
+ const char* input_filename = "bear-320x240.webm"; |
+ MockMediaSource source(input_filename, kWebM, kAppendWholeFile); |
+ StartPipelineWithMediaSource(&source); |
+ source.SetMemoryLimits(1048576); |
+ |
+ scoped_refptr<DecoderBuffer> file = ReadTestDataFile(input_filename); |
+ |
+ auto buffered_ranges = pipeline_->GetBufferedTimeRanges(); |
+ EXPECT_EQ(1u, buffered_ranges.size()); |
+ do { |
+ // Advance media_time to the end of the currently buffered data |
+ base::TimeDelta media_time = buffered_ranges.end(0); |
+ source.Seek(media_time); |
+ // Ask MediaSource to evict buffered data if buffering limit has been |
+ // reached (the data will be evicted from the front of the buffered range). |
+ source.EvictCodedFrames(media_time, file->data_size()); |
+ source.AppendAtTime(media_time, file->data(), file->data_size()); |
+ buffered_ranges = pipeline_->GetBufferedTimeRanges(); |
+ } while (buffered_ranges.size() == 1 && |
+ buffered_ranges.start(0) == base::TimeDelta::FromSeconds(0)); |
+ |
+ EXPECT_EQ(1u, buffered_ranges.size()); |
+ source.Shutdown(); |
+ Stop(); |
+} |
+ |
#if !defined(DISABLE_EME_TESTS) |
TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_Encrypted_WebM) { |
MockMediaSource source("bear-320x240-16x9-aspect-av_enc-av.webm", kWebM, |