OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <deque> | 5 #include <deque> |
6 #include <string> | 6 #include <string> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
12 #include "media/blink/multibuffer.h" | 12 #include "media/blink/multibuffer.h" |
13 #include "media/blink/multibuffer_reader.h" | 13 #include "media/blink/multibuffer_reader.h" |
14 #include "media/blink/test_random.h" | 14 #include "media/blink/test_random.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 | 16 |
17 const int kBlockSizeShift = 8; | 17 const int kBlockSizeShift = 8; |
18 const size_t kBlockSize = 1UL << kBlockSizeShift; | 18 const size_t kBlockSize = 1UL << kBlockSizeShift; |
19 | 19 |
20 namespace media { | 20 namespace media { |
21 class TestMultiBufferDataProvider; | |
22 | 21 |
23 std::vector<TestMultiBufferDataProvider*> writers; | 22 class FakeMultiBufferDataProvider; |
24 | 23 |
25 class TestMultiBufferDataProvider : public media::MultiBuffer::DataProvider { | 24 namespace { |
25 std::vector<FakeMultiBufferDataProvider*> writers; | |
26 } // namespace | |
27 | |
28 class FakeMultiBufferDataProvider : public media::MultiBuffer::DataProvider { | |
26 public: | 29 public: |
27 TestMultiBufferDataProvider(MultiBufferBlockId pos, | 30 FakeMultiBufferDataProvider(MultiBufferBlockId pos, |
28 size_t file_size, | 31 size_t file_size, |
29 int max_blocks_after_defer, | 32 int max_blocks_after_defer, |
30 bool must_read_whole_file, | 33 bool must_read_whole_file, |
34 MultiBuffer* multibuffer, | |
31 media::TestRandom* rnd) | 35 media::TestRandom* rnd) |
xhwang
2015/11/23 23:09:21
s/media:://
hubbe
2015/11/24 22:55:11
Done
(Here and everywhere else)
| |
32 : pos_(pos), | 36 : pos_(pos), |
33 blocks_until_deferred_(1 << 30), | 37 blocks_until_deferred_(1 << 30), |
34 max_blocks_after_defer_(max_blocks_after_defer), | 38 max_blocks_after_defer_(max_blocks_after_defer), |
35 file_size_(file_size), | 39 file_size_(file_size), |
36 must_read_whole_file_(must_read_whole_file), | 40 must_read_whole_file_(must_read_whole_file), |
41 multibuffer_(multibuffer), | |
37 rnd_(rnd) { | 42 rnd_(rnd) { |
38 writers.push_back(this); | 43 writers.push_back(this); |
39 } | 44 } |
40 | 45 |
41 ~TestMultiBufferDataProvider() override { | 46 ~FakeMultiBufferDataProvider() override { |
42 if (must_read_whole_file_) { | 47 if (must_read_whole_file_) { |
43 CHECK_GE(pos_ * kBlockSize, file_size_); | 48 CHECK_GE(pos_ * kBlockSize, file_size_); |
44 } | 49 } |
45 for (size_t i = 0; i < writers.size(); i++) { | 50 for (size_t i = 0; i < writers.size(); i++) { |
46 if (writers[i] == this) { | 51 if (writers[i] == this) { |
47 writers[i] = writers.back(); | 52 writers[i] = writers.back(); |
48 writers.pop_back(); | 53 writers.pop_back(); |
49 return; | 54 return; |
50 } | 55 } |
51 } | 56 } |
52 LOG(FATAL) << "Couldn't find myself in writers!"; | 57 LOG(FATAL) << "Couldn't find myself in writers!"; |
53 } | 58 } |
54 | 59 |
55 MultiBufferBlockId Tell() const override { return pos_; } | 60 MultiBufferBlockId Tell() const override { return pos_; } |
56 | 61 |
57 bool Available() const override { return !fifo_.empty(); } | 62 bool Available() const override { return !fifo_.empty(); } |
58 | 63 |
59 scoped_refptr<DataBuffer> Read() override { | 64 scoped_refptr<DataBuffer> Read() override { |
60 DCHECK(Available()); | 65 DCHECK(Available()); |
61 scoped_refptr<DataBuffer> ret = fifo_.front(); | 66 scoped_refptr<DataBuffer> ret = fifo_.front(); |
62 fifo_.pop_front(); | 67 fifo_.pop_front(); |
63 ++pos_; | 68 ++pos_; |
64 return ret; | 69 return ret; |
65 } | 70 } |
66 | 71 |
67 void SetAvailableCallback(const base::Closure& cb) override { | |
68 DCHECK(!Available()); | |
69 cb_ = cb; | |
70 } | |
71 | |
72 void SetDeferred(bool deferred) override { | 72 void SetDeferred(bool deferred) override { |
73 if (deferred) { | 73 if (deferred) { |
74 if (max_blocks_after_defer_ > 0) { | 74 if (max_blocks_after_defer_ > 0) { |
75 blocks_until_deferred_ = rnd_->Rand() % max_blocks_after_defer_; | 75 blocks_until_deferred_ = rnd_->Rand() % max_blocks_after_defer_; |
76 } else if (max_blocks_after_defer_ < 0) { | 76 } else if (max_blocks_after_defer_ < 0) { |
77 blocks_until_deferred_ = -max_blocks_after_defer_; | 77 blocks_until_deferred_ = -max_blocks_after_defer_; |
78 } else { | 78 } else { |
79 blocks_until_deferred_ = 0; | 79 blocks_until_deferred_ = 0; |
80 } | 80 } |
81 } else { | 81 } else { |
(...skipping 15 matching lines...) Expand all Loading... | |
97 break; | 97 break; |
98 block->writable_data()[x] = | 98 block->writable_data()[x] = |
99 static_cast<uint8_t>((byte_pos * 15485863) >> 16); | 99 static_cast<uint8_t>((byte_pos * 15485863) >> 16); |
100 } | 100 } |
101 block->set_data_size(static_cast<int>(x)); | 101 block->set_data_size(static_cast<int>(x)); |
102 fifo_.push_back(block); | 102 fifo_.push_back(block); |
103 if (byte_pos == file_size_) { | 103 if (byte_pos == file_size_) { |
104 fifo_.push_back(DataBuffer::CreateEOSBuffer()); | 104 fifo_.push_back(DataBuffer::CreateEOSBuffer()); |
105 ret = false; | 105 ret = false; |
106 } | 106 } |
107 cb_.Run(); | 107 multibuffer_->OnDataProviderEvent(this); |
108 return ret; | 108 return ret; |
109 } | 109 } |
110 | 110 |
111 private: | 111 private: |
112 std::deque<scoped_refptr<media::DataBuffer>> fifo_; | 112 std::deque<scoped_refptr<media::DataBuffer>> fifo_; |
113 MultiBufferBlockId pos_; | 113 MultiBufferBlockId pos_; |
114 int32_t blocks_until_deferred_; | 114 int32_t blocks_until_deferred_; |
115 int32_t max_blocks_after_defer_; | 115 int32_t max_blocks_after_defer_; |
116 size_t file_size_; | 116 size_t file_size_; |
117 bool must_read_whole_file_; | 117 bool must_read_whole_file_; |
118 base::Closure cb_; | 118 MultiBuffer* multibuffer_; |
119 media::TestRandom* rnd_; | 119 media::TestRandom* rnd_; |
120 }; | 120 }; |
121 | 121 |
122 class TestMultiBuffer : public media::MultiBuffer { | 122 class TestMultiBuffer : public media::MultiBuffer { |
123 public: | 123 public: |
124 explicit TestMultiBuffer( | 124 explicit TestMultiBuffer( |
125 int32_t shift, | 125 int32_t shift, |
126 const scoped_refptr<media::MultiBuffer::GlobalLRU>& lru, | 126 const scoped_refptr<media::MultiBuffer::GlobalLRU>& lru, |
127 media::TestRandom* rnd) | 127 media::TestRandom* rnd) |
xhwang
2015/11/23 23:09:21
ditto
hubbe
2015/11/24 22:55:10
Done.
| |
128 : media::MultiBuffer(shift, lru), | 128 : media::MultiBuffer(shift, lru), |
129 range_supported_(false), | 129 range_supported_(false), |
130 create_ok_(true), | 130 create_ok_(true), |
131 max_writers_(10000), | 131 max_writers_(10000), |
132 file_size_(1 << 30), | 132 file_size_(1 << 30), |
133 max_blocks_after_defer_(0), | 133 max_blocks_after_defer_(0), |
134 must_read_whole_file_(false), | 134 must_read_whole_file_(false), |
135 writers_created_(0), | 135 writers_created_(0), |
136 rnd_(rnd) {} | 136 rnd_(rnd) {} |
137 | 137 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
178 | 178 |
179 void SetMustReadWholeFile(bool must_read_whole_file) { | 179 void SetMustReadWholeFile(bool must_read_whole_file) { |
180 must_read_whole_file_ = must_read_whole_file; | 180 must_read_whole_file_ = must_read_whole_file; |
181 } | 181 } |
182 | 182 |
183 int32_t writers_created() const { return writers_created_; } | 183 int32_t writers_created() const { return writers_created_; } |
184 | 184 |
185 void SetRangeSupported(bool supported) { range_supported_ = supported; } | 185 void SetRangeSupported(bool supported) { range_supported_ = supported; } |
186 | 186 |
187 protected: | 187 protected: |
188 DataProvider* CreateWriter(const MultiBufferBlockId& pos) override { | 188 scoped_ptr<DataProvider> CreateWriter( |
189 const MultiBufferBlockId& pos) override { | |
189 DCHECK(create_ok_); | 190 DCHECK(create_ok_); |
190 writers_created_++; | 191 writers_created_++; |
191 CHECK_LT(writers.size(), max_writers_); | 192 CHECK_LT(writers.size(), max_writers_); |
192 return new TestMultiBufferDataProvider( | 193 return scoped_ptr<DataProvider>(new FakeMultiBufferDataProvider( |
193 pos, file_size_, max_blocks_after_defer_, must_read_whole_file_, rnd_); | 194 pos, file_size_, max_blocks_after_defer_, must_read_whole_file_, this, |
195 rnd_)); | |
194 } | 196 } |
195 void Prune(size_t max_to_free) override { | 197 void Prune(size_t max_to_free) override { |
196 // Prune should not cause additional writers to be spawned. | 198 // Prune should not cause additional writers to be spawned. |
197 create_ok_ = false; | 199 create_ok_ = false; |
198 MultiBuffer::Prune(max_to_free); | 200 MultiBuffer::Prune(max_to_free); |
199 create_ok_ = true; | 201 create_ok_ = true; |
200 } | 202 } |
201 | 203 |
202 bool RangeSupported() const override { return range_supported_; } | 204 bool RangeSupported() const override { return range_supported_; } |
203 | 205 |
204 private: | 206 private: |
205 bool range_supported_; | 207 bool range_supported_; |
206 bool create_ok_; | 208 bool create_ok_; |
207 size_t max_writers_; | 209 size_t max_writers_; |
208 size_t file_size_; | 210 size_t file_size_; |
209 int32_t max_blocks_after_defer_; | 211 int32_t max_blocks_after_defer_; |
210 bool must_read_whole_file_; | 212 bool must_read_whole_file_; |
211 int32_t writers_created_; | 213 int32_t writers_created_; |
212 media::TestRandom* rnd_; | 214 media::TestRandom* rnd_; |
213 }; | 215 }; |
214 } | 216 |
217 } // namespace media | |
215 | 218 |
216 class MultiBufferTest : public testing::Test { | 219 class MultiBufferTest : public testing::Test { |
xhwang
2015/11/23 23:09:21
Is there any reason these tests are not in media n
hubbe
2015/11/24 22:55:11
Nope, done.
| |
217 public: | 220 public: |
218 MultiBufferTest() | 221 MultiBufferTest() |
219 : rnd_(42), | 222 : rnd_(42), |
220 lru_(new media::MultiBuffer::GlobalLRU()), | 223 lru_(new media::MultiBuffer::GlobalLRU()), |
221 multibuffer_(kBlockSizeShift, lru_, &rnd_) {} | 224 multibuffer_(kBlockSizeShift, lru_, &rnd_) {} |
222 | 225 |
223 void Advance() { | 226 void Advance() { |
224 CHECK(media::writers.size()); | 227 CHECK(media::writers.size()); |
225 media::writers[rnd_.Rand() % media::writers.size()]->Advance(); | 228 media::writers[rnd_.Rand() % media::writers.size()]->Advance(); |
226 } | 229 } |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
503 } | 506 } |
504 } | 507 } |
505 multibuffer_.CheckLRUState(); | 508 multibuffer_.CheckLRUState(); |
506 } | 509 } |
507 multibuffer_.CheckPresentState(); | 510 multibuffer_.CheckPresentState(); |
508 while (!read_helpers.empty()) { | 511 while (!read_helpers.empty()) { |
509 delete read_helpers.back(); | 512 delete read_helpers.back(); |
510 read_helpers.pop_back(); | 513 read_helpers.pop_back(); |
511 } | 514 } |
512 } | 515 } |
OLD | NEW |