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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "base/strings/string_split.h" | 10 #include "base/strings/string_split.h" |
(...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
955 cb.SetClusterTimecode(timecode); | 955 cb.SetClusterTimecode(timecode); |
956 return cb.Finish(); | 956 return cb.Finish(); |
957 } | 957 } |
958 | 958 |
959 void CheckExpectedRanges(const std::string& expected) { | 959 void CheckExpectedRanges(const std::string& expected) { |
960 CheckExpectedRanges(kSourceId, expected); | 960 CheckExpectedRanges(kSourceId, expected); |
961 } | 961 } |
962 | 962 |
963 void CheckExpectedRanges(const std::string& id, | 963 void CheckExpectedRanges(const std::string& id, |
964 const std::string& expected) { | 964 const std::string& expected) { |
965 Ranges<base::TimeDelta> r = demuxer_->GetBufferedRanges(id); | 965 CheckExpectedRanges(demuxer_->GetBufferedRanges(id), expected); |
| 966 } |
966 | 967 |
| 968 void CheckExpectedRanges(DemuxerStream::Type type, |
| 969 const std::string& expected) { |
| 970 ChunkDemuxerStream* stream = |
| 971 static_cast<ChunkDemuxerStream*>(demuxer_->GetStream(type)); |
| 972 CheckExpectedRanges(stream->GetBufferedRanges(kDefaultDuration()), |
| 973 expected); |
| 974 } |
| 975 |
| 976 void CheckExpectedRanges(const Ranges<base::TimeDelta>& r, |
| 977 const std::string& expected) { |
967 std::stringstream ss; | 978 std::stringstream ss; |
968 ss << "{ "; | 979 ss << "{ "; |
969 for (size_t i = 0; i < r.size(); ++i) { | 980 for (size_t i = 0; i < r.size(); ++i) { |
970 ss << "[" << r.start(i).InMilliseconds() << "," | 981 ss << "[" << r.start(i).InMilliseconds() << "," |
971 << r.end(i).InMilliseconds() << ") "; | 982 << r.end(i).InMilliseconds() << ") "; |
972 } | 983 } |
973 ss << "}"; | 984 ss << "}"; |
974 EXPECT_EQ(expected, ss.str()); | 985 EXPECT_EQ(expected, ss.str()); |
975 } | 986 } |
976 | 987 |
(...skipping 2285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3262 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200); | 3273 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200); |
3263 demuxer_->CancelPendingSeek(seek_time); | 3274 demuxer_->CancelPendingSeek(seek_time); |
3264 | 3275 |
3265 // Initiate the seek to the new location. | 3276 // Initiate the seek to the new location. |
3266 Seek(seek_time); | 3277 Seek(seek_time); |
3267 | 3278 |
3268 // Append data to satisfy the seek. | 3279 // Append data to satisfy the seek. |
3269 AppendCluster(seek_time.InMilliseconds(), 10); | 3280 AppendCluster(seek_time.InMilliseconds(), 10); |
3270 } | 3281 } |
3271 | 3282 |
| 3283 TEST_F(ChunkDemuxerTest, SetMemoryLimitType) { |
| 3284 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| 3285 |
| 3286 // Set different memory limits for audio and video. |
| 3287 demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize); |
| 3288 demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, 5 * kBlockSize); |
| 3289 |
| 3290 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(1000); |
| 3291 |
| 3292 // Append data at the start that can be garbage collected: |
| 3293 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10); |
| 3294 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 5); |
| 3295 |
| 3296 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,230) }"); |
| 3297 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,165) }"); |
| 3298 |
| 3299 // Seek so we can garbage collect the data appended above. |
| 3300 Seek(seek_time); |
| 3301 |
| 3302 // Append data at seek_time. |
| 3303 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, |
| 3304 seek_time.InMilliseconds(), 10); |
| 3305 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, |
| 3306 seek_time.InMilliseconds(), 5); |
| 3307 |
| 3308 // Verify that the old data, and nothing more, has been garbage collected. |
| 3309 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [1000,1230) }"); |
| 3310 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [1000,1165) }"); |
| 3311 } |
| 3312 |
3272 TEST_F(ChunkDemuxerTest, GCDuringSeek) { | 3313 TEST_F(ChunkDemuxerTest, GCDuringSeek) { |
3273 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); | 3314 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); |
3274 | 3315 |
3275 demuxer_->SetMemoryLimitsForTesting(5 * kBlockSize); | 3316 demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 5 * kBlockSize); |
3276 | 3317 |
3277 base::TimeDelta seek_time1 = base::TimeDelta::FromMilliseconds(1000); | 3318 base::TimeDelta seek_time1 = base::TimeDelta::FromMilliseconds(1000); |
3278 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(500); | 3319 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(500); |
3279 | 3320 |
3280 // Initiate a seek to |seek_time1|. | 3321 // Initiate a seek to |seek_time1|. |
3281 Seek(seek_time1); | 3322 Seek(seek_time1); |
3282 | 3323 |
3283 // Append data to satisfy the first seek request. | 3324 // Append data to satisfy the first seek request. |
3284 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, | 3325 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, |
3285 seek_time1.InMilliseconds(), 5); | 3326 seek_time1.InMilliseconds(), 5); |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3655 TEST_F(ChunkDemuxerTest, CuesBetweenClusters) { | 3696 TEST_F(ChunkDemuxerTest, CuesBetweenClusters) { |
3656 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 3697 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
3657 | 3698 |
3658 AppendCluster(GenerateCluster(0, 0, 4)); | 3699 AppendCluster(GenerateCluster(0, 0, 4)); |
3659 AppendData(kCuesHeader, sizeof(kCuesHeader)); | 3700 AppendData(kCuesHeader, sizeof(kCuesHeader)); |
3660 AppendCluster(GenerateCluster(46, 66, 5)); | 3701 AppendCluster(GenerateCluster(46, 66, 5)); |
3661 CheckExpectedRanges(kSourceId, "{ [0,115) }"); | 3702 CheckExpectedRanges(kSourceId, "{ [0,115) }"); |
3662 } | 3703 } |
3663 | 3704 |
3664 } // namespace media | 3705 } // namespace media |
OLD | NEW |