blob: 177dec6862b9481001249a960755a6f003e13a37 [file] [log] [blame]
// Copyright 2016 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.
#ifndef SERVICES_MEDIA_FRAMEWORK_MOJO_PARTS_MOJO_READER_H_
#define SERVICES_MEDIA_FRAMEWORK_MOJO_PARTS_MOJO_READER_H_
#include <atomic>
#include "base/single_thread_task_runner.h"
#include "mojo/services/media/core/interfaces/seeking_reader.mojom.h"
#include "services/media/framework/parts/reader.h"
#include "services/util/cpp/incident.h"
namespace mojo {
namespace media {
// Reads raw data from a SeekingReader service.
class MojoReader : public Reader {
public:
// Creates an MojoReader. Must be called on a mojo thread.
static std::shared_ptr<Reader> Create(
InterfaceHandle<SeekingReader> seeking_reader) {
return std::shared_ptr<Reader>(new MojoReader(seeking_reader.Pass()));
}
~MojoReader() override;
// Reader implementation.
void Describe(const DescribeCallback& callback) override;
void ReadAt(size_t position,
uint8_t* buffer,
size_t bytes_to_read,
const ReadAtCallback& callback) override;
private:
static constexpr size_t kDataPipeCapacity = 32u * 1024u;
// Calls ReadResponseBody.
static void ReadResponseBodyStatic(void* self, MojoResult result);
MojoReader(InterfaceHandle<SeekingReader> seeking_reader);
// Continues a ReadAt operation on the thread on which this reader was
// constructed (a mojo thread).
void ContinueReadAt();
// Reads from response_body_ into response_body_buffer_.
void ReadResponseBody();
// Completes a ReadAt operation by calling the read_at_callback_.
void CompleteReadAt(Result result, size_t bytes_read = 0);
// Shuts down the consumer handle and calls CompleteReadAt.
void FailReadAt(MojoResult result);
SeekingReaderPtr seeking_reader_;
Result result_ = Result::kOk;
size_t size_ = kUnknownSize;
bool can_seek_ = false;
Incident ready_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
std::atomic_bool read_in_progress_;
size_t read_at_position_;
uint8_t* read_at_buffer_;
size_t read_at_bytes_to_read_;
size_t read_at_bytes_remaining_;
ReadAtCallback read_at_callback_;
ScopedDataPipeConsumerHandle consumer_handle_;
size_t consumer_handle_position_ = kUnknownSize;
};
} // namespace media
} // namespace mojo
#endif // SERVICES_MEDIA_FRAMEWORK_MOJO_PARTS_MOJO_READER_H_