You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
5.4 KiB
209 lines
5.4 KiB
// 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_
|