// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_MEDIA_DECODER_BUFFER_ALLOCATOR_H_
#define COBALT_MEDIA_DECODER_BUFFER_ALLOCATOR_H_

#include <memory>

#include "base/compiler_specific.h"
#include "cobalt/media/decoder_buffer_memory_info.h"
#include "nb/bidirectional_fit_reuse_allocator.h"
#include "nb/starboard_memory_allocator.h"
#include "starboard/atomic.h"
#include "starboard/common/mutex.h"
#include "starboard/media.h"
#include "third_party/chromium/media/base/decoder_buffer.h"
#include "third_party/chromium/media/base/video_decoder_config.h"

namespace cobalt {
namespace media {

class DecoderBufferAllocator : public ::media::DecoderBuffer::Allocator,
                               public DecoderBufferMemoryInfo {
 public:
  DecoderBufferAllocator();
  ~DecoderBufferAllocator() override;

  void Suspend();
  void Resume();

  // DecoderBuffer::Allocator methods.
  void* Allocate(size_t size, size_t alignment) override;
  void Free(void* p, size_t size) override;

  // DecoderBufferMemoryInfo methods.
  size_t GetAllocatedMemory() const override;
  size_t GetCurrentMemoryCapacity() const override;
  size_t GetMaximumMemoryCapacity() const override;
  size_t GetSourceBufferEvictExtraInBytes() const override;

  void SetSourceBufferEvictExtraInBytes(size_t evict_extra_in_bytes) {
    source_buffer_evict_extra_in_bytes_ = evict_extra_in_bytes;
  }

 private:
  void EnsureReuseAllocatorIsCreated();

  const bool using_memory_pool_;
  const bool is_memory_pool_allocated_on_demand_;
  const int initial_capacity_;
  const int allocation_unit_;

  starboard::Mutex mutex_;
  nb::StarboardMemoryAllocator fallback_allocator_;
  std::unique_ptr<nb::BidirectionalFitReuseAllocator> reuse_allocator_;

  int max_buffer_capacity_ = 0;
  size_t source_buffer_evict_extra_in_bytes_ = 0;

  // Monitor memory allocation and use when |using_memory_pool_| is false
  starboard::atomic_int32_t sbmemory_bytes_used_;
};

}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_DECODER_BUFFER_ALLOCATOR_H_
