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 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 |