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 "media/blink/multibuffer.h" | 5 #include "media/blink/multibuffer.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 | 8 |
| 9 namespace media { | 9 namespace media { |
| 10 | 10 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 154 | 154 |
| 155 // Make sure that there are no present blocks between the writer and | 155 // Make sure that there are no present blocks between the writer and |
| 156 // the requested position, as that will cause the writer to quit. | 156 // the requested position, as that will cause the writer to quit. |
| 157 if (closest_writer > closest_block) { | 157 if (closest_writer > closest_block) { |
| 158 provider = writer_index_[closest_writer]; | 158 provider = writer_index_[closest_writer]; |
| 159 DCHECK(provider); | 159 DCHECK(provider); |
| 160 } | 160 } |
| 161 } | 161 } |
| 162 if (!provider) { | 162 if (!provider) { |
| 163 DCHECK(writer_index_.find(pos) == writer_index_.end()); | 163 DCHECK(writer_index_.find(pos) == writer_index_.end()); |
| 164 provider = writer_index_[pos] = CreateWriter(pos); | 164 provider = writer_index_[pos] = CreateWriter(pos).release(); |
|
xhwang
2015/11/23 23:09:21
release() seems hacky. Can we switch to use std::m
hubbe
2015/11/24 22:55:10
Done.
| |
| 165 provider->SetAvailableCallback(base::Bind( | |
| 166 &MultiBuffer::DataProviderEvent, base::Unretained(this), provider)); | |
| 167 } | 165 } |
| 168 provider->SetDeferred(false); | 166 provider->SetDeferred(false); |
| 169 } | 167 } |
| 170 | 168 |
| 171 void MultiBuffer::RemoveReader(const BlockId& pos, Reader* reader) { | 169 void MultiBuffer::RemoveReader(const BlockId& pos, Reader* reader) { |
| 172 auto i = readers_.find(pos); | 170 auto i = readers_.find(pos); |
| 173 if (i == readers_.end()) | 171 if (i == readers_.end()) |
| 174 return; | 172 return; |
| 175 i->second.erase(reader); | 173 i->second.erase(reader); |
| 176 if (i->second.empty()) { | 174 if (i->second.empty()) { |
| 177 readers_.erase(i); | 175 readers_.erase(i); |
| 178 } | 176 } |
| 179 } | 177 } |
| 180 | 178 |
| 181 void MultiBuffer::CleanupWriters(const BlockId& pos) { | 179 void MultiBuffer::CleanupWriters(const BlockId& pos) { |
| 182 BlockId p2 = pos + kMaxWaitForReaderOffset; | 180 BlockId p2 = pos + kMaxWaitForReaderOffset; |
| 183 BlockId closest_writer = ClosestPreviousEntry(writer_index_, p2); | 181 BlockId closest_writer = ClosestPreviousEntry(writer_index_, p2); |
| 184 while (closest_writer > pos - kMaxWaitForWriterOffset) { | 182 while (closest_writer > pos - kMaxWaitForWriterOffset) { |
| 185 DCHECK(writer_index_[closest_writer]); | 183 DCHECK(writer_index_[closest_writer]); |
| 186 DataProviderEvent(writer_index_[closest_writer]); | 184 OnDataProviderEvent(writer_index_[closest_writer]); |
| 187 closest_writer = ClosestPreviousEntry(writer_index_, closest_writer - 1); | 185 closest_writer = ClosestPreviousEntry(writer_index_, closest_writer - 1); |
| 188 } | 186 } |
| 189 } | 187 } |
| 190 | 188 |
| 191 bool MultiBuffer::Contains(const BlockId& pos) const { | 189 bool MultiBuffer::Contains(const BlockId& pos) const { |
| 192 DCHECK(present_[pos] == 0 || present_[pos] == 1) | 190 DCHECK(present_[pos] == 0 || present_[pos] == 1) |
| 193 << " pos = " << pos << " present_[pos] " << present_[pos]; | 191 << " pos = " << pos << " present_[pos] " << present_[pos]; |
| 194 DCHECK_EQ(present_[pos], data_.find(pos) != data_.end() ? 1 : 0); | 192 DCHECK_EQ(present_[pos], data_.find(pos) != data_.end() ? 1 : 0); |
| 195 return !!present_[pos]; | 193 return !!present_[pos]; |
| 196 } | 194 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 251 } | 249 } |
| 252 if (i.interval_end() == freed_range.first.end) { | 250 if (i.interval_end() == freed_range.first.end) { |
| 253 // Notify the following range that it contains fewer blocks. | 251 // Notify the following range that it contains fewer blocks. |
| 254 auto j = i; | 252 auto j = i; |
| 255 ++j; | 253 ++j; |
| 256 DCHECK_EQ(j.value(), 1); | 254 DCHECK_EQ(j.value(), 1); |
| 257 NotifyAvailableRange(j.interval(), j.interval()); | 255 NotifyAvailableRange(j.interval(), j.interval()); |
| 258 } | 256 } |
| 259 } | 257 } |
| 260 } | 258 } |
| 259 if (data_.empty()) | |
| 260 OnEmpty(); | |
| 261 } | 261 } |
| 262 | 262 |
| 263 void MultiBuffer::OnEmpty() {} | |
| 264 | |
| 263 void MultiBuffer::AddProvider(scoped_ptr<DataProvider> provider) { | 265 void MultiBuffer::AddProvider(scoped_ptr<DataProvider> provider) { |
| 264 // If there is already a provider in the same location, we delete it. | 266 // If there is already a provider in the same location, we delete it. |
| 265 DCHECK(!provider->Available()); | 267 DCHECK(!provider->Available()); |
| 266 BlockId pos = provider->Tell(); | 268 BlockId pos = provider->Tell(); |
| 267 DataProvider** place = &writer_index_[pos]; | 269 DataProvider** place = &writer_index_[pos]; |
| 268 DCHECK_NE(*place, provider.get()); | 270 DCHECK_NE(*place, provider.get()); |
| 269 if (*place) | 271 if (*place) |
| 270 delete *place; | 272 delete *place; |
| 271 *place = provider.release(); | 273 *place = provider.release(); |
| 272 } | 274 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 317 if (RangeSupported() && Contains(id)) | 319 if (RangeSupported() && Contains(id)) |
| 318 return true; | 320 return true; |
| 319 | 321 |
| 320 return false; | 322 return false; |
| 321 } | 323 } |
| 322 | 324 |
| 323 void MultiBuffer::Prune(size_t max_to_free) { | 325 void MultiBuffer::Prune(size_t max_to_free) { |
| 324 lru_->Prune(max_to_free); | 326 lru_->Prune(max_to_free); |
| 325 } | 327 } |
| 326 | 328 |
| 327 void MultiBuffer::DataProviderEvent(DataProvider* provider_tmp) { | 329 void MultiBuffer::OnDataProviderEvent(DataProvider* provider_tmp) { |
| 328 scoped_ptr<DataProvider> provider(RemoveProvider(provider_tmp)); | 330 scoped_ptr<DataProvider> provider(RemoveProvider(provider_tmp)); |
| 329 BlockId start_pos = provider->Tell(); | 331 BlockId start_pos = provider->Tell(); |
| 330 BlockId pos = start_pos; | 332 BlockId pos = start_pos; |
| 331 bool eof = false; | 333 bool eof = false; |
| 332 int64_t blocks_before = data_.size(); | 334 int64_t blocks_before = data_.size(); |
| 333 | 335 |
| 334 while (!ProviderCollision(pos) && !eof) { | 336 while (!ProviderCollision(pos) && !eof) { |
| 335 if (!provider->Available()) { | 337 if (!provider->Available()) { |
| 336 AddProvider(provider.Pass()); | 338 AddProvider(provider.Pass()); |
| 337 break; | 339 break; |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 471 } | 473 } |
| 472 | 474 |
| 473 void MultiBuffer::IncrementMaxSize(int32_t size) { | 475 void MultiBuffer::IncrementMaxSize(int32_t size) { |
| 474 max_size_ += size; | 476 max_size_ += size; |
| 475 lru_->IncrementMaxSize(size); | 477 lru_->IncrementMaxSize(size); |
| 476 DCHECK_GE(max_size_, 0); | 478 DCHECK_GE(max_size_, 0); |
| 477 // Pruning only happens when blocks are added. | 479 // Pruning only happens when blocks are added. |
| 478 } | 480 } |
| 479 | 481 |
| 480 } // namespace media | 482 } // namespace media |
| OLD | NEW |