| // Copyright (c) 2012 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 MEDIA_WEBM_WEBM_PARSER_H_ |
| #define MEDIA_WEBM_WEBM_PARSER_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/basictypes.h" |
| #include "media/base/media_export.h" |
| |
| namespace media { |
| |
| // Interface for receiving WebM parser events. |
| // |
| // Each method is called when an element of the specified type is parsed. |
| // The ID of the element that was parsed is given along with the value |
| // stored in the element. List elements generate calls at the start and |
| // end of the list. Any pointers passed to these methods are only guaranteed |
| // to be valid for the life of that call. Each method (except for OnListStart) |
| // returns a bool that indicates whether the parsed data is valid. OnListStart |
| // returns a pointer to a WebMParserClient object, which should be used to |
| // handle elements parsed out of the list being started. If false (or NULL by |
| // OnListStart) is returned then the parse is immediately terminated and an |
| // error is reported by the parser. |
| class MEDIA_EXPORT WebMParserClient { |
| public: |
| virtual ~WebMParserClient(); |
| |
| virtual WebMParserClient* OnListStart(int id); |
| virtual bool OnListEnd(int id); |
| virtual bool OnUInt(int id, int64 val); |
| virtual bool OnFloat(int id, double val); |
| virtual bool OnBinary(int id, const uint8* data, int size); |
| virtual bool OnString(int id, const std::string& str); |
| |
| protected: |
| WebMParserClient(); |
| |
| DISALLOW_COPY_AND_ASSIGN(WebMParserClient); |
| }; |
| |
| struct ListElementInfo; |
| |
| // Parses a WebM list element and all of its children. This |
| // class supports incremental parsing of the list so Parse() |
| // can be called multiple times with pieces of the list. |
| // IsParsingComplete() will return true once the entire list has |
| // been parsed. |
| class MEDIA_EXPORT WebMListParser { |
| public: |
| // |id| - Element ID of the list we intend to parse. |
| // |client| - Called as different elements in the list are parsed. |
| WebMListParser(int id, WebMParserClient* client); |
| ~WebMListParser(); |
| |
| // Resets the state of the parser so it can start parsing a new list. |
| void Reset(); |
| |
| // Parses list data contained in |buf|. |
| // |
| // Returns < 0 if the parse fails. |
| // Returns 0 if more data is needed. |
| // Returning > 0 indicates success & the number of bytes parsed. |
| int Parse(const uint8* buf, int size); |
| |
| // Returns true if the entire list has been parsed. |
| bool IsParsingComplete() const; |
| |
| private: |
| enum State { |
| NEED_LIST_HEADER, |
| INSIDE_LIST, |
| DONE_PARSING_LIST, |
| PARSE_ERROR, |
| }; |
| |
| struct ListState { |
| int id_; |
| int64 size_; |
| int64 bytes_parsed_; |
| const ListElementInfo* element_info_; |
| WebMParserClient* client_; |
| }; |
| |
| void ChangeState(State new_state); |
| |
| // Parses a single element in the current list. |
| // |
| // |header_size| - The size of the element header |
| // |id| - The ID of the element being parsed. |
| // |element_size| - The size of the element body. |
| // |data| - Pointer to the element contents. |
| // |size| - Number of bytes in |data| |
| // |client| - Client to pass the parsed data to. |
| // |
| // Returns < 0 if the parse fails. |
| // Returns 0 if more data is needed. |
| // Returning > 0 indicates success & the number of bytes parsed. |
| int ParseListElement(int header_size, |
| int id, int64 element_size, |
| const uint8* data, int size); |
| |
| // Called when starting to parse a new list. |
| // |
| // |id| - The ID of the new list. |
| // |size| - The size of the new list. |
| // |client| - The client object to notify that a new list is being parsed. |
| // |
| // Returns true if this list can be started in the current context. False |
| // if starting this list causes some sort of parse error. |
| bool OnListStart(int id, int64 size); |
| |
| // Called when the end of the current list has been reached. This may also |
| // signal the end of the current list's ancestors if the current list happens |
| // to be at the end of its parent. |
| // |
| // Returns true if no errors occurred while ending this list(s). |
| bool OnListEnd(); |
| |
| // Checks to see if |id_b| is a sibling or ancestor of |id_a|. |
| bool IsSiblingOrAncestor(int id_a, int id_b) const; |
| |
| State state_; |
| |
| // Element ID passed to the constructor. |
| const int root_id_; |
| |
| // Element level for |root_id_|. Used to verify that elements appear at |
| // the correct level. |
| const int root_level_; |
| |
| // WebMParserClient to handle the root list. |
| WebMParserClient* const root_client_; |
| |
| // Stack of state for all the lists currently being parsed. Lists are |
| // added and removed from this stack as they are parsed. |
| std::vector<ListState> list_state_stack_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WebMListParser); |
| }; |
| |
| // Parses an element header & returns the ID and element size. |
| // |
| // Returns < 0 if the parse fails. |
| // Returns 0 if more data is needed. |
| // Returning > 0 indicates success & the number of bytes parsed. |
| // |*id| contains the element ID on success and is undefined otherwise. |
| // |*element_size| contains the element size on success and is undefined |
| // otherwise. |
| int MEDIA_EXPORT WebMParseElementHeader(const uint8* buf, int size, |
| int* id, int64* element_size); |
| |
| } // namespace media |
| |
| #endif // MEDIA_WEBM_WEBM_PARSER_H_ |