summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-15 00:33:11 +0000
committeracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-15 00:33:11 +0000
commit968e2f30f0f774757398de6a9e8532b73f0d568f (patch)
treeea4642b9b66dafa1383c24b993923f1ebe3f543b
parenta7a91930157152a59fd6f023eea77eb47207da61 (diff)
downloadchromium_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.cc42
-rw-r--r--media/filters/chunk_demuxer.h4
-rw-r--r--media/filters/chunk_demuxer_unittest.cc65
-rw-r--r--webkit/renderer/media/webmediasourceclient_impl.cc3
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