Chromium Code Reviews| 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 |