summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authoracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-11 00:15:51 +0000
committeracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-11 00:15:51 +0000
commit70abdb1de05f6df7a0ed3b75468ce2b96ec98daf (patch)
treefaae10fabb04bd9cc162cd346e65256589ba0435 /media
parent1271ce6555aa4205c9938a1a6baa0e71d404740a (diff)
downloadchromium_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.cc25
-rw-r--r--media/filters/chunk_demuxer_unittest.cc22
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