// Copyright (c) 2012 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/file_data_source.h"

#include <algorithm>
#include <utility>

#include "base/logging.h"
#include "starboard/memory.h"

namespace cobalt {
namespace media {

FileDataSource::FileDataSource()
    : force_read_errors_(false), force_streaming_(false), bytes_read_(0) {}

FileDataSource::FileDataSource(base::File file)
    : force_read_errors_(false), force_streaming_(false), bytes_read_(0) {
  file_.Initialize(std::move(file));
}

bool FileDataSource::Initialize(const base::FilePath& file_path) {
  DCHECK(!file_.IsValid());
  return file_.Initialize(file_path);
}

void FileDataSource::Stop() {}

void FileDataSource::Abort() {}

void FileDataSource::Read(int64_t position, int size, uint8_t* data,
                          const DataSource::ReadCB& read_cb) {
  if (force_read_errors_ || !file_.IsValid()) {
    read_cb.Run(kReadError);
    return;
  }

  int64_t file_size = file_.length();

  CHECK_GE(file_size, 0);
  CHECK_GE(position, 0);
  CHECK_GE(size, 0);

  // Cap position and size within bounds.
  position = std::min(position, file_size);
  int64_t clamped_size =
      std::min(static_cast<int64_t>(size), file_size - position);

  SbMemoryCopy(data, file_.data() + position, clamped_size);
  bytes_read_ += clamped_size;
  read_cb.Run(clamped_size);
}

bool FileDataSource::GetSize(int64_t* size_out) {
  *size_out = file_.length();
  return true;
}

bool FileDataSource::IsStreaming() { return force_streaming_; }

void FileDataSource::SetBitrate(int bitrate) {}

FileDataSource::~FileDataSource() {}

}  // namespace media
}  // namespace cobalt
