1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "media/filters/file_data_source.h"
6
7#include <algorithm>
8
9#include "base/logging.h"
10
11namespace media {
12
13FileDataSource::FileDataSource()
14    : force_read_errors_(false),
15      force_streaming_(false) {
16}
17
18FileDataSource::FileDataSource(base::File file)
19    : force_read_errors_(false),
20      force_streaming_(false) {
21  file_.Initialize(file.Pass());
22}
23
24bool FileDataSource::Initialize(const base::FilePath& file_path) {
25  DCHECK(!file_.IsValid());
26  return file_.Initialize(file_path);
27}
28
29void FileDataSource::Stop() {
30}
31
32void FileDataSource::Read(int64 position, int size, uint8* data,
33                          const DataSource::ReadCB& read_cb) {
34  if (force_read_errors_ || !file_.IsValid()) {
35    read_cb.Run(kReadError);
36    return;
37  }
38
39  int64 file_size = file_.length();
40
41  CHECK_GE(file_size, 0);
42  CHECK_GE(position, 0);
43  CHECK_GE(size, 0);
44
45  // Cap position and size within bounds.
46  position = std::min(position, file_size);
47  int64 clamped_size = std::min(static_cast<int64>(size), file_size - position);
48
49  memcpy(data, file_.data() + position, clamped_size);
50  read_cb.Run(clamped_size);
51}
52
53bool FileDataSource::GetSize(int64* size_out) {
54  *size_out = file_.length();
55  return true;
56}
57
58bool FileDataSource::IsStreaming() {
59  return force_streaming_;
60}
61
62void FileDataSource::SetBitrate(int bitrate) {}
63
64FileDataSource::~FileDataSource() {}
65
66}  // namespace media
67