Index: media/webm/webm_parser.h |
diff --git a/media/webm/webm_parser.h b/media/webm/webm_parser.h |
index 7d15f9bbb8aac788135707a20b1ba31734966b9e..bc3e09fbbe65b25d59fea448249d86a07e760713 100644 |
--- a/media/webm/webm_parser.h |
+++ b/media/webm/webm_parser.h |
@@ -6,8 +6,10 @@ |
#define MEDIA_WEBM_WEBM_PARSER_H_ |
#include <string> |
+#include <vector> |
#include "base/basictypes.h" |
+#include "media/base/media_export.h" |
namespace media { |
@@ -21,7 +23,7 @@ namespace media { |
// indicates whether the parsed data is valid. If false is returned |
// then the parse is immediately terminated and an error is reported by the |
// parser. |
-class WebMParserClient { |
+class MEDIA_EXPORT WebMParserClient { |
public: |
virtual ~WebMParserClient(); |
@@ -34,6 +36,106 @@ class WebMParserClient { |
virtual bool OnSimpleBlock(int track_num, int timecode, |
int flags, |
const uint8* data, int size) = 0; |
+ 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. |
+ explicit WebMListParser(int id); |
+ ~WebMListParser(); |
+ |
+ // Resets the state of the parser so it can start parsing a new list. |
+ void Reset(); |
+ |
+ // Parses list data contained in |buf|. |
+ // |client| Called as different elements in the list are parsed. |
+ // |
+ // 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, WebMParserClient* client); |
+ |
+ // 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_; |
+ int size_; |
+ int bytes_parsed_; |
+ const ListElementInfo* element_info_; |
+ }; |
+ |
+ 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, |
+ WebMParserClient* client); |
+ |
+ // 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, WebMParserClient* client); |
+ |
+ // 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. |
+ // |
+ // |client| - The client to notify about lists ending. |
+ // |
+ // Returns true if no errors occurred while ending this list(s). |
+ bool OnListEnd(WebMParserClient* client); |
+ |
+ State state_; |
+ |
+ // Element ID passed to the constructor. |
+ int root_id_; |
+ |
+ // Element level for |root_id_|. Used to verify that elements appear at |
+ // the correct level. |
+ int root_level_; |
+ |
+ // 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. |
@@ -47,15 +149,6 @@ class WebMParserClient { |
int WebMParseElementHeader(const uint8* buf, int size, |
int* id, int64* element_size); |
-// Parses a single list element that matches |id|. This method fails if the |
-// buffer points to an element that does not match |id|. |
-// |
-// Returns -1 if the parse fails. |
-// Returns 0 if more data is needed. |
-// Returns the number of bytes parsed on success. |
-int WebMParseListElement(const uint8* buf, int size, int id, |
- int level, WebMParserClient* client); |
- |
} // namespace media |
#endif // MEDIA_WEBM_WEBM_PARSER_H_ |