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 "media/base/audio_decoder_config.h" | 6 #include "media/base/audio_decoder_config.h" |
7 #include "media/base/decoder_buffer.h" | 7 #include "media/base/decoder_buffer.h" |
8 #include "media/base/mock_callback.h" | 8 #include "media/base/mock_callback.h" |
9 #include "media/base/mock_demuxer_host.h" | 9 #include "media/base/mock_demuxer_host.h" |
10 #include "media/base/test_data_util.h" | 10 #include "media/base/test_data_util.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
65 buffer[i] = tmp & 0xff; | 65 buffer[i] = tmp & 0xff; |
66 tmp >>= 8; | 66 tmp >>= 8; |
67 } | 67 } |
68 } | 68 } |
69 | 69 |
70 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { | 70 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { |
71 return arg && !arg->IsEndOfStream() && | 71 return arg && !arg->IsEndOfStream() && |
72 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms; | 72 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms; |
73 } | 73 } |
74 | 74 |
75 MATCHER(IsEndOfStream, "") { | |
76 return arg && arg->IsEndOfStream(); | |
77 } | |
78 | |
75 static void OnReadDone(const base::TimeDelta& expected_time, | 79 static void OnReadDone(const base::TimeDelta& expected_time, |
76 bool* called, | 80 bool* called, |
77 DemuxerStream::Status status, | 81 DemuxerStream::Status status, |
78 const scoped_refptr<DecoderBuffer>& buffer) { | 82 const scoped_refptr<DecoderBuffer>& buffer) { |
79 EXPECT_EQ(status, DemuxerStream::kOk); | 83 EXPECT_EQ(status, DemuxerStream::kOk); |
80 EXPECT_EQ(expected_time, buffer->GetTimestamp()); | 84 EXPECT_EQ(expected_time, buffer->GetTimestamp()); |
81 *called = true; | 85 *called = true; |
82 } | 86 } |
83 | 87 |
84 static void OnReadDone_EOSExpected(bool* called, | 88 static void OnReadDone_EOSExpected(bool* called, |
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
578 ss << "[" << r.start(i).InMilliseconds() << "," | 582 ss << "[" << r.start(i).InMilliseconds() << "," |
579 << r.end(i).InMilliseconds() << ") "; | 583 << r.end(i).InMilliseconds() << ") "; |
580 } | 584 } |
581 ss << "}"; | 585 ss << "}"; |
582 EXPECT_EQ(ss.str(), expected); | 586 EXPECT_EQ(ss.str(), expected); |
583 } | 587 } |
584 | 588 |
585 MOCK_METHOD2(ReadDone, void(DemuxerStream::Status status, | 589 MOCK_METHOD2(ReadDone, void(DemuxerStream::Status status, |
586 const scoped_refptr<DecoderBuffer>&)); | 590 const scoped_refptr<DecoderBuffer>&)); |
587 | 591 |
592 void ExpectStall(DemuxerStream* stream) { | |
acolwell GONE FROM CHROMIUM
2012/08/04 00:04:51
s/ExpectStall/ExpectEndOfStream/ ? since that look
vrk (LEFT CHROMIUM)
2012/08/06 20:43:42
Done.
| |
593 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream())); | |
594 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, | |
595 base::Unretained(this))); | |
596 } | |
597 | |
588 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { | 598 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { |
589 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, | 599 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, |
590 HasTimestamp(timestamp_in_ms))); | 600 HasTimestamp(timestamp_in_ms))); |
591 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, | 601 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, |
592 base::Unretained(this))); | 602 base::Unretained(this))); |
593 } | 603 } |
594 | 604 |
595 void ExpectConfigChanged(DemuxerStream* stream) { | 605 void ExpectConfigChanged(DemuxerStream* stream) { |
596 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); | 606 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); |
597 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, | 607 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, |
(...skipping 1160 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 ExpectStall(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 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2095 scoped_ptr<Cluster> cluster = GenerateCluster(1000, 2); | 2133 scoped_ptr<Cluster> cluster = GenerateCluster(1000, 2); |
2096 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); | 2134 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); |
2097 | 2135 |
2098 scoped_refptr<DemuxerStream> audio = | 2136 scoped_refptr<DemuxerStream> audio = |
2099 demuxer_->GetStream(DemuxerStream::AUDIO); | 2137 demuxer_->GetStream(DemuxerStream::AUDIO); |
2100 scoped_refptr<DemuxerStream> video = | 2138 scoped_refptr<DemuxerStream> video = |
2101 demuxer_->GetStream(DemuxerStream::VIDEO); | 2139 demuxer_->GetStream(DemuxerStream::VIDEO); |
2102 GenerateExpectedReads(0, 2, audio, video); | 2140 GenerateExpectedReads(0, 2, audio, video); |
2103 } | 2141 } |
2104 | 2142 |
2105 TEST_F(ChunkDemuxerTest, TestTimestampOffsetSeparateStreams) { | 2143 TEST_F(ChunkDemuxerTest, TestTimestampOffsetSeparateStreams) { |
vrk (LEFT CHROMIUM)
2012/08/03 23:52:03
Had to fix this test because it was unintentionall
| |
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 |