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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 buffer[i] = tmp & 0xff; | 66 buffer[i] = tmp & 0xff; |
67 tmp >>= 8; | 67 tmp >>= 8; |
68 } | 68 } |
69 } | 69 } |
70 | 70 |
71 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { | 71 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { |
72 return arg && !arg->IsEndOfStream() && | 72 return arg && !arg->IsEndOfStream() && |
73 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms; | 73 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms; |
74 } | 74 } |
75 | 75 |
| 76 MATCHER(IsEndOfStream, "") { |
| 77 return arg && arg->IsEndOfStream(); |
| 78 } |
| 79 |
76 static void OnReadDone(const base::TimeDelta& expected_time, | 80 static void OnReadDone(const base::TimeDelta& expected_time, |
77 bool* called, | 81 bool* called, |
78 DemuxerStream::Status status, | 82 DemuxerStream::Status status, |
79 const scoped_refptr<DecoderBuffer>& buffer) { | 83 const scoped_refptr<DecoderBuffer>& buffer) { |
80 EXPECT_EQ(status, DemuxerStream::kOk); | 84 EXPECT_EQ(status, DemuxerStream::kOk); |
81 EXPECT_EQ(expected_time, buffer->GetTimestamp()); | 85 EXPECT_EQ(expected_time, buffer->GetTimestamp()); |
82 *called = true; | 86 *called = true; |
83 } | 87 } |
84 | 88 |
85 static void OnReadDone_EOSExpected(bool* called, | 89 static void OnReadDone_EOSExpected(bool* called, |
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 ss << "[" << r.start(i).InMilliseconds() << "," | 583 ss << "[" << r.start(i).InMilliseconds() << "," |
580 << r.end(i).InMilliseconds() << ") "; | 584 << r.end(i).InMilliseconds() << ") "; |
581 } | 585 } |
582 ss << "}"; | 586 ss << "}"; |
583 EXPECT_EQ(ss.str(), expected); | 587 EXPECT_EQ(ss.str(), expected); |
584 } | 588 } |
585 | 589 |
586 MOCK_METHOD2(ReadDone, void(DemuxerStream::Status status, | 590 MOCK_METHOD2(ReadDone, void(DemuxerStream::Status status, |
587 const scoped_refptr<DecoderBuffer>&)); | 591 const scoped_refptr<DecoderBuffer>&)); |
588 | 592 |
| 593 void ExpectEndOfStream(DemuxerStream* stream) { |
| 594 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream())); |
| 595 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, |
| 596 base::Unretained(this))); |
| 597 } |
| 598 |
589 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { | 599 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { |
590 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, | 600 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, |
591 HasTimestamp(timestamp_in_ms))); | 601 HasTimestamp(timestamp_in_ms))); |
592 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, | 602 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, |
593 base::Unretained(this))); | 603 base::Unretained(this))); |
594 } | 604 } |
595 | 605 |
596 void ExpectConfigChanged(DemuxerStream* stream) { | 606 void ExpectConfigChanged(DemuxerStream* stream) { |
597 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); | 607 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); |
598 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, | 608 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, |
(...skipping 1159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1758 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size())); | 1768 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size())); |
1759 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size())); | 1769 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size())); |
1760 | 1770 |
1761 // Both streams should be able to fulfill a seek to 25. | 1771 // Both streams should be able to fulfill a seek to 25. |
1762 demuxer_->Seek(base::TimeDelta::FromMilliseconds(25), | 1772 demuxer_->Seek(base::TimeDelta::FromMilliseconds(25), |
1763 NewExpectedStatusCB(PIPELINE_OK)); | 1773 NewExpectedStatusCB(PIPELINE_OK)); |
1764 GenerateSingleStreamExpectedReads(25, 4, audio, kAudioBlockDuration); | 1774 GenerateSingleStreamExpectedReads(25, 4, audio, kAudioBlockDuration); |
1765 GenerateSingleStreamExpectedReads(30, 4, video, kVideoBlockDuration); | 1775 GenerateSingleStreamExpectedReads(30, 4, video, kVideoBlockDuration); |
1766 } | 1776 } |
1767 | 1777 |
| 1778 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodesOutOfRange) { |
| 1779 std::string audio_id = "audio1"; |
| 1780 std::string video_id = "video1"; |
| 1781 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); |
| 1782 |
| 1783 scoped_refptr<DemuxerStream> audio = |
| 1784 demuxer_->GetStream(DemuxerStream::AUDIO); |
| 1785 scoped_refptr<DemuxerStream> video = |
| 1786 demuxer_->GetStream(DemuxerStream::VIDEO); |
| 1787 |
| 1788 // Generate two streams where the video stream starts 10s after the audio |
| 1789 // stream and append them. |
| 1790 scoped_ptr<Cluster> cluster_v( |
| 1791 GenerateSingleStreamCluster(10000, 4 * kVideoBlockDuration + 10000, |
| 1792 kVideoTrackNum, kVideoBlockDuration)); |
| 1793 scoped_ptr<Cluster> cluster_a( |
| 1794 GenerateSingleStreamCluster(0, 4 * kAudioBlockDuration + 0, |
| 1795 kAudioTrackNum, kAudioBlockDuration)); |
| 1796 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size())); |
| 1797 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size())); |
| 1798 |
| 1799 // Should not be able to fulfill a seek to 0. |
| 1800 demuxer_->Seek(base::TimeDelta::FromMilliseconds(0), |
| 1801 NewExpectedStatusCB(PIPELINE_ERROR_ABORT)); |
| 1802 ExpectRead(audio, 0); |
| 1803 ExpectEndOfStream(video); |
| 1804 } |
| 1805 |
1768 TEST_F(ChunkDemuxerTest, TestClusterWithNoBuffers) { | 1806 TEST_F(ChunkDemuxerTest, TestClusterWithNoBuffers) { |
1769 ASSERT_TRUE(InitDemuxer(true, true, false)); | 1807 ASSERT_TRUE(InitDemuxer(true, true, false)); |
1770 | 1808 |
1771 // Generate and append an empty cluster beginning at 0. | 1809 // Generate and append an empty cluster beginning at 0. |
1772 ASSERT_TRUE(AppendEmptyCluster(0)); | 1810 ASSERT_TRUE(AppendEmptyCluster(0)); |
1773 | 1811 |
1774 // Sanity check that data can be appended after this cluster correctly. | 1812 // Sanity check that data can be appended after this cluster correctly. |
1775 scoped_ptr<Cluster> media_data(GenerateCluster(0, 2)); | 1813 scoped_ptr<Cluster> media_data(GenerateCluster(0, 2)); |
1776 ASSERT_TRUE(AppendData(media_data->data(), media_data->size())); | 1814 ASSERT_TRUE(AppendData(media_data->data(), media_data->size())); |
1777 scoped_refptr<DemuxerStream> audio = | 1815 scoped_refptr<DemuxerStream> audio = |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2105 TEST_F(ChunkDemuxerTest, TestTimestampOffsetSeparateStreams) { | 2143 TEST_F(ChunkDemuxerTest, TestTimestampOffsetSeparateStreams) { |
2106 std::string audio_id = "audio1"; | 2144 std::string audio_id = "audio1"; |
2107 std::string video_id = "video1"; | 2145 std::string video_id = "video1"; |
2108 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); | 2146 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); |
2109 | 2147 |
2110 scoped_refptr<DemuxerStream> audio = | 2148 scoped_refptr<DemuxerStream> audio = |
2111 demuxer_->GetStream(DemuxerStream::AUDIO); | 2149 demuxer_->GetStream(DemuxerStream::AUDIO); |
2112 scoped_refptr<DemuxerStream> video = | 2150 scoped_refptr<DemuxerStream> video = |
2113 demuxer_->GetStream(DemuxerStream::VIDEO); | 2151 demuxer_->GetStream(DemuxerStream::VIDEO); |
2114 | 2152 |
2115 scoped_ptr<Cluster> cluster_a( | 2153 scoped_ptr<Cluster> cluster_a1( |
2116 GenerateSingleStreamCluster( | 2154 GenerateSingleStreamCluster( |
2117 2500, 2500 + kAudioBlockDuration * 4, kAudioTrackNum, | 2155 2500, 2500 + kAudioBlockDuration * 4, kAudioTrackNum, |
2118 kAudioBlockDuration)); | 2156 kAudioBlockDuration)); |
2119 | 2157 |
2120 scoped_ptr<Cluster> cluster_v( | 2158 scoped_ptr<Cluster> cluster_v1( |
| 2159 GenerateSingleStreamCluster( |
| 2160 2500, 2500 + kVideoBlockDuration * 4, kVideoTrackNum, |
| 2161 kVideoBlockDuration)); |
| 2162 |
| 2163 scoped_ptr<Cluster> cluster_a2( |
| 2164 GenerateSingleStreamCluster( |
| 2165 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); |
| 2166 |
| 2167 scoped_ptr<Cluster> cluster_v2( |
2121 GenerateSingleStreamCluster( | 2168 GenerateSingleStreamCluster( |
2122 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); | 2169 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); |
2123 | 2170 |
2124 ASSERT_TRUE(demuxer_->SetTimestampOffset(audio_id, -2.5)); | 2171 ASSERT_TRUE(demuxer_->SetTimestampOffset(audio_id, -2.5)); |
2125 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size())); | 2172 ASSERT_TRUE(demuxer_->SetTimestampOffset(video_id, -2.5)); |
| 2173 ASSERT_TRUE(AppendData(audio_id, cluster_a1->data(), cluster_a1->size())); |
| 2174 ASSERT_TRUE(AppendData(video_id, cluster_v1->data(), cluster_v1->size())); |
2126 GenerateSingleStreamExpectedReads(0, 4, audio, kAudioBlockDuration); | 2175 GenerateSingleStreamExpectedReads(0, 4, audio, kAudioBlockDuration); |
| 2176 GenerateSingleStreamExpectedReads(0, 4, video, kVideoBlockDuration); |
2127 | 2177 |
| 2178 demuxer_->StartWaitingForSeek(); |
| 2179 demuxer_->Seek(base::TimeDelta::FromMilliseconds(27300), |
| 2180 NewExpectedStatusCB(PIPELINE_OK)); |
| 2181 |
| 2182 ASSERT_TRUE(demuxer_->SetTimestampOffset(audio_id, 27.3)); |
2128 ASSERT_TRUE(demuxer_->SetTimestampOffset(video_id, 27.3)); | 2183 ASSERT_TRUE(demuxer_->SetTimestampOffset(video_id, 27.3)); |
2129 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size())); | 2184 ASSERT_TRUE(AppendData(audio_id, cluster_a2->data(), cluster_a2->size())); |
| 2185 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size())); |
2130 GenerateSingleStreamExpectedReads(27300, 4, video, kVideoBlockDuration); | 2186 GenerateSingleStreamExpectedReads(27300, 4, video, kVideoBlockDuration); |
| 2187 GenerateSingleStreamExpectedReads(27300, 4, audio, kAudioBlockDuration); |
2131 } | 2188 } |
2132 | 2189 |
2133 TEST_F(ChunkDemuxerTest, TestTimestampOffsetMidParse) { | 2190 TEST_F(ChunkDemuxerTest, TestTimestampOffsetMidParse) { |
2134 ASSERT_TRUE(InitDemuxer(true, true, false)); | 2191 ASSERT_TRUE(InitDemuxer(true, true, false)); |
2135 | 2192 |
2136 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); | 2193 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); |
2137 // Append only part of the cluster data. | 2194 // Append only part of the cluster data. |
2138 ASSERT_TRUE(AppendData(cluster->data(), cluster->size() - 13)); | 2195 ASSERT_TRUE(AppendData(cluster->data(), cluster->size() - 13)); |
2139 | 2196 |
2140 // Setting a timestamp should fail because we're in the middle of a cluster. | 2197 // Setting a timestamp should fail because we're in the middle of a cluster. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2193 | 2250 |
2194 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); | 2251 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); |
2195 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); | 2252 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); |
2196 | 2253 |
2197 EXPECT_CALL(host_, SetDuration( | 2254 EXPECT_CALL(host_, SetDuration( |
2198 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); | 2255 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); |
2199 demuxer_->EndOfStream(PIPELINE_OK); | 2256 demuxer_->EndOfStream(PIPELINE_OK); |
2200 } | 2257 } |
2201 | 2258 |
2202 } // namespace media | 2259 } // namespace media |
OLD | NEW |