Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Side by Side Diff: media/blink/multibuffer.cc

Issue 1399603003: Tie multibuffers to URLs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@media_cache
Patch Set: comments addressed Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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();
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698