xref: /aosp_15_r20/external/libwebm/webm_parser/include/webm/element.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_ELEMENT_H_
9*103e46e4SHarish Mahendrakar #define INCLUDE_WEBM_ELEMENT_H_
10*103e46e4SHarish Mahendrakar 
11*103e46e4SHarish Mahendrakar #include <cstdint>
12*103e46e4SHarish Mahendrakar #include <limits>
13*103e46e4SHarish Mahendrakar #include <utility>
14*103e46e4SHarish Mahendrakar 
15*103e46e4SHarish Mahendrakar #include "./id.h"
16*103e46e4SHarish Mahendrakar 
17*103e46e4SHarish Mahendrakar /**
18*103e46e4SHarish Mahendrakar  \file
19*103e46e4SHarish Mahendrakar  A wrapper around an object that represents a WebM element, including its parsed
20*103e46e4SHarish Mahendrakar  metadata.
21*103e46e4SHarish Mahendrakar  */
22*103e46e4SHarish Mahendrakar 
23*103e46e4SHarish Mahendrakar namespace webm {
24*103e46e4SHarish Mahendrakar 
25*103e46e4SHarish Mahendrakar /**
26*103e46e4SHarish Mahendrakar  \addtogroup PUBLIC_API
27*103e46e4SHarish Mahendrakar  @{
28*103e46e4SHarish Mahendrakar  */
29*103e46e4SHarish Mahendrakar 
30*103e46e4SHarish Mahendrakar /**
31*103e46e4SHarish Mahendrakar  A wrapper around an object that represents a WebM element.
32*103e46e4SHarish Mahendrakar 
33*103e46e4SHarish Mahendrakar  Since some elements may be absent, this wrapper is used to indicate the
34*103e46e4SHarish Mahendrakar  presence (or lack thereof) of an element in a WebM document. If the element is
35*103e46e4SHarish Mahendrakar  encoded in the file and it has been parsed, `is_present()` will return true.
36*103e46e4SHarish Mahendrakar  Otherwise it will return false since the element was ommitted or skipped when
37*103e46e4SHarish Mahendrakar  parsing.
38*103e46e4SHarish Mahendrakar  */
39*103e46e4SHarish Mahendrakar template <typename T>
40*103e46e4SHarish Mahendrakar class Element {
41*103e46e4SHarish Mahendrakar  public:
42*103e46e4SHarish Mahendrakar   /**
43*103e46e4SHarish Mahendrakar    Value-initializes the element's value and makes `is_present()` false.
44*103e46e4SHarish Mahendrakar    */
45*103e46e4SHarish Mahendrakar   constexpr Element() = default;
46*103e46e4SHarish Mahendrakar 
47*103e46e4SHarish Mahendrakar   /**
48*103e46e4SHarish Mahendrakar    Creates an element with the given value and makes `is_present()` false.
49*103e46e4SHarish Mahendrakar 
50*103e46e4SHarish Mahendrakar    \param value The value of the element.
51*103e46e4SHarish Mahendrakar    */
Element(const T & value)52*103e46e4SHarish Mahendrakar   explicit constexpr Element(const T& value) : value_(value) {}
53*103e46e4SHarish Mahendrakar 
54*103e46e4SHarish Mahendrakar   /**
55*103e46e4SHarish Mahendrakar    Creates an element with the given value and makes `is_present()` false.
56*103e46e4SHarish Mahendrakar 
57*103e46e4SHarish Mahendrakar    \param value The value of the element.
58*103e46e4SHarish Mahendrakar    */
Element(T && value)59*103e46e4SHarish Mahendrakar   explicit constexpr Element(T&& value) : value_(std::move(value)) {}
60*103e46e4SHarish Mahendrakar 
61*103e46e4SHarish Mahendrakar   /**
62*103e46e4SHarish Mahendrakar    Creates an element with the given value and presence state.
63*103e46e4SHarish Mahendrakar 
64*103e46e4SHarish Mahendrakar    \param value The value of the element.
65*103e46e4SHarish Mahendrakar    \param is_present True if the element is present, false if it is absent.
66*103e46e4SHarish Mahendrakar    */
Element(const T & value,bool is_present)67*103e46e4SHarish Mahendrakar   constexpr Element(const T& value, bool is_present)
68*103e46e4SHarish Mahendrakar       : value_(value), is_present_(is_present) {}
69*103e46e4SHarish Mahendrakar 
70*103e46e4SHarish Mahendrakar   /**
71*103e46e4SHarish Mahendrakar    Creates an element with the given value and presence state.
72*103e46e4SHarish Mahendrakar 
73*103e46e4SHarish Mahendrakar    \param value The value of the element.
74*103e46e4SHarish Mahendrakar    \param is_present True if the element is present, false if it is absent.
75*103e46e4SHarish Mahendrakar    */
Element(T && value,bool is_present)76*103e46e4SHarish Mahendrakar   constexpr Element(T&& value, bool is_present)
77*103e46e4SHarish Mahendrakar       : value_(std::move(value)), is_present_(is_present) {}
78*103e46e4SHarish Mahendrakar 
79*103e46e4SHarish Mahendrakar   constexpr Element(const Element<T>& other) = default;
80*103e46e4SHarish Mahendrakar   constexpr Element(Element<T>&& other) = default;
81*103e46e4SHarish Mahendrakar 
82*103e46e4SHarish Mahendrakar   ~Element() = default;
83*103e46e4SHarish Mahendrakar 
84*103e46e4SHarish Mahendrakar   Element<T>& operator=(const Element<T>& other) = default;
85*103e46e4SHarish Mahendrakar   Element<T>& operator=(Element<T>&& other) = default;
86*103e46e4SHarish Mahendrakar 
87*103e46e4SHarish Mahendrakar   /**
88*103e46e4SHarish Mahendrakar    Sets the element's value and state.
89*103e46e4SHarish Mahendrakar 
90*103e46e4SHarish Mahendrakar    \param value The new value for the element.
91*103e46e4SHarish Mahendrakar    \param is_present The new presence state for the element.
92*103e46e4SHarish Mahendrakar    */
Set(const T & value,bool is_present)93*103e46e4SHarish Mahendrakar   void Set(const T& value, bool is_present) {
94*103e46e4SHarish Mahendrakar     value_ = value;
95*103e46e4SHarish Mahendrakar     is_present_ = is_present;
96*103e46e4SHarish Mahendrakar   }
97*103e46e4SHarish Mahendrakar 
98*103e46e4SHarish Mahendrakar   /**
99*103e46e4SHarish Mahendrakar    Sets the element's value and state.
100*103e46e4SHarish Mahendrakar 
101*103e46e4SHarish Mahendrakar    \param value The new value for the element.
102*103e46e4SHarish Mahendrakar    \param is_present The new presence state for the element.
103*103e46e4SHarish Mahendrakar    */
Set(T && value,bool is_present)104*103e46e4SHarish Mahendrakar   void Set(T&& value, bool is_present) {
105*103e46e4SHarish Mahendrakar     value_ = std::move(value);
106*103e46e4SHarish Mahendrakar     is_present_ = is_present;
107*103e46e4SHarish Mahendrakar   }
108*103e46e4SHarish Mahendrakar 
109*103e46e4SHarish Mahendrakar   /**
110*103e46e4SHarish Mahendrakar    Gets the element's value.
111*103e46e4SHarish Mahendrakar    */
value()112*103e46e4SHarish Mahendrakar   constexpr const T& value() const { return value_; }
113*103e46e4SHarish Mahendrakar 
114*103e46e4SHarish Mahendrakar   /**
115*103e46e4SHarish Mahendrakar    Gets a mutuable pointer to the element's value (will never be null).
116*103e46e4SHarish Mahendrakar    */
mutable_value()117*103e46e4SHarish Mahendrakar   T* mutable_value() { return &value_; }
118*103e46e4SHarish Mahendrakar 
119*103e46e4SHarish Mahendrakar   /**
120*103e46e4SHarish Mahendrakar    Returns true if the element is present, false otherwise.
121*103e46e4SHarish Mahendrakar    */
is_present()122*103e46e4SHarish Mahendrakar   constexpr bool is_present() const { return is_present_; }
123*103e46e4SHarish Mahendrakar 
124*103e46e4SHarish Mahendrakar   bool operator==(const Element<T>& other) const {
125*103e46e4SHarish Mahendrakar     return is_present_ == other.is_present_ && value_ == other.value_;
126*103e46e4SHarish Mahendrakar   }
127*103e46e4SHarish Mahendrakar 
128*103e46e4SHarish Mahendrakar  private:
129*103e46e4SHarish Mahendrakar   T value_{};
130*103e46e4SHarish Mahendrakar   bool is_present_ = false;
131*103e46e4SHarish Mahendrakar };
132*103e46e4SHarish Mahendrakar 
133*103e46e4SHarish Mahendrakar /**
134*103e46e4SHarish Mahendrakar  Metadata for WebM elements that are encountered when parsing.
135*103e46e4SHarish Mahendrakar  */
136*103e46e4SHarish Mahendrakar struct ElementMetadata {
137*103e46e4SHarish Mahendrakar   /**
138*103e46e4SHarish Mahendrakar    The EBML ID of the element.
139*103e46e4SHarish Mahendrakar    */
140*103e46e4SHarish Mahendrakar   Id id;
141*103e46e4SHarish Mahendrakar 
142*103e46e4SHarish Mahendrakar   /**
143*103e46e4SHarish Mahendrakar    The number of bytes that were used to encode the EBML ID and element size.
144*103e46e4SHarish Mahendrakar 
145*103e46e4SHarish Mahendrakar    If the size of the header is unknown (which is only the case if a seek was
146*103e46e4SHarish Mahendrakar    performed to the middle of an element, so its header was not parsed), this
147*103e46e4SHarish Mahendrakar    will be the value `kUnknownHeaderSize`.
148*103e46e4SHarish Mahendrakar    */
149*103e46e4SHarish Mahendrakar   std::uint32_t header_size;
150*103e46e4SHarish Mahendrakar 
151*103e46e4SHarish Mahendrakar   /**
152*103e46e4SHarish Mahendrakar    The size of the element.
153*103e46e4SHarish Mahendrakar 
154*103e46e4SHarish Mahendrakar    This is number of bytes in the element's body, which excludes the header
155*103e46e4SHarish Mahendrakar    bytes.
156*103e46e4SHarish Mahendrakar 
157*103e46e4SHarish Mahendrakar    If the size of the element's body is unknown, this will be the value
158*103e46e4SHarish Mahendrakar    `kUnknownElementSize`.
159*103e46e4SHarish Mahendrakar    */
160*103e46e4SHarish Mahendrakar   std::uint64_t size;
161*103e46e4SHarish Mahendrakar 
162*103e46e4SHarish Mahendrakar   /**
163*103e46e4SHarish Mahendrakar    The absolute byte position of the element, starting at the first byte of the
164*103e46e4SHarish Mahendrakar    element's header.
165*103e46e4SHarish Mahendrakar 
166*103e46e4SHarish Mahendrakar    If the position of the element is unknown (which is only the case if a seek
167*103e46e4SHarish Mahendrakar    was performed to the middle of an element), this will be the value
168*103e46e4SHarish Mahendrakar    `kUnknownElementPosition`.
169*103e46e4SHarish Mahendrakar    */
170*103e46e4SHarish Mahendrakar   std::uint64_t position;
171*103e46e4SHarish Mahendrakar 
172*103e46e4SHarish Mahendrakar   /**
173*103e46e4SHarish Mahendrakar    Returns true if every member within the two objects are equal.
174*103e46e4SHarish Mahendrakar    */
175*103e46e4SHarish Mahendrakar   bool operator==(const ElementMetadata& other) const {
176*103e46e4SHarish Mahendrakar     return id == other.id && header_size == other.header_size &&
177*103e46e4SHarish Mahendrakar            size == other.size && position == other.position;
178*103e46e4SHarish Mahendrakar   }
179*103e46e4SHarish Mahendrakar };
180*103e46e4SHarish Mahendrakar 
181*103e46e4SHarish Mahendrakar /**
182*103e46e4SHarish Mahendrakar  A special value for `ElementMetadata::header_size` indicating the header size
183*103e46e4SHarish Mahendrakar  is not known.
184*103e46e4SHarish Mahendrakar  */
185*103e46e4SHarish Mahendrakar constexpr std::uint64_t kUnknownHeaderSize =
186*103e46e4SHarish Mahendrakar     std::numeric_limits<std::uint32_t>::max();
187*103e46e4SHarish Mahendrakar 
188*103e46e4SHarish Mahendrakar /**
189*103e46e4SHarish Mahendrakar  A special value for `ElementMetadata::size` indicating the element's size is
190*103e46e4SHarish Mahendrakar  not known.
191*103e46e4SHarish Mahendrakar  */
192*103e46e4SHarish Mahendrakar constexpr std::uint64_t kUnknownElementSize =
193*103e46e4SHarish Mahendrakar     std::numeric_limits<std::uint64_t>::max();
194*103e46e4SHarish Mahendrakar 
195*103e46e4SHarish Mahendrakar /**
196*103e46e4SHarish Mahendrakar  A special value for `ElementMetadata::position` indicating the element's
197*103e46e4SHarish Mahendrakar  position is not known.
198*103e46e4SHarish Mahendrakar  */
199*103e46e4SHarish Mahendrakar constexpr std::uint64_t kUnknownElementPosition =
200*103e46e4SHarish Mahendrakar     std::numeric_limits<std::uint64_t>::max();
201*103e46e4SHarish Mahendrakar 
202*103e46e4SHarish Mahendrakar /**
203*103e46e4SHarish Mahendrakar  @}
204*103e46e4SHarish Mahendrakar  */
205*103e46e4SHarish Mahendrakar 
206*103e46e4SHarish Mahendrakar }  // namespace webm
207*103e46e4SHarish Mahendrakar 
208*103e46e4SHarish Mahendrakar #endif  // INCLUDE_WEBM_ELEMENT_H_
209