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

Side by Side Diff: media/test/pipeline_integration_test.cc

Issue 2827983004: Fix MSE garbage collection for disabled media tracks (Closed)
Patch Set: Created 3 years, 8 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
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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 chunk_demuxer_->AppendData(kSourceId, pData, size, append_window_start, 533 chunk_demuxer_->AppendData(kSourceId, pData, size, append_window_start,
534 append_window_end, &timestamp_offset)); 534 append_window_end, &timestamp_offset));
535 last_timestamp_offset_ = timestamp_offset; 535 last_timestamp_offset_ = timestamp_offset;
536 } 536 }
537 537
538 void SetMemoryLimits(size_t limit_bytes) { 538 void SetMemoryLimits(size_t limit_bytes) {
539 chunk_demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, limit_bytes); 539 chunk_demuxer_->SetMemoryLimitsForTest(DemuxerStream::AUDIO, limit_bytes);
540 chunk_demuxer_->SetMemoryLimitsForTest(DemuxerStream::VIDEO, limit_bytes); 540 chunk_demuxer_->SetMemoryLimitsForTest(DemuxerStream::VIDEO, limit_bytes);
541 } 541 }
542 542
543 void EvictCodedFrames(base::TimeDelta currentMediaTime, size_t newDataSize) { 543 bool EvictCodedFrames(base::TimeDelta currentMediaTime, size_t newDataSize) {
544 chunk_demuxer_->EvictCodedFrames(kSourceId, currentMediaTime, newDataSize); 544 return chunk_demuxer_->EvictCodedFrames(kSourceId, currentMediaTime,
545 newDataSize);
545 } 546 }
546 547
547 void RemoveRange(base::TimeDelta start, base::TimeDelta end) { 548 void RemoveRange(base::TimeDelta start, base::TimeDelta end) {
548 chunk_demuxer_->Remove(kSourceId, start, end); 549 chunk_demuxer_->Remove(kSourceId, start, end);
549 } 550 }
550 551
551 void EndOfStream() { chunk_demuxer_->MarkEndOfStream(PIPELINE_OK); } 552 void EndOfStream() { chunk_demuxer_->MarkEndOfStream(PIPELINE_OK); }
552 553
553 void Shutdown() { 554 void Shutdown() {
554 if (!chunk_demuxer_) 555 if (!chunk_demuxer_)
(...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after
1558 1559
1559 buffered_ranges = pipeline_->GetBufferedTimeRanges(); 1560 buffered_ranges = pipeline_->GetBufferedTimeRanges();
1560 } while (buffered_ranges.size() == 1 && 1561 } while (buffered_ranges.size() == 1 &&
1561 buffered_ranges.start(0) == base::TimeDelta::FromSeconds(0)); 1562 buffered_ranges.start(0) == base::TimeDelta::FromSeconds(0));
1562 1563
1563 EXPECT_EQ(1u, buffered_ranges.size()); 1564 EXPECT_EQ(1u, buffered_ranges.size());
1564 source.Shutdown(); 1565 source.Shutdown();
1565 Stop(); 1566 Stop();
1566 } 1567 }
1567 1568
1569 TEST_F(PipelineIntegrationTest, MediaSource_GCWithDisabledVideoStream) {
1570 const char* input_filename = "bear-320x240.webm";
1571 MockMediaSource source(input_filename, kWebM, kAppendWholeFile);
1572 EXPECT_EQ(PIPELINE_OK, StartPipelineWithMediaSource(&source));
1573 scoped_refptr<DecoderBuffer> file = ReadTestDataFile(input_filename);
1574 // The input file contains audio + video data. Assuming video data size is
1575 // larger than audio, so setting memory limits to half of file data_size will
1576 // ensure that video SourceBuffer is above memory limit and the audio
1577 // SourceBuffer is below the memory limit.
1578 source.SetMemoryLimits(file->data_size() / 2);
1579
1580 // Disable the video track and start playback. Renderer won't read from the
1581 // disabled video stream, so the video stream read position should be 0.
1582 pipeline_->OnSelectedVideoTrackChanged(base::nullopt);
1583 Play();
1584
1585 // Wait until audio playback advances past 2 seconds and call MSE GC algorithm
1586 // to prepare for more data to be appended.
1587 base::TimeDelta media_time = base::TimeDelta::FromSeconds(2);
1588 ASSERT_TRUE(WaitUntilCurrentTimeIsAfter(media_time));
1589 // At this point the video SourceBuffer is over the memory limit (see the
1590 // SetMemoryLimits comment above), but MSE GC should be able to remove some
1591 // of video data and return true indicating success, even though no data has
1592 // been read from the disabled video stream and its read position is 0.
1593 ASSERT_TRUE(source.EvictCodedFrames(media_time, 10));
1594
1595 source.Shutdown();
1596 Stop();
1597 }
1598
1568 TEST_F(PipelineIntegrationTest, 1599 TEST_F(PipelineIntegrationTest,
1569 MAYBE_EME(MediaSource_ConfigChange_Encrypted_WebM)) { 1600 MAYBE_EME(MediaSource_ConfigChange_Encrypted_WebM)) {
1570 MockMediaSource source("bear-320x240-16x9-aspect-av_enc-av.webm", kWebM, 1601 MockMediaSource source("bear-320x240-16x9-aspect-av_enc-av.webm", kWebM,
1571 kAppendWholeFile); 1602 kAppendWholeFile);
1572 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); 1603 FakeEncryptedMedia encrypted_media(new KeyProvidingApp());
1573 EXPECT_EQ(PIPELINE_OK, 1604 EXPECT_EQ(PIPELINE_OK,
1574 StartPipelineWithEncryptedMedia(&source, &encrypted_media)); 1605 StartPipelineWithEncryptedMedia(&source, &encrypted_media));
1575 1606
1576 EXPECT_CALL(*this, OnVideoNaturalSizeChange(gfx::Size(640, 360))).Times(1); 1607 EXPECT_CALL(*this, OnVideoNaturalSizeChange(gfx::Size(640, 360))).Times(1);
1577 scoped_refptr<DecoderBuffer> second_file = 1608 scoped_refptr<DecoderBuffer> second_file =
(...skipping 1093 matching lines...) Expand 10 before | Expand all | Expand 10 after
2671 2702
2672 TEST_F(PipelineIntegrationTest, BasicPlaybackPositiveStartTime) { 2703 TEST_F(PipelineIntegrationTest, BasicPlaybackPositiveStartTime) {
2673 ASSERT_EQ(PIPELINE_OK, Start("nonzero-start-time.webm")); 2704 ASSERT_EQ(PIPELINE_OK, Start("nonzero-start-time.webm"));
2674 Play(); 2705 Play();
2675 ASSERT_TRUE(WaitUntilOnEnded()); 2706 ASSERT_TRUE(WaitUntilOnEnded());
2676 ASSERT_EQ(base::TimeDelta::FromMicroseconds(396000), 2707 ASSERT_EQ(base::TimeDelta::FromMicroseconds(396000),
2677 demuxer_->GetStartTime()); 2708 demuxer_->GetStartTime());
2678 } 2709 }
2679 2710
2680 } // namespace media 2711 } // namespace media
OLDNEW
« media/filters/chunk_demuxer.cc ('K') | « media/filters/source_buffer_state.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698