// Copyright 2015 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_MEDIA_MULTI_BUFFER_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_MEDIA_MULTI_BUFFER_H_ #include <stddef.h> #include <stdint.h> #include <functional> #include <limits> #include <map> #include <memory> #include <set> #include <unordered_map> #include <vector> #include "base/containers/lru_cache.h" #include "base/functional/callback.h" #include "base/hash/hash.h" #include "base/memory/raw_ptr.h" #include "base/synchronization/lock.h" #include "base/task/single_thread_task_runner.h" #include "build/build_config.h" #include "media/base/data_buffer.h" #include "third_party/blink/renderer/platform/allow_discouraged_type.h" #include "third_party/blink/renderer/platform/media/interval_map.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/ref_counted.h" namespace blink { // Used to identify a block of data in the multibuffer. // Our blocks are 32kb (1 << 15), so our maximum cacheable file size // is 1 << (15 + 31) = 64Tb MultiBufferBlockId; class MultiBuffer; // This type is used to identify a block in the LRU, which is shared between // multibuffers. MultiBufferGlobalBlockId; } // namespace blink namespace std { template <> struct hash<blink::MultiBufferGlobalBlockId> { … }; } // namespace std namespace blink { // Freeing a lot of blocks can be expensive, to keep thing // flowing smoothly we only free a maximum of |kMaxFreesPerAdd| // blocks when a new block is added to the cache. const int kMaxFreesPerAdd = …; // There is a simple logic for creating, destroying and deferring // data providers. Every data provider has a look-ahead region and // a look-behind region. If there are readers in the look-ahead // region, we keep reading. If not, but there are readers in the // look-behind region, we defer. If there are no readers in either // region, we destroy the data provider. // When new readers are added, new data providers are created if // the new reader doesn't fall into the look-ahead region of // an existing data provider. // This is the size of the look-ahead region. const int kMaxWaitForWriterOffset = …; // This is the size of the look-behind region. const int kMaxWaitForReaderOffset = …; // MultiBuffers are multi-reader multi-writer cache/buffers with // prefetching and pinning. Data is stored internally in ref-counted // blocks of identical size. |block_size_shift| is log2 of the block // size. // // Users should inherit this class and implement CreateWriter(). // TODO(hubbe): Make the multibuffer respond to memory pressure. class PLATFORM_EXPORT MultiBuffer { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_MEDIA_MULTI_BUFFER_H_