| 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";
|
|
|