| Index: media/blink/multibuffer_reader.cc
|
| diff --git a/media/blink/multibuffer_reader.cc b/media/blink/multibuffer_reader.cc
|
| deleted file mode 100644
|
| index 8f98167684c63d98233e1d5cb7e8dfec5cf931fb..0000000000000000000000000000000000000000
|
| --- a/media/blink/multibuffer_reader.cc
|
| +++ /dev/null
|
| @@ -1,237 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/callback_helpers.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "media/blink/multibuffer_reader.h"
|
| -#include "net/base/net_errors.h"
|
| -
|
| -namespace media {
|
| -
|
| -MultiBufferReader::MultiBufferReader(
|
| - MultiBuffer* multibuffer,
|
| - int64_t start,
|
| - int64_t end,
|
| - const base::Callback<void(int64_t, int64_t)>& progress_callback)
|
| - : multibuffer_(multibuffer),
|
| - // If end is -1, we use a very large (but still supported) value instead.
|
| - end_(end == -1LL ? (1LL << (multibuffer->block_size_shift() + 30)) : end),
|
| - preload_high_(0),
|
| - preload_low_(0),
|
| - max_buffer_forward_(0),
|
| - max_buffer_backward_(0),
|
| - pos_(start),
|
| - preload_pos_(-1),
|
| - loading_(true),
|
| - current_wait_size_(0),
|
| - progress_callback_(progress_callback),
|
| - weak_factory_(this) {
|
| - DCHECK_GE(start, 0);
|
| - DCHECK_GE(end_, 0);
|
| -}
|
| -
|
| -MultiBufferReader::~MultiBufferReader() {
|
| - multibuffer_->RemoveReader(preload_pos_, this);
|
| - multibuffer_->IncrementMaxSize(
|
| - -block_ceil(max_buffer_forward_ + max_buffer_backward_));
|
| - multibuffer_->PinRange(block(pos_ - max_buffer_backward_),
|
| - block_ceil(pos_ + max_buffer_forward_), -1);
|
| - multibuffer_->CleanupWriters(preload_pos_);
|
| -}
|
| -
|
| -void MultiBufferReader::Seek(int64_t pos) {
|
| - DCHECK_GE(pos, 0);
|
| - if (pos == pos_)
|
| - return;
|
| - // Use a rangemap to compute the diff in pinning.
|
| - IntervalMap<MultiBuffer::BlockId, int32_t> tmp;
|
| - tmp.IncrementInterval(block(pos_ - max_buffer_backward_),
|
| - block_ceil(pos_ + max_buffer_forward_), -1);
|
| - tmp.IncrementInterval(block(pos - max_buffer_backward_),
|
| - block_ceil(pos + max_buffer_forward_), 1);
|
| -
|
| - multibuffer_->PinRanges(tmp);
|
| -
|
| - multibuffer_->RemoveReader(preload_pos_, this);
|
| - MultiBufferBlockId old_preload_pos = preload_pos_;
|
| - preload_pos_ = block(pos);
|
| - pos_ = pos;
|
| - UpdateInternalState();
|
| - multibuffer_->CleanupWriters(old_preload_pos);
|
| -}
|
| -
|
| -void MultiBufferReader::SetMaxBuffer(int64_t backward, int64_t forward) {
|
| - // Safe, because we know this doesn't actually prune the cache right away.
|
| - multibuffer_->IncrementMaxSize(
|
| - -block_ceil(max_buffer_forward_ + max_buffer_backward_));
|
| - // Use a rangemap to compute the diff in pinning.
|
| - IntervalMap<MultiBuffer::BlockId, int32_t> tmp;
|
| - tmp.IncrementInterval(block(pos_ - max_buffer_backward_),
|
| - block_ceil(pos_ + max_buffer_forward_), -1);
|
| - max_buffer_backward_ = backward;
|
| - max_buffer_forward_ = forward;
|
| - tmp.IncrementInterval(block(pos_ - max_buffer_backward_),
|
| - block_ceil(pos_ + max_buffer_forward_), 1);
|
| - multibuffer_->PinRanges(tmp);
|
| -
|
| - multibuffer_->IncrementMaxSize(
|
| - block_ceil(max_buffer_forward_ + max_buffer_backward_));
|
| -}
|
| -
|
| -int64_t MultiBufferReader::Available() const {
|
| - int64_t unavailable_byte_pos =
|
| - static_cast<int64_t>(multibuffer_->FindNextUnavailable(block(pos_)))
|
| - << multibuffer_->block_size_shift();
|
| - return std::max<int64_t>(0, unavailable_byte_pos - pos_);
|
| -}
|
| -
|
| -int64_t MultiBufferReader::TryRead(uint8_t* data, int64_t len) {
|
| - DCHECK_GT(len, 0);
|
| - current_wait_size_ = 0;
|
| - cb_.Reset();
|
| - DCHECK_LE(pos_ + len, end_);
|
| - const MultiBuffer::DataMap& data_map = multibuffer_->map();
|
| - MultiBuffer::DataMap::const_iterator i = data_map.find(block(pos_));
|
| - int64_t p = pos_;
|
| - int64_t bytes_read = 0;
|
| - while (bytes_read < len) {
|
| - if (i == data_map.end())
|
| - break;
|
| - if (i->first != block(p))
|
| - break;
|
| - if (i->second->end_of_stream())
|
| - break;
|
| - size_t offset = p & ((1LL << multibuffer_->block_size_shift()) - 1);
|
| - size_t tocopy =
|
| - std::min<size_t>(len - bytes_read, i->second->data_size() - offset);
|
| - memcpy(data, i->second->data() + offset, tocopy);
|
| - data += tocopy;
|
| - bytes_read += tocopy;
|
| - p += tocopy;
|
| - ++i;
|
| - }
|
| - Seek(p);
|
| - return bytes_read;
|
| -}
|
| -
|
| -int MultiBufferReader::Wait(int64_t len, const base::Closure& cb) {
|
| - DCHECK_LE(pos_ + len, end_);
|
| - DCHECK_NE(Available(), -1);
|
| - DCHECK_LE(len, max_buffer_forward_);
|
| - current_wait_size_ = len;
|
| -
|
| - cb_.Reset();
|
| - UpdateInternalState();
|
| -
|
| - if (Available() >= current_wait_size_) {
|
| - return net::OK;
|
| - } else {
|
| - cb_ = cb;
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -}
|
| -
|
| -void MultiBufferReader::SetPreload(int64_t preload_high, int64_t preload_low) {
|
| - DCHECK_GE(preload_high, preload_low);
|
| - multibuffer_->RemoveReader(preload_pos_, this);
|
| - preload_pos_ = block(pos_);
|
| - preload_high_ = preload_high;
|
| - preload_low_ = preload_low;
|
| - UpdateInternalState();
|
| -}
|
| -
|
| -bool MultiBufferReader::IsLoading() const {
|
| - return loading_;
|
| -}
|
| -
|
| -void MultiBufferReader::CheckWait() {
|
| - if (!cb_.is_null() &&
|
| - (Available() >= current_wait_size_ || Available() == -1)) {
|
| - // We redirect the call through a weak pointer to ourselves to guarantee
|
| - // there are no callbacks from us after we've been destroyed.
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MultiBufferReader::Call, weak_factory_.GetWeakPtr(),
|
| - base::ResetAndReturn(&cb_)));
|
| - }
|
| -}
|
| -
|
| -void MultiBufferReader::Call(const base::Closure& cb) const {
|
| - cb.Run();
|
| -}
|
| -
|
| -void MultiBufferReader::NotifyAvailableRange(
|
| - const Interval<MultiBufferBlockId>& range) {
|
| - // Update end_ if we can.
|
| - if (range.end > range.begin) {
|
| - auto i = multibuffer_->map().find(range.end - 1);
|
| - DCHECK(i != multibuffer_->map().end());
|
| - if (i->second->end_of_stream()) {
|
| - // This is an upper limit because the last-to-one block is allowed
|
| - // to be smaller than the rest of the blocks.
|
| - int64_t size_upper_limit = static_cast<int64_t>(range.end)
|
| - << multibuffer_->block_size_shift();
|
| - end_ = std::min(end_, size_upper_limit);
|
| - }
|
| - }
|
| - UpdateInternalState();
|
| - if (!progress_callback_.is_null()) {
|
| - // We redirect the call through a weak pointer to ourselves to guarantee
|
| - // there are no callbacks from us after we've been destroyed.
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MultiBufferReader::Call, weak_factory_.GetWeakPtr(),
|
| - base::Bind(progress_callback_,
|
| - static_cast<int64_t>(range.begin)
|
| - << multibuffer_->block_size_shift(),
|
| - static_cast<int64_t>(range.end)
|
| - << multibuffer_->block_size_shift())));
|
| - // We may be destroyed, do not touch |this|.
|
| - }
|
| -}
|
| -
|
| -void MultiBufferReader::UpdateInternalState() {
|
| - int64_t effective_preload = loading_ ? preload_high_ : preload_low_;
|
| -
|
| - loading_ = false;
|
| - if (preload_pos_ == -1) {
|
| - preload_pos_ = block(pos_);
|
| - DCHECK_GE(preload_pos_, 0);
|
| - }
|
| - MultiBuffer::BlockId max_preload = block_ceil(
|
| - std::min(end_, pos_ + std::max(effective_preload, current_wait_size_)));
|
| -
|
| - // Note that we might not have been added to the multibuffer,
|
| - // removing ourselves is a no-op in that case.
|
| - multibuffer_->RemoveReader(preload_pos_, this);
|
| -
|
| - // We explicitly allow preloading to go beyond the pinned region in the cache.
|
| - // It only happens when we want to preload something into the disk cache.
|
| - // Thus it is possible to have blocks between our current reading position
|
| - // and preload_pos_ be unavailable. When we get a Seek() call (possibly
|
| - // through TryRead()) we reset the preload_pos_ to the current reading
|
| - // position, and preload_pos_ will become the first unavailable block after
|
| - // our current reading position again.
|
| - preload_pos_ = multibuffer_->FindNextUnavailable(preload_pos_);
|
| - DCHECK_GE(preload_pos_, 0);
|
| -
|
| - DVLOG(3) << "UpdateInternalState"
|
| - << " pp = " << preload_pos_
|
| - << " block_ceil(end_) = " << block_ceil(end_) << " end_ = " << end_
|
| - << " max_preload " << max_preload;
|
| -
|
| - if (preload_pos_ < block_ceil(end_)) {
|
| - if (preload_pos_ < max_preload) {
|
| - loading_ = true;
|
| - multibuffer_->AddReader(preload_pos_, this);
|
| - } else if (multibuffer_->Contains(preload_pos_ - 1)) {
|
| - --preload_pos_;
|
| - multibuffer_->AddReader(preload_pos_, this);
|
| - }
|
| - }
|
| - CheckWait();
|
| -}
|
| -
|
| -} // namespace media
|
|
|