xref: /aosp_15_r20/external/libwebm/webm_parser/include/webm/callback.h (revision 103e46e4cd4b6efcf6001f23fa8665fb110abf8d)
1*103e46e4SHarish Mahendrakar // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2*103e46e4SHarish Mahendrakar //
3*103e46e4SHarish Mahendrakar // Use of this source code is governed by a BSD-style license
4*103e46e4SHarish Mahendrakar // that can be found in the LICENSE file in the root of the source
5*103e46e4SHarish Mahendrakar // tree. An additional intellectual property rights grant can be found
6*103e46e4SHarish Mahendrakar // in the file PATENTS.  All contributing project authors may
7*103e46e4SHarish Mahendrakar // be found in the AUTHORS file in the root of the source tree.
8*103e46e4SHarish Mahendrakar #ifndef INCLUDE_WEBM_CALLBACK_H_
9*103e46e4SHarish Mahendrakar #define INCLUDE_WEBM_CALLBACK_H_
10*103e46e4SHarish Mahendrakar 
11*103e46e4SHarish Mahendrakar #include <cstdint>
12*103e46e4SHarish Mahendrakar 
13*103e46e4SHarish Mahendrakar #include "./dom_types.h"
14*103e46e4SHarish Mahendrakar #include "./reader.h"
15*103e46e4SHarish Mahendrakar #include "./status.h"
16*103e46e4SHarish Mahendrakar 
17*103e46e4SHarish Mahendrakar /**
18*103e46e4SHarish Mahendrakar  \file
19*103e46e4SHarish Mahendrakar  The main callback type that receives parsing events.
20*103e46e4SHarish Mahendrakar  */
21*103e46e4SHarish Mahendrakar 
22*103e46e4SHarish Mahendrakar namespace webm {
23*103e46e4SHarish Mahendrakar 
24*103e46e4SHarish Mahendrakar /**
25*103e46e4SHarish Mahendrakar  \addtogroup PUBLIC_API
26*103e46e4SHarish Mahendrakar  @{
27*103e46e4SHarish Mahendrakar  */
28*103e46e4SHarish Mahendrakar 
29*103e46e4SHarish Mahendrakar /**
30*103e46e4SHarish Mahendrakar  The action to be performed when parsing an element.
31*103e46e4SHarish Mahendrakar  */
32*103e46e4SHarish Mahendrakar enum class Action {
33*103e46e4SHarish Mahendrakar   /**
34*103e46e4SHarish Mahendrakar    Read and parse the element.
35*103e46e4SHarish Mahendrakar    */
36*103e46e4SHarish Mahendrakar   kRead,
37*103e46e4SHarish Mahendrakar 
38*103e46e4SHarish Mahendrakar   /**
39*103e46e4SHarish Mahendrakar    Skip the element. Skipped elements are not parsed or stored, and the callback
40*103e46e4SHarish Mahendrakar    is not given any further notifications regarding the element.
41*103e46e4SHarish Mahendrakar    */
42*103e46e4SHarish Mahendrakar   kSkip,
43*103e46e4SHarish Mahendrakar };
44*103e46e4SHarish Mahendrakar 
45*103e46e4SHarish Mahendrakar /**
46*103e46e4SHarish Mahendrakar  A callback that receives parsing events.
47*103e46e4SHarish Mahendrakar 
48*103e46e4SHarish Mahendrakar  Every method that returns a `Status` should return `Status::kOkCompleted` when
49*103e46e4SHarish Mahendrakar  the method has completed and parsing should continue. Returning any other value
50*103e46e4SHarish Mahendrakar  will cause parsing to stop. Parsing may be resumed if the returned status was
51*103e46e4SHarish Mahendrakar  not a parsing error (see `Status::is_parsing_error()`). When parsing is
52*103e46e4SHarish Mahendrakar  resumed, the same `Callback` method will be called again.
53*103e46e4SHarish Mahendrakar 
54*103e46e4SHarish Mahendrakar  Methods that take a `Reader` expect the implementation to consume (either via
55*103e46e4SHarish Mahendrakar  `Reader::Read()` or `Reader::Skip()`) the specified number of bytes before
56*103e46e4SHarish Mahendrakar  returning `Status::kOkCompleted`. Default implementations will call
57*103e46e4SHarish Mahendrakar  `Reader::Skip()` to skip the specified number of bytes and the resulting
58*103e46e4SHarish Mahendrakar  `Status` will be returned (unless it's `Status::kOkPartial`, in which case
59*103e46e4SHarish Mahendrakar  `Reader::Skip()` will be called again to skip more data).
60*103e46e4SHarish Mahendrakar 
61*103e46e4SHarish Mahendrakar  Throwing an exception from the member functions is permitted, though if the
62*103e46e4SHarish Mahendrakar  exception will be caught and parsing resumed, then the reader should not
63*103e46e4SHarish Mahendrakar  advance its position (for methods that take a `Reader`) before the exception is
64*103e46e4SHarish Mahendrakar  thrown. When parsing is resumed, the same `Callback` method will be called
65*103e46e4SHarish Mahendrakar  again.
66*103e46e4SHarish Mahendrakar 
67*103e46e4SHarish Mahendrakar  Users should derive from this class and override member methods as needed.
68*103e46e4SHarish Mahendrakar  */
69*103e46e4SHarish Mahendrakar class Callback {
70*103e46e4SHarish Mahendrakar  public:
71*103e46e4SHarish Mahendrakar   virtual ~Callback() = default;
72*103e46e4SHarish Mahendrakar 
73*103e46e4SHarish Mahendrakar   /**
74*103e46e4SHarish Mahendrakar    Called when the parser starts a new element. This is called after the
75*103e46e4SHarish Mahendrakar    elements ID and size has been parsed, but before any of its body has been
76*103e46e4SHarish Mahendrakar    read (or validated).
77*103e46e4SHarish Mahendrakar 
78*103e46e4SHarish Mahendrakar    Defaults to `Action::kRead` and returning `Status::kOkCompleted`.
79*103e46e4SHarish Mahendrakar 
80*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element that has just been encountered.
81*103e46e4SHarish Mahendrakar    \param[out] action The action that should be taken when handling this
82*103e46e4SHarish Mahendrakar    element. Will not be null.
83*103e46e4SHarish Mahendrakar    */
84*103e46e4SHarish Mahendrakar   virtual Status OnElementBegin(const ElementMetadata& metadata,
85*103e46e4SHarish Mahendrakar                                 Action* action);
86*103e46e4SHarish Mahendrakar 
87*103e46e4SHarish Mahendrakar   /**
88*103e46e4SHarish Mahendrakar    Called when the parser encounters an unknown element.
89*103e46e4SHarish Mahendrakar 
90*103e46e4SHarish Mahendrakar    Defaults to calling (and returning the result of) `Reader::Skip()`.
91*103e46e4SHarish Mahendrakar 
92*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
93*103e46e4SHarish Mahendrakar    \param reader The reader that should be used to consume data. Will not be
94*103e46e4SHarish Mahendrakar    null.
95*103e46e4SHarish Mahendrakar    \param[in,out] bytes_remaining The number of remaining bytes that need to be
96*103e46e4SHarish Mahendrakar    consumed for the element. Will not be null.
97*103e46e4SHarish Mahendrakar    \return `Status::kOkCompleted` when the element has been fully consumed and
98*103e46e4SHarish Mahendrakar    `bytes_remaining` is now zero.
99*103e46e4SHarish Mahendrakar    */
100*103e46e4SHarish Mahendrakar   virtual Status OnUnknownElement(const ElementMetadata& metadata,
101*103e46e4SHarish Mahendrakar                                   Reader* reader,
102*103e46e4SHarish Mahendrakar                                   std::uint64_t* bytes_remaining);
103*103e46e4SHarish Mahendrakar 
104*103e46e4SHarish Mahendrakar   /**
105*103e46e4SHarish Mahendrakar    Called when the parser encounters an `Id::kEbml` element and it has been
106*103e46e4SHarish Mahendrakar    fully parsed.
107*103e46e4SHarish Mahendrakar 
108*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
109*103e46e4SHarish Mahendrakar 
110*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
111*103e46e4SHarish Mahendrakar    \param ebml The parsed element.
112*103e46e4SHarish Mahendrakar    */
113*103e46e4SHarish Mahendrakar   virtual Status OnEbml(const ElementMetadata& metadata, const Ebml& ebml);
114*103e46e4SHarish Mahendrakar 
115*103e46e4SHarish Mahendrakar   /**
116*103e46e4SHarish Mahendrakar    Called when the parser encounters an Id::kVoid element.
117*103e46e4SHarish Mahendrakar 
118*103e46e4SHarish Mahendrakar    Defaults to calling (and returning the result of) Reader::Skip.
119*103e46e4SHarish Mahendrakar 
120*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
121*103e46e4SHarish Mahendrakar    \param reader The reader that should be used to consume data. Will not be
122*103e46e4SHarish Mahendrakar    null.
123*103e46e4SHarish Mahendrakar    \param[in,out] bytes_remaining The number of remaining bytes that need to be
124*103e46e4SHarish Mahendrakar    consumed for the element. Will not be null.
125*103e46e4SHarish Mahendrakar    \return `Status::kOkCompleted` when the element has been fully consumed and
126*103e46e4SHarish Mahendrakar    `bytes_remaining` is now zero.
127*103e46e4SHarish Mahendrakar    */
128*103e46e4SHarish Mahendrakar   virtual Status OnVoid(const ElementMetadata& metadata, Reader* reader,
129*103e46e4SHarish Mahendrakar                         std::uint64_t* bytes_remaining);
130*103e46e4SHarish Mahendrakar 
131*103e46e4SHarish Mahendrakar   /**
132*103e46e4SHarish Mahendrakar    Called when the parser starts an `Id::kSegment` element.
133*103e46e4SHarish Mahendrakar 
134*103e46e4SHarish Mahendrakar    Defaults to `Action::kRead` and returning `Status::kOkCompleted`.
135*103e46e4SHarish Mahendrakar 
136*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element that has just been encountered.
137*103e46e4SHarish Mahendrakar    \param[out] action The action that should be taken when handling this
138*103e46e4SHarish Mahendrakar    element. Will not be null.
139*103e46e4SHarish Mahendrakar    */
140*103e46e4SHarish Mahendrakar   virtual Status OnSegmentBegin(const ElementMetadata& metadata,
141*103e46e4SHarish Mahendrakar                                 Action* action);
142*103e46e4SHarish Mahendrakar 
143*103e46e4SHarish Mahendrakar   /**
144*103e46e4SHarish Mahendrakar    Called when the parser encounters an `Id::kSeek` element and it has been
145*103e46e4SHarish Mahendrakar    fully parsed.
146*103e46e4SHarish Mahendrakar 
147*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
148*103e46e4SHarish Mahendrakar 
149*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
150*103e46e4SHarish Mahendrakar    \param seek The parsed element.
151*103e46e4SHarish Mahendrakar    */
152*103e46e4SHarish Mahendrakar   virtual Status OnSeek(const ElementMetadata& metadata, const Seek& seek);
153*103e46e4SHarish Mahendrakar 
154*103e46e4SHarish Mahendrakar   /**
155*103e46e4SHarish Mahendrakar    Called when the parser encounters an `Id::kInfo` element and it has been
156*103e46e4SHarish Mahendrakar    fully parsed.
157*103e46e4SHarish Mahendrakar 
158*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
159*103e46e4SHarish Mahendrakar 
160*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
161*103e46e4SHarish Mahendrakar    \param info The parsed element.
162*103e46e4SHarish Mahendrakar    */
163*103e46e4SHarish Mahendrakar   virtual Status OnInfo(const ElementMetadata& metadata, const Info& info);
164*103e46e4SHarish Mahendrakar 
165*103e46e4SHarish Mahendrakar   /**
166*103e46e4SHarish Mahendrakar    Called when the parser starts an `Id::kCluster` element.
167*103e46e4SHarish Mahendrakar 
168*103e46e4SHarish Mahendrakar    Because Cluster elements should start with a Timecode (and optionally
169*103e46e4SHarish Mahendrakar    PrevSize) child, this method is not invoked until a child BlockGroup or
170*103e46e4SHarish Mahendrakar    SimpleBlock element is encountered (or the Cluster ends if no such child
171*103e46e4SHarish Mahendrakar    exists).
172*103e46e4SHarish Mahendrakar 
173*103e46e4SHarish Mahendrakar    Defaults to `Action::kRead` and returning `Status::kOkCompleted`.
174*103e46e4SHarish Mahendrakar 
175*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
176*103e46e4SHarish Mahendrakar    \param cluster The element, as it has currently been parsed.
177*103e46e4SHarish Mahendrakar    \param[out] action The action that should be taken when handling this
178*103e46e4SHarish Mahendrakar    element. Will not be null.
179*103e46e4SHarish Mahendrakar    */
180*103e46e4SHarish Mahendrakar   virtual Status OnClusterBegin(const ElementMetadata& metadata,
181*103e46e4SHarish Mahendrakar                                 const Cluster& cluster, Action* action);
182*103e46e4SHarish Mahendrakar 
183*103e46e4SHarish Mahendrakar   /**
184*103e46e4SHarish Mahendrakar    Called when the parser starts an `Id::kSimpleBlock` element.
185*103e46e4SHarish Mahendrakar 
186*103e46e4SHarish Mahendrakar    Defaults to `Action::kRead` and returning `Status::kOkCompleted`.
187*103e46e4SHarish Mahendrakar 
188*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
189*103e46e4SHarish Mahendrakar    \param simple_block The parsed SimpleBlock header.
190*103e46e4SHarish Mahendrakar    \param[out] action The action that should be taken when handling this
191*103e46e4SHarish Mahendrakar    element. Will not be null.
192*103e46e4SHarish Mahendrakar    */
193*103e46e4SHarish Mahendrakar   virtual Status OnSimpleBlockBegin(const ElementMetadata& metadata,
194*103e46e4SHarish Mahendrakar                                     const SimpleBlock& simple_block,
195*103e46e4SHarish Mahendrakar                                     Action* action);
196*103e46e4SHarish Mahendrakar 
197*103e46e4SHarish Mahendrakar   /**
198*103e46e4SHarish Mahendrakar    Called when the parser finishes an `Id::kSimpleBlock` element.
199*103e46e4SHarish Mahendrakar 
200*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
201*103e46e4SHarish Mahendrakar 
202*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
203*103e46e4SHarish Mahendrakar    \param simple_block The parsed SimpleBlock header.
204*103e46e4SHarish Mahendrakar    */
205*103e46e4SHarish Mahendrakar   virtual Status OnSimpleBlockEnd(const ElementMetadata& metadata,
206*103e46e4SHarish Mahendrakar                                   const SimpleBlock& simple_block);
207*103e46e4SHarish Mahendrakar 
208*103e46e4SHarish Mahendrakar   /**
209*103e46e4SHarish Mahendrakar    Called when the parser starts an `Id::kBlockGroup` element.
210*103e46e4SHarish Mahendrakar 
211*103e46e4SHarish Mahendrakar    Defaults to `Action::kRead` and returning `Status::kOkCompleted`.
212*103e46e4SHarish Mahendrakar 
213*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
214*103e46e4SHarish Mahendrakar    \param[out] action The action that should be taken when handling this
215*103e46e4SHarish Mahendrakar    element. Will not be null.
216*103e46e4SHarish Mahendrakar    */
217*103e46e4SHarish Mahendrakar   virtual Status OnBlockGroupBegin(const ElementMetadata& metadata,
218*103e46e4SHarish Mahendrakar                                    Action* action);
219*103e46e4SHarish Mahendrakar 
220*103e46e4SHarish Mahendrakar   /**
221*103e46e4SHarish Mahendrakar    Called when the parser starts an `Id::kBlock` element.
222*103e46e4SHarish Mahendrakar 
223*103e46e4SHarish Mahendrakar    Defaults to `Action::kRead` and returning `Status::kOkCompleted`.
224*103e46e4SHarish Mahendrakar 
225*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
226*103e46e4SHarish Mahendrakar    \param block The parsed Block header.
227*103e46e4SHarish Mahendrakar    \param[out] action The action that should be taken when handling this
228*103e46e4SHarish Mahendrakar    element. Will not be null.
229*103e46e4SHarish Mahendrakar    */
230*103e46e4SHarish Mahendrakar   virtual Status OnBlockBegin(const ElementMetadata& metadata,
231*103e46e4SHarish Mahendrakar                               const Block& block, Action* action);
232*103e46e4SHarish Mahendrakar 
233*103e46e4SHarish Mahendrakar   /**
234*103e46e4SHarish Mahendrakar    Called when the parser finishes an `Id::Block` element.
235*103e46e4SHarish Mahendrakar 
236*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
237*103e46e4SHarish Mahendrakar 
238*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
239*103e46e4SHarish Mahendrakar    \param block The parsed Block header.
240*103e46e4SHarish Mahendrakar    */
241*103e46e4SHarish Mahendrakar   virtual Status OnBlockEnd(const ElementMetadata& metadata,
242*103e46e4SHarish Mahendrakar                             const Block& block);
243*103e46e4SHarish Mahendrakar 
244*103e46e4SHarish Mahendrakar   /**
245*103e46e4SHarish Mahendrakar    Called when the parser finishes an `Id::kBlockGroup` element.
246*103e46e4SHarish Mahendrakar 
247*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
248*103e46e4SHarish Mahendrakar 
249*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
250*103e46e4SHarish Mahendrakar    \param block_group The parsed element.
251*103e46e4SHarish Mahendrakar    */
252*103e46e4SHarish Mahendrakar   virtual Status OnBlockGroupEnd(const ElementMetadata& metadata,
253*103e46e4SHarish Mahendrakar                                  const BlockGroup& block_group);
254*103e46e4SHarish Mahendrakar 
255*103e46e4SHarish Mahendrakar   /**
256*103e46e4SHarish Mahendrakar    Called when the parser encounters a frame within a `Id::kBlock` or
257*103e46e4SHarish Mahendrakar    `Id::kSimpleBlock` element.
258*103e46e4SHarish Mahendrakar 
259*103e46e4SHarish Mahendrakar    Defaults to calling (and returning the result of) `Reader::Skip`.
260*103e46e4SHarish Mahendrakar 
261*103e46e4SHarish Mahendrakar    \param metadata Metadata about the frame.
262*103e46e4SHarish Mahendrakar    \param reader The reader that should be used to consume data. Will not be
263*103e46e4SHarish Mahendrakar    null.
264*103e46e4SHarish Mahendrakar    \param[in,out] bytes_remaining The number of remaining bytes that need to be
265*103e46e4SHarish Mahendrakar    consumed for the frame. Will not be null.
266*103e46e4SHarish Mahendrakar    \return `Status::kOkCompleted` when the frame has been fully consumed and
267*103e46e4SHarish Mahendrakar    `bytes_remaining` is now zero.
268*103e46e4SHarish Mahendrakar    */
269*103e46e4SHarish Mahendrakar   virtual Status OnFrame(const FrameMetadata& metadata, Reader* reader,
270*103e46e4SHarish Mahendrakar                          std::uint64_t* bytes_remaining);
271*103e46e4SHarish Mahendrakar 
272*103e46e4SHarish Mahendrakar   /**
273*103e46e4SHarish Mahendrakar    Called when the parser finishes an `Id::kCluster` element.
274*103e46e4SHarish Mahendrakar 
275*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
276*103e46e4SHarish Mahendrakar 
277*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
278*103e46e4SHarish Mahendrakar    \param cluster The parsed element.
279*103e46e4SHarish Mahendrakar    */
280*103e46e4SHarish Mahendrakar   virtual Status OnClusterEnd(const ElementMetadata& metadata,
281*103e46e4SHarish Mahendrakar                               const Cluster& cluster);
282*103e46e4SHarish Mahendrakar 
283*103e46e4SHarish Mahendrakar   /**
284*103e46e4SHarish Mahendrakar    Called when the parser starts an `Id::kTrackEntry` element.
285*103e46e4SHarish Mahendrakar 
286*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
287*103e46e4SHarish Mahendrakar 
288*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
289*103e46e4SHarish Mahendrakar    \param track_entry The parsed element.
290*103e46e4SHarish Mahendrakar    */
291*103e46e4SHarish Mahendrakar   virtual Status OnTrackEntry(const ElementMetadata& metadata,
292*103e46e4SHarish Mahendrakar                               const TrackEntry& track_entry);
293*103e46e4SHarish Mahendrakar 
294*103e46e4SHarish Mahendrakar   /**
295*103e46e4SHarish Mahendrakar    Called when the parser encounters an `Id::kCuePoint` element and it has been
296*103e46e4SHarish Mahendrakar    fully parsed.
297*103e46e4SHarish Mahendrakar 
298*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
299*103e46e4SHarish Mahendrakar 
300*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
301*103e46e4SHarish Mahendrakar    \param cue_point The parsed element.
302*103e46e4SHarish Mahendrakar    */
303*103e46e4SHarish Mahendrakar   virtual Status OnCuePoint(const ElementMetadata& metadata,
304*103e46e4SHarish Mahendrakar                             const CuePoint& cue_point);
305*103e46e4SHarish Mahendrakar 
306*103e46e4SHarish Mahendrakar   /**
307*103e46e4SHarish Mahendrakar    Called when the parser encounters an `Id::kEditionEntry` element and it has
308*103e46e4SHarish Mahendrakar    been fully parsed.
309*103e46e4SHarish Mahendrakar 
310*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
311*103e46e4SHarish Mahendrakar 
312*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
313*103e46e4SHarish Mahendrakar    \param edition_entry The parsed element.
314*103e46e4SHarish Mahendrakar    */
315*103e46e4SHarish Mahendrakar   virtual Status OnEditionEntry(const ElementMetadata& metadata,
316*103e46e4SHarish Mahendrakar                                 const EditionEntry& edition_entry);
317*103e46e4SHarish Mahendrakar 
318*103e46e4SHarish Mahendrakar   /**
319*103e46e4SHarish Mahendrakar    Called when the parser encounters an `Id::kTag` element and it has been fully
320*103e46e4SHarish Mahendrakar    parsed.
321*103e46e4SHarish Mahendrakar 
322*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
323*103e46e4SHarish Mahendrakar 
324*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
325*103e46e4SHarish Mahendrakar    \param tag The parsed element.
326*103e46e4SHarish Mahendrakar    */
327*103e46e4SHarish Mahendrakar   virtual Status OnTag(const ElementMetadata& metadata, const Tag& tag);
328*103e46e4SHarish Mahendrakar 
329*103e46e4SHarish Mahendrakar   /**
330*103e46e4SHarish Mahendrakar    Called when the parser finishes an `Id::kSegment` element.
331*103e46e4SHarish Mahendrakar 
332*103e46e4SHarish Mahendrakar    Defaults to returning `Status::kOkCompleted`.
333*103e46e4SHarish Mahendrakar 
334*103e46e4SHarish Mahendrakar    \param metadata Metadata about the element.
335*103e46e4SHarish Mahendrakar    */
336*103e46e4SHarish Mahendrakar   virtual Status OnSegmentEnd(const ElementMetadata& metadata);
337*103e46e4SHarish Mahendrakar 
338*103e46e4SHarish Mahendrakar  protected:
339*103e46e4SHarish Mahendrakar   /**
340*103e46e4SHarish Mahendrakar    Calls (and returns the result of) `Reader::Skip()`, skipping (up to) the
341*103e46e4SHarish Mahendrakar    requested number of bytes.
342*103e46e4SHarish Mahendrakar 
343*103e46e4SHarish Mahendrakar    Unlike `Reader::Skip()`, this method may be called with `*bytes_remaining ==
344*103e46e4SHarish Mahendrakar    0`, which will result in `Status::kOkCompleted`. `Reader::Skip()` will be
345*103e46e4SHarish Mahendrakar    called multiple times if it returns `Status::kOkPartial` until it returns a
346*103e46e4SHarish Mahendrakar    different status (indicating the requested number of bytes has been fully
347*103e46e4SHarish Mahendrakar    skipped or some error occurred).
348*103e46e4SHarish Mahendrakar 
349*103e46e4SHarish Mahendrakar    \param reader The reader that should be used to skip data. Must not be null.
350*103e46e4SHarish Mahendrakar    \param[in,out] bytes_remaining The number of remaining bytes that need to be
351*103e46e4SHarish Mahendrakar    skipped. Must not be null. May be zero.
352*103e46e4SHarish Mahendrakar    \return The result of `Reader::Skip()`.
353*103e46e4SHarish Mahendrakar    */
354*103e46e4SHarish Mahendrakar   static Status Skip(Reader* reader, std::uint64_t* bytes_remaining);
355*103e46e4SHarish Mahendrakar };
356*103e46e4SHarish Mahendrakar 
357*103e46e4SHarish Mahendrakar /**
358*103e46e4SHarish Mahendrakar  @}
359*103e46e4SHarish Mahendrakar  */
360*103e46e4SHarish Mahendrakar 
361*103e46e4SHarish Mahendrakar }  // namespace webm
362*103e46e4SHarish Mahendrakar 
363*103e46e4SHarish Mahendrakar #endif  // INCLUDE_WEBM_CALLBACK_H_
364