diff options
author | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-15 00:33:11 +0000 |
---|---|---|
committer | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-15 00:33:11 +0000 |
commit | 968e2f30f0f774757398de6a9e8532b73f0d568f (patch) | |
tree | ea4642b9b66dafa1383c24b993923f1ebe3f543b | |
parent | a7a91930157152a59fd6f023eea77eb47207da61 (diff) | |
download | chromium_src-968e2f30f0f774757398de6a9e8532b73f0d568f.zip chromium_src-968e2f30f0f774757398de6a9e8532b73f0d568f.tar.gz chromium_src-968e2f30f0f774757398de6a9e8532b73f0d568f.tar.bz2 |
Remove logic from ChunkDemuxer that allows EndOfStream to silently fail.
BUG=151316
TEST=ChunkDemuxerTest.TestEndOfStreamDuringPendingSeek updated to reflect the
minor change in behavior and ChunkDemuxerTest.TestEndOfStreamFailures
removed since it is no longer relevant.
Review URL: https://chromiumcodereview.appspot.com/17101002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@206526 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | media/filters/chunk_demuxer.cc | 42 | ||||
-rw-r--r-- | media/filters/chunk_demuxer.h | 4 | ||||
-rw-r--r-- | media/filters/chunk_demuxer_unittest.cc | 65 | ||||
-rw-r--r-- | webkit/renderer/media/webmediasourceclient_impl.cc | 3 |
4 files changed, 22 insertions, 92 deletions
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc index 27af028..d0c1dc9 100644 --- a/media/filters/chunk_demuxer.cc +++ b/media/filters/chunk_demuxer.cc @@ -232,7 +232,6 @@ class ChunkDemuxerStream : public DemuxerStream { void EndOfStream(); void CancelEndOfStream(); - bool CanEndOfStream() const; void Shutdown(); @@ -340,7 +339,8 @@ void ChunkDemuxerStream::CancelPendingSeek() { bool ChunkDemuxerStream::IsSeekPending() const { base::AutoLock auto_lock(lock_); - return stream_->IsSeekPending(); + return !(end_of_stream_ && stream_->IsEndSelected()) && + stream_->IsSeekPending(); } void ChunkDemuxerStream::OnNewMediaSegment(TimeDelta start_timestamp) { @@ -411,7 +411,6 @@ void ChunkDemuxerStream::EndOfStream() { { base::AutoLock auto_lock(lock_); DCHECK(!end_of_stream_); - DCHECK(stream_->IsEndSelected()); end_of_stream_ = true; CreateReadDoneClosures_Locked(&closures); } @@ -426,11 +425,6 @@ void ChunkDemuxerStream::CancelEndOfStream() { end_of_stream_ = false; } -bool ChunkDemuxerStream::CanEndOfStream() const { - base::AutoLock auto_lock(lock_); - return stream_->IsEndSelected(); -} - void ChunkDemuxerStream::Shutdown() { ReadCBQueue read_cbs; { @@ -975,7 +969,7 @@ bool ChunkDemuxer::SetTimestampOffset(const std::string& id, TimeDelta offset) { return source_state_map_[id]->SetTimestampOffset(offset); } -bool ChunkDemuxer::EndOfStream(PipelineStatus status) { +void ChunkDemuxer::EndOfStream(PipelineStatus status) { DVLOG(1) << "EndOfStream(" << status << ")"; PipelineStatusCB cb; { @@ -984,16 +978,14 @@ bool ChunkDemuxer::EndOfStream(PipelineStatus status) { DCHECK_NE(state_, ENDED); if (state_ == SHUTDOWN || state_ == PARSE_ERROR) - return true; + return; if (state_ == INITIALIZING) { ReportError_Locked(DEMUXER_ERROR_COULD_NOT_OPEN); - return true; + return; } - if (!CanEndOfStream_Locked() && status == PIPELINE_OK) - return false; - + bool old_seek_pending = IsSeekPending_Locked(); if (audio_) audio_->EndOfStream(); @@ -1001,22 +993,20 @@ bool ChunkDemuxer::EndOfStream(PipelineStatus status) { video_->EndOfStream(); // Give a chance to resume the pending seek process. - if (IsSeekPending_Locked() && !seek_cb_.is_null()) { - std::swap(cb, seek_cb_); - } - if (status != PIPELINE_OK) { ReportError_Locked(status); - } else { - ChangeState_Locked(ENDED); - DecreaseDurationIfNecessary(); + return; } + + ChangeState_Locked(ENDED); + DecreaseDurationIfNecessary(); + + if (old_seek_pending && !IsSeekPending_Locked() && !seek_cb_.is_null()) + std::swap(cb, seek_cb_); } if (!cb.is_null()) cb.Run(PIPELINE_OK); - - return true; } void ChunkDemuxer::Shutdown() { @@ -1104,12 +1094,6 @@ bool ChunkDemuxer::IsSeekPending_Locked() const { return seek_pending; } -bool ChunkDemuxer::CanEndOfStream_Locked() const { - lock_.AssertAcquired(); - return (!audio_ || audio_->CanEndOfStream()) && - (!video_ || video_->CanEndOfStream()); -} - void ChunkDemuxer::OnSourceInitDone(bool success, TimeDelta duration) { DVLOG(1) << "OnSourceInitDone(" << success << ", " << duration.InSecondsF() << ")"; diff --git a/media/filters/chunk_demuxer.h b/media/filters/chunk_demuxer.h index 249f22b..80e1539 100644 --- a/media/filters/chunk_demuxer.h +++ b/media/filters/chunk_demuxer.h @@ -104,9 +104,7 @@ class MEDIA_EXPORT ChunkDemuxer : public Demuxer { bool SetTimestampOffset(const std::string& id, base::TimeDelta offset); // Signals an EndOfStream request. - // Returns false if called in an unexpected state or if there is a gap between - // the current position and the end of the buffered data. - bool EndOfStream(PipelineStatus status); + void EndOfStream(PipelineStatus status); void Shutdown(); private: diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc index df036f8..325e821 100644 --- a/media/filters/chunk_demuxer_unittest.cc +++ b/media/filters/chunk_demuxer_unittest.cc @@ -455,7 +455,8 @@ class ChunkDemuxerTest : public testing::Test { AppendData(bear1->GetData() + 72737, 28183); CheckExpectedRanges(kSourceId, "{ [0,2737) }"); - return demuxer_->EndOfStream(PIPELINE_OK); + demuxer_->EndOfStream(PIPELINE_OK); + return true; } void ShutdownDemuxer() { @@ -1242,7 +1243,7 @@ TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { EXPECT_CALL(host_, SetDuration( base::TimeDelta::FromMilliseconds(kVideoBlockDuration))); - EXPECT_TRUE(demuxer_->EndOfStream(PIPELINE_OK)); + demuxer_->EndOfStream(PIPELINE_OK); end_of_stream_helper_1.CheckIfReadDonesWereCalled(true); @@ -1260,7 +1261,7 @@ TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringCanceledSeek) { AppendCluster(0, 10); EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138))); - EXPECT_TRUE(demuxer_->EndOfStream(PIPELINE_OK)); + demuxer_->EndOfStream(PIPELINE_OK); // Start the first seek. demuxer_->StartWaitingForSeek(); @@ -1768,7 +1769,9 @@ TEST_F(ChunkDemuxerTest, TestEndOfStreamDuringPendingSeek) { base::Bind(OnSeekDone_OKExpected, &seek_cb_was_called)); EXPECT_FALSE(seek_cb_was_called); - EXPECT_FALSE(demuxer_->EndOfStream(PIPELINE_OK)); + EXPECT_CALL(host_, SetDuration( + base::TimeDelta::FromMilliseconds(300))); + demuxer_->EndOfStream(PIPELINE_OK); EXPECT_FALSE(seek_cb_was_called); scoped_ptr<Cluster> cluster_a3( @@ -2070,60 +2073,6 @@ TEST_F(ChunkDemuxerTest, TestCodecIDsThatAreNotRFC6381Compliant) { } } -TEST_F(ChunkDemuxerTest, TestEndOfStreamFailures) { - std::string audio_id = "audio"; - std::string video_id = "video"; - - ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); - - scoped_ptr<Cluster> cluster_a1( - GenerateSingleStreamCluster(0, 35, kAudioTrackNum, 35)); - scoped_ptr<Cluster> cluster_v1( - GenerateSingleStreamCluster(0, 10, kVideoTrackNum, 5)); - scoped_ptr<Cluster> cluster_v2( - GenerateSingleStreamCluster(10, 25, kVideoTrackNum, 5)); - scoped_ptr<Cluster> cluster_v3( - GenerateSingleStreamCluster(30, 50, kVideoTrackNum, 10)); - - AppendData(audio_id, cluster_a1->data(), cluster_a1->size()); - AppendData(video_id, cluster_v1->data(), cluster_v1->size()); - AppendData(video_id, cluster_v3->data(), cluster_v3->size()); - - CheckExpectedRanges(audio_id, "{ [0,35) }"); - CheckExpectedRanges(video_id, "{ [0,10) [30,50) }"); - - // Make sure that end of stream fails because there is a gap between - // the current position(0) and the end of the appended data. - EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(50))); - ASSERT_FALSE(demuxer_->EndOfStream(PIPELINE_OK)); - - // Seek to an time that is inside the last ranges for both streams - // and verify that the EndOfStream() is successful. - demuxer_->StartWaitingForSeek(); - demuxer_->Seek(base::TimeDelta::FromMilliseconds(30), - NewExpectedStatusCB(PIPELINE_OK)); - - ASSERT_TRUE(demuxer_->EndOfStream(PIPELINE_OK)); - - // Append an zero length buffer to transition out of the end of stream state. - AppendData(NULL, 0); - - // Seek back to 0 and verify that EndOfStream() fails again. - demuxer_->StartWaitingForSeek(); - demuxer_->Seek(base::TimeDelta::FromMilliseconds(0), - NewExpectedStatusCB(PIPELINE_OK)); - - ASSERT_FALSE(demuxer_->EndOfStream(PIPELINE_OK)); - - // Append the missing range and verify that EndOfStream() succeeds now. - AppendData(video_id, cluster_v2->data(), cluster_v2->size()); - - CheckExpectedRanges(audio_id, "{ [0,35) }"); - CheckExpectedRanges(video_id, "{ [0,50) }"); - - ASSERT_TRUE(demuxer_->EndOfStream(PIPELINE_OK)); -} - TEST_F(ChunkDemuxerTest, TestEndOfStreamStillSetAfterSeek) { ASSERT_TRUE(InitDemuxer(true, true)); diff --git a/webkit/renderer/media/webmediasourceclient_impl.cc b/webkit/renderer/media/webmediasourceclient_impl.cc index 16d91e2..0e7ebab 100644 --- a/webkit/renderer/media/webmediasourceclient_impl.cc +++ b/webkit/renderer/media/webmediasourceclient_impl.cc @@ -77,8 +77,7 @@ void WebMediaSourceClientImpl::endOfStream( NOTIMPLEMENTED(); } - if (!demuxer_->EndOfStream(pipeline_status)) - DVLOG(1) << "EndOfStream call failed."; + demuxer_->EndOfStream(pipeline_status); } } // namespace webkit_media |