| // 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_WEBM_PARSER_H_ | |
| #define INCLUDE_WEBM_WEBM_PARSER_H_ | |
| #include <memory> | |
| #include "./callback.h" | |
| #include "./reader.h" | |
| #include "./status.h" | |
| /** | |
| \file | |
| The main parser class for parsing WebM files. | |
| */ | |
| namespace webm { | |
| /** | |
| \defgroup PUBLIC_API Public API | |
| Public types and header files intended for use by users. | |
| */ | |
| /** | |
| \addtogroup PUBLIC_API | |
| @{ | |
| */ | |
| /** | |
| Incrementally parses a WebM document encoded in a byte stream. | |
| It is expected that the parsing will begin at the start of the WebM | |
| file/document. Otherwise, the `DidSeek()` method should be used to inform the | |
| parser that reading may not necessarily begin at the beginning of the document | |
| and the parser should be prepared to handle data at an arbitrary point in the | |
| document. | |
| WebM files are mostly a subset of Matroska, with a few small modifications. | |
| Matroska is a format built on top of EBML. | |
| */ | |
| // Spec references: | |
| // http://www.webmproject.org/docs/container/ | |
| // https://matroska.org/technical/specs/index.html | |
| // https://github.com/Matroska-Org/ebml-specification/blob/master/specification.markdown | |
| class WebmParser { | |
| public: | |
| /** | |
| Constructs the object and prepares it for parsing. | |
| */ | |
| WebmParser(); | |
| /* | |
| Cleans up the parser. No further cleanup is required from the user. | |
| */ | |
| ~WebmParser(); | |
| // Non-copyable and non-movable. | |
| WebmParser(const WebmParser&) = delete; | |
| WebmParser& operator=(const WebmParser&) = delete; | |
| /** | |
| Resets the parser after a seek was performed on the reader, which prepares | |
| the parser for starting at an arbitrary point in the stream. | |
| The seek must be to the start of an element (that is, it can't be any random | |
| byte) or parsing will fail. | |
| */ | |
| void DidSeek(); | |
| /** | |
| Feeds data into the parser from the provided reader. | |
| If a parsing error code has been returned (which indicates a malformed | |
| document), calling Feed() again will just result in the same error; parsing | |
| has already failed at that point and further progress can't be made. | |
| \param callback The callback which receives parsing events. No internal | |
| references are maintained to `callback`, so it may be modified or freed after | |
| this method returns. | |
| \param reader The reader the parser will use to request data. No internal | |
| references are maintained to `reader`, so it may be modified or freed after | |
| this method returns. | |
| \return `Status::kOkCompleted` when parsing completes successfully. | |
| `Status::kOkPartial` or another non-parsing error code (see status.h for | |
| error codes classified as parsing errors) will be returned if parsing has | |
| only partially completed, and Feed() should be called again to resume | |
| parsing. | |
| */ | |
| Status Feed(Callback* callback, Reader* reader); | |
| /** | |
| Swaps this parser and the provided parser. | |
| \param other The parser to swap values/states with. Must not be null. | |
| */ | |
| void Swap(WebmParser* other); | |
| private: | |
| // This header can only rely on sources in the public API. | |
| class DocumentParser; | |
| // The internal implementation of the parser. | |
| std::unique_ptr<DocumentParser> parser_; | |
| // The status of the parser, used to prevent further progress if an | |
| // unrecoverable parsing error has already been encountered. | |
| Status parsing_status_ = Status(Status::kOkPartial); | |
| }; | |
| /** | |
| Swaps the two parsers. | |
| This is provided so code can use argument dependent lookup in an idiomatic way | |
| when swapping (especially since `std::swap` won't work since the parser is | |
| non-movable). | |
| \param left The first parser to swap. | |
| \param right The second parser to swap. | |
| */ | |
| void swap(WebmParser& left, WebmParser& right); | |
| /** | |
| @} | |
| */ | |
| } // namespace webm | |
| #endif // INCLUDE_WEBM_WEBM_PARSER_H_ |