diff options
author | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-11 00:15:51 +0000 |
---|---|---|
committer | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-11 00:15:51 +0000 |
commit | 70abdb1de05f6df7a0ed3b75468ce2b96ec98daf (patch) | |
tree | faae10fabb04bd9cc162cd346e65256589ba0435 /media | |
parent | 1271ce6555aa4205c9938a1a6baa0e71d404740a (diff) | |
download | chromium_src-70abdb1de05f6df7a0ed3b75468ce2b96ec98daf.zip chromium_src-70abdb1de05f6df7a0ed3b75468ce2b96ec98daf.tar.gz chromium_src-70abdb1de05f6df7a0ed3b75468ce2b96ec98daf.tar.bz2 |
Update ChunkDemuxer to allow appending after EndOfStream() is called.
WebKit is also allowed to call AppendData() with a length of 0 now so that the ChunkDemuxer can do the proper state transition.
BUG=165197
TEST=ChunkDemuxerTest.TestZeroLengthAppend, ChunkDemuxerTest.TestAppendAfterEndOfStream, LayoutTests/http/tests/media/media-source/video-media-source-append-in-ended-state.html
Review URL: https://chromiumcodereview.appspot.com/11507005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172199 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/filters/chunk_demuxer.cc | 25 | ||||
-rw-r--r-- | media/filters/chunk_demuxer_unittest.cc | 22 |
2 files changed, 44 insertions, 3 deletions
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc index 6af84a3..8d9bffd 100644 --- a/media/filters/chunk_demuxer.cc +++ b/media/filters/chunk_demuxer.cc @@ -203,7 +203,9 @@ class ChunkDemuxerStream : public DemuxerStream { bool UpdateVideoConfig(const VideoDecoderConfig& config); void EndOfStream(); + void CancelEndOfStream(); bool CanEndOfStream() const; + void Shutdown(); // DemuxerStream methods. @@ -396,6 +398,12 @@ void ChunkDemuxerStream::EndOfStream() { it->Run(); } +void ChunkDemuxerStream::CancelEndOfStream() { + base::AutoLock auto_lock(lock_); + DCHECK(end_of_stream_); + end_of_stream_ = false; +} + bool ChunkDemuxerStream::CanEndOfStream() const { base::AutoLock auto_lock(lock_); return stream_->IsEndSelected(); @@ -797,8 +805,6 @@ bool ChunkDemuxer::AppendData(const std::string& id, DVLOG(1) << "AppendData(" << id << ", " << length << ")"; DCHECK(!id.empty()); - DCHECK(data); - DCHECK_GT(length, 0u); Ranges<TimeDelta> ranges; @@ -809,6 +815,21 @@ bool ChunkDemuxer::AppendData(const std::string& id, // Capture if the SourceBuffer has a pending seek before we start parsing. bool old_seek_pending = IsSeekPending_Locked(); + if (state_ == ENDED) { + ChangeState_Locked(INITIALIZED); + + if (audio_) + audio_->CancelEndOfStream(); + + if (video_) + video_->CancelEndOfStream(); + } + + if (length == 0u) + return true; + + DCHECK(data); + switch (state_) { case INITIALIZING: DCHECK(IsValidId(id)); diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc index 6506e42..f2524c5 100644 --- a/media/filters/chunk_demuxer_unittest.cc +++ b/media/filters/chunk_demuxer_unittest.cc @@ -294,7 +294,6 @@ class ChunkDemuxerTest : public testing::Test { bool AppendData(const std::string& source_id, const uint8* data, size_t length) { - CHECK(length); EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); return demuxer_->AppendData(source_id, data, length); } @@ -2434,4 +2433,25 @@ TEST_F(ChunkDemuxerTest, TestEndOfStreamTruncateDuration) { demuxer_->EndOfStream(PIPELINE_OK); } + +TEST_F(ChunkDemuxerTest, TestZeroLengthAppend) { + ASSERT_TRUE(InitDemuxer(true, true)); + ASSERT_TRUE(AppendData(NULL, 0)); +} + +TEST_F(ChunkDemuxerTest, TestAppendAfterEndOfStream) { + ASSERT_TRUE(InitDemuxer(true, true)); + + EXPECT_CALL(host_, SetDuration(_)) + .Times(AnyNumber()); + + scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); + ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); + demuxer_->EndOfStream(PIPELINE_OK); + + scoped_ptr<Cluster> cluster_b(kDefaultSecondCluster()); + ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size())); + demuxer_->EndOfStream(PIPELINE_OK); +} + } // namespace media |