Upload upstream chromium 108.0.5359.1
[platform/framework/web/chromium-efl.git] / media / filters / in_memory_url_protocol.cc
1 // Copyright 2011 The Chromium Authors
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/in_memory_url_protocol.h"
6
7 #include "media/ffmpeg/ffmpeg_common.h"
8
9 namespace media {
10
11 InMemoryUrlProtocol::InMemoryUrlProtocol(const uint8_t* data,
12                                          int64_t size,
13                                          bool streaming)
14     : data_(data),
15       size_(size >= 0 ? size : 0),
16       position_(0),
17       streaming_(streaming) {}
18
19 InMemoryUrlProtocol::~InMemoryUrlProtocol() = default;
20
21 int InMemoryUrlProtocol::Read(int size, uint8_t* data) {
22   // Not sure this can happen, but it's unclear from the ffmpeg code, so guard
23   // against it.
24   if (size < 0)
25     return AVERROR(EIO);
26   if (!size)
27     return 0;
28
29   const int64_t available_bytes = size_ - position_;
30   if (available_bytes <= 0)
31     return AVERROR_EOF;
32
33   if (size > available_bytes)
34     size = available_bytes;
35
36   if (size > 0) {
37     memcpy(data, data_ + position_, size);
38     position_ += size;
39   }
40
41   return size;
42 }
43
44 bool InMemoryUrlProtocol::GetPosition(int64_t* position_out) {
45   if (!position_out)
46     return false;
47
48   *position_out = position_;
49   return true;
50 }
51
52 bool InMemoryUrlProtocol::SetPosition(int64_t position) {
53   if (position < 0 || position > size_)
54     return false;
55   position_ = position;
56   return true;
57 }
58
59 bool InMemoryUrlProtocol::GetSize(int64_t* size_out) {
60   if (!size_out)
61     return false;
62
63   *size_out = size_;
64   return true;
65 }
66
67 bool InMemoryUrlProtocol::IsStreaming() {
68   return streaming_;
69 }
70
71 }  // namespace media