1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef MEDIA_WEBM_WEBM_PARSER_H_
6 #define MEDIA_WEBM_WEBM_PARSER_H_
11 #include "base/basictypes.h"
12 #include "media/base/media_export.h"
16 // Interface for receiving WebM parser events.
18 // Each method is called when an element of the specified type is parsed.
19 // The ID of the element that was parsed is given along with the value
20 // stored in the element. List elements generate calls at the start and
21 // end of the list. Any pointers passed to these methods are only guaranteed
22 // to be valid for the life of that call. Each method (except for OnListStart)
23 // returns a bool that indicates whether the parsed data is valid. OnListStart
24 // returns a pointer to a WebMParserClient object, which should be used to
25 // handle elements parsed out of the list being started. If false (or NULL by
26 // OnListStart) is returned then the parse is immediately terminated and an
27 // error is reported by the parser.
28 class MEDIA_EXPORT WebMParserClient
{
30 virtual ~WebMParserClient();
32 virtual WebMParserClient
* OnListStart(int id
);
33 virtual bool OnListEnd(int id
);
34 virtual bool OnUInt(int id
, int64 val
);
35 virtual bool OnFloat(int id
, double val
);
36 virtual bool OnBinary(int id
, const uint8
* data
, int size
);
37 virtual bool OnString(int id
, const std::string
& str
);
42 DISALLOW_COPY_AND_ASSIGN(WebMParserClient
);
45 struct ListElementInfo
;
47 // Parses a WebM list element and all of its children. This
48 // class supports incremental parsing of the list so Parse()
49 // can be called multiple times with pieces of the list.
50 // IsParsingComplete() will return true once the entire list has
52 class MEDIA_EXPORT WebMListParser
{
54 // |id| - Element ID of the list we intend to parse.
55 // |client| - Called as different elements in the list are parsed.
56 WebMListParser(int id
, WebMParserClient
* client
);
59 // Resets the state of the parser so it can start parsing a new list.
62 // Parses list data contained in |buf|.
64 // Returns < 0 if the parse fails.
65 // Returns 0 if more data is needed.
66 // Returning > 0 indicates success & the number of bytes parsed.
67 int Parse(const uint8
* buf
, int size
);
69 // Returns true if the entire list has been parsed.
70 bool IsParsingComplete() const;
84 const ListElementInfo
* element_info_
;
85 WebMParserClient
* client_
;
88 void ChangeState(State new_state
);
90 // Parses a single element in the current list.
92 // |header_size| - The size of the element header
93 // |id| - The ID of the element being parsed.
94 // |element_size| - The size of the element body.
95 // |data| - Pointer to the element contents.
96 // |size| - Number of bytes in |data|
97 // |client| - Client to pass the parsed data to.
99 // Returns < 0 if the parse fails.
100 // Returns 0 if more data is needed.
101 // Returning > 0 indicates success & the number of bytes parsed.
102 int ParseListElement(int header_size
,
103 int id
, int64 element_size
,
104 const uint8
* data
, int size
);
106 // Called when starting to parse a new list.
108 // |id| - The ID of the new list.
109 // |size| - The size of the new list.
110 // |client| - The client object to notify that a new list is being parsed.
112 // Returns true if this list can be started in the current context. False
113 // if starting this list causes some sort of parse error.
114 bool OnListStart(int id
, int64 size
);
116 // Called when the end of the current list has been reached. This may also
117 // signal the end of the current list's ancestors if the current list happens
118 // to be at the end of its parent.
120 // Returns true if no errors occurred while ending this list(s).
123 // Checks to see if |id_b| is a sibling or ancestor of |id_a|.
124 bool IsSiblingOrAncestor(int id_a
, int id_b
) const;
128 // Element ID passed to the constructor.
131 // Element level for |root_id_|. Used to verify that elements appear at
132 // the correct level.
133 const int root_level_
;
135 // WebMParserClient to handle the root list.
136 WebMParserClient
* const root_client_
;
138 // Stack of state for all the lists currently being parsed. Lists are
139 // added and removed from this stack as they are parsed.
140 std::vector
<ListState
> list_state_stack_
;
142 DISALLOW_COPY_AND_ASSIGN(WebMListParser
);
145 // Parses an element header & returns the ID and element size.
147 // Returns < 0 if the parse fails.
148 // Returns 0 if more data is needed.
149 // Returning > 0 indicates success & the number of bytes parsed.
150 // |*id| contains the element ID on success and is undefined otherwise.
151 // |*element_size| contains the element size on success and is undefined
153 int MEDIA_EXPORT
WebMParseElementHeader(const uint8
* buf
, int size
,
154 int* id
, int64
* element_size
);
158 #endif // MEDIA_WEBM_WEBM_PARSER_H_