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

Unified Diff: media/filters/chunk_demuxer_unittest.cc

Issue 10835044: Cancel pending seek in ChunkDemuxer when a new seek occurs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: response to CR Created 8 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | webkit/media/webmediaplayer_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/chunk_demuxer_unittest.cc
diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc
index 46c9e6377f22c6e13ea56e8ed487072745c067cc..d266a8ae12da915c0d534297e19d1b93b56554ae 100644
--- a/media/filters/chunk_demuxer_unittest.cc
+++ b/media/filters/chunk_demuxer_unittest.cc
@@ -86,6 +86,14 @@ static void OnReadDone(const base::TimeDelta& expected_time,
*called = true;
}
+static void OnReadDone_AbortExpected(
+ bool* called, DemuxerStream::Status status,
+ const scoped_refptr<DecoderBuffer>& buffer) {
+ EXPECT_EQ(status, DemuxerStream::kAborted);
+ EXPECT_EQ(NULL, buffer.get());
+ *called = true;
+}
+
static void OnReadDone_EOSExpected(bool* called,
DemuxerStream::Status status,
const scoped_refptr<DecoderBuffer>& buffer) {
@@ -1489,6 +1497,79 @@ TEST_F(ChunkDemuxerTest, TestRemoveId) {
GenerateSingleStreamExpectedReads(0, 4, video, kVideoBlockDuration);
}
+TEST_F(ChunkDemuxerTest, TestSeekCanceled) {
+ ASSERT_TRUE(InitDemuxer(true, true, false));
+
+ scoped_refptr<DemuxerStream> audio =
+ demuxer_->GetStream(DemuxerStream::AUDIO);
+ scoped_refptr<DemuxerStream> video =
+ demuxer_->GetStream(DemuxerStream::VIDEO);
+
+ // Append cluster at the beginning of the stream.
+ scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4));
+ ASSERT_TRUE(AppendData(start_cluster->data(), start_cluster->size()));
+
+ // Seek to an unbuffered region.
+ demuxer_->StartWaitingForSeek();
+ demuxer_->Seek(base::TimeDelta::FromSeconds(50),
+ NewExpectedStatusCB(PIPELINE_OK));
+
+ // Attempt to read in unbuffered area; should not fulfill the read.
+ bool audio_read_done = false;
+ bool video_read_done = false;
+ audio->Read(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
+ video->Read(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
+ EXPECT_FALSE(audio_read_done);
+ EXPECT_FALSE(video_read_done);
+
+ // Now cancel the pending seek, which should flush the reads with empty
+ // buffers.
+ demuxer_->CancelPendingSeek();
+ EXPECT_TRUE(audio_read_done);
+ EXPECT_TRUE(video_read_done);
+
+ // A seek back to the buffered region should succeed.
+ demuxer_->StartWaitingForSeek();
+ demuxer_->Seek(base::TimeDelta::FromSeconds(0),
+ NewExpectedStatusCB(PIPELINE_OK));
+ GenerateExpectedReads(0, 4, audio, video);
+}
+
+TEST_F(ChunkDemuxerTest, TestSeekCanceledWhileWaitingForSeek) {
+ ASSERT_TRUE(InitDemuxer(true, true, false));
+
+ scoped_refptr<DemuxerStream> audio =
+ demuxer_->GetStream(DemuxerStream::AUDIO);
+ scoped_refptr<DemuxerStream> video =
+ demuxer_->GetStream(DemuxerStream::VIDEO);
+
+ // Append cluster at the beginning of the stream.
+ scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4));
+ ASSERT_TRUE(AppendData(start_cluster->data(), start_cluster->size()));
+
+ // Start waiting for a seek.
+ demuxer_->StartWaitingForSeek();
+
+ // Now cancel the upcoming seek to an unbuffered region.
+ demuxer_->CancelPendingSeek();
+ demuxer_->Seek(base::TimeDelta::FromSeconds(50),
+ NewExpectedStatusCB(PIPELINE_OK));
+
+ // Read requests should be fulfilled with empty buffers.
+ bool audio_read_done = false;
+ bool video_read_done = false;
+ audio->Read(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
+ video->Read(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
+ EXPECT_TRUE(audio_read_done);
+ EXPECT_TRUE(video_read_done);
+
+ // A seek back to the buffered region should succeed.
+ demuxer_->StartWaitingForSeek();
+ demuxer_->Seek(base::TimeDelta::FromSeconds(0),
+ NewExpectedStatusCB(PIPELINE_OK));
+ GenerateExpectedReads(0, 4, audio, video);
+}
+
// Test that Seek() successfully seeks to all source IDs.
TEST_F(ChunkDemuxerTest, TestSeekAudioAndVideoSources) {
std::string audio_id = "audio1";
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | webkit/media/webmediaplayer_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698