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 2178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2189 NewExpectedStatusCB(PIPELINE_OK)); | 2189 NewExpectedStatusCB(PIPELINE_OK)); |
2190 | 2190 |
2191 // Verify that no config change is signalled. | 2191 // Verify that no config change is signalled. |
2192 ExpectRead(stream, 801); | 2192 ExpectRead(stream, 801); |
2193 ASSERT_TRUE(video_config_1.Matches(stream->video_decoder_config())); | 2193 ASSERT_TRUE(video_config_1.Matches(stream->video_decoder_config())); |
2194 } | 2194 } |
2195 | 2195 |
2196 TEST_F(ChunkDemuxerTest, TestTimestampPositiveOffset) { | 2196 TEST_F(ChunkDemuxerTest, TestTimestampPositiveOffset) { |
2197 ASSERT_TRUE(InitDemuxer(true, true, false)); | 2197 ASSERT_TRUE(InitDemuxer(true, true, false)); |
2198 | 2198 |
2199 ASSERT_TRUE(demuxer_->SetTimestampOffset(kSourceId, 30)); | 2199 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
| 2200 kSourceId, base::TimeDelta::FromSeconds(30))); |
2200 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); | 2201 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); |
2201 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); | 2202 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); |
2202 | 2203 |
2203 scoped_refptr<DemuxerStream> audio = | 2204 scoped_refptr<DemuxerStream> audio = |
2204 demuxer_->GetStream(DemuxerStream::AUDIO); | 2205 demuxer_->GetStream(DemuxerStream::AUDIO); |
2205 scoped_refptr<DemuxerStream> video = | 2206 scoped_refptr<DemuxerStream> video = |
2206 demuxer_->GetStream(DemuxerStream::VIDEO); | 2207 demuxer_->GetStream(DemuxerStream::VIDEO); |
2207 GenerateExpectedReads(30000, 2, audio, video); | 2208 GenerateExpectedReads(30000, 2, audio, video); |
2208 } | 2209 } |
2209 | 2210 |
2210 TEST_F(ChunkDemuxerTest, TestTimestampNegativeOffset) { | 2211 TEST_F(ChunkDemuxerTest, TestTimestampNegativeOffset) { |
2211 ASSERT_TRUE(InitDemuxer(true, true, false)); | 2212 ASSERT_TRUE(InitDemuxer(true, true, false)); |
2212 | 2213 |
2213 ASSERT_TRUE(demuxer_->SetTimestampOffset(kSourceId, -1)); | 2214 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
| 2215 kSourceId, base::TimeDelta::FromSeconds(-1))); |
2214 scoped_ptr<Cluster> cluster = GenerateCluster(1000, 2); | 2216 scoped_ptr<Cluster> cluster = GenerateCluster(1000, 2); |
2215 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); | 2217 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); |
2216 | 2218 |
2217 scoped_refptr<DemuxerStream> audio = | 2219 scoped_refptr<DemuxerStream> audio = |
2218 demuxer_->GetStream(DemuxerStream::AUDIO); | 2220 demuxer_->GetStream(DemuxerStream::AUDIO); |
2219 scoped_refptr<DemuxerStream> video = | 2221 scoped_refptr<DemuxerStream> video = |
2220 demuxer_->GetStream(DemuxerStream::VIDEO); | 2222 demuxer_->GetStream(DemuxerStream::VIDEO); |
2221 GenerateExpectedReads(0, 2, audio, video); | 2223 GenerateExpectedReads(0, 2, audio, video); |
2222 } | 2224 } |
2223 | 2225 |
(...skipping 18 matching lines...) Expand all Loading... |
2242 kVideoBlockDuration)); | 2244 kVideoBlockDuration)); |
2243 | 2245 |
2244 scoped_ptr<Cluster> cluster_a2( | 2246 scoped_ptr<Cluster> cluster_a2( |
2245 GenerateSingleStreamCluster( | 2247 GenerateSingleStreamCluster( |
2246 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); | 2248 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); |
2247 | 2249 |
2248 scoped_ptr<Cluster> cluster_v2( | 2250 scoped_ptr<Cluster> cluster_v2( |
2249 GenerateSingleStreamCluster( | 2251 GenerateSingleStreamCluster( |
2250 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); | 2252 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); |
2251 | 2253 |
2252 ASSERT_TRUE(demuxer_->SetTimestampOffset(audio_id, -2.5)); | 2254 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
2253 ASSERT_TRUE(demuxer_->SetTimestampOffset(video_id, -2.5)); | 2255 audio_id, base::TimeDelta::FromMilliseconds(-2500))); |
| 2256 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
| 2257 video_id, base::TimeDelta::FromMilliseconds(-2500))); |
2254 ASSERT_TRUE(AppendData(audio_id, cluster_a1->data(), cluster_a1->size())); | 2258 ASSERT_TRUE(AppendData(audio_id, cluster_a1->data(), cluster_a1->size())); |
2255 ASSERT_TRUE(AppendData(video_id, cluster_v1->data(), cluster_v1->size())); | 2259 ASSERT_TRUE(AppendData(video_id, cluster_v1->data(), cluster_v1->size())); |
2256 GenerateSingleStreamExpectedReads(0, 4, audio, kAudioBlockDuration); | 2260 GenerateSingleStreamExpectedReads(0, 4, audio, kAudioBlockDuration); |
2257 GenerateSingleStreamExpectedReads(0, 4, video, kVideoBlockDuration); | 2261 GenerateSingleStreamExpectedReads(0, 4, video, kVideoBlockDuration); |
2258 | 2262 |
2259 demuxer_->StartWaitingForSeek(); | 2263 demuxer_->StartWaitingForSeek(); |
2260 demuxer_->Seek(base::TimeDelta::FromMilliseconds(27300), | 2264 demuxer_->Seek(base::TimeDelta::FromMilliseconds(27300), |
2261 NewExpectedStatusCB(PIPELINE_OK)); | 2265 NewExpectedStatusCB(PIPELINE_OK)); |
2262 | 2266 |
2263 ASSERT_TRUE(demuxer_->SetTimestampOffset(audio_id, 27.3)); | 2267 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
2264 ASSERT_TRUE(demuxer_->SetTimestampOffset(video_id, 27.3)); | 2268 audio_id, base::TimeDelta::FromMilliseconds(27300))); |
| 2269 ASSERT_TRUE(demuxer_->SetTimestampOffset( |
| 2270 video_id, base::TimeDelta::FromMilliseconds(27300))); |
2265 ASSERT_TRUE(AppendData(audio_id, cluster_a2->data(), cluster_a2->size())); | 2271 ASSERT_TRUE(AppendData(audio_id, cluster_a2->data(), cluster_a2->size())); |
2266 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size())); | 2272 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size())); |
2267 GenerateSingleStreamExpectedReads(27300, 4, video, kVideoBlockDuration); | 2273 GenerateSingleStreamExpectedReads(27300, 4, video, kVideoBlockDuration); |
2268 GenerateSingleStreamExpectedReads(27300, 4, audio, kAudioBlockDuration); | 2274 GenerateSingleStreamExpectedReads(27300, 4, audio, kAudioBlockDuration); |
2269 } | 2275 } |
2270 | 2276 |
2271 TEST_F(ChunkDemuxerTest, TestTimestampOffsetMidParse) { | 2277 TEST_F(ChunkDemuxerTest, TestTimestampOffsetMidParse) { |
2272 ASSERT_TRUE(InitDemuxer(true, true, false)); | 2278 ASSERT_TRUE(InitDemuxer(true, true, false)); |
2273 | 2279 |
2274 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); | 2280 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); |
2275 // Append only part of the cluster data. | 2281 // Append only part of the cluster data. |
2276 ASSERT_TRUE(AppendData(cluster->data(), cluster->size() - 13)); | 2282 ASSERT_TRUE(AppendData(cluster->data(), cluster->size() - 13)); |
2277 | 2283 |
2278 // Setting a timestamp should fail because we're in the middle of a cluster. | 2284 // Setting a timestamp should fail because we're in the middle of a cluster. |
2279 ASSERT_FALSE(demuxer_->SetTimestampOffset(kSourceId, 25)); | 2285 ASSERT_FALSE(demuxer_->SetTimestampOffset( |
| 2286 kSourceId, base::TimeDelta::FromSeconds(25))); |
2280 } | 2287 } |
2281 | 2288 |
2282 TEST_F(ChunkDemuxerTest, TestDurationChange) { | 2289 TEST_F(ChunkDemuxerTest, TestDurationChange) { |
2283 ASSERT_TRUE(InitDemuxer(true, true, false)); | 2290 ASSERT_TRUE(InitDemuxer(true, true, false)); |
2284 static const int kStreamDuration = kDefaultDuration().InMilliseconds(); | 2291 static const int kStreamDuration = kDefaultDuration().InMilliseconds(); |
2285 | 2292 |
2286 // Add data leading up to the currently set duration. | 2293 // Add data leading up to the currently set duration. |
2287 scoped_ptr<Cluster> first_cluster = GenerateCluster( | 2294 scoped_ptr<Cluster> first_cluster = GenerateCluster( |
2288 kStreamDuration - kAudioBlockDuration, | 2295 kStreamDuration - kAudioBlockDuration, |
2289 kStreamDuration - kVideoBlockDuration, 2); | 2296 kStreamDuration - kVideoBlockDuration, 2); |
(...skipping 19 matching lines...) Expand all Loading... |
2309 base::TimeDelta::FromMilliseconds(kNewStreamDuration))); | 2316 base::TimeDelta::FromMilliseconds(kNewStreamDuration))); |
2310 ASSERT_TRUE(AppendData(third_cluster->data(), third_cluster->size())); | 2317 ASSERT_TRUE(AppendData(third_cluster->data(), third_cluster->size())); |
2311 | 2318 |
2312 // See that the range has increased appropriately. | 2319 // See that the range has increased appropriately. |
2313 CheckExpectedRanges(kSourceId, "{ [201191,201270) }"); | 2320 CheckExpectedRanges(kSourceId, "{ [201191,201270) }"); |
2314 } | 2321 } |
2315 | 2322 |
2316 TEST_F(ChunkDemuxerTest, TestDurationChangeTimestampOffset) { | 2323 TEST_F(ChunkDemuxerTest, TestDurationChangeTimestampOffset) { |
2317 ASSERT_TRUE(InitDemuxer(true, true, false)); | 2324 ASSERT_TRUE(InitDemuxer(true, true, false)); |
2318 | 2325 |
2319 ASSERT_TRUE(demuxer_->SetTimestampOffset(kSourceId, | 2326 ASSERT_TRUE(demuxer_->SetTimestampOffset(kSourceId, kDefaultDuration())); |
2320 kDefaultDuration().InSecondsF())); | |
2321 scoped_ptr<Cluster> cluster = GenerateCluster(0, 4); | 2327 scoped_ptr<Cluster> cluster = GenerateCluster(0, 4); |
2322 | 2328 |
2323 EXPECT_CALL(host_, SetDuration( | 2329 EXPECT_CALL(host_, SetDuration( |
2324 kDefaultDuration() + base::TimeDelta::FromMilliseconds( | 2330 kDefaultDuration() + base::TimeDelta::FromMilliseconds( |
2325 kAudioBlockDuration * 2))); | 2331 kAudioBlockDuration * 2))); |
2326 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); | 2332 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); |
2327 } | 2333 } |
2328 | 2334 |
2329 TEST_F(ChunkDemuxerTest, TestEndOfStreamTruncateDuration) { | 2335 TEST_F(ChunkDemuxerTest, TestEndOfStreamTruncateDuration) { |
2330 ASSERT_TRUE(InitDemuxer(true, true, false)); | 2336 ASSERT_TRUE(InitDemuxer(true, true, false)); |
2331 | 2337 |
2332 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); | 2338 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); |
2333 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); | 2339 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); |
2334 | 2340 |
2335 EXPECT_CALL(host_, SetDuration( | 2341 EXPECT_CALL(host_, SetDuration( |
2336 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); | 2342 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); |
2337 demuxer_->EndOfStream(PIPELINE_OK); | 2343 demuxer_->EndOfStream(PIPELINE_OK); |
2338 } | 2344 } |
2339 | 2345 |
2340 } // namespace media | 2346 } // namespace media |
OLD | NEW |