| // Copyright (c) 2016 The WebM project authors. All Rights Reserved. | |
| // | |
| // Use of this source code is governed by a BSD-style license | |
| // that can be found in the LICENSE file in the root of the source | |
| // tree. An additional intellectual property rights grant can be found | |
| // in the file PATENTS. All contributing project authors may | |
| // be found in the AUTHORS file in the root of the source tree. | |
| #ifndef INCLUDE_WEBM_READER_H_ | |
| #define INCLUDE_WEBM_READER_H_ | |
| #include <cstddef> | |
| #include <cstdint> | |
| #include "./status.h" | |
| /** | |
| \file | |
| An interface that acts as a data source for the parser to read from. | |
| */ | |
| namespace webm { | |
| /** | |
| \addtogroup PUBLIC_API | |
| @{ | |
| */ | |
| /** | |
| A generic interface for reading from a data source. | |
| Throwing an exception from the member functions is permitted, though if the | |
| exception will be caught and parsing resumed, then the reader should not | |
| advance its position before throwing the exception. | |
| */ | |
| class Reader { | |
| public: | |
| virtual ~Reader() = default; | |
| /** | |
| Reads data from the source and advances the reader's position by the number | |
| of bytes read. | |
| Short reads are permitted, as is reading no data. | |
| \param num_to_read The number of bytes that should be read. Must not be 0. | |
| \param buffer The buffer to store the read bytes. Must be large enough to | |
| store at least `num_to_read` bytes. Must not be null. | |
| \param[out] num_actually_read The number of bytes that were actually read is | |
| stored in this integer. Must not be null. | |
| \return `Status::kOkCompleted` if `num_to_read` bytes were read. | |
| `Status::kOkPartial` if the number of bytes read is > 0 and < `num_to_read`. | |
| If no bytes are read, then some status other than `Status::kOkCompleted` and | |
| `Status::kOkPartial` must be returned and `num_actually_read` must be set to | |
| 0. | |
| */ | |
| virtual Status Read(std::size_t num_to_read, std::uint8_t* buffer, | |
| std::uint64_t* num_actually_read) = 0; | |
| /** | |
| Skips data from the source and advances the reader's position by the number | |
| of bytes skipped. | |
| Short skips are permitted, as is skipping no data. This is similar to the | |
| `Read()` method, but does not store data in an output buffer. | |
| \param num_to_skip The number of bytes that should be skipped. Must not be 0. | |
| \param[out] num_actually_skipped The number of bytes that were actually | |
| skipped is stored in this integer. Must not be null. | |
| \return `Status::kOkCompleted` if `num_to_skip` bytes were skipped. | |
| `Status::kOkPartial` if the number of bytes skipped is > 0 and < | |
| `num_to_skip`. If no bytes are skipped, then some status other than | |
| `Status::kOkCompleted` and `Status::kOkPartial` must be returned and | |
| `num_actually_skipped` must be set to 0. | |
| */ | |
| virtual Status Skip(std::uint64_t num_to_skip, | |
| std::uint64_t* num_actually_skipped) = 0; | |
| /** | |
| Gets the Reader's current absolute byte position in the stream. | |
| Implementations don't necessarily need to start from 0 (which might be the | |
| case if parsing is starting in the middle of a data source). The value | |
| `kUnknownElementPosition` must not be returned. | |
| */ | |
| virtual std::uint64_t Position() const = 0; | |
| }; | |
| /** | |
| @} | |
| */ | |
| } // namespace webm | |
| #endif // INCLUDE_WEBM_READER_H_ |