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