// Copyright (c) 2011 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 "cobalt/media/filters/in_memory_url_protocol.h"

#include "cobalt/media/ffmpeg/ffmpeg_common.h"
#include "starboard/memory.h"

namespace cobalt {
namespace media {

InMemoryUrlProtocol::InMemoryUrlProtocol(const uint8_t* data, int64_t size,
                                         bool streaming)
    : data_(data),
      size_(size >= 0 ? size : 0),
      position_(0),
      streaming_(streaming) {}

InMemoryUrlProtocol::~InMemoryUrlProtocol() {}

int InMemoryUrlProtocol::Read(int size, uint8_t* data) {
  if (size < 0) return AVERROR(EIO);

  int64_t available_bytes = size_ - position_;
  if (size > available_bytes) size = available_bytes;

  if (size > 0) {
    SbMemoryCopy(data, data_ + position_, size);
    position_ += size;
  }

  return size;
}

bool InMemoryUrlProtocol::GetPosition(int64_t* position_out) {
  if (!position_out) return false;

  *position_out = position_;
  return true;
}

bool InMemoryUrlProtocol::SetPosition(int64_t position) {
  if (position < 0 || position > size_) return false;
  position_ = position;
  return true;
}

bool InMemoryUrlProtocol::GetSize(int64_t* size_out) {
  if (!size_out) return false;

  *size_out = size_;
  return true;
}

bool InMemoryUrlProtocol::IsStreaming() { return streaming_; }

}  // namespace media
}  // namespace cobalt
