summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc8794.txt
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
commit4bfd864f10b68b71482b35c818559068ef8d5797 (patch)
treee3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc8794.txt
parentea76e11061bda059ae9f9ad130a9895cc85607db (diff)
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc8794.txt')
-rw-r--r--doc/rfc/rfc8794.txt2742
1 files changed, 2742 insertions, 0 deletions
diff --git a/doc/rfc/rfc8794.txt b/doc/rfc/rfc8794.txt
new file mode 100644
index 0000000..8dc7c14
--- /dev/null
+++ b/doc/rfc/rfc8794.txt
@@ -0,0 +1,2742 @@
+
+
+
+
+Internet Engineering Task Force (IETF) S. Lhomme
+Request for Comments: 8794
+Category: Standards Track D. Rice
+ISSN: 2070-1721
+ M. Bunkus
+ July 2020
+
+
+ Extensible Binary Meta Language
+
+Abstract
+
+ This document defines the Extensible Binary Meta Language (EBML)
+ format as a binary container format designed for audio/video storage.
+ EBML is designed as a binary equivalent to XML and uses a storage-
+ efficient approach to build nested Elements with identifiers,
+ lengths, and values. Similar to how an XML Schema defines the
+ structure and semantics of an XML Document, this document defines how
+ EBML Schemas are created to convey the semantics of an EBML Document.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc8794.
+
+Copyright Notice
+
+ Copyright (c) 2020 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+Table of Contents
+
+ 1. Introduction
+ 2. Notation and Conventions
+ 3. Structure
+ 4. Variable-Size Integer
+ 4.1. VINT_WIDTH
+ 4.2. VINT_MARKER
+ 4.3. VINT_DATA
+ 4.4. VINT Examples
+ 5. Element ID
+ 6. Element Data Size
+ 6.1. Data Size Format
+ 6.2. Unknown Data Size
+ 6.3. Data Size Values
+ 7. EBML Element Types
+ 7.1. Signed Integer Element
+ 7.2. Unsigned Integer Element
+ 7.3. Float Element
+ 7.4. String Element
+ 7.5. UTF-8 Element
+ 7.6. Date Element
+ 7.7. Master Element
+ 7.8. Binary Element
+ 8. EBML Document
+ 8.1. EBML Header
+ 8.2. EBML Body
+ 9. EBML Stream
+ 10. EBML Versioning
+ 10.1. EBML Header Version
+ 10.2. EBML Document Version
+ 11. Elements semantics
+ 11.1. EBML Schema
+ 11.1.1. EBML Schema Example
+ 11.1.2. "<EBMLSchema>" Element
+ 11.1.3. "<EBMLSchema>" Namespace
+ 11.1.4. "<EBMLSchema>" Attributes
+ 11.1.5. "<element>" Element
+ 11.1.6. "<element>" Attributes
+ 11.1.7. "<documentation>" Element
+ 11.1.8. "<documentation>" Attributes
+ 11.1.9. "<implementation_note>" Element
+ 11.1.10. "<implementation_note>" Attributes
+ 11.1.11. "<restriction>" Element
+ 11.1.12. "<enum>" Element
+ 11.1.13. "<enum>" Attributes
+ 11.1.14. "<extension>" Element
+ 11.1.15. "<extension>" Attributes
+ 11.1.16. XML Schema for EBML Schema
+ 11.1.17. Identically Recurring Elements
+ 11.1.18. Textual expression of floats
+ 11.1.19. Note on the use of default attributes to define
+ Mandatory EBML Elements
+ 11.2. EBML Header Elements
+ 11.2.1. EBML Element
+ 11.2.2. EBMLVersion Element
+ 11.2.3. EBMLReadVersion Element
+ 11.2.4. EBMLMaxIDLength Element
+ 11.2.5. EBMLMaxSizeLength Element
+ 11.2.6. DocType Element
+ 11.2.7. DocTypeVersion Element
+ 11.2.8. DocTypeReadVersion Element
+ 11.2.9. DocTypeExtension Element
+ 11.2.10. DocTypeExtensionName Element
+ 11.2.11. DocTypeExtensionVersion Element
+ 11.3. Global Elements
+ 11.3.1. CRC-32 Element
+ 11.3.2. Void Element
+ 12. Considerations for Reading EBML Data
+ 13. Terminating Elements
+ 14. Guidelines for Updating Elements
+ 14.1. Reducing Element Data in Size
+ 14.1.1. Adding a Void Element
+ 14.1.2. Extending the Element Data Size
+ 14.1.3. Terminating Element Data
+ 14.2. Considerations when Updating Elements with Cyclic
+ Redundancy Check (CRC)
+ 15. Backward and Forward Compatibility
+ 15.1. Backward Compatibility
+ 15.2. Forward Compatibility
+ 16. Security Considerations
+ 17. IANA Considerations
+ 17.1. EBML Element IDs Registry
+ 17.2. EBML DocTypes Registry
+ 18. Normative References
+ 19. Informative References
+ Authors' Addresses
+
+1. Introduction
+
+ EBML, short for Extensible Binary Meta Language, specifies a binary
+ format aligned with octets (bytes) and inspired by the principle of
+ XML (a framework for structuring data).
+
+ The goal of this document is to define a generic, binary, space-
+ efficient format that can be used to define more complex formats
+ using an EBML Schema. EBML is used by the multimedia container,
+ Matroska [Matroska]. The applicability of EBML for other use cases
+ is beyond the scope of this document.
+
+ The definition of the EBML format recognizes the idea behind HTML and
+ XML as a good one: separate structure and semantics allowing the same
+ structural layer to be used with multiple, possibly widely differing,
+ semantic layers. Except for the EBML Header and a few Global
+ Elements, this specification does not define particular EBML format
+ semantics; however, this specification is intended to define how
+ other EBML-based formats can be defined, such as the audio/video
+ container formats Matroska and WebM [WebM].
+
+ EBML uses a simple approach of building Elements upon three pieces of
+ data (tag, length, and value), as this approach is well known, easy
+ to parse, and allows selective data parsing. The EBML structure
+ additionally allows for hierarchical arrangement to support complex
+ structural formats in an efficient manner.
+
+ A typical EBML file has the following structure:
+
+ EBML Header (master)
+ + DocType (string)
+ + DocTypeVersion (unsigned integer)
+ EBML Body Root (master)
+ + ElementA (utf-8)
+ + Parent (master)
+ + ElementB (integer)
+ + Parent (master)
+ + ElementB (integer)
+
+2. Notation and Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+ This document defines specific terms in order to define the format
+ and application of "EBML". Specific terms are defined below:
+
+ "EBML": Extensible Binary Meta Language
+
+ "EBML Document Type": A name provided by an "EBML Schema" to
+ designate a particular implementation of "EBML" for a data format
+ (e.g., Matroska and WebM).
+
+ "EBML Schema": A standardized definition for the structure of an
+ "EBML Document Type".
+
+ "EBML Document": A datastream comprised of only two components, an
+ "EBML Header" and an "EBML Body".
+
+ "EBML Reader": A data parser that interprets the semantics of an
+ "EBML Document" and creates a way for programs to use "EBML".
+
+ "EBML Stream": A file that consists of one or more "EBML Documents"
+ that are concatenated together.
+
+ "EBML Header": A declaration that provides processing instructions
+ and identification of the "EBML Body". The "EBML Header" is
+ analogous to an XML Declaration [XML] (see Section 2.8 on "Prolog
+ and Document Type Declaration").
+
+ "EBML Body": All data of an "EBML Document" following the "EBML
+ Header".
+
+ "Variable-Size Integer": A compact variable-length binary value that
+ defines its own length.
+
+ "VINT": Also known as "Variable-Size Integer".
+
+ "EBML Element": A foundation block of data that contains three
+ parts: an "Element ID", an "Element Data Size", and "Element
+ Data".
+
+ "Element ID": A binary value, encoded as a "Variable-Size Integer",
+ used to uniquely identify a defined "EBML Element" within a
+ specific "EBML Schema".
+
+ "Element Data Size": An expression, encoded as a "Variable-Size
+ Integer", of the length in octets of "Element Data".
+
+ "VINTMAX": The maximum possible value that can be stored as "Element
+ Data Size".
+
+ "Unknown-Sized Element": An "Element" with an unknown "Element Data
+ Size".
+
+ "Element Data": The value(s) of the "EBML Element", which is
+ identified by its "Element ID" and "Element Data Size". The form
+ of the "Element Data" is defined by this document and the
+ corresponding "EBML Schema" of the Element's "EBML Document Type".
+
+ "Root Level": The starting level in the hierarchy of an "EBML
+ Document".
+
+ "Root Element": A mandatory, nonrepeating "EBML Element" that occurs
+ at the top level of the path hierarchy within an "EBML Body" and
+ contains all other "EBML Elements" of the "EBML Body", excepting
+ optional "Void Elements".
+
+ "Top-Level Element": An "EBML Element" defined to only occur as a
+ "Child Element" of the "Root Element".
+
+ "Master Element": The "Master Element" contains zero, one, or many
+ other "EBML Elements".
+
+ "Child Element": A "Child Element" is a relative term to describe
+ the "EBML Elements" immediately contained within a "Master
+ Element".
+
+ "Parent Element": A relative term to describe the "Master Element"
+ that contains a specified element. For any specified "EBML
+ Element" that is not at "Root Level", the "Parent Element" refers
+ to the "Master Element" in which that "EBML Element" is directly
+ contained.
+
+ "Descendant Element": A relative term to describe any "EBML
+ Elements" contained within a "Master Element", including any of
+ the "Child Elements" of its "Child Elements", and so on.
+
+ "Void Element": An "Element" used to overwrite data or reserve space
+ within a "Master Element" for later use.
+
+ "Element Name": The human-readable name of the "EBML Element".
+
+ "Element Path": The hierarchy of "Parent Element" where the "EBML
+ Element" is expected to be found in the "EBML Body".
+
+ "Empty Element": An "EBML Element" that has an "Element Data Size"
+ with all "VINT_DATA" bits set to zero, which indicates that the
+ "Element Data" of the "Element" is zero octets in length.
+
+3. Structure
+
+ EBML uses a system of Elements to compose an EBML Document. EBML
+ Elements incorporate three parts: an Element ID, an Element Data
+ Size, and Element Data. The Element Data, which is described by the
+ Element ID, includes either binary data, one or more other EBML
+ Elements, or both.
+
+4. Variable-Size Integer
+
+ The Element ID and Element Data Size are both encoded as a Variable-
+ Size Integer. The Variable-Size Integer is composed of a VINT_WIDTH,
+ VINT_MARKER, and VINT_DATA, in that order. Variable-Size Integers
+ MUST left-pad the VINT_DATA value with zero bits so that the whole
+ Variable-Size Integer is octet aligned. The Variable-Size Integer
+ will be referred to as VINT for shorthand.
+
+4.1. VINT_WIDTH
+
+ Each Variable-Size Integer starts with a VINT_WIDTH followed by a
+ VINT_MARKER. VINT_WIDTH is a sequence of zero or more bits of value
+ "0" and is terminated by the VINT_MARKER, which is a single bit of
+ value "1". The total length in bits of both VINT_WIDTH and
+ VINT_MARKER is the total length in octets in of the Variable-Size
+ Integer.
+
+ The single bit "1" starts a Variable-Size Integer with a length of
+ one octet. The sequence of bits "01" starts a Variable-Size Integer
+ with a length of two octets. "001" starts a Variable-Size Integer
+ with a length of three octets, and so on, with each additional "0"
+ bit adding one octet to the length of the Variable-Size Integer.
+
+4.2. VINT_MARKER
+
+ The VINT_MARKER serves as a separator between the VINT_WIDTH and
+ VINT_DATA. Each Variable-Size Integer MUST contain exactly one
+ VINT_MARKER. The VINT_MARKER is one bit in length and contain a bit
+ with a value of one. The first bit with a value of one within the
+ Variable-Size Integer is the VINT_MARKER.
+
+4.3. VINT_DATA
+
+ The VINT_DATA portion of the Variable-Size Integer includes all data
+ following (but not including) the VINT_MARKER until end of the
+ Variable-Size Integer whose length is derived from the VINT_WIDTH.
+ The bits required for the VINT_WIDTH and the VINT_MARKER use one out
+ of every eight bits of the total length of the Variable-Size Integer.
+ Thus, a Variable-Size Integer of 1-octet length supplies 7 bits for
+ VINT_DATA, a 2-octet length supplies 14 bits for VINT_DATA, and a
+ 3-octet length supplies 21 bits for VINT_DATA. If the number of bits
+ required for VINT_DATA is less than the bit size of VINT_DATA, then
+ VINT_DATA MUST be zero-padded to the left to a size that fits. The
+ VINT_DATA value MUST be expressed as a big-endian unsigned integer.
+
+4.4. VINT Examples
+
+ Table 1 shows examples of Variable-Size Integers with lengths from 1
+ to 5 octets. The "Usable Bits" column refers to the number of bits
+ that can be used in the VINT_DATA. The "Representation" column
+ depicts a binary expression of Variable-Size Integers where
+ VINT_WIDTH is depicted by "0", the VINT_MARKER as "1", and the
+ VINT_DATA as "x".
+
+ +==============+=============+===============================+
+ | Octet Length | Usable Bits | Representation |
+ +==============+=============+===============================+
+ | 1 | 7 | 1xxx xxxx |
+ +--------------+-------------+-------------------------------+
+ | 2 | 14 | 01xx xxxx xxxx xxxx |
+ +--------------+-------------+-------------------------------+
+ | 3 | 21 | 001x xxxx xxxx xxxx xxxx xxxx |
+ +--------------+-------------+-------------------------------+
+ | 4 | 28 | 0001 xxxx xxxx xxxx xxxx xxxx |
+ | | | xxxx xxxx |
+ +--------------+-------------+-------------------------------+
+ | 5 | 35 | 0000 1xxx xxxx xxxx xxxx xxxx |
+ | | | xxxx xxxx xxxx xxxx |
+ +--------------+-------------+-------------------------------+
+
+ Table 1: VINT examples depicting usable bits
+
+ A Variable-Size Integer may be rendered at octet lengths larger than
+ needed to store the data in order to facilitate overwriting it at a
+ later date -- e.g., when its final size isn't known in advance. In
+ Table 2, an integer "2" (with a corresponding binary value of 0b10)
+ is shown encoded as different Variable-Size Integers with lengths
+ from one octet to four octets. All four encoded examples have
+ identical semantic meaning, though the VINT_WIDTH and the padding of
+ the VINT_DATA vary.
+
+ +=========+==============+=====================+====================+
+ | Integer | Octet | As Represented in | As Represented in |
+ | | Length | VINT (binary) | VINT (hexadecimal) |
+ +=========+==============+=====================+====================+
+ | 2 | 1 | 1000 0010 | 0x82 |
+ +---------+--------------+---------------------+--------------------+
+ | 2 | 2 | 0100 0000 0000 0010 | 0x4002 |
+ +---------+--------------+---------------------+--------------------+
+ | 2 | 3 | 0010 0000 0000 0000 | 0x200002 |
+ | | | 0000 0010 | |
+ +---------+--------------+---------------------+--------------------+
+ | 2 | 4 | 0001 0000 0000 0000 | 0x10000002 |
+ | | | 0000 0000 0000 0010 | |
+ +---------+--------------+---------------------+--------------------+
+
+ Table 2: VINT examples depicting the same integer value rendered
+ at different VINT lengths
+
+5. Element ID
+
+ An Element ID is a Variable-Size Integer. By default, Element IDs
+ are from one octet to four octets in length, although Element IDs of
+ greater lengths MAY be used if the EBMLMaxIDLength Element of the
+ EBML Header is set to a value greater than four (see Section 11.2.4).
+ The bits of the VINT_DATA component of the Element ID MUST NOT be all
+ "0" values or all "1" values. The VINT_DATA component of the Element
+ ID MUST be encoded at the shortest valid length. For example, an
+ Element ID with binary encoding of "1011 1111" is valid, whereas an
+ Element ID with binary encoding of "0100 0000 0011 1111" stores a
+ semantically equal VINT_DATA but is invalid, because a shorter VINT
+ encoding is possible. Additionally, an Element ID with binary
+ encoding of "1111 1111" is invalid, since the VINT_DATA section is
+ set to all one values, whereas an Element ID with binary encoding of
+ "0100 0000 0111 1111" stores a semantically equal VINT_DATA and is
+ the shortest-possible VINT encoding.
+
+ Table 3 details these specific examples further:
+
+ +============+=============+================+====================+
+ | VINT_WIDTH | VINT_MARKER | VINT_DATA | Element ID Status |
+ +============+=============+================+====================+
+ | | 1 | 0000000 | Invalid: VINT_DATA |
+ | | | | MUST NOT be set to |
+ | | | | all 0 |
+ +------------+-------------+----------------+--------------------+
+ | 0 | 1 | 00000000000000 | Invalid: VINT_DATA |
+ | | | | MUST NOT be set to |
+ | | | | all 0 |
+ +------------+-------------+----------------+--------------------+
+ | | 1 | 0000001 | Valid |
+ +------------+-------------+----------------+--------------------+
+ | 0 | 1 | 00000000000001 | Invalid: A shorter |
+ | | | | VINT_DATA encoding |
+ | | | | is available. |
+ +------------+-------------+----------------+--------------------+
+ | | 1 | 0111111 | Valid |
+ +------------+-------------+----------------+--------------------+
+ | 0 | 1 | 00000000111111 | Invalid: A shorter |
+ | | | | VINT_DATA encoding |
+ | | | | is available. |
+ +------------+-------------+----------------+--------------------+
+ | | 1 | 1111111 | Invalid: VINT_DATA |
+ | | | | MUST NOT be set to |
+ | | | | all 1 |
+ +------------+-------------+----------------+--------------------+
+ | 0 | 1 | 00000001111111 | Valid |
+ +------------+-------------+----------------+--------------------+
+
+ Table 3: Examples of valid and invalid Element IDs
+
+ The range and count of possible Element IDs are determined by their
+ octet length. Examples of this are provided in Table 4.
+
+ +=========================+================+=================+
+ | Element ID Octet Length | Range of Valid | Number of Valid |
+ | | Element IDs | Element IDs |
+ +=========================+================+=================+
+ | 1 | 0x81 - 0xFE | 126 |
+ +-------------------------+----------------+-----------------+
+ | 2 | 0x407F - | 16,256 |
+ | | 0x7FFE | |
+ +-------------------------+----------------+-----------------+
+ | 3 | 0x203FFF - | 2,080,768 |
+ | | 0x3FFFFE | |
+ +-------------------------+----------------+-----------------+
+ | 4 | 0x101FFFFF - | 268,338,304 |
+ | | 0x1FFFFFFE | |
+ +-------------------------+----------------+-----------------+
+
+ Table 4: Examples of count and range for Element IDs at
+ various octet lengths
+
+6. Element Data Size
+
+6.1. Data Size Format
+
+ The Element Data Size expresses the length in octets of Element Data.
+ The Element Data Size itself is encoded as a Variable-Size Integer.
+ By default, Element Data Sizes can be encoded in lengths from one
+ octet to eight octets, although Element Data Sizes of greater lengths
+ MAY be used if the octet length of the longest Element Data Size of
+ the EBML Document is declared in the EBMLMaxSizeLength Element of the
+ EBML Header (see Section 11.2.5). Unlike the VINT_DATA of the
+ Element ID, the VINT_DATA component of the Element Data Size is not
+ mandated to be encoded at the shortest valid length. For example, an
+ Element Data Size with binary encoding of 1011 1111 or a binary
+ encoding of 0100 0000 0011 1111 are both valid Element Data Sizes and
+ both store a semantically equal value (both 0b00000000111111 and
+ 0b0111111, the VINT_DATA sections of the examples, represent the
+ integer 63).
+
+ Although an Element ID with all VINT_DATA bits set to zero is
+ invalid, an Element Data Size with all VINT_DATA bits set to zero is
+ allowed for EBML Element Types that do not mandate a nonzero length
+ (see Section 7). An Element Data Size with all VINT_DATA bits set to
+ zero indicates that the Element Data is zero octets in length. Such
+ an EBML Element is referred to as an Empty Element. If an Empty
+ Element has a default value declared, then the EBML Reader MUST
+ interpret the value of the Empty Element as the default value. If an
+ Empty Element has no default value declared, then the EBML Reader
+ MUST use the value of the Empty Element for the corresponding EBML
+ Element Type of the Element ID, 0 for numbers and an empty string for
+ strings.
+
+6.2. Unknown Data Size
+
+ An Element Data Size with all VINT_DATA bits set to one is reserved
+ as an indicator that the size of the EBML Element is unknown. The
+ only reserved value for the VINT_DATA of Element Data Size is all
+ bits set to one. An EBML Element with an unknown Element Data Size
+ is referred to as an Unknown-Sized Element. Only a Master Element is
+ allowed to be of unknown size, and it can only be so if the
+ "unknownsizeallowed" attribute of its EBML Schema is set to true (see
+ Section 11.1.6.10).
+
+ The use of Unknown-Sized Elements allows an EBML Element to be
+ written and read before the size of the EBML Element is known.
+ Unknown-Sized Elements MUST only be used if the Element Data Size is
+ not known before the Element Data is written, such as in some cases
+ of datastreaming. The end of an Unknown-Sized Element is determined
+ by whichever comes first:
+
+ * Any EBML Element that is a valid Parent Element of the Unknown-
+ Sized Element according to the EBML Schema, Global Elements
+ excluded.
+
+ * Any valid EBML Element according to the EBML Schema, Global
+ Elements excluded, that is not a Descendant Element of the
+ Unknown-Sized Element but shares a common direct parent, such as a
+ Top-Level Element.
+
+ * Any EBML Element that is a valid Root Element according to the
+ EBML Schema, Global Elements excluded.
+
+ * The end of the Parent Element with a known size has been reached.
+
+ * The end of the EBML Document, either when reaching the end of the
+ file or because a new EBML Header started.
+
+ Consider an Unknown-Sized Element whose EBML path is
+ "\root\level1\level2\elt". When reading a new Element ID, assuming
+ the EBML Path of that new Element is valid, here are some possible
+ and impossible ways that this new Element is ending "elt":
+
+ +==================================+============================+
+ | EBML Path of new element | Status |
+ +==================================+============================+
+ | \root\level1\level2 | Ends the Unknown-Sized |
+ | | Element, as it is a new |
+ | | Parent Element |
+ +----------------------------------+----------------------------+
+ | \root\level1 | Ends the Unknown-Sized |
+ | | Element, as it is a new |
+ | | Parent Element |
+ +----------------------------------+----------------------------+
+ | \root | Ends the Unknown-Sized |
+ | | Element, as it is a new |
+ | | Root Element |
+ +----------------------------------+----------------------------+
+ | \root2 | Ends the Unknown-Sized |
+ | | Element, as it is a new |
+ | | Root Element |
+ +----------------------------------+----------------------------+
+ | \root\level1\level2\other | Ends the Unknown-Sized |
+ | | Element, as they share the |
+ | | same parent |
+ +----------------------------------+----------------------------+
+ | \root\level1\level2\elt | Ends the Unknown-Sized |
+ | | Element, as they share the |
+ | | same parent |
+ +----------------------------------+----------------------------+
+ | \root\level1\level2\elt\inside | Doesn't end the Unknown- |
+ | | Sized Element; it's a |
+ | | child of "elt" |
+ +----------------------------------+----------------------------+
+ | \root\level1\level2\elt\<global> | Global Element is valid; |
+ | | it's a child of "elt" |
+ +----------------------------------+----------------------------+
+ | \root\level1\level2\<global> | Global Element cannot be |
+ | | interpreted with this |
+ | | path; while parsing "elt", |
+ | | a Global Element can only |
+ | | be a child of "elt" |
+ +----------------------------------+----------------------------+
+
+ Table 5: Examples of determining the end of an Unknown-Sized
+ Element
+
+6.3. Data Size Values
+
+ For Element Data Sizes encoded at octet lengths from one to eight,
+ Table 6 depicts the range of possible values that can be encoded as
+ an Element Data Size. An Element Data Size with an octet length of 8
+ is able to express a size of 2^(56)-2 or 72,057,594,037,927,934
+ octets (or about 72 petabytes). The maximum possible value that can
+ be stored as Element Data Size is referred to as VINTMAX.
+
+ +==============+======================+
+ | Octet Length | Possible Value Range |
+ +==============+======================+
+ | 1 | 0 to 2^(7) - 2 |
+ +--------------+----------------------+
+ | 2 | 0 to 2^(14) - 2 |
+ +--------------+----------------------+
+ | 3 | 0 to 2^(21) - 2 |
+ +--------------+----------------------+
+ | 4 | 0 to 2^(28) - 2 |
+ +--------------+----------------------+
+ | 5 | 0 to 2^(35) - 2 |
+ +--------------+----------------------+
+ | 6 | 0 to 2^(42) - 2 |
+ +--------------+----------------------+
+ | 7 | 0 to 2^(49) - 2 |
+ +--------------+----------------------+
+ | 8 | 0 to 2^(56) - 2 |
+ +--------------+----------------------+
+
+ Table 6: Possible range of values
+ that can be stored in VINTs, by
+ octet length
+
+ If the length of Element Data equals 2^(n*7)-1, then the octet length
+ of the Element Data Size MUST be at least n+1. This rule prevents an
+ Element Data Size from being expressed as the unknown-size value.
+ Table 7 clarifies this rule by showing a valid and invalid expression
+ of an Element Data Size with a VINT_DATA of 127 (which is equal to
+ 2^(1*7)-1) and 16,383 (which is equal to 2^(2*7)-1).
+
+ +============+=============+=======================+==============+
+ | VINT_WIDTH | VINT_MARKER | VINT_DATA | Element Data |
+ | | | | Size Status |
+ +============+=============+=======================+==============+
+ | | 1 | 1111111 | Reserved |
+ | | | | (meaning |
+ | | | | Unknown) |
+ +------------+-------------+-----------------------+--------------+
+ | 0 | 1 | 00000001111111 | Valid |
+ | | | | (meaning 127 |
+ | | | | octets) |
+ +------------+-------------+-----------------------+--------------+
+ | 00 | 1 | 000000000000001111111 | Valid |
+ | | | | (meaning 127 |
+ | | | | octets) |
+ +------------+-------------+-----------------------+--------------+
+ | 0 | 1 | 11111111111111 | Reserved |
+ | | | | (meaning |
+ | | | | Unknown) |
+ +------------+-------------+-----------------------+--------------+
+ | 00 | 1 | 000000011111111111111 | Valid |
+ | | | | (16,383 |
+ | | | | octets) |
+ +------------+-------------+-----------------------+--------------+
+
+ Table 7: Demonstration of VINT_DATA reservation for VINTs of
+ unknown size
+
+7. EBML Element Types
+
+ EBML Elements are defined by an EBML Schema (see Section 11.1), which
+ MUST declare one of the following EBML Element Types for each EBML
+ Element. An EBML Element Type defines a concept of storing data
+ within an EBML Element that describes such characteristics as length,
+ endianness, and definition.
+
+ EBML Elements that are defined as a Signed Integer Element, Unsigned
+ Integer Element, Float Element, or Date Element use big-endian
+ storage.
+
+7.1. Signed Integer Element
+
+ A Signed Integer Element MUST declare a length from zero to eight
+ octets. If the EBML Element is not defined to have a default value,
+ then a Signed Integer Element with a zero-octet length represents an
+ integer value of zero.
+
+ A Signed Integer Element stores an integer (meaning that it can be
+ written without a fractional component) that could be negative,
+ positive, or zero. Signed Integers are stored with two's complement
+ notation with the leftmost bit being the sign bit. Because EBML
+ limits Signed Integers to 8 octets in length, a Signed Integer
+ Element stores a number from -9,223,372,036,854,775,808 to
+ +9,223,372,036,854,775,807.
+
+7.2. Unsigned Integer Element
+
+ An Unsigned Integer Element MUST declare a length from zero to eight
+ octets. If the EBML Element is not defined to have a default value,
+ then an Unsigned Integer Element with a zero-octet length represents
+ an integer value of zero.
+
+ An Unsigned Integer Element stores an integer (meaning that it can be
+ written without a fractional component) that could be positive or
+ zero. Because EBML limits Unsigned Integers to 8 octets in length,
+ an Unsigned Integer Element stores a number from 0 to
+ 18,446,744,073,709,551,615.
+
+7.3. Float Element
+
+ A Float Element MUST declare a length of either zero octets (0 bit),
+ four octets (32 bit), or eight octets (64 bit). If the EBML Element
+ is not defined to have a default value, then a Float Element with a
+ zero-octet length represents a numerical value of zero.
+
+ A Float Element stores a floating-point number in the 32-bit and
+ 64-bit binary interchange format, as defined in [IEEE.754].
+
+7.4. String Element
+
+ A String Element MUST declare a length in octets from zero to
+ VINTMAX. If the EBML Element is not defined to have a default value,
+ then a String Element with a zero-octet length represents an empty
+ string.
+
+ A String Element MUST either be empty (zero-length) or contain
+ printable ASCII characters [RFC0020] in the range of 0x20 to 0x7E,
+ with an exception made for termination (see Section 13).
+
+7.5. UTF-8 Element
+
+ A UTF-8 Element MUST declare a length in octets from zero to VINTMAX.
+ If the EBML Element is not defined to have a default value, then a
+ UTF-8 Element with a zero-octet length represents an empty string.
+
+ A UTF-8 Element contains only a valid Unicode string as defined in
+ [RFC3629], with an exception made for termination (see Section 13).
+
+7.6. Date Element
+
+ A Date Element MUST declare a length of either zero octets or eight
+ octets. If the EBML Element is not defined to have a default value,
+ then a Date Element with a zero-octet length represents a timestamp
+ of 2001-01-01T00:00:00.000000000 UTC [RFC3339].
+
+ The Date Element stores an integer in the same format as the Signed
+ Integer Element that expresses a point in time referenced in
+ nanoseconds from the precise beginning of the third millennium of the
+ Gregorian Calendar in Coordinated Universal Time (also known as
+ 2001-01-01T00:00:00.000000000 UTC). This provides a possible
+ expression of time from 1708-09-11T00:12:44.854775808 UTC to
+ 2293-04-11T11:47:16.854775807 UTC.
+
+7.7. Master Element
+
+ A Master Element MUST declare a length in octets from zero to VINTMAX
+ or be of unknown length. See Section 6 for rules that apply to
+ elements of unknown length.
+
+ The Master Element contains zero or more other elements. EBML
+ Elements contained within a Master Element MUST have the
+ EBMLParentPath of their Element Path equal to the EBMLFullPath of the
+ Master Element Element Path (see Section 11.1.6.2). Element Data
+ stored within Master Elements SHOULD only consist of EBML Elements
+ and SHOULD NOT contain any data that is not part of an EBML Element.
+ The EBML Schema identifies what Element IDs are valid within the
+ Master Elements for that version of the EBML Document Type. Any data
+ contained within a Master Element that is not part of a Child Element
+ MUST be ignored.
+
+7.8. Binary Element
+
+ A Binary Element MUST declare a length in octets from zero to
+ VINTMAX.
+
+ The contents of a Binary Element should not be interpreted by the
+ EBML Reader.
+
+8. EBML Document
+
+ An EBML Document is composed of only two components, an EBML Header
+ and an EBML Body. An EBML Document MUST start with an EBML Header
+ that declares significant characteristics of the entire EBML Body.
+ An EBML Document consists of EBML Elements and MUST NOT contain any
+ data that is not part of an EBML Element.
+
+8.1. EBML Header
+
+ The EBML Header is a declaration that provides processing
+ instructions and identification of the EBML Body. The EBML Header of
+ an EBML Document is analogous to the XML Declaration of an XML
+ Document.
+
+ The EBML Header documents the EBML Schema (also known as the EBML
+ DocType) that is used to semantically interpret the structure and
+ meaning of the EBML Document. Additionally, the EBML Header
+ documents the versions of both EBML and the EBML Schema that were
+ used to write the EBML Document and the versions required to read the
+ EBML Document.
+
+ The EBML Header MUST contain a single Master Element with an Element
+ Name of "EBML" and Element ID of "0x1A45DFA3" (see Section 11.2.1);
+ the Master Element may have any number of additional EBML Elements
+ within it. The EBML Header of an EBML Document that uses an
+ EBMLVersion of 1 MUST only contain EBML Elements that are defined as
+ part of this document.
+
+ Elements within an EBML Header can be at most 4 octets long, except
+ for the EBML Element with Element Name "EBML" and Element ID
+ "0x1A45DFA3" (see Section 11.2.1); this Element can be up to 8 octets
+ long.
+
+8.2. EBML Body
+
+ All data of an EBML Document following the EBML Header is the EBML
+ Body. The end of the EBML Body, as well as the end of the EBML
+ Document that contains the EBML Body, is reached at whichever comes
+ first: the beginning of a new EBML Header at the Root Level or the
+ end of the file. This document defines precisely which EBML Elements
+ are to be used within the EBML Header but does not name or define
+ which EBML Elements are to be used within the EBML Body. The
+ definition of which EBML Elements are to be used within the EBML Body
+ is defined by an EBML Schema.
+
+ Within the EBML Body, the maximum octet length allowed for any
+ Element ID is set by the EBMLMaxIDLength Element of the EBML Header,
+ and the maximum octet length allowed for any Element Data Size is set
+ by the EBMLMaxSizeLength Element of the EBML Header.
+
+9. EBML Stream
+
+ An EBML Stream is a file that consists of one or more EBML Documents
+ that are concatenated together. An occurrence of an EBML Header at
+ the Root Level marks the beginning of an EBML Document.
+
+10. EBML Versioning
+
+ An EBML Document handles 2 different versions: the version of the
+ EBML Header and the version of the EBML Body. Both versions are
+ meant to be backward compatible.
+
+10.1. EBML Header Version
+
+ The version of the EBML Header is found in EBMLVersion. An EBML
+ parser can read an EBML Header if it can read either the EBMLVersion
+ version or a version equal or higher than the one found in
+ EBMLReadVersion.
+
+10.2. EBML Document Version
+
+ The version of the EBML Body is found in EBMLDocTypeVersion. A
+ parser for the particular DocType format can read the EBML Document
+ if it can read either the EBMLDocTypeVersion version of that format
+ or a version equal or higher than the one found in
+ EBMLDocTypeReadVersion.
+
+11. Elements semantics
+
+11.1. EBML Schema
+
+ An EBML Schema is a well-formed XML Document [XML] that defines the
+ properties, arrangement, and usage of EBML Elements that compose a
+ specific EBML Document Type. The relationship of an EBML Schema to
+ an EBML Document is analogous to the relationship of an XML Schema
+ [XML-SCHEMA] to an XML Document [XML]. An EBML Schema MUST be
+ clearly associated with one or more EBML Document Types. An EBML
+ Document Type is identified by a string stored within the EBML Header
+ in the DocType Element -- for example, Matroska or WebM (see
+ Section 11.2.6). The DocType value for an EBML Document Type MUST be
+ unique, persistent, and described in the IANA registry (see
+ Section 17.2).
+
+ An EBML Schema MUST declare exactly one EBML Element at Root Level
+ (referred to as the Root Element) that occurs exactly once within an
+ EBML Document. The Void Element MAY also occur at Root Level but is
+ not a Root Element (see Section 11.3.2).
+
+ The EBML Schema MUST document all Elements of the EBML Body. The
+ EBML Schema does not document Global Elements that are defined by
+ this document (namely, the Void Element and the CRC-32 Element).
+
+ The EBML Schema MUST NOT use the Element ID "0x1A45DFA3", which is
+ reserved for the EBML Header for the purpose of resynchronization.
+
+ An EBML Schema MAY constrain the use of EBML Header Elements (see
+ Section 11.2) by adding or constraining that Element's "range"
+ attribute. For example, an EBML Schema MAY constrain the
+ EBMLMaxSizeLength to a maximum value of "8" or MAY constrain the
+ EBMLVersion to only support a value of "1". If an EBML Schema adopts
+ the EBML Header Element as is, then it is not required to document
+ that Element within the EBML Schema. If an EBML Schema constrains
+ the range of an EBML Header Element, then that Element MUST be
+ documented within an "<element>" node of the EBML Schema. This
+ document provides an example of an EBML Schema; see Section 11.1.1.
+
+11.1.1. EBML Schema Example
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <EBMLSchema xmlns="urn:ietf:rfc:8794"
+ docType="files-in-ebml-demo" version="1">
+ <!-- constraints to the range of two EBML Header Elements -->
+ <element name="EBMLReadVersion" path="\EBML\EBMLReadVersion"
+ id="0x42F7" minOccurs="1" maxOccurs="1" range="1" default="1"
+ type="uinteger"/>
+ <element name="EBMLMaxSizeLength"
+ path="\EBML\EBMLMaxSizeLength" id="0x42F3" minOccurs="1"
+ maxOccurs="1" range="8" default="8" type="uinteger"/>
+ <!-- Root Element-->
+ <element name="Files" path="\Files" id="0x1946696C"
+ type="master">
+ <documentation lang="en"
+ purpose="definition">Container of data and
+ attributes representing one or many files.</documentation>
+ </element>
+ <element name="File" path="\Files\File" id="0x6146"
+ type="master" minOccurs="1">
+ <documentation lang="en" purpose="definition">
+ An attached file.
+ </documentation>
+ </element>
+ <element name="FileName" path="\Files\File\FileName"
+ id="0x614E" type="utf-8"
+ minOccurs="1">
+ <documentation lang="en" purpose="definition">
+ Filename of the attached file.
+ </documentation>
+ </element>
+ <element name="MimeType" path="\Files\File\MimeType"
+ id="0x464D" type="string"
+ minOccurs="1">
+ <documentation lang="en" purpose="definition">
+ MIME type of the file.
+ </documentation>
+ </element>
+ <element name="ModificationTimestamp"
+ path="\Files\File\ModificationTimestamp" id="0x4654"
+ type="date" minOccurs="1">
+ <documentation lang="en" purpose="definition">
+ Modification timestamp of the file.
+ </documentation>
+ </element>
+ <element name="Data" path="\Files\File\Data" id="0x4664"
+ type="binary" minOccurs="1">
+ <documentation lang="en" purpose="definition">
+ The data of the file.
+ </documentation>
+ </element>
+ </EBMLSchema>
+
+11.1.2. "<EBMLSchema>" Element
+
+ Within an EBML Schema, the XPath [XPath] of the "<EBMLSchema>"
+ element is "/EBMLSchema".
+
+ When used as an XML Document, the EBML Schema MUST use "<EBMLSchema>"
+ as the top-level element. The "<EBMLSchema>" element can contain
+ "<element>" subelements.
+
+11.1.3. "<EBMLSchema>" Namespace
+
+ The namespace URI for elements of the EBML Schema is a URN as defined
+ by [RFC8141] that uses the namespace identifier 'ietf' defined by
+ [RFC2648] and extended by [RFC3688]. This URN is
+ "urn:ietf:rfc:8794".
+
+11.1.4. "<EBMLSchema>" Attributes
+
+ Within an EBML Schema, the "<EBMLSchema>" element uses the following
+ attributes to define an EBML Element:
+
+11.1.4.1. docType
+
+ Within an EBML Schema, the XPath of the "@docType" attribute is
+ "/EBMLSchema/@docType".
+
+ The docType lists the official name of the EBML Document Type that is
+ defined by the EBML Schema; for example, "<EBMLSchema
+ docType="matroska">".
+
+ The "docType" attribute is REQUIRED within the "<EBMLSchema>"
+ Element.
+
+11.1.4.2. version
+
+ Within an EBML Schema, the XPath of the "@version" attribute is
+ "/EBMLSchema/@version".
+
+ The version lists a nonnegative integer that specifies the version of
+ the docType documented by the EBML Schema. Unlike XML Schemas, an
+ EBML Schema documents all versions of a docType's definition rather
+ than using separate EBML Schemas for each version of a docType. EBML
+ Elements may be introduced and deprecated by using the "minver" and
+ "maxver" attributes of "<element>".
+
+ The "version" attribute is REQUIRED within the "<EBMLSchema>"
+ Element.
+
+11.1.4.3. ebml
+
+ Within an EBML Schema, the XPath of the "@ebml" attribute is
+ "/EBMLSchema/@ebml".
+
+ The "ebml" attribute is a positive integer that specifies the version
+ of the EBML Header (see Section 11.2.2) used by the EBML Schema. If
+ the attribute is omitted, the EBML Header version is 1.
+
+11.1.5. "<element>" Element
+
+ Within an EBML Schema, the XPath of the "<element>" element is
+ "/EBMLSchema/element".
+
+ Each "<element>" defines one EBML Element through the use of several
+ attributes that are defined in Section 11.1.6. EBML Schemas MAY
+ contain additional attributes to extend the semantics but MUST NOT
+ conflict with the definitions of the "<element>" attributes defined
+ within this document.
+
+ The "<element>" nodes contain a description of the meaning and use of
+ the EBML Element stored within one or more "<documentation>"
+ subelements, followed by optional "<implementation_note>"
+ subelements, followed by zero or one "<restriction>" subelement,
+ followed by optional "<extension>" subelements. All "<element>"
+ nodes MUST be subelements of the "<EBMLSchema>".
+
+11.1.6. "<element>" Attributes
+
+ Within an EBML Schema, the "<element>" uses the following attributes
+ to define an EBML Element:
+
+11.1.6.1. name
+
+ Within an EBML Schema, the XPath of the "@name" attribute is
+ "/EBMLSchema/element/@name".
+
+ The name provides the human-readable name of the EBML Element. The
+ value of the name MUST be in the form of characters "A" to "Z", "a"
+ to "z", "0" to "9", "-", and ".". The first character of the name
+ MUST be in the form of an "A" to "Z", "a" to "z", or "0" to "9"
+ character.
+
+ The "name" attribute is REQUIRED.
+
+11.1.6.2. path
+
+ Within an EBML Schema, the XPath of the "@path" attribute is
+ "/EBMLSchema/element/@path".
+
+ The path defines the allowed storage locations of the EBML Element
+ within an EBML Document. This path MUST be defined with the full
+ hierarchy of EBML Elements separated with a "\". The top EBML
+ Element in the path hierarchy is the first in the value. The syntax
+ of the "path" attribute is defined using this Augmented Backus-Naur
+ Form (ABNF) [RFC5234] with the case-sensitive update [RFC7405]
+ notation:
+
+ The "path" attribute is REQUIRED.
+
+ EBMLFullPath = EBMLParentPath EBMLElement
+
+ EBMLParentPath = PathDelimiter [EBMLParents]
+
+ EBMLParents = 0*IntermediatePathAtom EBMLLastParent
+ IntermediatePathAtom = EBMLPathAtom / GlobalPlaceholder
+ EBMLLastParent = EBMLPathAtom / GlobalPlaceholder
+
+ EBMLPathAtom = [IsRecursive] EBMLAtomName PathDelimiter
+ EBMLElement = [IsRecursive] EBMLAtomName
+
+ PathDelimiter = "\"
+ IsRecursive = "+"
+ EBMLAtomName = ALPHA / DIGIT 0*EBMLNameChar
+ EBMLNameChar = ALPHA / DIGIT / "-" / "."
+
+ GlobalPlaceholder = "(" GlobalParentOccurrence "\)"
+ GlobalParentOccurrence = [PathMinOccurrence] "-" [PathMaxOccurrence]
+ PathMinOccurrence = 1*DIGIT ; no upper limit
+ PathMaxOccurrence = 1*DIGIT ; no upper limit
+
+ The "*", "(", and ")" symbols are interpreted as defined in
+ [RFC5234].
+
+ The EBMLAtomName of the EBMLElement part MUST be equal to the "@name"
+ attribute of the EBML Schema. If the EBMLElement part contains an
+ IsRecursive part, the EBML Element can occur within itself
+ recursively (see Section 11.1.6.11).
+
+ The starting PathDelimiter of EBMLParentPath corresponds to the root
+ of the EBML Document.
+
+ The "@path" value MUST be unique within the EBML Schema. The "@id"
+ value corresponding to this "@path" MUST NOT be defined for use
+ within another EBML Element with the same EBMLParentPath as this
+ "@path".
+
+ A path with a GlobalPlaceholder as the EBMLLastParent defines a
+ Global Element; see Section 11.3. If the element has no
+ EBMLLastParent part, or the EBMLLastParent part is not a
+ GlobalPlaceholder, then the Element is not a Global Element.
+
+ The GlobalParentOccurrence part is interpreted as the number of valid
+ EBMLPathAtom parts that can replace the GlobalPlaceholder in the
+ path. PathMinOccurrence represents the minimum number of
+ EBMLPathAtoms required to replace the GlobalPlaceholder.
+ PathMaxOccurrence represents the maximum number of EBMLPathAtoms
+ possible to replace the GlobalPlaceholder.
+
+ If PathMinOccurrence is not present, then that GlobalParentOccurrence
+ has a PathMinOccurrence value of 0. If PathMaxOccurrence is not
+ present, then there is no upper bound for the permitted number of
+ EBMLPathAtoms possible to replace the GlobalPlaceholder.
+ PathMaxOccurrence MUST NOT have the value 0, as it would mean no
+ EBMLPathAtom can replace the GlobalPlaceholder, and the EBMLFullPath
+ would be the same without that GlobalPlaceholder part.
+ PathMaxOccurrence MUST be bigger than, or equal to,
+ PathMinOccurrence.
+
+ For example, in "\a\(0-1\)global", the Element path "\a\x\global"
+ corresponds to an EBMLPathAtom occurrence of 1. The Element
+ "\a\x\y\global" corresponds to an EBMLPathAtom occurrence of 2, etc.
+ In those cases, "\a\x" or "\a\x\y" MUST be valid paths to be able to
+ contain the element "global".
+
+ Consider another EBML Path, "\a\(1-\)global". There has to be at
+ least one EBMLPathAtom between the "\a\" part and "global". So the
+ "global" EBML Element cannot be found inside the "\a" EBML Element,
+ as it means the resulting path "\a\global" has no EBMLPathAtom
+ between the "\a\" and "global". However, the "global" EBML Element
+ can be found inside the "\a\b" EBML Element, because the resulting
+ path, "\a\b\global", has one EBMLPathAtom between the "\a\" and
+ "global". Alternatively, it can be found inside the "\a\b\c" EBML
+ Element (two EBMLPathAtom), or inside the "\a\b\c\d" EBML Element
+ (three EBMLPathAtom), etc.
+
+ Consider another EBML Path, "\a\(0-1\)global". There has to be at
+ most one EBMLPathAtom between the "\a\" part and "global". So the
+ "global" EBML Element can be found inside either the "\a" EBML
+ Element (0 EBMLPathAtom replacing GlobalPlaceholder) or the "\a\b"
+ EBML Element (one replacement EBMLPathAtom). But it cannot be found
+ inside the "\a\b\c" EBML Element, because the resulting path,
+ "\a\b\c\global", has two EBMLPathAtom between "\a\" and "global".
+
+11.1.6.3. id
+
+ Within an EBML Schema, the XPath of the "@id" attribute is
+ "/EBMLSchema/element/@id".
+
+ The Element ID is encoded as a Variable-Size Integer. It is read and
+ stored in big-endian order. In the EBML Schema, it is expressed in
+ hexadecimal notation prefixed by a 0x. To reduce the risk of false
+ positives while parsing EBML Streams, the Element IDs of the Root
+ Element and Top-Level Elements SHOULD be at least 4 octets in length.
+ Element IDs defined for use at Root Level or directly under the Root
+ Level MAY use shorter octet lengths to facilitate padding and
+ optimize edits to EBML Documents; for instance, the Void Element uses
+ an Element ID with a length of one octet to allow its usage in more
+ writing and editing scenarios.
+
+ The Element ID of any Element found within an EBML Document MUST only
+ match a single "@path" value of its corresponding EBML Schema, but a
+ separate instance of that Element ID value defined by the EBML Schema
+ MAY occur within a different "@path". If more than one Element is
+ defined to use the same "@id" value, then the "@path" values of those
+ Elements MUST NOT share the same EBMLParentPath. Elements MUST NOT
+ be defined to use the same "@id" value if one of their common Parent
+ Elements could be an Unknown-Sized Element.
+
+ The "id" attribute is REQUIRED.
+
+11.1.6.4. minOccurs
+
+ Within an EBML Schema, the XPath of the "@minOccurs" attribute is
+ "/EBMLSchema/element/@minOccurs".
+
+ "minOccurs" is a nonnegative integer expressing the minimum permitted
+ number of occurrences of this EBML Element within its Parent Element.
+
+ Each instance of the Parent Element MUST contain at least this many
+ instances of this EBML Element. If the EBML Element has an empty
+ EBMLParentPath, then "minOccurs" refers to constraints on the
+ occurrence of the EBML Element within the EBML Document. EBML
+ Elements with "minOccurs" set to "1" that also have a default value
+ (see Section 11.1.6.8) declared are not REQUIRED to be stored but are
+ REQUIRED to be interpreted; see Section 11.1.19.
+
+ An EBML Element defined with a "minOccurs" value greater than zero is
+ called a Mandatory EBML Element.
+
+ The "minOccurs" attribute is OPTIONAL. If the "minOccurs" attribute
+ is not present, then that EBML Element has a "minOccurs" value of 0.
+
+ The semantic meaning of "minOccurs" within an EBML Schema is
+ analogous to the meaning of "minOccurs" within an XML Schema.
+
+11.1.6.5. maxOccurs
+
+ Within an EBML Schema, the XPath of the "@maxOccurs" attribute is
+ "/EBMLSchema/element/@maxOccurs".
+
+ "maxOccurs" is a nonnegative integer expressing the maximum permitted
+ number of occurrences of this EBML Element within its Parent Element.
+
+ Each instance of the Parent Element MUST contain at most this many
+ instances of this EBML Element, including the unwritten mandatory
+ element with a default value; see Section 11.1.19. If the EBML
+ Element has an empty EBMLParentPath, then "maxOccurs" refers to
+ constraints on the occurrence of the EBML Element within the EBML
+ Document.
+
+ The "maxOccurs" attribute is OPTIONAL. If the "maxOccurs" attribute
+ is not present, then there is no upper bound for the permitted number
+ of occurrences of this EBML Element within its Parent Element or
+ within the EBML Document, depending on whether or not the
+ EBMLParentPath of the EBML Element is empty.
+
+ The semantic meaning of "maxOccurs" within an EBML Schema is
+ analogous to the meaning of "maxOccurs" within an XML Schema; when it
+ is not present, it's similar to xml:maxOccurs="unbounded" in an XML
+ Schema.
+
+11.1.6.6. range
+
+ Within an EBML Schema, the XPath of the "@range" attribute is
+ "/EBMLSchema/element/@range".
+
+ A numerical range for EBML Elements that are of numerical types
+ (Unsigned Integer, Signed Integer, Float, and Date). If specified,
+ the value of the EBML Element MUST be within the defined range. See
+ Section 11.1.6.6.1 for rules applied to expression of range values.
+
+ The "range" attribute is OPTIONAL. If the "range" attribute is not
+ present, then any value legal for the "type" attribute is valid.
+
+11.1.6.6.1. Expression of range
+
+ The "range" attribute MUST only be used with EBML Elements that are
+ either signed integer, unsigned integer, float, or date. The
+ expression defines the upper, lower, exact, or excluded value of the
+ EBML Element and optionally an upper boundary value combined with a
+ lower boundary. The range expression may contain whitespace (using
+ the ASCII 0x20 character) for readability, but whitespace within a
+ range expression MUST NOT convey meaning.
+
+ To set a fixed value for the range, the value is used as the
+ attribute value. For example, "1234" means the EBML element always
+ has the value 1234. The value can be prefixed with "not" to indicate
+ that the fixed value MUST NOT be used for that Element. For example,
+ "not 1234" means the Element can use all values of its type except
+ 1234.
+
+ The ">" sign is used for an exclusive lower boundary, and the ">="
+ sign is used for an inclusive lower boundary. For example, ">3"
+ means the Element value MUST be greater than 3, and ">=0x1p+0" means
+ the Element value MUST be greater than or equal to the floating value
+ 1.0; see Section 11.1.18.
+
+ The "<" sign is used for an exclusive upper boundary, and the "<="
+ sign is used for an inclusive upper boundary. For example, "<-2"
+ means the Element value MUST be less than -2, and "<=10" means the
+ Element value MUST be less than or equal to 10.
+
+ The lower and upper bounds can be combined into an expression to form
+ a closed boundary. The lower boundary comes first, followed by the
+ upper boundary, separated by a comma. For example, ">3,<= 20" means
+ the Element value MUST be greater than 3 and less than or equal to
+ 20.
+
+ A special form of lower and upper bounds using the "-" separator is
+ possible, meaning the Element value MUST be greater than, or equal
+ to, the first value and MUST be less than or equal to the second
+ value. For example, "1-10" is equivalent to ">=1,<=10". If the
+ upper boundary is negative, the "range" attribute MUST only use the
+ latter form.
+
+11.1.6.7. length
+
+ Within an EBML Schema, the XPath of the "@length" attribute is
+ "/EBMLSchema/element/@length".
+
+ The "length" attribute is a value to express the valid length of the
+ Element Data as written, measured in octets. The length provides a
+ constraint in addition to the Length value of the definition of the
+ corresponding EBML Element Type. This length MUST be expressed as
+ either a nonnegative integer or a range (see Section 11.1.6.6.1) that
+ consists of only nonnegative integers and valid operators.
+
+ The "length" attribute is OPTIONAL. If the "length" attribute is not
+ present for that EBML Element, then that EBML Element is only limited
+ in length by the definition of the associated EBML Element Type.
+
+11.1.6.8. default
+
+ Within an EBML Schema, the XPath of the "@default" attribute is
+ "/EBMLSchema/element/@default".
+
+ If an Element is mandatory (has a "minOccurs" value greater than
+ zero) but not written within its Parent Element or stored as an Empty
+ Element, then the EBML Reader of the EBML Document MUST semantically
+ interpret the EBML Element as present with this specified default
+ value for the EBML Element. An unwritten mandatory Element with a
+ declared default value is semantically equivalent to that Element if
+ written with the default value stored as the Element Data. EBML
+ Elements that are Master Elements MUST NOT declare a default value.
+ EBML Elements with a "minOccurs" value greater than 1 MUST NOT
+ declare a default value.
+
+ The default attribute is OPTIONAL.
+
+11.1.6.9. type
+
+ Within an EBML Schema, the XPath of the "@type" attribute is
+ "/EBMLSchema/element/@type".
+
+ The type MUST be set to one of the following values: "integer"
+ (signed integer), "uinteger" (unsigned integer), "float", "string",
+ "date", "utf-8", "master", or "binary". The content of each type is
+ defined in Section 7.
+
+ The "type" attribute is REQUIRED.
+
+11.1.6.10. unknownsizeallowed
+
+ Within an EBML Schema, the XPath of the "@unknownsizeallowed"
+ attribute is "/EBMLSchema/element/@unknownsizeallowed".
+
+ This attribute is a boolean to express whether an EBML Element is
+ permitted to be an Unknown-Sized Element (having all VINT_DATA bits
+ of Element Data Size set to 1). EBML Elements that are not Master
+ Elements MUST NOT set "unknownsizeallowed" to true. An EBML Element
+ that is defined with an "unknownsizeallowed" attribute set to 1 MUST
+ also have the "unknownsizeallowed" attribute of its Parent Element
+ set to 1.
+
+ An EBML Element with the "unknownsizeallowed" attribute set to 1 MUST
+ NOT have its "recursive" attribute set to 1.
+
+ The "unknownsizeallowed" attribute is OPTIONAL. If the
+ "unknownsizeallowed" attribute is not used, then that EBML Element is
+ not allowed to use an unknown Element Data Size.
+
+11.1.6.11. recursive
+
+ Within an EBML Schema, the XPath of the "@recursive" attribute is
+ "/EBMLSchema/element/@recursive".
+
+ This attribute is a boolean to express whether an EBML Element is
+ permitted to be stored recursively. If it is allowed, the EBML
+ Element MAY be stored within another EBML Element that has the same
+ Element ID, which itself can be stored in an EBML Element that has
+ the same Element ID, and so on. EBML Elements that are not Master
+ Elements MUST NOT set recursive to true.
+
+ If the EBMLElement part of the "@path" contains an IsRecursive part,
+ then the "recursive" value MUST be true; otherwise, it MUST be false.
+
+ An EBML Element with the "recursive" attribute set to 1 MUST NOT have
+ its "unknownsizeallowed" attribute set to 1.
+
+ The "recursive" attribute is OPTIONAL. If the "recursive" attribute
+ is not present, then the EBML Element MUST NOT be used recursively.
+
+11.1.6.12. recurring
+
+ Within an EBML Schema, the XPath of the "@recurring" attribute is
+ "/EBMLSchema/element/@recurring".
+
+ This attribute is a boolean to express whether or not an EBML Element
+ is defined as an Identically Recurring Element; see Section 11.1.17.
+
+ The "recurring" attribute is OPTIONAL. If the "recurring" attribute
+ is not present, then the EBML Element is not an Identically Recurring
+ Element.
+
+11.1.6.13. minver
+
+ Within an EBML Schema, the XPath of the "@minver" attribute is
+ "/EBMLSchema/element/@minver".
+
+ The "minver" (minimum version) attribute stores a nonnegative integer
+ that represents the first version of the docType to support the EBML
+ Element.
+
+ The "minver" attribute is OPTIONAL. If the "minver" attribute is not
+ present, then the EBML Element has a minimum version of "1".
+
+11.1.6.14. maxver
+
+ Within an EBML Schema, the XPath of the "@maxver" attribute is
+ "/EBMLSchema/element/@maxver".
+
+ The "maxver" (maximum version) attribute stores a nonnegative integer
+ that represents the last or most recent version of the docType to
+ support the element. "maxver" MUST be greater than or equal to
+ "minver".
+
+ The "maxver" attribute is OPTIONAL. If the "maxver" attribute is not
+ present, then the EBML Element has a maximum version equal to the
+ value stored in the "version" attribute of "<EBMLSchema>".
+
+11.1.7. "<documentation>" Element
+
+ Within an EBML Schema, the XPaths of the "<documentation>" elements
+ are "/EBMLSchema/element/documentation" and
+ "/EBMLSchema/element/restriction/enum/documentation".
+
+ The "<documentation>" element provides additional information about
+ EBML Elements or enumeration values. Within the "<documentation>"
+ element, the following XHTML [XHTML] elements MAY be used: "<a>",
+ "<br>", and "<strong>".
+
+11.1.8. "<documentation>" Attributes
+
+11.1.8.1. lang
+
+ Within an EBML Schema, the XPath of the "@lang" attribute is
+ "/EBMLSchema/element/documentation/@lang".
+
+ The "lang" attribute is set to the value from [RFC5646] of the
+ language of the element's documentation.
+
+ The "lang" attribute is OPTIONAL.
+
+11.1.8.2. purpose
+
+ Within an EBML Schema, the XPath of the "@purpose" attribute is
+ "/EBMLSchema/element/documentation/@purpose".
+
+ A "purpose" attribute distinguishes the meaning of the documentation.
+ Values for the "<documentation>" subelement's "purpose" attribute
+ MUST include one of the values listed in Table 8.
+
+ +============+=================================================+
+ | value of | definition |
+ | "purpose" | |
+ | attribute | |
+ +============+=================================================+
+ | definition | A "definition" is recommended for every defined |
+ | | EBML Element. This documentation explains the |
+ | | semantic meaning of the EBML Element. |
+ +------------+-------------------------------------------------+
+ | rationale | An explanation about the reason or catalyst for |
+ | | the definition of the Element. |
+ +------------+-------------------------------------------------+
+ | usage | Recommended practices or guidelines for both |
+ | notes | reading, writing, or interpreting the Element. |
+ +------------+-------------------------------------------------+
+ | references | Informational references to support the |
+ | | contextualization and understanding of the |
+ | | value of the Element. |
+ +------------+-------------------------------------------------+
+
+ Table 8: Definitions of the permitted values for the
+ "purpose" attribute of the documentation Element
+
+ The "purpose" attribute is REQUIRED.
+
+11.1.9. "<implementation_note>" Element
+
+ Within an EBML Schema, the XPath of the "<implementation_note>"
+ element is "/EBMLSchema/element/implementation_note".
+
+ In some cases within an EBML Document Type, the attributes of the
+ "<element>" element are not sufficient to clearly communicate how the
+ defined EBML Element is intended to be implemented. For instance,
+ one EBML Element might only be mandatory if another EBML Element is
+ present. As another example, the default value of an EBML Element
+ might be derived from a related Element's content. In these cases
+ where the Element's definition is conditional or advanced
+ implementation notes are needed, one or many "<implementation_note>"
+ elements can be used to store that information. The
+ "<implementation_note>" refers to a specific attribute of the parent
+ "<element>" as expressed by the "note_attribute" attribute (see
+ Section 11.1.10.1).
+
+11.1.10. "<implementation_note>" Attributes
+
+11.1.10.1. note_attribute
+
+ Within an EBML Schema, the XPath of the "@note_attribute" attribute
+ is "/EBMLSchema/element/implementation_note/@note_attribute".
+
+ The "note_attribute" attribute references which of the attributes of
+ the "<element>" the "<implementation_note>" relates to. The
+ "note_attribute" attribute MUST be set to one of the following values
+ (corresponding to that attribute of the parent "<element>"):
+ "minOccurs", "maxOccurs", "range", "length", "default", "minver", or
+ "maxver". The "<implementation_note>" SHALL supersede the parent
+ "<element>"'s attribute that is named in the "note_attribute"
+ attribute. An "<element>" SHALL NOT have more than one
+ "<implementation_note>" of the same "note_attribute".
+
+ The "note_attribute" attribute is REQUIRED.
+
+11.1.10.2. "<implementation_note>" Example
+
+ The following fragment of an EBML Schema demonstrates how an
+ "<implementation_note>" is used. In this case, an EBML Schema
+ documents a list of items that are described with an optional cost.
+ The Currency Element uses an "<implementation_note>" to say that the
+ Currency Element is REQUIRED if the Cost Element is set, otherwise
+ not.
+
+ <element name="Items" path="\Items" id="0x4025" type="master"
+ minOccurs="1" maxOccurs="1">
+ <documentation lang="en" purpose="definition">
+ A set of items.
+ </documentation>
+ </element>
+ <element name="Item" path="\Items\Item" id="0x4026"
+ type="master">
+ <documentation lang="en" purpose="definition">
+ An item.
+ </documentation>
+ </element>
+ <element name="Cost" path="\Items\Item\Cost" id="0x4024"
+ type="float" maxOccurs="1">
+ <documentation lang="en" purpose="definition">
+ The cost of the item, if any.
+ </documentation>
+ </element>
+ <element name="Currency" path="\Items\Item\Currency" id="0x403F"
+ type="string" maxOccurs="1">
+ <documentation lang="en" purpose="definition">
+ The currency of the item's cost.
+ </documentation>
+ <implementation_note note_attribute="minOccurs">
+ Currency MUST be set (minOccurs=1) if the associated Item stores
+ a Cost, else Currency MAY be unset (minOccurs=0).
+ </implementation_note>
+ </element>
+
+11.1.11. "<restriction>" Element
+
+ Within an EBML Schema, the XPath of the "<restriction>" element is
+ "/EBMLSchema/element/restriction".
+
+ The "<restriction>" element provides information about restrictions
+ to the allowable values for the EBML Element, which are listed in
+ "<enum>" elements.
+
+11.1.12. "<enum>" Element
+
+ Within an EBML Schema, the XPath of the "<enum>" element is
+ "/EBMLSchema/element/restriction/enum".
+
+ The "<enum>" element stores a list of values allowed for storage in
+ the EBML Element. The values MUST match the type of the EBML Element
+ (for example, "<enum value="Yes">" cannot be a valid value for an
+ EBML Element that is defined as an unsigned integer). An "<enum>"
+ element MAY also store "<documentation>" elements to further describe
+ the "<enum>".
+
+11.1.13. "<enum>" Attributes
+
+11.1.13.1. label
+
+ Within an EBML Schema, the XPath of the "@label" attribute is
+ "/EBMLSchema/element/restriction/enum/@label".
+
+ The label provides a concise expression for human consumption that
+ describes what the value of "<enum>" represents.
+
+ The "label" attribute is OPTIONAL.
+
+11.1.13.2. value
+
+ Within an EBML Schema, the XPath of the "@value" attribute is
+ "/EBMLSchema/element/restriction/enum/@value".
+
+ The value represents data that MAY be stored within the EBML Element.
+
+ The "value" attribute is REQUIRED.
+
+11.1.14. "<extension>" Element
+
+ Within an EBML Schema, the XPath of the "<extension>" element is
+ "/EBMLSchema/element/extension".
+
+ The "<extension>" element provides an unconstrained element to
+ contain information about the associated EBML "<element>", which is
+ undefined by this document but MAY be defined by the associated EBML
+ Document Type. The "<extension>" element MUST contain a "type"
+ attribute and also MAY contain any other attribute or subelement as
+ long as the EBML Schema remains as a well-formed XML Document. All
+ "<extension>" elements MUST be subelements of the "<element>".
+
+11.1.15. "<extension>" Attributes
+
+11.1.15.1. type
+
+ Within an EBML Schema, the XPath of the "@type" attribute is
+ "/EBMLSchema/element/extension/@type".
+
+ The "type" attribute should reference a name or identifier of the
+ project or authority associated with the contents of the
+ "<extension>" element.
+
+ The "type" attribute is REQUIRED.
+
+11.1.16. XML Schema for EBML Schema
+
+ The following provides an XML Schema [XML-SCHEMA] for facilitating
+ verification of an EBML Schema described in Section 11.1.
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <xs:schema xmlns="urn:ietf:rfc:8794"
+ targetNamespace="urn:ietf:rfc:8794"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
+ elementFormDefault="qualified" version="01">
+
+ <!-- for HTML in comments -->
+ <xs:import namespace="http://www.w3.org/1999/xhtml"
+ schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd"/>
+
+ <xs:element name="EBMLSchema" type="EBMLSchemaType"/>
+
+ <xs:complexType name="EBMLSchemaType">
+ <xs:sequence>
+ <xs:element name="element" type="elementType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="docType" use="required"/>
+ <xs:attribute name="version" use="required" type="xs:integer"/>
+ <xs:attribute name="ebml" type="xs:positiveInteger"
+ default="1"/>
+ </xs:complexType>
+
+ <xs:complexType name="elementType">
+ <xs:sequence>
+ <xs:element name="documentation" type="documentationType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="implementation_note" type="noteType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="restriction" type="restrictionType"
+ minOccurs="0" maxOccurs="1"/>
+ <xs:element name="extension" type="extensionType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[0-9A-Za-z.-]([0-9A-Za-z.-])*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="path" use="required">
+ <!-- <xs:simpleType>
+ <xs:restriction base="xs:integer">
+ <xs:pattern value="[0-9]*\*[0-9]*()"/>
+ </xs:restriction>
+ </xs:simpleType> -->
+ </xs:attribute>
+ <xs:attribute name="id" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="0x([0-9A-F][0-9A-F])+"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="minOccurs" default="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:integer">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="maxOccurs" default="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:integer">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="range"/>
+ <xs:attribute name="length"/>
+ <xs:attribute name="default"/>
+ <xs:attribute name="type" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="integer"/>
+ <xs:enumeration value="uinteger"/>
+ <xs:enumeration value="float"/>
+ <xs:enumeration value="string"/>
+ <xs:enumeration value="date"/>
+ <xs:enumeration value="utf-8"/>
+ <xs:enumeration value="master"/>
+ <xs:enumeration value="binary"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="unknownsizeallowed" type="xs:boolean"
+ default="false"/>
+ <xs:attribute name="recursive" type="xs:boolean"
+ default="false"/>
+ <xs:attribute name="recurring" type="xs:boolean"
+ default="false"/>
+ <xs:attribute name="minver" default="1">
+ <xs:simpleType>
+ <xs:restriction base="xs:integer">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="maxver">
+ <xs:simpleType>
+ <xs:restriction base="xs:integer">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+
+ <xs:complexType name="restrictionType">
+ <xs:sequence>
+ <xs:element name="enum" type="enumType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="extensionType">
+ <xs:sequence>
+ <xs:any processContents="skip"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="type" use="required"/>
+ <xs:anyAttribute processContents="skip"/>
+ </xs:complexType>
+
+ <xs:complexType name="enumType">
+ <xs:sequence>
+ <xs:element name="documentation" type="documentationType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="label"/>
+ <xs:attribute name="value" use="required"/>
+ </xs:complexType>
+
+ <xs:complexType name="documentationType" mixed="true">
+ <xs:sequence>
+ <xs:element name="a" type="xhtml:xhtml.a.type"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="br" type="xhtml:xhtml.br.type"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="strong" type="xhtml:xhtml.strong.type"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="lang"/>
+ <xs:attribute name="purpose" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="definition"/>
+ <xs:enumeration value="rationale"/>
+ <xs:enumeration value="references"/>
+ <xs:enumeration value="usage notes"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+
+ <xs:complexType name="noteType">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="note_attribute" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="minOccurs"/>
+ <xs:enumeration value="maxOccurs"/>
+ <xs:enumeration value="range"/>
+ <xs:enumeration value="length"/>
+ <xs:enumeration value="default"/>
+ <xs:enumeration value="minver"/>
+ <xs:enumeration value="maxver"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:schema>
+
+11.1.17. Identically Recurring Elements
+
+ An Identically Recurring Element is an EBML Element that MAY occur
+ within its Parent Element more than once, but each recurrence of it
+ within that Parent Element MUST be identical both in storage and
+ semantics. Identically Recurring Elements are permitted to be stored
+ multiple times within the same Parent Element in order to increase
+ data resilience and optimize the use of EBML in transmission. For
+ instance, a pertinent Top-Level Element could be periodically resent
+ within a datastream so that an EBML Reader that starts reading the
+ stream from the middle could better interpret the contents.
+ Identically Recurring Elements SHOULD include a CRC-32 Element as a
+ Child Element; this is especially recommended when EBML is used for
+ long-term storage or transmission. If a Parent Element contains more
+ than one copy of an Identically Recurring Element that includes a
+ CRC-32 Element as a Child Element, then the first instance of the
+ Identically Recurring Element with a valid CRC-32 value should be
+ used for interpretation. If a Parent Element contains more than one
+ copy of an Identically Recurring Element that does not contain a
+ CRC-32 Element, or if CRC-32 Elements are present but none are valid,
+ then the first instance of the Identically Recurring Element should
+ be used for interpretation.
+
+11.1.18. Textual expression of floats
+
+ When a float value is represented textually in an EBML Schema, such
+ as within a default or range value, the float values MUST be
+ expressed as Hexadecimal Floating-Point Constants as defined in the
+ C11 standard [ISO9899] (see Section 6.4.4.2 on Floating Constants).
+ Table 9 provides examples of expressions of float ranges.
+
+ +===================+=========================================+
+ | as decimal | as Hexadecimal Floating-Point Constants |
+ +===================+=========================================+
+ | 0.0 | 0x0p+1 |
+ +-------------------+-----------------------------------------+
+ | 0.0-1.0 | 0x0p+1-0x1p+0 |
+ +-------------------+-----------------------------------------+
+ | 1.0-256.0 | 0x1p+0-0x1p+8 |
+ +-------------------+-----------------------------------------+
+ | 0.857421875 | 0x1.b7p-1 |
+ +-------------------+-----------------------------------------+
+ | -1.0--0.857421875 | -0x1p+0--0x1.b7p-1 |
+ +-------------------+-----------------------------------------+
+
+ Table 9: Example of Floating-Point values and ranges as
+ decimal and Hexadecimal Floating-Point Constants
+
+ Within an expression of a float range, as in an integer range, the -
+ (hyphen) character is the separator between the minimum and maximum
+ values permitted by the range. Hexadecimal Floating-Point Constants
+ also use a - (hyphen) when indicating a negative binary power.
+ Within a float range, when a - (hyphen) is immediately preceded by a
+ letter p, then the - (hyphen) is a part of the Hexadecimal Floating-
+ Point Constant that notes negative binary power. Within a float
+ range, when a - (hyphen) is not immediately preceded by a letter p,
+ then the - (hyphen) represents the separator between the minimum and
+ maximum values permitted by the range.
+
+11.1.19. Note on the use of default attributes to define Mandatory EBML
+ Elements
+
+ If a Mandatory EBML Element has a default value declared by an EBML
+ Schema and the value of the EBML Element is equal to the declared
+ default value, then that EBML Element is not required to be present
+ within the EBML Document if its Parent Element is present. In this
+ case, the default value of the Mandatory EBML Element MUST be read by
+ the EBML Reader, although the EBML Element is not present within its
+ Parent Element.
+
+ If a Mandatory EBML Element has no default value declared by an EBML
+ Schema and its Parent Element is present, then the EBML Element MUST
+ be present, as well. If a Mandatory EBML Element has a default value
+ declared by an EBML Schema, and its Parent Element is present, and
+ the value of the EBML Element is NOT equal to the declared default
+ value, then the EBML Element MUST be present.
+
+ Table 10 clarifies whether a Mandatory EBML Element MUST be written,
+ according to whether the default value is declared, the value of the
+ EBML Element is equal to the declared default value, and/or the
+ Parent Element is used.
+
+ +=================+=============+===============+==================+
+ | Is the default | Is the | Is the Parent | Then is storing |
+ | value declared? | value equal | Element | the EBML Element |
+ | | to default? | present? | REQUIRED? |
+ +=================+=============+===============+==================+
+ | Yes | Yes | Yes | No |
+ +-----------------+-------------+---------------+------------------+
+ | Yes | Yes | No | No |
+ +-----------------+-------------+---------------+------------------+
+ | Yes | No | Yes | Yes |
+ +-----------------+-------------+---------------+------------------+
+ | Yes | No | No | No |
+ +-----------------+-------------+---------------+------------------+
+ | No | n/a | Yes | Yes |
+ +-----------------+-------------+---------------+------------------+
+ | No | n/a | No | No |
+ +-----------------+-------------+---------------+------------------+
+
+ Table 10: Demonstration of the conditional requirements of VINT
+ Storage
+
+11.2. EBML Header Elements
+
+ This document contains definitions of all EBML Elements of the EBML
+ Header.
+
+11.2.1. EBML Element
+
+ name: EBML
+
+ path: "\EBML"
+
+ id: 0x1A45DFA3
+
+ minOccurs: 1
+
+ maxOccurs: 1
+
+ type: Master Element
+
+ description: Set the EBML characteristics of the data to follow.
+ Each EBML Document has to start with this.
+
+11.2.2. EBMLVersion Element
+
+ name: EBMLVersion
+
+ path: "\EBML\EBMLVersion"
+
+ id: 0x4286
+
+ minOccurs: 1
+
+ maxOccurs: 1
+
+ range: not 0
+
+ default: 1
+
+ type: Unsigned Integer
+
+ description: The version of EBML specifications used to create the
+ EBML Document. The version of EBML defined in this document is 1,
+ so EBMLVersion SHOULD be 1.
+
+11.2.3. EBMLReadVersion Element
+
+ name: EBMLReadVersion
+
+ path: "\EBML\EBMLReadVersion"
+
+ id: 0x42F7
+
+ minOccurs: 1
+
+ maxOccurs: 1
+
+ range: 1
+
+ default: 1
+
+ type: Unsigned Integer
+
+ description: The minimum EBML version an EBML Reader has to support
+ to read this EBML Document. The EBMLReadVersion Element MUST be
+ less than or equal to EBMLVersion.
+
+11.2.4. EBMLMaxIDLength Element
+
+ name: EBMLMaxIDLength
+
+ path: "\EBML\EBMLMaxIDLength"
+
+ id: 0x42F2
+
+ minOccurs: 1
+
+ maxOccurs: 1
+
+ range: >=4
+
+ default: 4
+
+ type: Unsigned Integer
+
+ description: The EBMLMaxIDLength Element stores the maximum
+ permitted length in octets of the Element IDs to be found within
+ the EBML Body. An EBMLMaxIDLength Element value of four is
+ RECOMMENDED, though larger values are allowed.
+
+11.2.5. EBMLMaxSizeLength Element
+
+ name: EBMLMaxSizeLength
+
+ path: "\EBML\EBMLMaxSizeLength"
+
+ id: 0x42F3
+
+ minOccurs: 1
+
+ maxOccurs: 1
+
+ range: not 0
+
+ default: 8
+
+ type: Unsigned Integer
+
+ description: The EBMLMaxSizeLength Element stores the maximum
+ permitted length in octets of the expressions of all Element Data
+ Sizes to be found within the EBML Body. The EBMLMaxSizeLength
+ Element documents an upper bound for the "length" of all Element
+ Data Size expressions within the EBML Body and not an upper bound
+ for the "value" of all Element Data Size expressions within the
+ EBML Body. EBML Elements that have an Element Data Size
+ expression that is larger in octets than what is expressed by
+ EBMLMaxSizeLength Element are invalid.
+
+11.2.6. DocType Element
+
+ name: DocType
+
+ path: "\EBML\DocType"
+
+ id: 0x4282
+
+ minOccurs: 1
+
+ maxOccurs: 1
+
+ length: >0
+
+ type: String
+
+ description: A string that describes and identifies the content of
+ the EBML Body that follows this EBML Header.
+
+11.2.7. DocTypeVersion Element
+
+ name: DocTypeVersion
+
+ path: "\EBML\DocTypeVersion"
+
+ id: 0x4287
+
+ minOccurs: 1
+
+ maxOccurs: 1
+
+ range: not 0
+
+ default: 1
+
+ type: Unsigned Integer
+
+ description: The version of DocType interpreter used to create the
+ EBML Document.
+
+11.2.8. DocTypeReadVersion Element
+
+ name: DocTypeReadVersion
+
+ path: "\EBML\DocTypeReadVersion"
+
+ id: 0x4285
+
+ minOccurs: 1
+
+ maxOccurs: 1
+
+ range: not 0
+
+ default: 1
+
+ type: Unsigned Integer
+
+ description: The minimum DocType version an EBML Reader has to
+ support to read this EBML Document. The value of the
+ DocTypeReadVersion Element MUST be less than or equal to the value
+ of the DocTypeVersion Element.
+
+11.2.9. DocTypeExtension Element
+
+ name: DocTypeExtension
+
+ path: "\EBML\DocTypeExtension"
+
+ id: 0x4281
+
+ minOccurs: 0
+
+ type: Master Element
+
+ description: A DocTypeExtension adds extra Elements to the main
+ DocType+DocTypeVersion tuple it's attached to. An EBML Reader MAY
+ know these extra Elements and how to use them. A DocTypeExtension
+ MAY be used to iterate between experimental Elements before they
+ are integrated into a regular DocTypeVersion. Reading one
+ DocTypeExtension version of a DocType+DocTypeVersion tuple doesn't
+ imply one should be able to read upper versions of this
+ DocTypeExtension.
+
+11.2.10. DocTypeExtensionName Element
+
+ name: DocTypeExtensionName
+
+ path: "\EBML\DocTypeExtension\DocTypeExtensionName"
+
+ id: 0x4283
+
+ minOccurs: 1
+
+ maxOccurs: 1
+
+ length: >0
+
+ type: String
+
+ description: The name of the DocTypeExtension to differentiate it
+ from other DocTypeExtensions of the same DocType+DocTypeVersion
+ tuple. A DocTypeExtensionName value MUST be unique within the
+ EBML Header.
+
+11.2.11. DocTypeExtensionVersion Element
+
+ name: DocTypeExtensionVersion
+
+ path: "\EBML\DocTypeExtension\DocTypeExtensionVersion"
+
+ id: 0x4284
+
+ minOccurs: 1
+
+ maxOccurs: 1
+
+ range: not 0
+
+ type: Unsigned Integer
+
+ description: The version of the DocTypeExtension. Different
+ DocTypeExtensionVersion values of the same DocType +
+ DocTypeVersion + DocTypeExtensionName tuple MAY contain completely
+ different sets of extra Elements. An EBML Reader MAY support
+ multiple versions of the same tuple, only one version of the
+ tuple, or not support the tuple at all.
+
+11.3. Global Elements
+
+ EBML allows some special Elements to be found within more than one
+ parent in an EBML Document or optionally at the Root Level of an EBML
+ Body. These Elements are called Global Elements. There are two
+ Global Elements that can be found in any EBML Document: the CRC-32
+ Element and the Void Element. An EBML Schema MAY add other Global
+ Elements to the format it defines. These extra elements apply only
+ to the EBML Body, not the EBML Header.
+
+ Global Elements are EBML Elements whose EBMLLastParent part of the
+ path has a GlobalPlaceholder. Because it is the last Parent part of
+ the path, a Global Element might also have EBMLParentPath parts in
+ its path. In this case, the Global Element can only be found within
+ this EBMLParentPath path -- i.e., it's not fully "global".
+
+ A Global Element can be found in many Parent Elements, allowing the
+ same number of occurrences in each Parent where this Element is
+ found.
+
+11.3.1. CRC-32 Element
+
+ name: CRC-32
+
+ path: "\(1-\)CRC-32"
+
+ id: 0xBF
+
+ minOccurs: 0
+
+ maxOccurs: 1
+
+ length: 4
+
+ type: Binary
+
+ description: The CRC-32 Element contains a 32-bit Cyclic Redundancy
+ Check value of all the Element Data of the Parent Element as
+ stored except for the CRC-32 Element itself. When the CRC-32
+ Element is present, the CRC-32 Element MUST be the first ordered
+ EBML Element within its Parent Element for easier reading. All
+ Top-Level Elements of an EBML Document that are Master Elements
+ SHOULD include a CRC-32 Element as a Child Element. The CRC in
+ use is the IEEE-CRC-32 algorithm as used in the [ISO3309] standard
+ and in Section 8.1.1.6.2 of [ITU.V42], with initial value of
+ 0xFFFFFFFF. The CRC value MUST be computed on a little-endian
+ bytestream and MUST use little-endian storage.
+
+11.3.2. Void Element
+
+ name: Void
+
+ path: "\(-\)Void"
+
+ id: 0xEC
+
+ minOccurs: 0
+
+ type: Binary
+
+ description: Used to void data or to avoid unexpected behaviors when
+ using damaged data. The content is discarded. Also used to
+ reserve space in a subelement for later use.
+
+12. Considerations for Reading EBML Data
+
+ The following scenarios describe events to consider when reading EBML
+ Documents, as well as the recommended design of an EBML Reader.
+
+ If a Master Element contains a CRC-32 Element that doesn't validate,
+ then the EBML Reader MAY ignore all contained data except for
+ Descendant Elements that contain their own valid CRC-32 Element.
+
+ In the following XML representation of a simple, hypothetical EBML
+ fragment, a Master Element called CONTACT contains two Child
+ Elements, NAME and ADDRESS. In this example, some data within the
+ NAME Element had been altered so that the CRC-32 of the NAME Element
+ does not validate, and thus any Ancestor Element with a CRC-32 would
+ therefore also no longer validate. However, even though the CONTACT
+ Element has a CRC-32 that does not validate (because of the changed
+ data within the NAME Element), the CRC-32 of the ADDRESS Element does
+ validate, and thus the contents and semantics of the ADDRESS Element
+ MAY be used.
+
+ <CONTACT>
+ <CRC-32>c119a69b</CRC-32><!-- does not validate -->
+ <NAME>
+ <CRC-32>1f59ee2b</CRC-32><!-- does not validate -->
+ <FIRST-NAME>invalid data</FIRST-NAME>
+ <LAST-NAME>invalid data</LAST-NAME>
+ </NAME>
+ <ADDRESS>
+ <CRC-32>df941cc9</CRC-32><!-- validates -->
+ <STREET>valid data</STREET>
+ <CITY>valid data</CITY>
+ </ADDRESS>
+ </CONTACT>
+
+ If a Master Element contains more occurrences of a Child Master
+ Element than permitted according to the "maxOccurs" and "recurring"
+ attributes of the definition of that Element, then the occurrences in
+ addition to "maxOccurs" MAY be ignored.
+
+ If a Master Element contains more occurrences of a Child Element than
+ permitted according to the "maxOccurs" attribute of the definition of
+ that Element, then all instances of that Element after the first
+ "maxOccurs" occurrences from the beginning of its Parent Element
+ SHOULD be ignored.
+
+13. Terminating Elements
+
+ Null Octets, which are octets with all bits set to zero, MAY follow
+ the value of a String Element or UTF-8 Element to serve as a
+ terminator. An EBML Writer MAY terminate a String Element or UTF-8
+ Element with Null Octets in order to overwrite a stored value with a
+ new value of lesser length while maintaining the same Element Data
+ Size; this can prevent the need to rewrite large portions of an EBML
+ Document. Otherwise, the use of Null Octets within a String Element
+ or UTF-8 Element is NOT RECOMMENDED. The Element Data of a UTF-8
+ Element MUST be a valid UTF-8 string up to whichever comes first: the
+ end of the Element or the first occurring Null octet. Within the
+ Element Data of a String or UTF-8 Element, any Null octet itself and
+ any following data within that Element SHOULD be ignored. A string
+ value and a copy of that string value terminated by one or more Null
+ Octets are semantically equal.
+
+ Table 11 shows examples of semantics and validation for the use of
+ Null Octets. Values to represent Stored Values and the Semantic
+ Meaning as represented as hexadecimal values.
+
+ +=====================+=====================+
+ | Stored Value | Semantic Meaning |
+ +=====================+=====================+
+ | 0x65 0x62 0x6D 0x6C | 0x65 0x62 0x6D 0x6C |
+ +---------------------+---------------------+
+ | 0x65 0x62 0x00 0x6C | 0x65 0x62 |
+ +---------------------+---------------------+
+ | 0x65 0x62 0x00 0x00 | 0x65 0x62 |
+ +---------------------+---------------------+
+ | 0x65 0x62 | 0x65 0x62 |
+ +---------------------+---------------------+
+
+ Table 11: Examples of semantics for Null
+ Octets in VINT_DATA
+
+14. Guidelines for Updating Elements
+
+ An EBML Document can be updated without requiring that the entire
+ EBML Document be rewritten. These recommendations describe
+ strategies for changing the Element Data of a written EBML Element
+ with minimal disruption to the rest of the EBML Document.
+
+14.1. Reducing Element Data in Size
+
+ There are three methods to reduce the size of Element Data of a
+ written EBML Element.
+
+14.1.1. Adding a Void Element
+
+ When an EBML Element is changed to reduce its total length by more
+ than one octet, an EBML Writer SHOULD fill the freed space with a
+ Void Element.
+
+14.1.2. Extending the Element Data Size
+
+ The same value for Element Data Size MAY be written in various
+ lengths, so for minor reductions of the Element Data, the Element
+ Size MAY be written to a longer octet length to fill the freed space.
+
+ For example, the first row of Table 12 depicts a String Element that
+ stores an Element ID (3 octets), Element Data Size (1 octet), and
+ Element Data (4 octets). If the Element Data is changed to reduce
+ the length by one octet, and if the current length of the Element
+ Data Size is less than its maximum permitted length, then the Element
+ Data Size of that Element MAY be rewritten to increase its length by
+ one octet. Thus, before and after the change, the EBML Element
+ maintains the same length of 8 octets, and data around the Element
+ does not need to be moved.
+
+ +=============+============+===================+==============+
+ | Status | Element ID | Element Data Size | Element Data |
+ +=============+============+===================+==============+
+ | Before edit | 0x3B4040 | 0x84 | 0x65626D6C |
+ +-------------+------------+-------------------+--------------+
+ | After edit | 0x3B4040 | 0x4003 | 0x6D6B76 |
+ +-------------+------------+-------------------+--------------+
+
+ Table 12: Example of editing a VINT to reduce VINT_DATA
+ length by one octet
+
+ This method is RECOMMENDED when the Element Data is reduced by a
+ single octet; for reductions by two or more octets, it is RECOMMENDED
+ to fill the freed space with a Void Element.
+
+ Note that if the Element Data length needs to be rewritten as
+ shortened by one octet and the Element Data Size could be rewritten
+ as a shorter VINT, then it is RECOMMENDED to rewrite the Element Data
+ Size as one octet shorter, shorten the Element Data by one octet, and
+ follow that Element with a Void Element. For example, Table 13
+ depicts a String Element that stores an Element ID (3 octets),
+ Element Data Size (2 octets, but could be rewritten in one octet),
+ and Element Data (3 octets). If the Element Data is to be rewritten
+ to a two-octet length, then another octet can be taken from Element
+ Data Size so that there is enough space to add a two-octet Void
+ Element.
+
+ +========+============+===================+==============+=========+
+ | Status | Element ID | Element Data Size | Element Data | Void |
+ | | | | | Element |
+ +========+============+===================+==============+=========+
+ | Before | 0x3B4040 | 0x4003 | 0x6D6B76 | |
+ +--------+------------+-------------------+--------------+---------+
+ | After | 0x3B4040 | 0x82 | 0x6869 | 0xEC80 |
+ +--------+------------+-------------------+--------------+---------+
+
+ Table 13: Example of editing a VINT to reduce VINT_DATA length
+ by more than one octet
+
+14.1.3. Terminating Element Data
+
+ For String Elements and UTF-8 Elements, the length of Element Data
+ could be reduced by adding Null Octets to terminate the Element Data
+ (see Section 13).
+
+ In Table 14, Element Data four octets long is changed to a value
+ three octets long, followed by a Null Octet; the Element Data Size
+ includes any Null Octets used to terminate Element Data and therefore
+ remains unchanged.
+
+ +=============+============+===================+==============+
+ | Status | Element ID | Element Data Size | Element Data |
+ +=============+============+===================+==============+
+ | Before edit | 0x3B4040 | 0x84 | 0x65626D6C |
+ +-------------+------------+-------------------+--------------+
+ | After edit | 0x3B4040 | 0x84 | 0x6D6B7600 |
+ +-------------+------------+-------------------+--------------+
+
+ Table 14: Example of terminating VINT_DATA with a Null
+ Octet when reducing VINT length during an edit
+
+ Note that this method is NOT RECOMMENDED. For reductions of one
+ octet, the method for Extending the Element Data Size SHOULD be used.
+ For reduction by more than one octet, the method for Adding a Void
+ Element SHOULD be used.
+
+14.2. Considerations when Updating Elements with Cyclic Redundancy
+ Check (CRC)
+
+ If the Element to be changed is a Descendant Element of any Master
+ Element that contains a CRC-32 Element (see Section 11.3.1), then the
+ CRC-32 Element MUST be verified before permitting the change.
+ Additionally, the CRC-32 Element value MUST be subsequently updated
+ to reflect the changed data.
+
+15. Backward and Forward Compatibility
+
+ Elements of an EBML format SHOULD be designed with backward and
+ forward compatibility in mind.
+
+15.1. Backward Compatibility
+
+ Backward compatibility of new EBML Elements can be achieved by using
+ default values for mandatory elements. The default value MUST
+ represent the state that was assumed for previous versions of the
+ EBML Schema, without this new EBML Element. If such a state doesn't
+ make sense for previous versions, then the new EBML Element SHOULD
+ NOT be mandatory.
+
+ Non-mandatory EBML Elements can be added in a new EBMLDocTypeVersion.
+ Since they are not mandatory, they won't be found in older versions
+ of the EBMLDocTypeVersion, just as they might not be found in newer
+ versions. This causes no compatibility issue.
+
+15.2. Forward Compatibility
+
+ EBML Elements MAY be marked as deprecated in a new EBMLDocTypeVersion
+ using the "maxver" attribute of the EBML Schema. If such an Element
+ is found in an EBML Document with a newer version of the
+ EBMLDocTypeVersion, it SHOULD be discarded.
+
+16. Security Considerations
+
+ EBML itself does not offer any kind of security and does not provide
+ confidentiality. EBML does not provide any kind of authorization.
+ EBML only offers marginally useful and effective data integrity
+ options, such as CRC elements.
+
+ Even if the semantic layer offers any kind of encryption, EBML itself
+ could leak information at both the semantic layer (as declared via
+ the DocType Element) and within the EBML structure (the presence of
+ EBML Elements can be derived even with an unknown semantic layer
+ using a heuristic approach -- not without errors, of course, but with
+ a certain degree of confidence).
+
+ An EBML Document that has the following issues may still be handled
+ by the EBML Reader and the data accepted as such, depending on how
+ strict the EBML Reader wants to be:
+
+ * Invalid Element IDs that are longer than the limit stated in the
+ EBMLMaxIDLength Element of the EBML Header.
+
+ * Invalid Element IDs that are not encoded in the shortest-possible
+ way.
+
+ * Invalid Element Data Size values that are longer than the limit
+ stated in the EBMLMaxSizeLength Element of the EBML Header.
+
+ Element IDs that are unknown to the EBML Reader MAY be accepted as
+ valid EBML IDs in order to skip such elements.
+
+ EBML Elements with a string type may contain extra data after the
+ first 0x00. These data MUST be discarded according to the Section 13
+ rules.
+
+ An EBML Reader may discard some or all data if the following errors
+ are found in the EBML Document:
+
+ * Invalid Element Data Size values (e.g., extending the length of
+ the EBML Element beyond the scope of the Parent Element, possibly
+ triggering access-out-of-bounds issues).
+
+ * Very high lengths in order to force out-of-memory situations
+ resulting in a denial of service, access-out-of-bounds issues,
+ etc.
+
+ * Missing EBML Elements that are mandatory in a Master Element and
+ have no declared default value, making the semantic invalid at
+ that Master Element level.
+
+ * Usage of invalid UTF-8 encoding in EBML Elements of UTF-8 type
+ (e.g., in order to trigger access-out-of-bounds or buffer-overflow
+ issues).
+
+ * Usage of invalid data in EBML Elements with a date type,
+ triggering bogus date accesses.
+
+ * The CRC-32 Element (see Section 11.3.1) of a Master Element
+ doesn't match the rest of the content of that Master Element.
+
+ Side-channel attacks could exploit:
+
+ * The semantic equivalence of the same string stored in a String
+ Element or UTF-8 Element with and without zero-bit padding, making
+ comparison at the semantic level invalid.
+
+ * The semantic equivalence of VINT_DATA within Element Data Size
+ with two different lengths due to left-padding zero bits, making
+ comparison at the semantic level invalid.
+
+ * Data contained within a Master Element that is not itself part of
+ a Child Element, which can trigger incorrect parsing behavior in
+ EBML Readers.
+
+ * Extraneous copies of Identically Recurring Element, making parsing
+ unnecessarily slow to the point of not being usable.
+
+ * Copies of Identically Recurring Element within a Parent Element
+ that contain invalid CRC-32 Elements. EBML Readers not checking
+ the CRC-32 might use the version of the element with mismatching
+ CRC-32s.
+
+ * Use of Void Elements that could be used to hide content or create
+ bogus resynchronization points seen by some EBML Readers and not
+ others.
+
+17. IANA Considerations
+
+17.1. EBML Element IDs Registry
+
+ This document creates a new IANA registry called the "EBML Element
+ IDs" registry.
+
+ Element IDs are described in Section 5. Element IDs are encoded
+ using the VINT mechanism described in Section 4 and can be between
+ one and five octets long. Five-octet-long Element IDs are possible
+ only if declared in the header.
+
+ This IANA registry only applies to Elements that can be contained in
+ the EBML Header, thus including Global Elements. Elements only found
+ in the EBML Body have their own set of independent Element IDs and
+ are not part of this IANA registry.
+
+ One-octet Element IDs MUST be between 0x81 and 0xFE. These items are
+ valuable because they are short, and they need to be used for
+ commonly repeated elements. Element IDs are to be allocated within
+ this range according to the "RFC Required" policy [RFC8126].
+
+ The following one-octet Element IDs are RESERVED: 0xFF and 0x80.
+
+ Values in the one-octet range of 0x00 to 0x7F are not valid for use
+ as an Element ID.
+
+ Two-octet Element IDs MUST be between 0x407F and 0x7FFE. Element IDs
+ are to be allocated within this range according to the "Specification
+ Required" policy [RFC8126].
+
+ The following two-octet Element IDs are RESERVED: 0x7FFF and 0x4000.
+
+ Values in the two-octet ranges of 0x0000 to 0x3FFF and 0x8000 to
+ 0xFFFF are not valid for use as an Element ID.
+
+ Three-octet Element IDs MUST be between 0x203FFF and 0x3FFFFE.
+ Element IDs are to be allocated within this range according to the
+ "First Come First Served" policy [RFC8126].
+
+ The following three-octet Element IDs are RESERVED: 0x3FFFFF and
+ 0x200000.
+
+ Values in the three-octet ranges of 0x000000 to 0x1FFFFF and 0x400000
+ to 0xFFFFFF are not valid for use as an Element ID.
+
+ Four-octet Element IDs MUST be between 0x101FFFFF and 0x1FFFFFFE.
+ Four-octet Element IDs are somewhat special in that they are useful
+ for resynchronizing to major structures in the event of data
+ corruption or loss. As such, four-octet Element IDs are split into
+ two categories. Four-octet Element IDs whose lower three octets (as
+ encoded) would make printable 7-bit ASCII values (0x20 to 0x7E,
+ inclusive) MUST be allocated by the "Specification Required" policy.
+ Sequential allocation of values is not required: specifications
+ SHOULD include a specific request and are encouraged to do early
+ allocations.
+
+ To be clear about the above category: four-octet Element IDs always
+ start with hex 0x10 to 0x1F, and that octet may be chosen so that the
+ entire VINT has some desirable property, such as a specific CRC. The
+ other three octets, when ALL having values between 0x20 (32, ASCII
+ Space) and 0x7E (126, ASCII "~"), fall into this category.
+
+ Other four-octet Element IDs may be allocated by the "First Come
+ First Served" policy.
+
+ The following four-octet Element IDs are RESERVED: 0x1FFFFFFF and
+ 0x10000000.
+
+ Values in the four-octet ranges of 0x00000000 to 0x0FFFFFFF and
+ 0x20000000 to 0xFFFFFFFF are not valid for use as an Element ID.
+
+ Five-octet Element IDs (values from 0x080FFFFFFF to 0x0FFFFFFFFE) are
+ RESERVED according to the "Experimental Use" policy [RFC8126]: they
+ may be used by anyone at any time, but there is no coordination.
+
+ ID Values found in this document are assigned as initial values as
+ follows:
+
+ +============+=========================+=================+
+ | Element ID | Element Name | Reference |
+ +============+=========================+=================+
+ | 0x1A45DFA3 | EBML | Described in |
+ | | | Section 11.2.1 |
+ +------------+-------------------------+-----------------+
+ | 0x4286 | EBMLVersion | Described in |
+ | | | Section 11.2.2 |
+ +------------+-------------------------+-----------------+
+ | 0x42F7 | EBMLReadVersion | Described in |
+ | | | Section 11.2.3 |
+ +------------+-------------------------+-----------------+
+ | 0x42F2 | EBMLMaxIDLength | Described in |
+ | | | Section 11.2.4 |
+ +------------+-------------------------+-----------------+
+ | 0x42F3 | EBMLMaxSizeLength | Described in |
+ | | | Section 11.2.5 |
+ +------------+-------------------------+-----------------+
+ | 0x4282 | DocType | Described in |
+ | | | Section 11.2.6 |
+ +------------+-------------------------+-----------------+
+ | 0x4287 | DocTypeVersion | Described in |
+ | | | Section 11.2.7 |
+ +------------+-------------------------+-----------------+
+ | 0x4285 | DocTypeReadVersion | Described in |
+ | | | Section 11.2.8 |
+ +------------+-------------------------+-----------------+
+ | 0x4281 | DocTypeExtension | Described in |
+ | | | Section 11.2.9 |
+ +------------+-------------------------+-----------------+
+ | 0x4283 | DocTypeExtensionName | Described in |
+ | | | Section 11.2.10 |
+ +------------+-------------------------+-----------------+
+ | 0x4284 | DocTypeExtensionVersion | Described in |
+ | | | Section 11.2.11 |
+ +------------+-------------------------+-----------------+
+ | 0xBF | CRC-32 | Described in |
+ | | | Section 11.3.1 |
+ +------------+-------------------------+-----------------+
+ | 0xEC | Void | Described in |
+ | | | Section 11.3.2 |
+ +------------+-------------------------+-----------------+
+
+ Table 15: IDs and Names for EBML Elements assigned by
+ this document
+
+17.2. EBML DocTypes Registry
+
+ This document creates a new IANA registry called the "EBML DocTypes"
+ registry.
+
+ To register a new DocType in this registry, one needs a DocType name,
+ a Description of the DocType, a Change Controller (IESG or email of
+ registrant), and an optional Reference to a document describing the
+ DocType.
+
+ DocType values are described in Section 11.1.4.1. DocTypes are ASCII
+ strings, defined in Section 7.4, which label the official name of the
+ EBML Document Type. The strings may be allocated according to the
+ "First Come First Served" policy.
+
+ The use of ASCII corresponds to the types and code already in use;
+ the value is not meant to be visible to the user.
+
+ DocType string values of "matroska" and "webm" are RESERVED to the
+ IETF for future use. These can be assigned via the "IESG Approval"
+ or "RFC Required" policies [RFC8126].
+
+18. Normative References
+
+ [IEEE.754] IEEE, "IEEE Standard for Binary Floating-Point
+ Arithmetic", 13 June 2019,
+ <https://standards.ieee.org/standard/754-2019.html>.
+
+ [ISO3309] International Organization for Standardization, "Data
+ communication -- High-level data link control procedures
+ -- Frame structure", ISO 3309, 3rd Edition, October 1984,
+ <https://www.iso.org/standard/8558.html>.
+
+ [ISO9899] International Organization for Standardization,
+ "Information technology -- Programming languages -- C",
+ ISO/IEC 9899:2011, 2011,
+ <https://www.iso.org/standard/57853.html>.
+
+ [ITU.V42] International Telecommunications Union, "Error-correcting
+ procedures for DCEs using asynchronous-to-synchronous
+ conversion", ITU-T Recommendation V.42, March 2002,
+ <https://www.itu.int/rec/T-REC-V.42>.
+
+ [RFC0020] Cerf, V., "ASCII format for network interchange", STD 80,
+ RFC 20, DOI 10.17487/RFC0020, October 1969,
+ <https://www.rfc-editor.org/info/rfc20>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC2648] Moats, R., "A URN Namespace for IETF Documents", RFC 2648,
+ DOI 10.17487/RFC2648, August 1999,
+ <https://www.rfc-editor.org/info/rfc2648>.
+
+ [RFC3339] Klyne, G. and C. Newman, "Date and Time on the Internet:
+ Timestamps", RFC 3339, DOI 10.17487/RFC3339, July 2002,
+ <https://www.rfc-editor.org/info/rfc3339>.
+
+ [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO
+ 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November
+ 2003, <https://www.rfc-editor.org/info/rfc3629>.
+
+ [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
+ DOI 10.17487/RFC3688, January 2004,
+ <https://www.rfc-editor.org/info/rfc3688>.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", STD 68, RFC 5234,
+ DOI 10.17487/RFC5234, January 2008,
+ <https://www.rfc-editor.org/info/rfc5234>.
+
+ [RFC5646] Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying
+ Languages", BCP 47, RFC 5646, DOI 10.17487/RFC5646,
+ September 2009, <https://www.rfc-editor.org/info/rfc5646>.
+
+ [RFC7405] Kyzivat, P., "Case-Sensitive String Support in ABNF",
+ RFC 7405, DOI 10.17487/RFC7405, December 2014,
+ <https://www.rfc-editor.org/info/rfc7405>.
+
+ [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for
+ Writing an IANA Considerations Section in RFCs", BCP 26,
+ RFC 8126, DOI 10.17487/RFC8126, June 2017,
+ <https://www.rfc-editor.org/info/rfc8126>.
+
+ [RFC8141] Saint-Andre, P. and J. Klensin, "Uniform Resource Names
+ (URNs)", RFC 8141, DOI 10.17487/RFC8141, April 2017,
+ <https://www.rfc-editor.org/info/rfc8141>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [XHTML] McCarron, S., "XHTML(tm) Basic 1.1 -- Second Edition",
+ Latest version available
+ at https://www.w3.org/TR/xhtml-basic, 27 March 2018,
+ <https://www.w3.org/TR/2018/SPSD-xhtml-basic-20180327/>.
+
+ [XML] Bray, T., Ed., Paoli, J., Ed., Sperberg-McQueen, C.M.,
+ Ed., Maler, E., Ed., and F. Yergeau, Ed., "Extensible
+ Markup Language (XML) 1.0 (Fifth Edition)", Latest version
+ available at https://www.w3.org/TR/xml/, 26 November 2008,
+ <https://www.w3.org/TR/2008/REC-xml-20081126/>.
+
+ [XML-SCHEMA]
+ Fallside, D.C. and P. Walmsley, "XML Schema Part 0: Primer
+ Second Edition", Latest version available at
+ http://www.w3.org/TR/xmlschema-0/, 28 October 2004,
+ <https://www.w3.org/TR/2004/REC-xmlschema-0-20041028/>.
+
+19. Informative References
+
+ [Matroska] Lhomme, S., Bunkus, M., and D. Rice, "Matroska Media
+ Container Format Specifications", Work in Progress,
+ Internet-Draft, draft-ietf-cellar-matroska-05, 17 April
+ 2020, <https://tools.ietf.org/html/draft-ietf-cellar-
+ matroska-05>.
+
+ [WebM] The WebM Project, "WebM Container Guidelines", 28 November
+ 2017, <https://www.webmproject.org/docs/container/>.
+
+ [XPath] Clark, J., Ed. and S. DeRose, "XML Path Language (XPath)
+ Version 1.0", Latest version available
+ at https://www.w3.org/TR/xpath, 16 November 1999,
+ <https://www.w3.org/TR/1999/REC-xpath-19991116>.
+
+Authors' Addresses
+
+ Steve Lhomme
+
+ Email: slhomme@matroska.org
+
+
+ Dave Rice
+
+ Email: dave@dericed.com
+
+
+ Moritz Bunkus
+
+ Email: moritz@bunkus.org