// 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 "media/filters/in_memory_url_protocol.h" #include "media/ffmpeg/ffmpeg_common.h" 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() = default; int InMemoryUrlProtocol::Read(int size, uint8_t* data) { // Not sure this can happen, but it's unclear from the ffmpeg code, so guard // against it. if (size < 0) return AVERROR(EIO); if (!size) return 0; const int64_t available_bytes = size_ - position_; if (available_bytes <= 0) return AVERROR_EOF; if (size > available_bytes) size = available_bytes; if (size > 0) { memcpy(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