| // 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_ |