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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | webkit/media/webmediaplayer_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/message_loop.h" 6 #include "base/message_loop.h"
7 #include "media/base/audio_decoder_config.h" 7 #include "media/base/audio_decoder_config.h"
8 #include "media/base/decoder_buffer.h" 8 #include "media/base/decoder_buffer.h"
9 #include "media/base/mock_callback.h" 9 #include "media/base/mock_callback.h"
10 #include "media/base/mock_demuxer_host.h" 10 #include "media/base/mock_demuxer_host.h"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 79
80 static void OnReadDone(const base::TimeDelta& expected_time, 80 static void OnReadDone(const base::TimeDelta& expected_time,
81 bool* called, 81 bool* called,
82 DemuxerStream::Status status, 82 DemuxerStream::Status status,
83 const scoped_refptr<DecoderBuffer>& buffer) { 83 const scoped_refptr<DecoderBuffer>& buffer) {
84 EXPECT_EQ(status, DemuxerStream::kOk); 84 EXPECT_EQ(status, DemuxerStream::kOk);
85 EXPECT_EQ(expected_time, buffer->GetTimestamp()); 85 EXPECT_EQ(expected_time, buffer->GetTimestamp());
86 *called = true; 86 *called = true;
87 } 87 }
88 88
89 static void OnReadDone_AbortExpected(
90 bool* called, DemuxerStream::Status status,
91 const scoped_refptr<DecoderBuffer>& buffer) {
92 EXPECT_EQ(status, DemuxerStream::kAborted);
93 EXPECT_EQ(NULL, buffer.get());
94 *called = true;
95 }
96
89 static void OnReadDone_EOSExpected(bool* called, 97 static void OnReadDone_EOSExpected(bool* called,
90 DemuxerStream::Status status, 98 DemuxerStream::Status status,
91 const scoped_refptr<DecoderBuffer>& buffer) { 99 const scoped_refptr<DecoderBuffer>& buffer) {
92 EXPECT_EQ(status, DemuxerStream::kOk); 100 EXPECT_EQ(status, DemuxerStream::kOk);
93 EXPECT_TRUE(buffer->IsEndOfStream()); 101 EXPECT_TRUE(buffer->IsEndOfStream());
94 *called = true; 102 *called = true;
95 } 103 }
96 104
97 class MockChunkDemuxerClient : public ChunkDemuxerClient { 105 class MockChunkDemuxerClient : public ChunkDemuxerClient {
98 public: 106 public:
(...skipping 1383 matching lines...) Expand 10 before | Expand all | Expand 10 after
1482 audio->Read(base::Bind(&OnReadDone_EOSExpected, 1490 audio->Read(base::Bind(&OnReadDone_EOSExpected,
1483 &audio_read_done)); 1491 &audio_read_done));
1484 EXPECT_TRUE(audio_read_done); 1492 EXPECT_TRUE(audio_read_done);
1485 1493
1486 // Read() from video should still return normal buffers. 1494 // Read() from video should still return normal buffers.
1487 scoped_refptr<DemuxerStream> video = 1495 scoped_refptr<DemuxerStream> video =
1488 demuxer_->GetStream(DemuxerStream::VIDEO); 1496 demuxer_->GetStream(DemuxerStream::VIDEO);
1489 GenerateSingleStreamExpectedReads(0, 4, video, kVideoBlockDuration); 1497 GenerateSingleStreamExpectedReads(0, 4, video, kVideoBlockDuration);
1490 } 1498 }
1491 1499
1500 TEST_F(ChunkDemuxerTest, TestSeekCanceled) {
1501 ASSERT_TRUE(InitDemuxer(true, true, false));
1502
1503 scoped_refptr<DemuxerStream> audio =
1504 demuxer_->GetStream(DemuxerStream::AUDIO);
1505 scoped_refptr<DemuxerStream> video =
1506 demuxer_->GetStream(DemuxerStream::VIDEO);
1507
1508 // Append cluster at the beginning of the stream.
1509 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4));
1510 ASSERT_TRUE(AppendData(start_cluster->data(), start_cluster->size()));
1511
1512 // Seek to an unbuffered region.
1513 demuxer_->StartWaitingForSeek();
1514 demuxer_->Seek(base::TimeDelta::FromSeconds(50),
1515 NewExpectedStatusCB(PIPELINE_OK));
1516
1517 // Attempt to read in unbuffered area; should not fulfill the read.
1518 bool audio_read_done = false;
1519 bool video_read_done = false;
1520 audio->Read(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
1521 video->Read(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
1522 EXPECT_FALSE(audio_read_done);
1523 EXPECT_FALSE(video_read_done);
1524
1525 // Now cancel the pending seek, which should flush the reads with empty
1526 // buffers.
1527 demuxer_->CancelPendingSeek();
1528 EXPECT_TRUE(audio_read_done);
1529 EXPECT_TRUE(video_read_done);
1530
1531 // A seek back to the buffered region should succeed.
1532 demuxer_->StartWaitingForSeek();
1533 demuxer_->Seek(base::TimeDelta::FromSeconds(0),
1534 NewExpectedStatusCB(PIPELINE_OK));
1535 GenerateExpectedReads(0, 4, audio, video);
1536 }
1537
1538 TEST_F(ChunkDemuxerTest, TestSeekCanceledWhileWaitingForSeek) {
1539 ASSERT_TRUE(InitDemuxer(true, true, false));
1540
1541 scoped_refptr<DemuxerStream> audio =
1542 demuxer_->GetStream(DemuxerStream::AUDIO);
1543 scoped_refptr<DemuxerStream> video =
1544 demuxer_->GetStream(DemuxerStream::VIDEO);
1545
1546 // Append cluster at the beginning of the stream.
1547 scoped_ptr<Cluster> start_cluster(GenerateCluster(0, 4));
1548 ASSERT_TRUE(AppendData(start_cluster->data(), start_cluster->size()));
1549
1550 // Start waiting for a seek.
1551 demuxer_->StartWaitingForSeek();
1552
1553 // Now cancel the upcoming seek to an unbuffered region.
1554 demuxer_->CancelPendingSeek();
1555 demuxer_->Seek(base::TimeDelta::FromSeconds(50),
1556 NewExpectedStatusCB(PIPELINE_OK));
1557
1558 // Read requests should be fulfilled with empty buffers.
1559 bool audio_read_done = false;
1560 bool video_read_done = false;
1561 audio->Read(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
1562 video->Read(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
1563 EXPECT_TRUE(audio_read_done);
1564 EXPECT_TRUE(video_read_done);
1565
1566 // A seek back to the buffered region should succeed.
1567 demuxer_->StartWaitingForSeek();
1568 demuxer_->Seek(base::TimeDelta::FromSeconds(0),
1569 NewExpectedStatusCB(PIPELINE_OK));
1570 GenerateExpectedReads(0, 4, audio, video);
1571 }
1572
1492 // Test that Seek() successfully seeks to all source IDs. 1573 // Test that Seek() successfully seeks to all source IDs.
1493 TEST_F(ChunkDemuxerTest, TestSeekAudioAndVideoSources) { 1574 TEST_F(ChunkDemuxerTest, TestSeekAudioAndVideoSources) {
1494 std::string audio_id = "audio1"; 1575 std::string audio_id = "audio1";
1495 std::string video_id = "video1"; 1576 std::string video_id = "video1";
1496 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 1577 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1497 1578
1498 scoped_ptr<Cluster> cluster_a1( 1579 scoped_ptr<Cluster> cluster_a1(
1499 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 1580 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration));
1500 1581
1501 scoped_ptr<Cluster> cluster_v1( 1582 scoped_ptr<Cluster> cluster_v1(
(...skipping 748 matching lines...) Expand 10 before | Expand all | Expand 10 after
2250 2331
2251 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); 2332 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster());
2252 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 2333 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
2253 2334
2254 EXPECT_CALL(host_, SetDuration( 2335 EXPECT_CALL(host_, SetDuration(
2255 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); 2336 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp)));
2256 demuxer_->EndOfStream(PIPELINE_OK); 2337 demuxer_->EndOfStream(PIPELINE_OK);
2257 } 2338 }
2258 2339
2259 } // namespace media 2340 } // namespace media
OLDNEW
« 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