| // Copyright (c) 2016 The WebM project authors. All Rights Reserved. |
| // |
| // Use of this source code is governed by a BSD-style license |
| // that can be found in the LICENSE file in the root of the source |
| // tree. An additional intellectual property rights grant can be found |
| // in the file PATENTS. All contributing project authors may |
| // be found in the AUTHORS file in the root of the source tree. |
| #ifndef INCLUDE_WEBM_ELEMENT_H_ |
| #define INCLUDE_WEBM_ELEMENT_H_ |
| |
| #include <cstdint> |
| #include <limits> |
| #include <utility> |
| |
| #include "./id.h" |
| |
| /** |
| \file |
| A wrapper around an object that represents a WebM element, including its parsed |
| metadata. |
| */ |
| |
| namespace webm { |
| |
| /** |
| \addtogroup PUBLIC_API |
| @{ |
| */ |
| |
| /** |
| A wrapper around an object that represents a WebM element. |
| |
| Since some elements may be absent, this wrapper is used to indicate the |
| presence (or lack thereof) of an element in a WebM document. If the element is |
| encoded in the file and it has been parsed, `is_present()` will return true. |
| Otherwise it will return false since the element was ommitted or skipped when |
| parsing. |
| */ |
| template <typename T> |
| class Element { |
| public: |
| /** |
| Value-initializes the element's value and makes `is_present()` false. |
| */ |
| constexpr Element() = default; |
| |
| /** |
| Creates an element with the given value and makes `is_present()` false. |
| |
| \param value The value of the element. |
| */ |
| explicit constexpr Element(const T& value) : value_(value) {} |
| |
| /** |
| Creates an element with the given value and makes `is_present()` false. |
| |
| \param value The value of the element. |
| */ |
| explicit constexpr Element(T&& value) : value_(std::move(value)) {} |
| |
| /** |
| Creates an element with the given value and presence state. |
| |
| \param value The value of the element. |
| \param is_present True if the element is present, false if it is absent. |
| */ |
| constexpr Element(const T& value, bool is_present) |
| : value_(value), is_present_(is_present) {} |
| |
| /** |
| Creates an element with the given value and presence state. |
| |
| \param value The value of the element. |
| \param is_present True if the element is present, false if it is absent. |
| */ |
| constexpr Element(T&& value, bool is_present) |
| : value_(std::move(value)), is_present_(is_present) {} |
| |
| constexpr Element(const Element<T>& other) = default; |
| constexpr Element(Element<T>&& other) = default; |
| |
| ~Element() = default; |
| |
| Element<T>& operator=(const Element<T>& other) = default; |
| Element<T>& operator=(Element<T>&& other) = default; |
| |
| /** |
| Sets the element's value and state. |
| |
| \param value The new value for the element. |
| \param is_present The new presence state for the element. |
| */ |
| void Set(const T& value, bool is_present) { |
| value_ = value; |
| is_present_ = is_present; |
| } |
| |
| /** |
| Sets the element's value and state. |
| |
| \param value The new value for the element. |
| \param is_present The new presence state for the element. |
| */ |
| void Set(T&& value, bool is_present) { |
| value_ = std::move(value); |
| is_present_ = is_present; |
| } |
| |
| /** |
| Gets the element's value. |
| */ |
| constexpr const T& value() const { return value_; } |
| |
| /** |
| Gets a mutuable pointer to the element's value (will never be null). |
| */ |
| T* mutable_value() { return &value_; } |
| |
| /** |
| Returns true if the element is present, false otherwise. |
| */ |
| constexpr bool is_present() const { return is_present_; } |
| |
| bool operator==(const Element<T>& other) const { |
| return is_present_ == other.is_present_ && value_ == other.value_; |
| } |
| |
| private: |
| T value_{}; |
| bool is_present_ = false; |
| }; |
| |
| /** |
| Metadata for WebM elements that are encountered when parsing. |
| */ |
| struct ElementMetadata { |
| /** |
| The EBML ID of the element. |
| */ |
| Id id; |
| |
| /** |
| The number of bytes that were used to encode the EBML ID and element size. |
| |
| If the size of the header is unknown (which is only the case if a seek was |
| performed to the middle of an element, so its header was not parsed), this |
| will be the value `kUnknownHeaderSize`. |
| */ |
| std::uint32_t header_size; |
| |
| /** |
| The size of the element. |
| |
| This is number of bytes in the element's body, which excludes the header |
| bytes. |
| |
| If the size of the element's body is unknown, this will be the value |
| `kUnknownElementSize`. |
| */ |
| std::uint64_t size; |
| |
| /** |
| The absolute byte position of the element, starting at the first byte of the |
| element's header. |
| |
| If the position of the element is unknown (which is only the case if a seek |
| was performed to the middle of an element), this will be the value |
| `kUnknownElementPosition`. |
| */ |
| std::uint64_t position; |
| |
| /** |
| Returns true if every member within the two objects are equal. |
| */ |
| bool operator==(const ElementMetadata& other) const { |
| return id == other.id && header_size == other.header_size && |
| size == other.size && position == other.position; |
| } |
| }; |
| |
| /** |
| A special value for `ElementMetadata::header_size` indicating the header size |
| is not known. |
| */ |
| constexpr std::uint64_t kUnknownHeaderSize = |
| std::numeric_limits<std::uint32_t>::max(); |
| |
| /** |
| A special value for `ElementMetadata::size` indicating the element's size is |
| not known. |
| */ |
| constexpr std::uint64_t kUnknownElementSize = |
| std::numeric_limits<std::uint64_t>::max(); |
| |
| /** |
| A special value for `ElementMetadata::position` indicating the element's |
| position is not known. |
| */ |
| constexpr std::uint64_t kUnknownElementPosition = |
| std::numeric_limits<std::uint64_t>::max(); |
| |
| /** |
| @} |
| */ |
| |
| } // namespace webm |
| |
| #endif // INCLUDE_WEBM_ELEMENT_H_ |