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