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 std::vector<FakeMultiBufferDataProvider*> writers; |
xhwang
2015/11/19 23:34:17
move this to an anonymous or internal namespace?
hubbe
2015/11/20 23:24:23
Done.
| |
25 | |
26 class FakeMultiBufferDataProvider : public media::MultiBuffer::DataProvider { | |
26 public: | 27 public: |
27 TestMultiBufferDataProvider(MultiBufferBlockId pos, | 28 FakeMultiBufferDataProvider(MultiBufferBlockId pos, |
28 size_t file_size, | 29 size_t file_size, |
29 int max_blocks_after_defer, | 30 int max_blocks_after_defer, |
30 bool must_read_whole_file) | 31 bool must_read_whole_file, |
32 MultiBuffer* multibuffer) | |
31 : pos_(pos), | 33 : pos_(pos), |
32 blocks_until_deferred_(1 << 30), | 34 blocks_until_deferred_(1 << 30), |
33 max_blocks_after_defer_(max_blocks_after_defer), | 35 max_blocks_after_defer_(max_blocks_after_defer), |
34 file_size_(file_size), | 36 file_size_(file_size), |
35 must_read_whole_file_(must_read_whole_file) { | 37 must_read_whole_file_(must_read_whole_file), |
38 multibuffer_(multibuffer) { | |
36 writers.push_back(this); | 39 writers.push_back(this); |
37 } | 40 } |
38 | 41 |
39 ~TestMultiBufferDataProvider() override { | 42 ~FakeMultiBufferDataProvider() override { |
40 if (must_read_whole_file_) { | 43 if (must_read_whole_file_) { |
41 CHECK_GE(pos_ * kBlockSize, file_size_); | 44 CHECK_GE(pos_ * kBlockSize, file_size_); |
42 } | 45 } |
43 for (size_t i = 0; i < writers.size(); i++) { | 46 for (size_t i = 0; i < writers.size(); i++) { |
44 if (writers[i] == this) { | 47 if (writers[i] == this) { |
45 writers[i] = writers.back(); | 48 writers[i] = writers.back(); |
46 writers.pop_back(); | 49 writers.pop_back(); |
47 return; | 50 return; |
48 } | 51 } |
49 } | 52 } |
50 LOG(FATAL) << "Couldn't find myself in writers!"; | 53 LOG(FATAL) << "Couldn't find myself in writers!"; |
51 } | 54 } |
52 | 55 |
53 MultiBufferBlockId Tell() const override { return pos_; } | 56 MultiBufferBlockId Tell() const override { return pos_; } |
54 | 57 |
55 bool Available() const override { return !fifo_.empty(); } | 58 bool Available() const override { return !fifo_.empty(); } |
56 | 59 |
57 scoped_refptr<DataBuffer> Read() override { | 60 scoped_refptr<DataBuffer> Read() override { |
58 DCHECK(Available()); | 61 DCHECK(Available()); |
59 scoped_refptr<DataBuffer> ret = fifo_.front(); | 62 scoped_refptr<DataBuffer> ret = fifo_.front(); |
60 fifo_.pop_front(); | 63 fifo_.pop_front(); |
61 ++pos_; | 64 ++pos_; |
62 return ret; | 65 return ret; |
63 } | 66 } |
64 | 67 |
65 void SetAvailableCallback(const base::Closure& cb) override { | |
66 DCHECK(!Available()); | |
67 cb_ = cb; | |
68 } | |
69 | |
70 void SetDeferred(bool deferred) override { | 68 void SetDeferred(bool deferred) override { |
71 if (deferred) { | 69 if (deferred) { |
72 if (max_blocks_after_defer_ > 0) { | 70 if (max_blocks_after_defer_ > 0) { |
73 blocks_until_deferred_ = rand() % max_blocks_after_defer_; | 71 blocks_until_deferred_ = rand() % max_blocks_after_defer_; |
74 } else if (max_blocks_after_defer_ < 0) { | 72 } else if (max_blocks_after_defer_ < 0) { |
75 blocks_until_deferred_ = -max_blocks_after_defer_; | 73 blocks_until_deferred_ = -max_blocks_after_defer_; |
76 } else { | 74 } else { |
77 blocks_until_deferred_ = 0; | 75 blocks_until_deferred_ = 0; |
78 } | 76 } |
79 } else { | 77 } else { |
(...skipping 15 matching lines...) Expand all Loading... | |
95 break; | 93 break; |
96 block->writable_data()[x] = | 94 block->writable_data()[x] = |
97 static_cast<uint8_t>((byte_pos * 15485863) >> 16); | 95 static_cast<uint8_t>((byte_pos * 15485863) >> 16); |
98 } | 96 } |
99 block->set_data_size(static_cast<int>(x)); | 97 block->set_data_size(static_cast<int>(x)); |
100 fifo_.push_back(block); | 98 fifo_.push_back(block); |
101 if (byte_pos == file_size_) { | 99 if (byte_pos == file_size_) { |
102 fifo_.push_back(DataBuffer::CreateEOSBuffer()); | 100 fifo_.push_back(DataBuffer::CreateEOSBuffer()); |
103 ret = false; | 101 ret = false; |
104 } | 102 } |
105 cb_.Run(); | 103 multibuffer_->DataProviderEvent(this); |
106 return ret; | 104 return ret; |
107 } | 105 } |
108 | 106 |
109 private: | 107 private: |
110 std::deque<scoped_refptr<media::DataBuffer>> fifo_; | 108 std::deque<scoped_refptr<media::DataBuffer>> fifo_; |
111 MultiBufferBlockId pos_; | 109 MultiBufferBlockId pos_; |
112 int32_t blocks_until_deferred_; | 110 int32_t blocks_until_deferred_; |
113 int32_t max_blocks_after_defer_; | 111 int32_t max_blocks_after_defer_; |
114 size_t file_size_; | 112 size_t file_size_; |
115 bool must_read_whole_file_; | 113 bool must_read_whole_file_; |
116 base::Closure cb_; | 114 MultiBuffer* multibuffer_; |
117 }; | 115 }; |
118 | 116 |
119 class TestMultiBuffer : public media::MultiBuffer { | 117 class TestMultiBuffer : public media::MultiBuffer { |
120 public: | 118 public: |
121 explicit TestMultiBuffer( | 119 explicit TestMultiBuffer( |
122 int32_t shift, | 120 int32_t shift, |
123 const scoped_refptr<media::MultiBuffer::GlobalLRU>& lru) | 121 const scoped_refptr<media::MultiBuffer::GlobalLRU>& lru) |
124 : media::MultiBuffer(shift, lru), | 122 : media::MultiBuffer(shift, lru), |
125 range_supported_(false), | 123 range_supported_(false), |
126 create_ok_(true), | 124 create_ok_(true), |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
177 | 175 |
178 int32_t writers_created() const { return writers_created_; } | 176 int32_t writers_created() const { return writers_created_; } |
179 | 177 |
180 void SetRangeSupported(bool supported) { range_supported_ = supported; } | 178 void SetRangeSupported(bool supported) { range_supported_ = supported; } |
181 | 179 |
182 protected: | 180 protected: |
183 DataProvider* CreateWriter(const MultiBufferBlockId& pos) override { | 181 DataProvider* CreateWriter(const MultiBufferBlockId& pos) override { |
184 DCHECK(create_ok_); | 182 DCHECK(create_ok_); |
185 writers_created_++; | 183 writers_created_++; |
186 CHECK_LT(writers.size(), max_writers_); | 184 CHECK_LT(writers.size(), max_writers_); |
187 return new TestMultiBufferDataProvider( | 185 return new FakeMultiBufferDataProvider( |
188 pos, file_size_, max_blocks_after_defer_, must_read_whole_file_); | 186 pos, file_size_, max_blocks_after_defer_, must_read_whole_file_, this); |
189 } | 187 } |
190 void Prune(size_t max_to_free) override { | 188 void Prune(size_t max_to_free) override { |
191 // Prune should not cause additional writers to be spawned. | 189 // Prune should not cause additional writers to be spawned. |
192 create_ok_ = false; | 190 create_ok_ = false; |
193 MultiBuffer::Prune(max_to_free); | 191 MultiBuffer::Prune(max_to_free); |
194 create_ok_ = true; | 192 create_ok_ = true; |
195 } | 193 } |
196 | 194 |
197 bool RangeSupported() const override { return range_supported_; } | 195 bool RangeSupported() const override { return range_supported_; } |
198 | 196 |
199 private: | 197 private: |
200 bool range_supported_; | 198 bool range_supported_; |
201 bool create_ok_; | 199 bool create_ok_; |
202 size_t max_writers_; | 200 size_t max_writers_; |
203 size_t file_size_; | 201 size_t file_size_; |
204 int32_t max_blocks_after_defer_; | 202 int32_t max_blocks_after_defer_; |
205 bool must_read_whole_file_; | 203 bool must_read_whole_file_; |
206 int32_t writers_created_; | 204 int32_t writers_created_; |
207 }; | 205 }; |
208 } | 206 |
207 } // namespace media | |
209 | 208 |
210 class MultiBufferTest : public testing::Test { | 209 class MultiBufferTest : public testing::Test { |
211 public: | 210 public: |
212 MultiBufferTest() | 211 MultiBufferTest() |
213 : lru_(new media::MultiBuffer::GlobalLRU()), | 212 : lru_(new media::MultiBuffer::GlobalLRU()), |
214 multibuffer_(kBlockSizeShift, lru_), | 213 multibuffer_(kBlockSizeShift, lru_), |
215 rnd_(42) {} | 214 rnd_(42) {} |
216 | 215 |
217 void Advance() { | 216 void Advance() { |
218 CHECK(media::writers.size()); | 217 CHECK(media::writers.size()); |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
493 read_helpers[j]->StartRead(); | 492 read_helpers[j]->StartRead(); |
494 multibuffer_.CheckLRUState(); | 493 multibuffer_.CheckLRUState(); |
495 } | 494 } |
496 } | 495 } |
497 multibuffer_.CheckPresentState(); | 496 multibuffer_.CheckPresentState(); |
498 while (!read_helpers.empty()) { | 497 while (!read_helpers.empty()) { |
499 delete read_helpers.back(); | 498 delete read_helpers.back(); |
500 read_helpers.pop_back(); | 499 read_helpers.pop_back(); |
501 } | 500 } |
502 } | 501 } |
OLD | NEW |