OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |