| rfc8794xml2.original.xml | rfc8794.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | ||||
| <rfc version="3" ipr="trust200902" docName="draft-ietf-cellar-ebml-20" sortRefs= | ||||
| "true" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w | ||||
| 3.org/2001/XInclude" tocInclude="true" symRefs="true" consensus="true" number="8 | ||||
| 794"> | ||||
| <front> | ||||
| <title abbrev="EBML">Extensible Binary Meta Language</title><seriesInfo value="8 | ||||
| 794" status="standard" name="RFC"></seriesInfo> | ||||
| <author initials="S." surname="Lhomme" fullname="Steve Lhomme"><address><postal> | ||||
| </postal><email>slhomme@matroska.org</email> | ||||
| </address></author> | ||||
| <author initials="D." surname="Rice" fullname="Dave Rice"><address><postal> | ||||
| </postal><email>dave@dericed.com</email> | ||||
| </address></author> | ||||
| <author initials="M." surname="Bunkus" fullname="Moritz Bunkus"><address><postal | ||||
| > | ||||
| </postal><email>moritz@bunkus.org</email> | ||||
| </address></author> | ||||
| <date year="2020" month="July"></date> | ||||
| <area>art</area> | ||||
| <workgroup>cellar</workgroup> | ||||
| <keyword>binary</keyword> | ||||
| <keyword>storage</keyword> | ||||
| <keyword>xml</keyword> | ||||
| <keyword>matroska</keyword> | ||||
| <keyword>webm</keyword> | ||||
| <abstract> | ||||
| <t>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 E | ||||
| lements with identifiers, lengths, and values. Similar to how an XML Schema defi | ||||
| nes the structure and semantics of an XML Document, this document defines how EB | ||||
| ML Schemas are created to convey the semantics of an EBML Document.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <middle> | ||||
| <section anchor="introduction"><name>Introduction</name> | ||||
| <t>EBML, short for Extensible Binary Meta Language, specifies a binary format | ||||
| aligned with octets (bytes) and inspired by the principle of XML (a framework fo | ||||
| r | ||||
| structuring data).</t> | ||||
| <t>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 | ||||
| <xref target="I-D.ietf-cellar-matroska"></xref>. The applicability of EBML for o | ||||
| ther | ||||
| use cases is beyond the scope of this document.</t> | ||||
| <t>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 <xref targe | ||||
| t="WebM"></xref>.</t> | ||||
| <t>EBML uses a simple approach of building Elements upon three pieces of data (t | ||||
| ag, length, and value), as this approach is well known, easy to parse, and allow | ||||
| s selective data parsing. The EBML structure additionally allows for hierarchica | ||||
| l arrangement to support complex structural formats in an efficient manner.</t> | ||||
| <t>A typical EBML file has the following structure:</t> | ||||
| <artwork>EBML Header (master) | ||||
| + DocType (string) | ||||
| + DocTypeVersion (unsigned integer) | ||||
| EBML Body Root (master) | ||||
| + ElementA (utf-8) | ||||
| + Parent (master) | ||||
| + ElementB (integer) | ||||
| + Parent (master) | ||||
| + ElementB (integer) | ||||
| </artwork> | ||||
| </section> | ||||
| <section anchor="notation-and-conventions"><name>Notation and Conventions</name> | ||||
| <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>& | ||||
| quot;, | ||||
| "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bc | ||||
| p14>SHALL NOT</bcp14>", | ||||
| "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | ||||
| "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>&quo | ||||
| t;, | ||||
| "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this | ||||
| document are to be interpreted as | ||||
| described in BCP 14 <xref target="RFC2119"></xref> <xref target="RFC8174">< | ||||
| /xref> | ||||
| when, and only when, they appear in all capitals, as shown here.</t> | ||||
| <t>This document defines specific terms in order to define the format and | ||||
| application of <tt>EBML</tt>. Specific terms are defined below:</t> | ||||
| <dl> | ||||
| <dt><tt>EBML</tt>:</dt> | ||||
| <dd>Extensible Binary Meta Language</dd> | ||||
| <dt><tt>EBML Document Type</tt>:</dt> | ||||
| <dd>A name provided by an <tt>EBML Schema</tt> to designate a particular | ||||
| implementation of <tt>EBML</tt> for a data format (e.g., Matroska and WebM).</dd | ||||
| > | ||||
| <dt><tt>EBML Schema</tt>:</dt> | ||||
| <dd>A standardized definition for the structure of an <tt>EBML Document Type</tt | ||||
| >.</dd> | ||||
| <dt><tt>EBML Document</tt>:</dt> | ||||
| <dd>A datastream comprised of only two components, an <tt>EBML Header</tt> and | ||||
| an <tt>EBML Body</tt>.</dd> | ||||
| <dt><tt>EBML Reader</tt>:</dt> | ||||
| <dd>A data parser that interprets the semantics of an <tt>EBML Document</tt> | ||||
| and creates a way for programs to use <tt>EBML</tt>.</dd> | ||||
| <dt><tt>EBML Stream</tt>:</dt> | ||||
| <dd>A file that consists of one or more <tt>EBML Documents</tt> that are | ||||
| concatenated together.</dd> | ||||
| <dt><tt>EBML Header</tt>:</dt> | ||||
| <dd>A declaration that provides processing instructions and identification of | ||||
| the <tt>EBML Body</tt>. The <tt>EBML Header</tt> is analogous to an XML Declarat | ||||
| ion | ||||
| <xref target="XML"></xref> (see Section 2.8 on "Prolog and Document Type De | ||||
| claration").</dd> | ||||
| <dt><tt>EBML Body</tt>:</dt> | ||||
| <dd>All data of an <tt>EBML Document</tt> following the <tt>EBML Header</tt>.</d | ||||
| d> | ||||
| <dt><tt>Variable-Size Integer</tt>:</dt> | ||||
| <dd>A compact variable-length binary value that defines its own length.</dd> | ||||
| <dt><tt>VINT</tt>:</dt> | ||||
| <dd>Also known as <tt>Variable-Size Integer</tt>.</dd> | ||||
| <dt><tt>EBML Element</tt>:</dt> | ||||
| <dd>A foundation block of data that contains three parts: an <tt>Element ID</tt> | ||||
| , | ||||
| an <tt>Element Data Size</tt>, and <tt>Element Data</tt>.</dd> | ||||
| <dt><tt>Element ID</tt>:</dt> | ||||
| <dd>A binary value, encoded as a <tt>Variable-Size Integer</tt>, | ||||
| used to uniquely identify a defined <tt>EBML Element</tt> within a specific | ||||
| <tt>EBML Schema</tt>.</dd> | ||||
| <dt><tt>Element Data Size</tt>:</dt> | ||||
| <dd>An expression, encoded as a <tt>Variable-Size Integer</tt>, of the length | ||||
| in octets of <tt>Element Data</tt>.</dd> | ||||
| <dt><tt>VINTMAX</tt>:</dt> | ||||
| <dd>The maximum possible value that can be stored as <tt>Element Data Size</tt>. | ||||
| </dd> | ||||
| <dt><tt>Unknown-Sized Element</tt>:</dt> | ||||
| <dd>An <tt>Element</tt> with an unknown <tt>Element Data Size</tt>.</dd> | ||||
| <dt><tt>Element Data</tt>:</dt> | ||||
| <dd>The value(s) of the <tt>EBML Element</tt>, which is identified by its | ||||
| <tt>Element ID</tt> and <tt>Element Data Size</tt>. The form of the <tt>Element | ||||
| Data</tt> is | ||||
| defined by this document and the corresponding <tt>EBML Schema</tt> of the | ||||
| Element's <tt>EBML Document Type</tt>.</dd> | ||||
| <dt><tt>Root Level</tt>:</dt> | ||||
| <dd>The starting level in the hierarchy of an <tt>EBML Document</tt>.</dd> | ||||
| <dt><tt>Root Element</tt>:</dt> | ||||
| <dd>A mandatory, nonrepeating <tt>EBML Element</tt> that occurs at the top | ||||
| level of the path hierarchy within an <tt>EBML Body</tt> and contains all other | ||||
| <tt>EBML Elements</tt> of the <tt>EBML Body</tt>, excepting optional <tt>Void El | ||||
| ements</tt>.</dd> | ||||
| <dt><tt>Top-Level Element</tt>:</dt> | ||||
| <dd>An <tt>EBML Element</tt> defined to only occur as a <tt>Child Element</tt> | ||||
| of the <tt>Root Element</tt>.</dd> | ||||
| <dt><tt>Master Element</tt>:</dt> | ||||
| <dd>The <tt>Master Element</tt> contains zero, one, or many other <tt>EBML Eleme | ||||
| nts</tt>.</dd> | ||||
| <dt><tt>Child Element</tt>:</dt> | ||||
| <dd>A <tt>Child Element</tt> is a relative term to describe the <tt>EBML Element | ||||
| s</tt> | ||||
| immediately contained within a <tt>Master Element</tt>.</dd> | ||||
| <dt><tt>Parent Element</tt>:</dt> | ||||
| <dd>A relative term to describe the <tt>Master Element</tt> that contains a | ||||
| specified element. For any specified <tt>EBML Element</tt> that is not at | ||||
| <tt>Root Level</tt>, the <tt>Parent Element</tt> refers to the <tt>Master Elemen | ||||
| t</tt> | ||||
| in which that <tt>EBML Element</tt> is directly contained.</dd> | ||||
| <dt><tt>Descendant Element</tt>:</dt> | ||||
| <dd>A relative term to describe any <tt>EBML Elements</tt> contained within a | ||||
| <tt>Master Element</tt>, including any of the <tt>Child Elements</tt> of its | ||||
| <tt>Child Elements</tt>, and so on.</dd> | ||||
| <dt><tt>Void Element</tt>:</dt> | ||||
| <dd>An <tt>Element</tt> used to overwrite data or | ||||
| reserve space within a <tt>Master Element</tt> for later use.</dd> | ||||
| <dt><tt>Element Name</tt>:</dt> | ||||
| <dd>The human-readable name of the <tt>EBML Element</tt>.</dd> | ||||
| <dt><tt>Element Path</tt>:</dt> | ||||
| <dd>The hierarchy of <tt>Parent Element</tt> where the <tt>EBML Element</tt> | ||||
| is expected to be found in the <tt>EBML Body</tt>.</dd> | ||||
| <dt><tt>Empty Element</tt>:</dt> | ||||
| <dd>An <tt>EBML Element</tt> that has an <tt>Element Data Size</tt> with all | ||||
| <tt>VINT_DATA</tt> bits set to zero, which indicates | ||||
| that the <tt>Element Data</tt> of the <tt>Element</tt> is zero octets in | ||||
| length.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="structure"><name>Structure</name> | ||||
| <t>EBML uses a system of Elements to compose an EBML Document. EBML Elements inc | ||||
| orporate 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.</t> | ||||
| </section> | ||||
| <section anchor="variable-size-integer"><name>Variable-Size Integer</name> | ||||
| <t>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 <bcp14>MUST</bcp14> | ||||
| 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.</t> | ||||
| <section anchor="vint-width"><name>VINT_WIDTH</name> | ||||
| <t>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 <tt>0</tt> | ||||
| and is terminated by the VINT_MARKER, which is a single bit of value | ||||
| <tt>1</tt>. The total length in bits of both VINT_WIDTH and VINT_MARKER is the | ||||
| total length in octets in of the Variable-Size Integer.</t> | ||||
| <t>The single bit <tt>1</tt> starts a Variable-Size Integer with a length of | ||||
| one octet. The sequence of bits <tt>01</tt> starts a Variable-Size Integer | ||||
| with a length of two octets. <tt>001</tt> starts a Variable-Size Integer with | ||||
| a length of three octets, and so on, with each additional <tt>0</tt> bit adding | ||||
| one | ||||
| octet to the length of the Variable-Size Integer.</t> | ||||
| </section> | ||||
| <section anchor="vint-marker"><name>VINT_MARKER</name> | ||||
| <t>The VINT_MARKER serves as a separator between the VINT_WIDTH and VINT_DATA. E | ||||
| ach Variable-Size Integer <bcp14>MUST</bcp14> contain exactly one VINT_MARKER. T | ||||
| he VINT_MARKER is one bit in length and contain a bit with a value of one. The f | ||||
| irst bit with a value of one within the Variable-Size Integer is the VINT_MARKER | ||||
| .</t> | ||||
| </section> | ||||
| <section anchor="vint-data"><name>VINT_DATA</name> | ||||
| <t>The VINT_DATA portion of the Variable-Size Integer includes all data followin | ||||
| g | ||||
| (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 <bcp14>MUST</bcp14> be zero-padded to the left to a size that | ||||
| fits. The VINT_DATA value <bcp14>MUST</bcp14> be expressed as a big-endian | ||||
| unsigned integer.</t> | ||||
| </section> | ||||
| <section anchor="vint-examples"><name>VINT Examples</name> | ||||
| <t><xref target="tableUsableBits"></xref> shows examples of Variable-Size | ||||
| Integers with lengths from 1 to 5 octets. The "Usable Bits" column ref | ||||
| ers 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 <tt>0</tt>, the VINT_MARKER as <tt>1</tt>, and the VINT_DATA as | ||||
| <tt>x</tt>.</t> | ||||
| <table anchor="tableUsableBits"><name>VINT examples depicting usable bits</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Octet Length</th> | ||||
| <th>Usable Bits</th> | ||||
| <th align="left">Representation</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>1</td> | ||||
| <td>7</td> | ||||
| <td align="left">1xxx xxxx</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>2</td> | ||||
| <td>14</td> | ||||
| <td align="left">01xx xxxx xxxx xxxx</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>3</td> | ||||
| <td>21</td> | ||||
| <td align="left">001x xxxx xxxx xxxx xxxx xxxx</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>4</td> | ||||
| <td>28</td> | ||||
| <td align="left">0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>5</td> | ||||
| <td>35</td> | ||||
| <td align="left">0000 1xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table><t>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 | ||||
| <xref target="tableVariousSizes"></xref>, an integer <tt>2</tt> (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.</t> | ||||
| <table anchor="tableVariousSizes"><name>VINT examples depicting the same | ||||
| integer value rendered at different VINT lengths</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Integer</th> | ||||
| <th>Octet Length</th> | ||||
| <th align="right">As Represented in VINT (binary)</th> | ||||
| <th align="right">As Represented in VINT (hexadecimal)</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>2</td> | ||||
| <td>1</td> | ||||
| <td align="right">1000 0010</td> | ||||
| <td align="right">0x82</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>2</td> | ||||
| <td>2</td> | ||||
| <td align="right">0100 0000 0000 0010</td> | ||||
| <td align="right">0x4002</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>2</td> | ||||
| <td>3</td> | ||||
| <td align="right">0010 0000 0000 0000 0000 0010</td> | ||||
| <td align="right">0x200002</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>2</td> | ||||
| <td>4</td> | ||||
| <td align="right">0001 0000 0000 0000 0000 0000 0000 0010</td> | ||||
| <td align="right">0x10000002</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table></section> | ||||
| </section> | ||||
| <section anchor="element-id"><name>Element ID</name> | ||||
| <t>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 | ||||
| <bcp14>MAY</bcp14> be used if the EBMLMaxIDLength Element of the EBML Header | ||||
| is set to a value greater than four (see | ||||
| <xref target="ebmlmaxidlength-element"></xref>). The bits of the VINT_DATA compo | ||||
| nent | ||||
| of the Element ID <bcp14>MUST NOT</bcp14> be all <tt>0</tt> values or all | ||||
| <tt>1</tt> values. The VINT_DATA component of the Element ID | ||||
| <bcp14>MUST</bcp14> be encoded at the shortest valid length. For example, an | ||||
| Element ID with binary encoding of <tt>1011 1111</tt> is valid, whereas an | ||||
| Element ID with binary encoding of <tt>0100 0000 0011 1111</tt> stores a | ||||
| semantically equal VINT_DATA but is invalid, because a shorter VINT encoding is | ||||
| possible. Additionally, an Element ID with binary encoding of <tt>1111 1111</tt> | ||||
| is invalid, since the VINT_DATA section is set to all one values, | ||||
| whereas an Element ID with binary encoding of <tt>0100 0000 0111 1111</tt> | ||||
| stores a semantically equal VINT_DATA and is the shortest-possible VINT | ||||
| encoding.</t> | ||||
| <t><xref target="tableElementIDValidity"></xref> details these specific examples | ||||
| further:</t> | ||||
| <table anchor="tableElementIDValidity"><name>Examples of valid and invalid Eleme | ||||
| nt IDs</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="right">VINT_WIDTH</th> | ||||
| <th align="right">VINT_MARKER</th> | ||||
| <th align="right">VINT_DATA</th> | ||||
| <th align="left">Element ID Status</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="right"></td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">0000000</td> | ||||
| <td align="left">Invalid: VINT_DATA <bcp14>MUST NOT</bcp14> be set to all 0</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0</td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">00000000000000</td> | ||||
| <td align="left">Invalid: VINT_DATA <bcp14>MUST NOT</bcp14> be set to all 0</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right"></td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">0000001</td> | ||||
| <td align="left">Valid</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0</td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">00000000000001</td> | ||||
| <td align="left">Invalid: A shorter VINT_DATA encoding is available.</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right"></td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">0111111</td> | ||||
| <td align="left">Valid</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0</td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">00000000111111</td> | ||||
| <td align="left">Invalid: A shorter VINT_DATA encoding is available.</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right"></td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">1111111</td> | ||||
| <td align="left">Invalid: VINT_DATA <bcp14>MUST NOT</bcp14> be set to all 1</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0</td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">00000001111111</td> | ||||
| <td align="left">Valid</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table><t>The range and count of possible Element IDs are determined by their | ||||
| octet length. Examples of this are provided in | ||||
| <xref target="tableElementIDRanges"></xref>.</t> | ||||
| <table anchor="tableElementIDRanges"><name>Examples of count and range for | ||||
| Element IDs at various octet lengths</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="center">Element ID Octet Length</th> | ||||
| <th align="center">Range of Valid Element IDs</th> | ||||
| <th align="right">Number of Valid Element IDs</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="center">1</td> | ||||
| <td align="center">0x81 - 0xFE</td> | ||||
| <td align="right">126</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">2</td> | ||||
| <td align="center">0x407F - 0x7FFE</td> | ||||
| <td align="right">16,256</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">3</td> | ||||
| <td align="center">0x203FFF - 0x3FFFFE</td> | ||||
| <td align="right">2,080,768</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">4</td> | ||||
| <td align="center">0x101FFFFF - 0x1FFFFFFE</td> | ||||
| <td align="right">268,338,304</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table></section> | ||||
| <section anchor="element-data-size"><name>Element Data Size</name> | ||||
| <section anchor="data-size-format"><name>Data Size Format</name> | ||||
| <t>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 <bcp14>MAY</bcp14> 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 | ||||
| <xref target="ebmlmaxsizelength-element"></xref>). 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).</t> | ||||
| <t>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 | ||||
| <xref target="ebml-element-types"></xref>). An Element Data Size with all VINT_D | ||||
| ATA | ||||
| 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 <bcp14>MUST</bcp14> | ||||
| interpret the value of the Empty Element as the default value. If an Empty | ||||
| Element has no default value declared, then the EBML Reader <bcp14>MUST</bcp14> | ||||
| 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.</t> | ||||
| </section> | ||||
| <section anchor="unknown-data-size"><name>Unknown Data Size</name> | ||||
| <t>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 <tt>unknownsizeallowed</tt> attribute of its EBML Schema is | ||||
| set to true (see <xref target="unknownsizeallowed"></xref>).</t> | ||||
| <t>The use of Unknown-Sized Elements allows an EBML Element to be written and re | ||||
| ad before the size of the EBML Element is known. Unknown-Sized Elements <bcp14>M | ||||
| UST</bcp14> only be used if the Element Data Size is not known before the Elemen | ||||
| t Data is written, such as in some cases of datastreaming. The end of an Unknown | ||||
| -Sized Element is determined by whichever comes first:</t> | ||||
| <ul> | ||||
| <li><t>Any EBML Element that is a valid Parent Element of the Unknown-Sized Elem | ||||
| ent according to the EBML Schema, Global Elements excluded.</t> | ||||
| </li> | ||||
| <li><t>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.</t> | ||||
| </li> | ||||
| <li><t>Any EBML Element that is a valid Root Element according to the EBML Schem | ||||
| a, Global Elements excluded.</t> | ||||
| </li> | ||||
| <li><t>The end of the Parent Element with a known size has been reached.</t> | ||||
| </li> | ||||
| <li><t>The end of the EBML Document, either when reaching the end of the file or | ||||
| because a new EBML Header started.</t> | ||||
| </li> | ||||
| </ul> | ||||
| <t>Consider an Unknown-Sized Element whose EBML path is | ||||
| <tt>\root\level1\level2\elt</tt>. 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 <tt>elt</tt>:</t> | ||||
| <table><name>Examples of determining the end of an Unknown-Sized Element | ||||
| </name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="left">EBML Path of new element</th> | ||||
| <th align="left">Status</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="left"><tt>\root\level1\level2</tt></td> | ||||
| <td align="left">Ends the Unknown-Sized Element, as it is a new Parent Element</ | ||||
| td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"><tt>\root\level1</tt></td> | ||||
| <td align="left">Ends the Unknown-Sized Element, as it is a new Parent Element</ | ||||
| td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"><tt>\root</tt></td> | ||||
| <td align="left">Ends the Unknown-Sized Element, as it is a new Root Element</td | ||||
| > | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"><tt>\root2</tt></td> | ||||
| <td align="left">Ends the Unknown-Sized Element, as it is a new Root Element</td | ||||
| > | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"><tt>\root\level1\level2\other</tt></td> | ||||
| <td align="left">Ends the Unknown-Sized Element, as they share the same parent</ | ||||
| td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"><tt>\root\level1\level2\elt</tt></td> | ||||
| <td align="left">Ends the Unknown-Sized Element, as they share the same parent</ | ||||
| td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"><tt>\root\level1\level2\elt\inside</tt></td> | ||||
| <td align="left">Doesn't end the Unknown-Sized Element; it's a child of <tt>elt< | ||||
| /tt></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"><tt>\root\level1\level2\elt\<global></tt></td> | ||||
| <td align="left">Global Element is valid; it's a child of <tt>elt</tt></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left"><tt>\root\level1\level2\<global></tt></td> | ||||
| <td align="left">Global Element cannot be interpreted with this path; while pars | ||||
| ing <tt>elt</tt>, a Global Element can only be a child of <tt>elt</tt></td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table></section> | ||||
| <section anchor="data-size-values"><name>Data Size Values</name> | ||||
| <t>For Element Data Sizes encoded at octet lengths from one to eight, | ||||
| <xref target="tableVintRangePerLength"></xref> depicts the range of possible val | ||||
| ues | ||||
| 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<sup>56</sup>-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.</t> | ||||
| <table anchor="tableVintRangePerLength"><name>Possible range of values that | ||||
| can be stored in VINTs, by octet length</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Octet Length</th> | ||||
| <th>Possible Value Range</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>1</td> | ||||
| <td>0 to 2<sup>7</sup> - 2</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>2</td> | ||||
| <td>0 to 2<sup>14</sup> - 2</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>3</td> | ||||
| <td>0 to 2<sup>21</sup> - 2</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>4</td> | ||||
| <td>0 to 2<sup>28</sup> - 2</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>5</td> | ||||
| <td>0 to 2<sup>35</sup> - 2</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>6</td> | ||||
| <td>0 to 2<sup>42</sup> - 2</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>7</td> | ||||
| <td>0 to 2<sup>49</sup> - 2</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>8</td> | ||||
| <td>0 to 2<sup>56</sup> - 2</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table><t>If the length of Element Data equals 2<sup>n*7</sup>-1, then the octe | ||||
| t | ||||
| length of the Element Data Size <bcp14>MUST</bcp14> be at least n+1. This rule | ||||
| prevents an Element Data Size from being expressed as the unknown-size | ||||
| value. <xref target="tableVintReservation"></xref> 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<sup>1*7</sup>-1) and 16,383 (which is equa | ||||
| l to | ||||
| 2<sup>2*7</sup>-1).</t> | ||||
| <table anchor="tableVintReservation"><name>Demonstration of VINT_DATA | ||||
| reservation for VINTs of unknown size</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="right">VINT_WIDTH</th> | ||||
| <th align="right">VINT_MARKER</th> | ||||
| <th align="right">VINT_DATA</th> | ||||
| <th>Element Data Size Status</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="right"></td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">1111111</td> | ||||
| <td>Reserved (meaning Unknown)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0</td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">00000001111111</td> | ||||
| <td>Valid (meaning 127 octets)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">00</td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">000000000000001111111</td> | ||||
| <td>Valid (meaning 127 octets)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0</td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">11111111111111</td> | ||||
| <td>Reserved (meaning Unknown)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">00</td> | ||||
| <td align="right">1</td> | ||||
| <td align="right">000000011111111111111</td> | ||||
| <td>Valid (16,383 octets)</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table></section> | ||||
| </section> | ||||
| <section anchor="ebml-element-types"><name>EBML Element Types</name> | ||||
| <t>EBML Elements are defined by an EBML Schema (see | ||||
| <xref target="ebml-schema"></xref>), which <bcp14>MUST</bcp14> declare one of th | ||||
| e | ||||
| 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.</t> | ||||
| <t>EBML Elements that are defined as a Signed Integer Element, Unsigned | ||||
| Integer Element, Float Element, or Date Element use big-endian storage.</t> | ||||
| <section anchor="signed-integer-element"><name>Signed Integer Element</name> | ||||
| <t>A Signed Integer Element <bcp14>MUST</bcp14> declare a length from zero to ei | ||||
| ght octets. If the EBML Element is not defined to have a default value, then a S | ||||
| igned Integer Element with a zero-octet length represents an integer value of ze | ||||
| ro.</t> | ||||
| <t>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.</t> | ||||
| </section> | ||||
| <section anchor="unsigned-integer-element"><name>Unsigned Integer Element</name> | ||||
| <t>An Unsigned Integer Element <bcp14>MUST</bcp14> 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.</t> | ||||
| <t>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.</t> | ||||
| </section> | ||||
| <section anchor="float-element"><name>Float Element</name> | ||||
| <t>A Float Element <bcp14>MUST</bcp14> 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.</t> | ||||
| <t>A Float Element stores a floating-point number in the 32-bit and 64-bit | ||||
| binary interchange format, as defined in <xref target="IEEE.754"></xref>.</t> | ||||
| </section> | ||||
| <section anchor="string-element"><name>String Element</name> | ||||
| <t>A String Element <bcp14>MUST</bcp14> declare a length in octets from zero to | ||||
| VINTMAX. If the EBML Element is not defined to have a default value, then a Stri | ||||
| ng Element with a zero-octet length represents an empty string.</t> | ||||
| <t>A String Element <bcp14>MUST</bcp14> either be empty (zero-length) or contain | ||||
| printable ASCII characters <xref target="RFC0020"></xref> in the range of 0x20 | ||||
| to 0x7E, with an exception made for termination (see <xref target="terminating-e | ||||
| lements"></xref>).</t> | ||||
| </section> | ||||
| <section anchor="utf-8-element"><name>UTF-8 Element</name> | ||||
| <t>A UTF-8 Element <bcp14>MUST</bcp14> declare a length in octets from zero to V | ||||
| INTMAX. 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.</t> | ||||
| <t>A UTF-8 Element contains only a valid Unicode string as defined in <xref targ | ||||
| et="RFC3629"></xref>, with an exception made for termination (see <xref target=" | ||||
| terminating-elements"></xref>).</t> | ||||
| </section> | ||||
| <section anchor="date-element"><name>Date Element</name> | ||||
| <t>A Date Element <bcp14>MUST</bcp14> 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:0 | ||||
| 0:00.000000000 UTC <xref target="RFC3339"></xref>.</t> | ||||
| <t>The Date Element stores an integer in the same format as the Signed Integer E | ||||
| lement that expresses a point in time referenced in nanoseconds from the precise | ||||
| beginning of the third millennium of the Gregorian Calendar in Coordinated Univ | ||||
| ersal Time (also known as 2001-01-01T00:00:00.000000000 UTC). This provides a po | ||||
| ssible expression of time from 1708-09-11T00:12:44.854775808 UTC to 2293-04-11T1 | ||||
| 1:47:16.854775807 UTC.</t> | ||||
| </section> | ||||
| <section anchor="master-element"><name>Master Element</name> | ||||
| <t>A Master Element <bcp14>MUST</bcp14> declare a length in octets from zero to | ||||
| VINTMAX or be of unknown length. See <xref target="element-data-size"></xref> fo | ||||
| r rules that apply to elements of unknown length.</t> | ||||
| <t>The Master Element contains zero or more other elements. EBML Elements contai | ||||
| ned within a Master Element <bcp14>MUST</bcp14> have the EBMLParentPath of their | ||||
| Element Path equal to the EBMLFullPath of the Master Element Element Path (see | ||||
| <xref target="path"></xref>). Element Data stored within Master Elements <bcp14> | ||||
| SHOULD</bcp14> only consist of EBML Elements and <bcp14>SHOULD NOT</bcp14> conta | ||||
| in 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 D | ||||
| ocument Type. Any data contained within a Master Element that is not part of a C | ||||
| hild Element <bcp14>MUST</bcp14> be ignored.</t> | ||||
| </section> | ||||
| <section anchor="binary-element"><name>Binary Element</name> | ||||
| <t>A Binary Element <bcp14>MUST</bcp14> declare a length in octets from zero to | ||||
| VINTMAX.</t> | ||||
| <t>The contents of a Binary Element should not be interpreted by the EBML Reader | ||||
| .</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="ebml-document"><name>EBML Document</name> | ||||
| <t>An EBML Document is composed of only two components, an EBML Header and an EB | ||||
| ML Body. An EBML Document <bcp14>MUST</bcp14> start with an EBML Header that dec | ||||
| lares significant characteristics of the entire EBML Body. An EBML Document cons | ||||
| ists of EBML Elements and <bcp14>MUST NOT</bcp14> contain any data that is not p | ||||
| art of an EBML Element.</t> | ||||
| <section anchor="ebml-header"><name>EBML Header</name> | ||||
| <t>The EBML Header is a declaration that provides processing instructions and id | ||||
| entification of the EBML Body. The EBML Header of an EBML Document is analogous | ||||
| to the XML Declaration of an XML Document.</t> | ||||
| <t>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.</t> | ||||
| <t>The EBML Header <bcp14>MUST</bcp14> contain a single Master Element with an | ||||
| Element Name of <tt>EBML</tt> and Element ID of <tt>0x1A45DFA3</tt> (see | ||||
| <xref target="ebml-element"></xref>); 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 <bcp14>MUST</bcp14> only contain EBML Elements that | ||||
| are defined as part of this document.</t> | ||||
| <t>Elements within an EBML Header can be at most 4 octets long, except for the | ||||
| EBML Element with Element Name <tt>EBML</tt> and Element ID | ||||
| <tt>0x1A45DFA3</tt> (see <xref target="ebml-element"></xref>); this Element can | ||||
| be up | ||||
| to 8 octets long.</t> | ||||
| </section> | ||||
| <section anchor="ebml-body"><name>EBML Body</name> | ||||
| <t>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 Head | ||||
| er at the Root Level or the end of the file. This document defines precisely whi | ||||
| ch EBML Elements are to be used within the EBML Header but does not name or defi | ||||
| ne which EBML Elements are to be used within the EBML Body. The definition of wh | ||||
| ich EBML Elements are to be used within the EBML Body is defined by an EBML Sche | ||||
| ma.</t> | ||||
| <t>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.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="ebml-stream"><name>EBML Stream</name> | ||||
| <t>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.</t> | ||||
| </section> | ||||
| <section anchor="ebml-versioning"><name>EBML Versioning</name> | ||||
| <t>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 compat | ||||
| ible.</t> | ||||
| <section anchor="ebml-header-version"><name>EBML Header Version</name> | ||||
| <t>The version of the EBML Header is found in EBMLVersion. An EBML parser can re | ||||
| ad an EBML Header if it can read either the EBMLVersion version or a version equ | ||||
| al or higher than the one found in EBMLReadVersion.</t> | ||||
| </section> | ||||
| <section anchor="ebml-document-version"><name>EBML Document Version</name> | ||||
| <t>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.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="elements-semantics"><name>Elements semantics</name> | ||||
| <section anchor="ebml-schema"><name>EBML Schema</name> | ||||
| <t>An EBML Schema is a well-formed XML Document | ||||
| <xref target="XML"></xref> 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 <xref target="XML-SCHEMA"></xref> to an XML | ||||
| Document <xref target="XML"></xref>. An EBML Schema | ||||
| <bcp14>MUST</bcp14> 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 | ||||
| <xref target="doctype-element"></xref>). The DocType value for an EBML Document | ||||
| Type | ||||
| <bcp14>MUST</bcp14> be unique, persistent, and described in the IANA registry | ||||
| (see <xref target="ebml-doctypes-registry"></xref>).</t> | ||||
| <t>An EBML Schema <bcp14>MUST</bcp14> declare exactly one EBML Element at Root L | ||||
| evel (referred to as the Root Element) that occurs exactly once within an EBML D | ||||
| ocument. The Void Element <bcp14>MAY</bcp14> also occur at Root Level but is not | ||||
| a Root Element (see <xref target="void-element"></xref>).</t> | ||||
| <t>The EBML Schema <bcp14>MUST</bcp14> 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).</t> | ||||
| <t>The EBML Schema <bcp14>MUST NOT</bcp14> use the Element ID | ||||
| <tt>0x1A45DFA3</tt>, which is reserved for the EBML Header for the purpose of | ||||
| resynchronization.</t> | ||||
| <t>An EBML Schema <bcp14>MAY</bcp14> constrain the use of EBML Header Elements | ||||
| (see <xref target="ebml-header-elements"></xref>) by adding or constraining | ||||
| that Element's <tt>range</tt> attribute. For example, an EBML Schema | ||||
| <bcp14>MAY</bcp14> constrain the EBMLMaxSizeLength to a maximum value of | ||||
| <tt>8</tt> or <bcp14>MAY</bcp14> constrain the EBMLVersion to only support a | ||||
| value of <tt>1</tt>. 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 | ||||
| <bcp14>MUST</bcp14> be documented within an <tt><element></tt> node of | ||||
| the EBML Schema. This document provides an example of an EBML Schema; see | ||||
| <xref target="ebml-schema-example"></xref>.</t> | ||||
| <section anchor="ebml-schema-example"><name>EBML Schema Example</name> | ||||
| <sourcecode type="xml"><?xml version="1.0" encoding="utf-8&quo | ||||
| t;?> | ||||
| <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&q | ||||
| uot; | ||||
| id="0x42F7" minOccurs="1" maxOccurs="1" range=& | ||||
| quot;1" default="1" | ||||
| type="uinteger"/> | ||||
| <element name="EBMLMaxSizeLength" | ||||
| path="\EBML\EBMLMaxSizeLength" id="0x42F3" minOccurs=&quo | ||||
| t;1" | ||||
| maxOccurs="1" range="8" default="8" type=" | ||||
| uinteger"/> | ||||
| <!-- Root Element--> | ||||
| <element name="Files" path="\Files" id="0x1946696C& | ||||
| quot; | ||||
| 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& | ||||
| quot; | ||||
| 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="0x | ||||
| 4664" | ||||
| type="binary" minOccurs="1"> | ||||
| <documentation lang="en" purpose="definition"> | ||||
| The data of the file. | ||||
| </documentation> | ||||
| </element> | ||||
| </EBMLSchema> | ||||
| </sourcecode> | ||||
| </section> | ||||
| <section anchor="ebmlschema-element"><name><tt><EBMLSchema></tt> Element</ | ||||
| name> | ||||
| <t>Within an EBML Schema, the XPath <xref target="XPath"></xref> of the | ||||
| <tt><EBMLSchema></tt> element is <tt>/EBMLSchema</tt>.</t> | ||||
| <t>When used as an XML Document, the EBML Schema <bcp14>MUST</bcp14> use | ||||
| <tt><EBMLSchema></tt> as the top-level element. The | ||||
| <tt><EBMLSchema></tt> element can contain <tt><element></tt> | ||||
| subelements.</t> | ||||
| </section> | ||||
| <section anchor="ebmlschema-namespace"><name><tt><EBMLSchema></tt> Namespa | ||||
| ce</name> | ||||
| <t>The namespace URI for elements of the EBML Schema is a URN as defined by | ||||
| <xref target="RFC2141"></xref> that uses the namespace identifier 'ietf' defined | ||||
| by <xref target="RFC2648"></xref> | ||||
| and extended by <xref target="RFC3688"></xref>. This URN is <tt>urn:ietf:rfc:879 | ||||
| 4</tt>.</t> | ||||
| </section> | ||||
| <section anchor="ebmlschema-attributes"><name><tt><EBMLSchema></tt> Attrib | ||||
| utes</name> | ||||
| <t>Within an EBML Schema, the <tt><EBMLSchema></tt> element uses the | ||||
| following attributes to define an EBML Element:</t> | ||||
| <section anchor="doctype"><name>docType</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@docType</tt> attribute is | ||||
| <tt>/EBMLSchema/@docType</tt>.</t> | ||||
| <t>The docType lists the official name of the EBML Document Type that is | ||||
| defined by the EBML Schema; for example, | ||||
| <tt><EBMLSchema docType="matroska"></tt>.</t> | ||||
| <t>The <tt>docType</tt> attribute is <bcp14>REQUIRED</bcp14> within the | ||||
| <tt><EBMLSchema></tt> Element.</t> | ||||
| </section> | ||||
| <section anchor="version"><name>version</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@version</tt> attribute is | ||||
| <tt>/EBMLSchema/@version</tt>.</t> | ||||
| <t>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 <tt>minver</tt> and <tt>maxver</tt> attributes of | ||||
| <tt><element></tt>.</t> | ||||
| <t>The <tt>version</tt> attribute is <bcp14>REQUIRED</bcp14> within the | ||||
| <tt><EBMLSchema></tt> Element.</t> | ||||
| </section> | ||||
| <section anchor="ebml"><name>ebml</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@ebml</tt> attribute is <tt>/EBML | ||||
| Schema/@ebml</tt>.</t> | ||||
| <t>The <tt>ebml</tt> attribute is a positive integer that specifies the | ||||
| version of the EBML Header (see <xref target="ebmlversion-element"></xref>) | ||||
| used by the EBML Schema. If the attribute is omitted, the EBML Header version | ||||
| is 1.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="element-element"><name><tt><element></tt> Element</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt><element></tt> element is | ||||
| <tt>/EBMLSchema/element</tt>.</t> | ||||
| <t>Each <tt><element></tt> defines one EBML Element through the use of | ||||
| several attributes that are defined in | ||||
| <xref target="element-attributes"></xref>. EBML Schemas <bcp14>MAY</bcp14> conta | ||||
| in | ||||
| additional attributes to extend the semantics but <bcp14>MUST NOT</bcp14> | ||||
| conflict with the definitions of the <tt><element></tt> attributes | ||||
| defined within this document.</t> | ||||
| <t>The <tt><element></tt> nodes contain a description of the meaning and u | ||||
| se of the EBML Element stored within one or more <tt><documentation></tt> | ||||
| subelements, followed by optional <tt><implementation_note></tt> subelemen | ||||
| ts, followed by zero or one <tt><restriction></tt> subelement, followed by | ||||
| optional <tt><extension></tt> subelements. All <tt><element></tt> n | ||||
| odes <bcp14>MUST</bcp14> be subelements of the <tt><EBMLSchema></tt>.</t> | ||||
| </section> | ||||
| <section anchor="element-attributes"><name><tt><element></tt> Attributes</ | ||||
| name> | ||||
| <t>Within an EBML Schema, the <tt><element></tt> uses the following | ||||
| attributes to define an EBML Element:</t> | ||||
| <section anchor="name"><name>name</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@name</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@name</tt>.</t> | ||||
| <t>The name provides the human-readable name of the EBML Element. The value of | ||||
| the name <bcp14>MUST</bcp14> be in the form of characters "A" to | ||||
| "Z", "a" to "z", "0" to "9", | ||||
| "-", and ".". The first character of the name | ||||
| <bcp14>MUST</bcp14> be in the form of an "A" to "Z", | ||||
| "a" to "z", or "0" to "9" character.</t> | ||||
| <t>The <tt>name</tt> attribute is <bcp14>REQUIRED</bcp14>.</t> | ||||
| </section> | ||||
| <section anchor="path"><name>path</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@path</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@path</tt>.</t> | ||||
| <t>The path defines the allowed storage locations of the EBML Element within | ||||
| an EBML Document. This path <bcp14>MUST</bcp14> be defined with the full | ||||
| hierarchy of EBML Elements separated with a <tt>\</tt>. The top EBML Element | ||||
| in the path hierarchy is the first in the value. The syntax of the | ||||
| <tt>path</tt> attribute is defined using this Augmented Backus-Naur Form | ||||
| (ABNF) <xref target="RFC5234"></xref> with the case-sensitive update | ||||
| <xref target="RFC7405"></xref> notation:</t> | ||||
| <t>The <tt>path</tt> attribute is <bcp14>REQUIRED</bcp14>.</t> | ||||
| <sourcecode type="abnf">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 | ||||
| </sourcecode> | ||||
| <t>The <tt>*</tt>, <tt>(</tt>, and <tt>)</tt> symbols are interpreted as defined | ||||
| in <xref target="RFC5234"></xref>.</t> | ||||
| <t>The EBMLAtomName of the EBMLElement part <bcp14>MUST</bcp14> be equal to the | ||||
| <tt>@name</tt> attribute of the EBML Schema. | ||||
| If the EBMLElement part contains an IsRecursive part, the EBML Element can occur | ||||
| within itself recursively (see <xref target="recursive"></xref>).</t> | ||||
| <t>The starting PathDelimiter of EBMLParentPath corresponds to the root of the E | ||||
| BML Document.</t> | ||||
| <t>The <tt>@path</tt> value <bcp14>MUST</bcp14> be unique within the EBML Schema | ||||
| . The <tt>@id</tt> value corresponding to this <tt>@path</tt> <bcp14>MUST NOT</b | ||||
| cp14> be defined for use within another EBML Element with the same EBMLParentPat | ||||
| h as this <tt>@path</tt>.</t> | ||||
| <t>A path with a GlobalPlaceholder as the EBMLLastParent defines a Global Elemen | ||||
| t; see <xref target="global-elements"></xref>. | ||||
| If the element has no EBMLLastParent part, or the EBMLLastParent part is not a | ||||
| GlobalPlaceholder, then the Element is not a Global Element.</t> | ||||
| <t>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.</t> | ||||
| <t>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 <bcp14>MUST NOT</bcp14> 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 <bcp14>MUST</bcp14> be bigger than, or equal to, | ||||
| PathMinOccurrence.</t> | ||||
| <t>For example, in <tt>\a\(0-1\)global</tt>, the Element path | ||||
| <tt>\a\x\global</tt> corresponds to an EBMLPathAtom occurrence of 1. The | ||||
| Element <tt>\a\x\y\global</tt> corresponds to an EBMLPathAtom occurrence of 2, | ||||
| etc. In those cases, <tt>\a\x</tt> or <tt>\a\x\y</tt> <bcp14>MUST</bcp14> be val | ||||
| id | ||||
| paths to be able to contain the element <tt>global</tt>.</t> | ||||
| <t>Consider another EBML Path, <tt>\a\(1-\)global</tt>. There has to be at | ||||
| least one EBMLPathAtom between the <tt>\a\</tt> part and <tt>global</tt>. | ||||
| So the <tt>global</tt> EBML Element cannot be found inside the <tt>\a</tt> | ||||
| EBML Element, as it means the resulting path <tt>\a\global</tt> has no | ||||
| EBMLPathAtom between the <tt>\a\</tt> and <tt>global</tt>. However, the | ||||
| <tt>global</tt> EBML Element can be found inside the <tt>\a\b</tt> EBML | ||||
| Element, because the resulting path, <tt>\a\b\global</tt>, has one EBMLPathAtom | ||||
| between the <tt>\a\</tt> and <tt>global</tt>. Alternatively, it can be found | ||||
| inside the <tt>\a\b\c</tt> EBML Element (two EBMLPathAtom), or inside the | ||||
| <tt>\a\b\c\d</tt> EBML Element (three EBMLPathAtom), etc.</t> | ||||
| <t>Consider another EBML Path, <tt>\a\(0-1\)global</tt>. There has to be at | ||||
| most one EBMLPathAtom between the <tt>\a\</tt> part and <tt>global</tt>. | ||||
| So the <tt>global</tt> EBML Element can be found inside either the <tt>\a</tt> | ||||
| EBML Element (0 EBMLPathAtom replacing GlobalPlaceholder) or the | ||||
| <tt>\a\b</tt> EBML Element (one replacement EBMLPathAtom). | ||||
| But it cannot be found inside the <tt>\a\b\c</tt> EBML Element, because the | ||||
| resulting path, <tt>\a\b\c\global</tt>, has two EBMLPathAtom between | ||||
| <tt>\a\</tt> and <tt>global</tt>.</t> | ||||
| </section> | ||||
| <section anchor="id"><name>id</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@id</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@id</tt>.</t> | ||||
| <t>The Element ID is encoded as a Variable-Size Integer. It is read and stored i | ||||
| n big-endian | ||||
| order. In the EBML Schema, it is expressed in | ||||
| hexadecimal notation prefixed by a 0x. To reduce the risk of false positives whi | ||||
| le parsing EBML Streams, the | ||||
| Element IDs of the Root Element and Top-Level Elements <bcp14>SHOULD</bcp14> | ||||
| be at least 4 octets in length. Element IDs defined for use at Root Level or | ||||
| directly under the Root Level <bcp14>MAY</bcp14> 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.</t> | ||||
| <t>The Element ID of any Element found within an EBML Document <bcp14>MUST</bcp1 | ||||
| 4> only match a single <tt>@path</tt> value of its corresponding EBML Schema, bu | ||||
| t a separate instance of that Element ID value defined by the EBML Schema <bcp14 | ||||
| >MAY</bcp14> occur within a different <tt>@path</tt>. If more than one Element i | ||||
| s defined to use the same <tt>@id</tt> value, then the <tt>@path</tt> values of | ||||
| those Elements <bcp14>MUST NOT</bcp14> share the same EBMLParentPath. Elements < | ||||
| bcp14>MUST NOT</bcp14> be defined to use the same <tt>@id</tt> value if one of t | ||||
| heir common Parent Elements could be an Unknown-Sized Element.</t> | ||||
| <t>The <tt>id</tt> attribute is <bcp14>REQUIRED</bcp14>.</t> | ||||
| </section> | ||||
| <section anchor="minoccurs"><name>minOccurs</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@minOccurs</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@minOccurs</tt>.</t> | ||||
| <t><tt>minOccurs</tt> is a nonnegative integer expressing the minimum permitted | ||||
| number | ||||
| of occurrences of this EBML Element within its Parent Element.</t> | ||||
| <t>Each instance of the Parent Element <bcp14>MUST</bcp14> contain at least this | ||||
| many instances of this EBML Element. | ||||
| If the EBML Element has an empty EBMLParentPath, then <tt>minOccurs</tt> refers | ||||
| to | ||||
| constraints on the occurrence of the EBML Element within the EBML Document. | ||||
| EBML Elements with <tt>minOccurs</tt> set to "1" that also have a defa | ||||
| ult | ||||
| value (see <xref target="default"></xref>) declared are not | ||||
| <bcp14>REQUIRED</bcp14> to be stored but are <bcp14>REQUIRED</bcp14> to be | ||||
| interpreted; see | ||||
| <xref target="note-on-the-use-of-default-attributes-to-define-mandatory-ebml-ele | ||||
| ments"></xref>.</t> | ||||
| <t>An EBML Element defined with a <tt>minOccurs</tt> value greater than zero is | ||||
| called | ||||
| a Mandatory EBML Element.</t> | ||||
| <t>The <tt>minOccurs</tt> attribute is <bcp14>OPTIONAL</bcp14>. If the <tt>minOc | ||||
| curs</tt> | ||||
| attribute is not present, then that EBML Element has a <tt>minOccurs</tt> value | ||||
| of | ||||
| 0.</t> | ||||
| <t>The semantic meaning of <tt>minOccurs</tt> within an EBML Schema is analogous | ||||
| to the meaning of <tt>minOccurs</tt> within an XML Schema.</t> | ||||
| </section> | ||||
| <section anchor="maxoccurs"><name>maxOccurs</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@maxOccurs</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@maxOccurs</tt>.</t> | ||||
| <t><tt>maxOccurs</tt> is a nonnegative integer expressing the maximum permitted | ||||
| number | ||||
| of occurrences of this EBML Element within its Parent Element.</t> | ||||
| <t>Each instance of the Parent Element <bcp14>MUST</bcp14> contain at most | ||||
| this many instances of this EBML Element, including the unwritten mandatory | ||||
| element with a default value; see | ||||
| <xref target="note-on-the-use-of-default-attributes-to-define-mandatory-ebml-ele | ||||
| ments"></xref>. | ||||
| If the EBML Element has an empty EBMLParentPath, then <tt>maxOccurs</tt> refers | ||||
| to | ||||
| constraints on the occurrence of the EBML Element within the EBML | ||||
| Document.</t> | ||||
| <t>The <tt>maxOccurs</tt> attribute is <bcp14>OPTIONAL</bcp14>. If the <tt>maxOc | ||||
| curs</tt> | ||||
| 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 El | ||||
| ement | ||||
| is empty.</t> | ||||
| <t>The semantic meaning of <tt>maxOccurs</tt> within an EBML Schema is analogous | ||||
| to the | ||||
| meaning of <tt>maxOccurs</tt> within an XML Schema; when it is not present, it's | ||||
| similar to xml:maxOccurs="unbounded" in an XML Schema.</t> | ||||
| </section> | ||||
| <section anchor="range"><name>range</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@range</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@range</tt>.</t> | ||||
| <t>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 <bcp14>MUST</bcp14> be within the defined range. See | ||||
| <xref target="expression-of-range"></xref> for rules applied to expression of ra | ||||
| nge | ||||
| values.</t> | ||||
| <t>The <tt>range</tt> attribute is <bcp14>OPTIONAL</bcp14>. If the | ||||
| <tt>range</tt> attribute is | ||||
| not present, then any value legal for the <tt>type</tt> attribute is valid.</t> | ||||
| <section anchor="expression-of-range"><name>Expression of range</name> | ||||
| <t>The <tt>range</tt> attribute <bcp14>MUST</bcp14> only be used with EBML Eleme | ||||
| nts | ||||
| 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 | ||||
| <bcp14>MUST NOT</bcp14> convey meaning.</t> | ||||
| <t>To set a fixed value for the range, the value is used as the attribute | ||||
| value. For example, <tt>1234</tt> means the EBML element always has the value | ||||
| 1234. The value can be prefixed with <tt>not</tt> to indicate that the fixed | ||||
| value <bcp14>MUST NOT</bcp14> be used for that Element. For example, | ||||
| <tt>not 1234</tt> means the Element can use all values of its type except 1234.< | ||||
| /t> | ||||
| <t>The <tt>></tt> sign is used for an exclusive lower boundary, and the | ||||
| <tt>>=</tt> sign is used for an inclusive lower boundary. For example, | ||||
| <tt>>3</tt> means the Element value <bcp14>MUST</bcp14> be greater than 3, | ||||
| and <tt>>=0x1p+0</tt> means the Element value <bcp14>MUST</bcp14> be | ||||
| greater than or equal to the floating value 1.0; see | ||||
| <xref target="textual-expression-of-floats"></xref>.</t> | ||||
| <t>The <tt><</tt> sign is used for an exclusive upper boundary, and the | ||||
| <tt><=</tt> sign is used for an inclusive upper boundary. For example, | ||||
| <tt><-2</tt> means the Element value <bcp14>MUST</bcp14> be less than -2, | ||||
| and <tt><=10</tt> means the Element value <bcp14>MUST</bcp14> be less than | ||||
| or equal to 10.</t> | ||||
| <t>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, <tt>>3,<= 20</tt> means the | ||||
| Element value <bcp14>MUST</bcp14> be greater than 3 and less than or equal to | ||||
| 20.</t> | ||||
| <t>A special form of lower and upper bounds using the <tt>-</tt> separator is | ||||
| possible, meaning the Element value <bcp14>MUST</bcp14> be greater than, or equa | ||||
| l to, | ||||
| the first value and <bcp14>MUST</bcp14> be less than or equal to the | ||||
| second value. For example, <tt>1-10</tt> is equivalent to | ||||
| <tt>>=1,<=10</tt>. If the upper boundary is negative, the <tt>range</tt> a | ||||
| ttribute | ||||
| <bcp14>MUST</bcp14> only use the latter form.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="length"><name>length</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@length</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@length</tt>.</t> | ||||
| <t>The <tt>length</tt> attribute is a value to express the valid length of the E | ||||
| lement | ||||
| 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 <bcp14>MUST</bcp14> be expressed as either a | ||||
| nonnegative integer or a range (see | ||||
| <xref target="expression-of-range"></xref>) that consists of only nonnegative | ||||
| integers and valid operators.</t> | ||||
| <t>The <tt>length</tt> attribute is <bcp14>OPTIONAL</bcp14>. If the | ||||
| <tt>length</tt> 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.</t> | ||||
| </section> | ||||
| <section anchor="default"><name>default</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@default</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@default</tt>.</t> | ||||
| <t>If an Element is mandatory (has a <tt>minOccurs</tt> value greater than zero) | ||||
| but not written within its Parent Element or stored as an Empty Element, then t | ||||
| he EBML Reader of the EBML Document <bcp14>MUST</bcp14> semantically interpret t | ||||
| he EBML Element as present with this specified default value for the EBML Elemen | ||||
| t. | ||||
| An unwritten mandatory Element with a declared default value is semantically equ | ||||
| ivalent to that Element if written with the default value stored as the Element | ||||
| Data. | ||||
| EBML Elements that are Master Elements <bcp14>MUST NOT</bcp14> declare a default | ||||
| value. | ||||
| EBML Elements with a <tt>minOccurs</tt> value greater than 1 <bcp14>MUST NOT</bc | ||||
| p14> declare a default value.</t> | ||||
| <t>The default attribute is <bcp14>OPTIONAL</bcp14>.</t> | ||||
| </section> | ||||
| <section anchor="type"><name>type</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@type</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@type</tt>.</t> | ||||
| <t>The type <bcp14>MUST</bcp14> be set to one of the following values: | ||||
| <tt>integer</tt> (signed integer), <tt>uinteger</tt> (unsigned integer), | ||||
| <tt>float</tt>, <tt>string</tt>, <tt>date</tt>, <tt>utf-8</tt>, | ||||
| <tt>master</tt>, or <tt>binary</tt>. The content of each type is defined | ||||
| in <xref target="ebml-element-types"></xref>.</t> | ||||
| <t>The <tt>type</tt> attribute is <bcp14>REQUIRED</bcp14>.</t> | ||||
| </section> | ||||
| <section anchor="unknownsizeallowed"><name>unknownsizeallowed</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@unknownsizeallowed</tt> | ||||
| attribute is <tt>/EBMLSchema/element/@unknownsizeallowed</tt>.</t> | ||||
| <t>This attribute is a boolean to express whether an EBML Element is permitted t | ||||
| o | ||||
| be an Unknown-Sized Element (having all VINT_DATA bits of Element Data Size set | ||||
| to 1). EBML Elements that are not Master Elements <bcp14>MUST NOT</bcp14> set | ||||
| <tt>unknownsizeallowed</tt> to true. An EBML Element that is defined with an | ||||
| <tt>unknownsizeallowed</tt> attribute set to 1 <bcp14>MUST</bcp14> also have the | ||||
| <tt>unknownsizeallowed</tt> attribute of its Parent Element set to 1.</t> | ||||
| <t>An EBML Element with the <tt>unknownsizeallowed</tt> attribute set to 1 | ||||
| <bcp14>MUST NOT</bcp14> have its <tt>recursive</tt> attribute set to 1.</t> | ||||
| <t>The <tt>unknownsizeallowed</tt> attribute is <bcp14>OPTIONAL</bcp14>. If the | ||||
| <tt>unknownsizeallowed</tt> attribute is not used, then that EBML Element is not | ||||
| allowed to use an unknown Element Data Size.</t> | ||||
| </section> | ||||
| <section anchor="recursive"><name>recursive</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@recursive</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@recursive</tt>.</t> | ||||
| <t>This attribute is a boolean to express whether an EBML Element is permitted t | ||||
| o | ||||
| be stored recursively. If it is allowed, the EBML Element <bcp14>MAY</bcp14> 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 <bcp14>MUST NOT</bcp14> set recursive to | ||||
| true.</t> | ||||
| <t>If the EBMLElement part of the <tt>@path</tt> contains an IsRecursive part, | ||||
| then the <tt>recursive</tt> value <bcp14>MUST</bcp14> be true; otherwise, it | ||||
| <bcp14>MUST</bcp14> be false.</t> | ||||
| <t>An EBML Element with the <tt>recursive</tt> attribute set to 1 <bcp14>MUST NO | ||||
| T</bcp14> | ||||
| have its <tt>unknownsizeallowed</tt> attribute set to 1.</t> | ||||
| <t>The <tt>recursive</tt> attribute is <bcp14>OPTIONAL</bcp14>. If the <tt>recur | ||||
| sive</tt> | ||||
| attribute is not present, then the EBML Element <bcp14>MUST NOT</bcp14> be | ||||
| used recursively.</t> | ||||
| </section> | ||||
| <section anchor="recurring"><name>recurring</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@recurring</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@recurring</tt>.</t> | ||||
| <t>This attribute is a boolean to express whether or not an EBML Element is defi | ||||
| ned as an | ||||
| Identically Recurring Element; see | ||||
| <xref target="identically-recurring-elements"></xref>.</t> | ||||
| <t>The <tt>recurring</tt> attribute is <bcp14>OPTIONAL</bcp14>. If the <tt>recur | ||||
| ring</tt> | ||||
| attribute is not present, then the EBML Element is not an Identically | ||||
| Recurring Element.</t> | ||||
| </section> | ||||
| <section anchor="minver"><name>minver</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@minver</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@minver</tt>.</t> | ||||
| <t>The <tt>minver</tt> (minimum version) attribute stores a nonnegative integer | ||||
| that | ||||
| represents the first version of the docType to support the EBML Element.</t> | ||||
| <t>The <tt>minver</tt> attribute is <bcp14>OPTIONAL</bcp14>. If the <tt>minver</ | ||||
| tt> | ||||
| attribute is not present, then the EBML Element has a minimum version of | ||||
| "1".</t> | ||||
| </section> | ||||
| <section anchor="maxver"><name>maxver</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@maxver</tt> attribute is | ||||
| <tt>/EBMLSchema/element/@maxver</tt>.</t> | ||||
| <t>The <tt>maxver</tt> (maximum version) attribute stores a nonnegative integer | ||||
| that | ||||
| represents the last or most recent version of the docType to support the | ||||
| element. <tt>maxver</tt> <bcp14>MUST</bcp14> be greater than or equal to <tt>min | ||||
| ver</tt>.</t> | ||||
| <t>The <tt>maxver</tt> attribute is <bcp14>OPTIONAL</bcp14>. If the <tt>maxver</ | ||||
| tt> attribute is | ||||
| not present, then the EBML Element has a maximum version equal to the value | ||||
| stored in the <tt>version</tt> attribute of <tt><EBMLSchema></tt>.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="documentation-element"><name><tt><documentation></tt> Ele | ||||
| ment</name> | ||||
| <t>Within an EBML Schema, the XPaths of the <tt><documentation></tt> | ||||
| elements are <tt>/EBMLSchema/element/documentation</tt> and <tt>/EBMLSchema/elem | ||||
| ent/restriction/enum/documentation</tt>.</t> | ||||
| <t>The <tt><documentation></tt> element provides additional information | ||||
| about EBML Elements or enumeration values. Within the <tt><documentation>< | ||||
| /tt> element, the | ||||
| following XHTML <xref target="XHTML"></xref> elements <bcp14>MAY</bcp14> be | ||||
| used: <tt><a></tt>, <tt><br></tt>, and <tt><strong></tt>.</t> | ||||
| </section> | ||||
| <section anchor="documentation-attributes"><name><tt><documentation></tt> | ||||
| Attributes</name> | ||||
| <section anchor="lang"><name>lang</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@lang</tt> attribute is | ||||
| <tt>/EBMLSchema/element/documentation/@lang</tt>.</t> | ||||
| <t>The <tt>lang</tt> attribute is set to the value from <xref target="RFC5646">< | ||||
| /xref> of | ||||
| the language of the element's documentation.</t> | ||||
| <t>The <tt>lang</tt> attribute is <bcp14>OPTIONAL</bcp14>.</t> | ||||
| </section> | ||||
| <section anchor="purpose"><name>purpose</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@purpose</tt> attribute is | ||||
| <tt>/EBMLSchema/element/documentation/@purpose</tt>.</t> | ||||
| <t>A <tt>purpose</tt> attribute distinguishes the meaning of the documentation. | ||||
| Values | ||||
| for the <tt><documentation></tt> subelement's <tt>purpose</tt> attribute | ||||
| <bcp14>MUST</bcp14> include one of the values listed in | ||||
| <xref target="tablePurposeDefinitions"></xref>.</t> | ||||
| <table anchor="tablePurposeDefinitions"><name>Definitions of the permitted | ||||
| values for the <tt>purpose</tt> attribute of the documentation Element</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="left">value of <tt>purpose</tt> attribute</th> | ||||
| <th align="left">definition</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="left">definition</td> | ||||
| <td align="left">A "definition" is recommended for every defined EBML | ||||
| Element. This documentation explains the semantic meaning of the EBML Element.</ | ||||
| td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">rationale</td> | ||||
| <td align="left">An explanation about the reason or catalyst for the definition | ||||
| of the Element.</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">usage notes</td> | ||||
| <td align="left">Recommended practices or guidelines for both reading, writing, | ||||
| or interpreting the Element.</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">references</td> | ||||
| <td align="left">Informational references to support the contextualization and u | ||||
| nderstanding of the value of the Element.</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table><t>The <tt>purpose</tt> attribute is <bcp14>REQUIRED</bcp14>.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="implementation-note-element"><name><tt><implementation_note& | ||||
| gt;</tt> Element</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt><implementation_note></tt> | ||||
| element is <tt>/EBMLSchema/element/implementation_note</tt>.</t> | ||||
| <t>In some cases within an EBML Document Type, the attributes of the | ||||
| <tt><element></tt> 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 ma | ||||
| ny | ||||
| <tt><implementation_note></tt> elements can be used to store that | ||||
| information. | ||||
| The <tt><implementation_note></tt> refers to a specific attribute of the | ||||
| parent <tt><element></tt> as expressed by the <tt>note_attribute</tt> | ||||
| attribute (see <xref target="note-attribute"></xref>).</t> | ||||
| </section> | ||||
| <section anchor="implementation-note-attributes"><name><tt><implementation_no | ||||
| te></tt> Attributes</name> | ||||
| <section anchor="note-attribute"><name>note_attribute</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@note_attribute</tt> attribute | ||||
| is <tt>/EBMLSchema/element/implementation_note/@note_attribute</tt>.</t> | ||||
| <t>The <tt>note_attribute</tt> attribute references which of the attributes of t | ||||
| he | ||||
| <tt><element></tt> the <tt><implementation_note></tt> relates to. | ||||
| The <tt>note_attribute</tt> attribute <bcp14>MUST</bcp14> be set to one of the | ||||
| following values (corresponding to that attribute of the parent | ||||
| <tt><element></tt>): <tt>minOccurs</tt>, <tt>maxOccurs</tt>, | ||||
| <tt>range</tt>, <tt>length</tt>, <tt>default</tt>, <tt>minver</tt>, or | ||||
| <tt>maxver</tt>. The <tt><implementation_note></tt> <bcp14>SHALL</bcp14> | ||||
| supersede the parent <tt><element></tt>'s attribute that is named in the | ||||
| <tt>note_attribute</tt> attribute. | ||||
| An <tt><element></tt> <bcp14>SHALL NOT</bcp14> have more than one <tt>< | ||||
| implementation_note></tt> of the same <tt>note_attribute</tt>.</t> | ||||
| <t>The <tt>note_attribute</tt> attribute is <bcp14>REQUIRED</bcp14>.</t> | ||||
| </section> | ||||
| <section anchor="implementation-note-example"><name><tt><implementation_note& | ||||
| gt;</tt> Example</name> | ||||
| <t>The following fragment of an EBML Schema demonstrates how an | ||||
| <tt><implementation_note></tt> 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 <tt><implementation_note></tt> to say that the | ||||
| Currency Element is <bcp14>REQUIRED</bcp14> if the Cost Element is set, | ||||
| otherwise not.</t> | ||||
| <sourcecode type="xml"><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&q | ||||
| uot; | ||||
| type="master"> | ||||
| <documentation lang="en" purpose="definition"> | ||||
| An item. | ||||
| </documentation> | ||||
| </element> | ||||
| <element name="Cost" path="\Items\Item\Cost" id="0x4 | ||||
| 024" | ||||
| 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=& | ||||
| quot;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> | ||||
| </sourcecode> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="restriction-element"><name><tt><restriction></tt> Element | ||||
| </name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt><restriction></tt> | ||||
| element is <tt>/EBMLSchema/element/restriction</tt>.</t> | ||||
| <t>The <tt><restriction></tt> element provides information about | ||||
| restrictions to the allowable values for the EBML Element, which are listed in | ||||
| <tt><enum></tt> elements.</t> | ||||
| </section> | ||||
| <section anchor="enum-element"><name><tt><enum></tt> Element</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt><enum></tt> element is | ||||
| <tt>/EBMLSchema/element/restriction/enum</tt>.</t> | ||||
| <t>The <tt><enum></tt> element stores a list of values allowed for | ||||
| storage in the EBML Element. The values <bcp14>MUST</bcp14> match the type of | ||||
| the EBML Element (for example, <tt><enum value="Yes"></tt> | ||||
| cannot be a valid value for an EBML Element that is defined as an unsigned | ||||
| integer). An <tt><enum></tt> element <bcp14>MAY</bcp14> also store | ||||
| <tt><documentation></tt> elements to further describe the | ||||
| <tt><enum></tt>.</t> | ||||
| </section> | ||||
| <section anchor="enum-attributes"><name><tt><enum></tt> Attributes</name> | ||||
| <section anchor="label"><name>label</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@label</tt> attribute is | ||||
| <tt>/EBMLSchema/element/restriction/enum/@label</tt>.</t> | ||||
| <t>The label provides a concise expression for human consumption that | ||||
| describes what the value of <tt><enum></tt> represents.</t> | ||||
| <t>The <tt>label</tt> attribute is <bcp14>OPTIONAL</bcp14>.</t> | ||||
| </section> | ||||
| <section anchor="value"><name>value</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@value</tt> attribute is | ||||
| <tt>/EBMLSchema/element/restriction/enum/@value</tt>.</t> | ||||
| <t>The value represents data that <bcp14>MAY</bcp14> be stored within the EBML E | ||||
| lement.</t> | ||||
| <t>The <tt>value</tt> attribute is <bcp14>REQUIRED</bcp14>.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="extension-element"><name><tt><extension></tt> Element</na | ||||
| me> | ||||
| <t>Within an EBML Schema, the XPath of the <tt><extension></tt> | ||||
| element is <tt>/EBMLSchema/element/extension</tt>.</t> | ||||
| <t>The <tt><extension></tt> element provides an unconstrained element to | ||||
| contain information about the associated EBML <tt><element></tt>, which | ||||
| is undefined by this document but <bcp14>MAY</bcp14> be defined by the | ||||
| associated EBML Document Type. The <tt><extension></tt> element | ||||
| <bcp14>MUST</bcp14> contain a <tt>type</tt> attribute and also | ||||
| <bcp14>MAY</bcp14> contain any other attribute or subelement as long as the | ||||
| EBML Schema remains as a well-formed XML Document. All | ||||
| <tt><extension></tt> elements <bcp14>MUST</bcp14> be subelements of the | ||||
| <tt><element></tt>.</t> | ||||
| </section> | ||||
| <section anchor="extension-attributes"><name><tt><extension></tt> Attribut | ||||
| es</name> | ||||
| <section anchor="type-1"><name>type</name> | ||||
| <t>Within an EBML Schema, the XPath of the <tt>@type</tt> attribute is | ||||
| <tt>/EBMLSchema/element/extension/@type</tt>.</t> | ||||
| <t>The <tt>type</tt> attribute should reference a name or identifier of the | ||||
| project or authority associated with the contents of the | ||||
| <tt><extension></tt> element.</t> | ||||
| <t>The <tt>type</tt> attribute is <bcp14>REQUIRED</bcp14>.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="xml-schema-for-ebml-schema"><name>XML Schema for EBML Schema</n | ||||
| ame> | ||||
| <t>The following provides an XML Schema <xref target="XML-SCHEMA"></xref> for | ||||
| facilitating verification of an EBML Schema described in | ||||
| <xref target="ebml-schema"></xref>.</t> | ||||
| <sourcecode type="xml"><?xml version="1.0" encoding="UTF-8&quo | ||||
| t;?> | ||||
| <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=&quo | ||||
| t;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&qu | ||||
| ot; | ||||
| minOccurs="0" maxOccurs="unbounded"/> | ||||
| <xs:element name="restriction" type="restrictionType&quo | ||||
| t; | ||||
| 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&q | ||||
| uot; | ||||
| 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"&g | ||||
| t; | ||||
| <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& | ||||
| quot; | ||||
| 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> | ||||
| </sourcecode> | ||||
| </section> | ||||
| <section anchor="identically-recurring-elements"><name>Identically Recurring Ele | ||||
| ments</name> | ||||
| <t>An Identically Recurring Element is an EBML Element that <bcp14>MAY</bcp14> | ||||
| occur within its Parent Element more than once, but each recurrence of it | ||||
| within that Parent Element <bcp14>MUST</bcp14> 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 | ||||
| <bcp14>SHOULD</bcp14> 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.</t> | ||||
| </section> | ||||
| <section anchor="textual-expression-of-floats"><name>Textual expression of float | ||||
| s</name> | ||||
| <t>When a float value is represented textually in an EBML Schema, such as | ||||
| within a default or range value, the float values <bcp14>MUST</bcp14> be | ||||
| expressed as Hexadecimal Floating-Point Constants as defined in the C11 | ||||
| standard <xref target="ISO9899"></xref> (see Section 6.4.4.2 on Floating | ||||
| Constants). <xref target="tableFloatExamples"></xref> provides examples of | ||||
| expressions of float ranges.</t> | ||||
| <table anchor="tableFloatExamples"><name>Example of Floating-Point values and | ||||
| ranges as decimal and Hexadecimal Floating-Point Constants</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="left">as decimal</th> | ||||
| <th align="left">as Hexadecimal Floating-Point Constants</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="left">0.0</td> | ||||
| <td align="left"><tt>0x0p+1</tt></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0.0-1.0</td> | ||||
| <td align="left"><tt>0x0p+1-0x1p+0</tt></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">1.0-256.0</td> | ||||
| <td align="left"><tt>0x1p+0-0x1p+8</tt></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0.857421875</td> | ||||
| <td align="left"><tt>0x1.b7p-1</tt></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">-1.0--0.857421875</td> | ||||
| <td align="left"><tt>-0x1p+0--0x1.b7p-1</tt></td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table><t>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.</t> | ||||
| </section> | ||||
| <section anchor="note-on-the-use-of-default-attributes-to-define-mandatory-ebml- | ||||
| elements"><name>Note on the use of default attributes to define Mandatory EBML E | ||||
| lements</name> | ||||
| <t>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 <bcp14>MUST</bcp14> be read by the EBML Reader, | ||||
| although the EBML Element is not present within its Parent Element.</t> | ||||
| <t>If a Mandatory EBML Element has no default value declared by an EBML Schema | ||||
| and its Parent Element is present, then the EBML Element <bcp14>MUST</bcp14> | ||||
| 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 | ||||
| <bcp14>MUST</bcp14> be present.</t> | ||||
| <t><xref target="tableVintRequirements"></xref> clarifies whether a Mandatory | ||||
| EBML Element <bcp14>MUST</bcp14> be written, according to whether the default va | ||||
| lue | ||||
| is declared, the value of the EBML Element is equal to the declared default | ||||
| value, and/or the Parent Element is used.</t> | ||||
| <table anchor="tableVintRequirements"><name>Demonstration of the conditional | ||||
| requirements of VINT Storage</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="center">Is the default value declared?</th> | ||||
| <th align="center">Is the value equal to default?</th> | ||||
| <th align="center">Is the Parent Element present?</th> | ||||
| <th align="center">Then is storing the EBML Element <bcp14>REQUIRED</bcp14>?</th | ||||
| > | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="center">Yes</td> | ||||
| <td align="center">Yes</td> | ||||
| <td align="center">Yes</td> | ||||
| <td align="center">No</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">Yes</td> | ||||
| <td align="center">Yes</td> | ||||
| <td align="center">No</td> | ||||
| <td align="center">No</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">Yes</td> | ||||
| <td align="center">No</td> | ||||
| <td align="center">Yes</td> | ||||
| <td align="center">Yes</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">Yes</td> | ||||
| <td align="center">No</td> | ||||
| <td align="center">No</td> | ||||
| <td align="center">No</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">No</td> | ||||
| <td align="center">n/a</td> | ||||
| <td align="center">Yes</td> | ||||
| <td align="center">Yes</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="center">No</td> | ||||
| <td align="center">n/a</td> | ||||
| <td align="center">No</td> | ||||
| <td align="center">No</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table></section> | ||||
| </section> | ||||
| <section anchor="ebml-header-elements"><name>EBML Header Elements</name> | ||||
| <t>This document contains definitions of all EBML Elements of the EBML Header.</ | ||||
| t> | ||||
| <section anchor="ebml-element"><name>EBML Element</name> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>EBML</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\EBML</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0x1A45DFA3</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>maxOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>Master Element</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>Set the EBML characteristics of the data to follow. Each EBML Document has | ||||
| to start with this.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="ebmlversion-element"><name>EBMLVersion Element</name> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>EBMLVersion</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\EBML\EBMLVersion</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0x4286</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>maxOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>range:</dt> | ||||
| <dd>not 0</dd> | ||||
| <dt>default:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>Unsigned Integer</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>The version of EBML specifications used to create the EBML Document. The | ||||
| version of EBML defined in this document is 1, so EBMLVersion | ||||
| <bcp14>SHOULD</bcp14> be 1.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="ebmlreadversion-element"><name>EBMLReadVersion Element</name> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>EBMLReadVersion</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\EBML\EBMLReadVersion</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0x42F7</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>maxOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>range:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>default:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>Unsigned Integer</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>The minimum EBML version an EBML Reader has to support to read this EBML | ||||
| Document. The EBMLReadVersion Element <bcp14>MUST</bcp14> be less than or equal | ||||
| to EBMLVersion.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="ebmlmaxidlength-element"><name>EBMLMaxIDLength Element</name> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>EBMLMaxIDLength</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\EBML\EBMLMaxIDLength</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0x42F2</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>maxOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>range:</dt> | ||||
| <dd>>=4</dd> | ||||
| <dt>default:</dt> | ||||
| <dd>4</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>Unsigned Integer</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>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 <bcp14>RECOMMENDED</bcp14>, though larger values are allowed.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="ebmlmaxsizelength-element"><name>EBMLMaxSizeLength Element</nam | ||||
| e> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>EBMLMaxSizeLength</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\EBML\EBMLMaxSizeLength</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0x42F3</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>maxOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>range:</dt> | ||||
| <dd>not 0</dd> | ||||
| <dt>default:</dt> | ||||
| <dd>8</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>Unsigned Integer</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>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 <tt>length</tt> of | ||||
| all Element Data Size expressions within the EBML Body and not an upper bound | ||||
| for the <tt>value</tt> of all Element Data Size expressions | ||||
| within the EBML Body. EBML Elements that have an Element Data Size expression th | ||||
| at is larger in octets | ||||
| than what is expressed by EBMLMaxSizeLength Element are invalid.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="doctype-element"><name>DocType Element</name> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>DocType</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\EBML\DocType</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0x4282</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>maxOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>length:</dt> | ||||
| <dd>>0</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>String</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>A string that describes and identifies the content of the EBML Body that | ||||
| follows this EBML Header.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="doctypeversion-element"><name>DocTypeVersion Element</name> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>DocTypeVersion</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\EBML\DocTypeVersion</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0x4287</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>maxOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>range:</dt> | ||||
| <dd>not 0</dd> | ||||
| <dt>default:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>Unsigned Integer</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>The version of DocType interpreter used to create the EBML Document.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="doctypereadversion-element"><name>DocTypeReadVersion Element</n | ||||
| ame> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>DocTypeReadVersion</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\EBML\DocTypeReadVersion</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0x4285</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>maxOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>range:</dt> | ||||
| <dd>not 0</dd> | ||||
| <dt>default:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>Unsigned Integer</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>The minimum DocType version an EBML Reader has to support to read this | ||||
| EBML Document. The value of the DocTypeReadVersion Element <bcp14>MUST</bcp14> | ||||
| be less than or equal to the value of the DocTypeVersion Element.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="doctypeextension-element"><name>DocTypeExtension Element</name> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>DocTypeExtension</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\EBML\DocTypeExtension</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0x4281</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>0</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>Master Element</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>A DocTypeExtension adds extra Elements to the main DocType+DocTypeVersion | ||||
| tuple it's attached to. An EBML Reader <bcp14>MAY</bcp14> know these extra Eleme | ||||
| nts and how | ||||
| to use them. A DocTypeExtension <bcp14>MAY</bcp14> 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.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="doctypeextensionname-element"><name>DocTypeExtensionName Elemen | ||||
| t</name> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>DocTypeExtensionName</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\EBML\DocTypeExtension\DocTypeExtensionName</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0x4283</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>maxOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>length:</dt> | ||||
| <dd>>0</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>String</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>The name of the DocTypeExtension to differentiate it from other | ||||
| DocTypeExtensions of the same DocType+DocTypeVersion tuple. A DocTypeExtensionNa | ||||
| me value | ||||
| <bcp14>MUST</bcp14> be unique within the EBML Header.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="doctypeextensionversion-element"><name>DocTypeExtensionVersion | ||||
| Element</name> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>DocTypeExtensionVersion</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\EBML\DocTypeExtension\DocTypeExtensionVersion</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0x4284</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>maxOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>range:</dt> | ||||
| <dd>not 0</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>Unsigned Integer</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>The version of the DocTypeExtension. Different DocTypeExtensionVersion | ||||
| values of the same DocType + DocTypeVersion + DocTypeExtensionName tuple | ||||
| <bcp14>MAY</bcp14> contain completely different sets of extra Elements. An | ||||
| EBML Reader <bcp14>MAY</bcp14> support multiple versions | ||||
| of the same tuple, only one version of the tuple, or not support the tuple at al | ||||
| l.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="global-elements"><name>Global Elements</name> | ||||
| <t>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 <bcp14>MAY</bcp14> add other Global Elements to the format it | ||||
| defines. These extra elements apply only to the EBML Body, not the EBML | ||||
| Header.</t> | ||||
| <t>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".</t> | ||||
| <t>A Global Element can be found in many Parent Elements, allowing the same numb | ||||
| er of occurrences in each Parent where this Element is found.</t> | ||||
| <section anchor="crc-32-element"><name>CRC-32 Element</name> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>CRC-32</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\(1-\)CRC-32</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0xBF</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>0</dd> | ||||
| <dt>maxOccurs:</dt> | ||||
| <dd>1</dd> | ||||
| <dt>length:</dt> | ||||
| <dd>4</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>Binary</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>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 | ||||
| <bcp14>MUST</bcp14> 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 <bcp14>SHOULD</bcp14> include a CRC-32 Element as a Child | ||||
| Element. The CRC in use is the IEEE-CRC-32 algorithm as used in the | ||||
| <xref target="ISO3309"></xref> standard and in Section 8.1.1.6.2 of | ||||
| <xref target="ITU.V42"></xref>, with initial value of 0xFFFFFFFF. The CRC value | ||||
| <bcp14>MUST</bcp14> be computed on a little-endian bytestream and | ||||
| <bcp14>MUST</bcp14> use little-endian storage.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| <section anchor="void-element"><name>Void Element</name> | ||||
| <dl> | ||||
| <dt>name:</dt> | ||||
| <dd>Void</dd> | ||||
| <dt>path:</dt> | ||||
| <dd><tt>\(-\)Void</tt></dd> | ||||
| <dt>id:</dt> | ||||
| <dd>0xEC</dd> | ||||
| <dt>minOccurs:</dt> | ||||
| <dd>0</dd> | ||||
| <dt>type:</dt> | ||||
| <dd>Binary</dd> | ||||
| <dt>description:</dt> | ||||
| <dd>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.</dd> | ||||
| </dl> | ||||
| </section> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="considerations-for-reading-ebml-data"><name>Considerations for | ||||
| Reading EBML Data</name> | ||||
| <t>The following scenarios describe events to consider when reading EBML | ||||
| Documents, as well as the recommended design of an EBML Reader.</t> | ||||
| <t>If a Master Element contains a CRC-32 Element that doesn't validate, then | ||||
| the EBML Reader <bcp14>MAY</bcp14> ignore all contained data except for | ||||
| Descendant Elements that contain their own valid CRC-32 Element.</t> | ||||
| <t>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 <bcp14>MAY</bcp14> be used.</t> | ||||
| <sourcecode type="xml"><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> | ||||
| </sourcecode> | ||||
| <t>If a Master Element contains more occurrences of a Child Master Element | ||||
| than permitted according to the <tt>maxOccurs</tt> and <tt>recurring</tt> | ||||
| attributes of the | ||||
| definition of that Element, then the occurrences in addition to <tt>maxOccurs</t | ||||
| t> | ||||
| <bcp14>MAY</bcp14> be ignored.</t> | ||||
| <t>If a Master Element contains more occurrences of a Child Element than | ||||
| permitted according to the <tt>maxOccurs</tt> attribute of the definition of tha | ||||
| t | ||||
| Element, then all instances of that Element after the first <tt>maxOccurs</tt> | ||||
| occurrences from the beginning of its Parent Element <bcp14>SHOULD</bcp14> be | ||||
| ignored.</t> | ||||
| </section> | ||||
| <section anchor="terminating-elements"><name>Terminating Elements</name> | ||||
| <t>Null Octets, which are octets with all bits set to zero, <bcp14>MAY</bcp14> f | ||||
| ollow the value of a String Element or UTF-8 Element to serve as a terminator. | ||||
| An EBML Writer <bcp14>MAY</bcp14> 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 <bcp14>NOT RECOMMENDED</ | ||||
| bcp14>. | ||||
| The Element Data of a UTF-8 Element <bcp14>MUST</bcp14> | ||||
| 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 Ele | ||||
| ment, | ||||
| any Null octet itself and any following data within that Element | ||||
| <bcp14>SHOULD</bcp14> be ignored. A string value and a copy of that string | ||||
| value terminated by one or more Null Octets are semantically equal.</t> | ||||
| <t><xref target="tableNullOctetSemantics"></xref> 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.</t> | ||||
| <table anchor="tableNullOctetSemantics"><name>Examples of semantics for Null | ||||
| Octets in VINT_DATA</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="left">Stored Value</th> | ||||
| <th align="left">Semantic Meaning</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="left">0x65 0x62 0x6D 0x6C</td> | ||||
| <td align="left">0x65 0x62 0x6D 0x6C</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0x65 0x62 0x00 0x6C</td> | ||||
| <td align="left">0x65 0x62</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0x65 0x62 0x00 0x00</td> | ||||
| <td align="left">0x65 0x62</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="left">0x65 0x62</td> | ||||
| <td align="left">0x65 0x62</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table></section> | ||||
| <section anchor="guidelines-for-updating-elements"><name>Guidelines for Updating | ||||
| Elements</name> | ||||
| <t>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.</t> | ||||
| <section anchor="reducing-element-data-in-size"><name>Reducing Element Data in S | ||||
| ize</name> | ||||
| <t>There are three methods to reduce the size of Element Data of a written EBML | ||||
| Element.</t> | ||||
| <section anchor="adding-a-void-element"><name>Adding a Void Element</name> | ||||
| <t>When an EBML Element is changed to reduce its total length by more than one o | ||||
| ctet, an EBML Writer <bcp14>SHOULD</bcp14> fill the freed space with a Void Elem | ||||
| ent.</t> | ||||
| </section> | ||||
| <section anchor="extending-the-element-data-size"><name>Extending the Element Da | ||||
| ta Size</name> | ||||
| <t>The same value for Element Data Size <bcp14>MAY</bcp14> be written in various | ||||
| lengths, so for minor reductions of the Element Data, the Element Size <bcp14>M | ||||
| AY</bcp14> be written to a longer octet length to fill the freed space.</t> | ||||
| <t>For example, the first row of | ||||
| <xref target="tableShortenVintOneOctet"></xref> depicts a String Element that st | ||||
| ores | ||||
| 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 | ||||
| <bcp14>MAY</bcp14> 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.</t> | ||||
| <table anchor="tableShortenVintOneOctet"><name>Example of editing a VINT to | ||||
| reduce VINT_DATA length by one octet</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Status</th> | ||||
| <th>Element ID</th> | ||||
| <th>Element Data Size</th> | ||||
| <th>Element Data</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>Before edit</td> | ||||
| <td>0x3B4040</td> | ||||
| <td>0x84</td> | ||||
| <td>0x65626D6C</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>After edit</td> | ||||
| <td>0x3B4040</td> | ||||
| <td>0x4003</td> | ||||
| <td>0x6D6B76</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table><t>This method is <bcp14>RECOMMENDED</bcp14> when the Element Data is | ||||
| reduced by a single octet; for reductions by two or more octets, it is | ||||
| <bcp14>RECOMMENDED</bcp14> to fill the freed space with a Void Element.</t> | ||||
| <t>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 <bcp14>RECOMMENDED</bcp14> 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, | ||||
| <xref target="tableShortenVintMoreThanOneOctet"></xref> 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.</t> | ||||
| <table anchor="tableShortenVintMoreThanOneOctet"><name>Example of editing a | ||||
| VINT to reduce VINT_DATA length by more than one octet</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Status</th> | ||||
| <th>Element ID</th> | ||||
| <th>Element Data Size</th> | ||||
| <th>Element Data</th> | ||||
| <th>Void Element</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>Before</td> | ||||
| <td>0x3B4040</td> | ||||
| <td>0x4003</td> | ||||
| <td>0x6D6B76</td> | ||||
| <td></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>After</td> | ||||
| <td>0x3B4040</td> | ||||
| <td>0x82</td> | ||||
| <td>0x6869</td> | ||||
| <td>0xEC80</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table></section> | ||||
| <section anchor="terminating-element-data"><name>Terminating Element Data</name> | ||||
| <t>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 | ||||
| <xref target="terminating-elements"></xref>).</t> | ||||
| <t>In <xref target="tableExampleNullPadding"></xref>, 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 th | ||||
| erefore | ||||
| remains unchanged.</t> | ||||
| <table anchor="tableExampleNullPadding"><name>Example of terminating VINT_DATA | ||||
| with a Null Octet when reducing VINT length during an edit</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Status</th> | ||||
| <th>Element ID</th> | ||||
| <th>Element Data Size</th> | ||||
| <th>Element Data</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>Before edit</td> | ||||
| <td>0x3B4040</td> | ||||
| <td>0x84</td> | ||||
| <td>0x65626D6C</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>After edit</td> | ||||
| <td>0x3B4040</td> | ||||
| <td>0x84</td> | ||||
| <td>0x6D6B7600</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table><t>Note that this method is <bcp14>NOT RECOMMENDED</bcp14>. For | ||||
| reductions of one octet, the method for Extending the Element Data Size | ||||
| <bcp14>SHOULD</bcp14> be used. For reduction by more than one octet, the | ||||
| method for Adding a Void Element <bcp14>SHOULD</bcp14> be used.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="considerations-when-updating-elements-with-cyclic-redundancy-ch | ||||
| eck-crc"><name>Considerations when Updating Elements with Cyclic Redundancy Chec | ||||
| k (CRC)</name> | ||||
| <t>If the Element to be changed is a Descendant Element of any Master Element | ||||
| that contains a CRC-32 Element (see <xref target="crc-32-element"></xref>), | ||||
| then the CRC-32 Element <bcp14>MUST</bcp14> be verified before permitting the | ||||
| change. Additionally, the CRC-32 Element value <bcp14>MUST</bcp14> be | ||||
| subsequently updated to reflect the changed data.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="backward-and-forward-compatibility"><name>Backward and Forward | ||||
| Compatibility</name> | ||||
| <t>Elements of an EBML format <bcp14>SHOULD</bcp14> be designed with backward an | ||||
| d forward compatibility in mind.</t> | ||||
| <section anchor="backward-compatibility"><name>Backward Compatibility</name> | ||||
| <t>Backward compatibility of new EBML Elements can be achieved by using default | ||||
| values for mandatory elements. The default value <bcp14>MUST</bcp14> represent t | ||||
| he 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, the | ||||
| n the new EBML Element <bcp14>SHOULD NOT</bcp14> be mandatory.</t> | ||||
| <t>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.</t> | ||||
| </section> | ||||
| <section anchor="forward-compatibility"><name>Forward Compatibility</name> | ||||
| <t>EBML Elements <bcp14>MAY</bcp14> be marked as deprecated in a new | ||||
| EBMLDocTypeVersion using the <tt>maxver</tt> attribute of the EBML Schema. If su | ||||
| ch an | ||||
| Element is found in an EBML Document with a newer version of the | ||||
| EBMLDocTypeVersion, it <bcp14>SHOULD</bcp14> be discarded.</t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="security-considerations"><name>Security Considerations</name> | ||||
| <t>EBML itself does not offer any kind of security and does not provide confiden | ||||
| tiality. EBML does not provide any kind of authorization. EBML only offers margi | ||||
| nally useful and effective data integrity options, such as CRC elements.</t> | ||||
| <t>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).</t> | ||||
| <t>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:</t> | ||||
| <ul> | ||||
| <li><t>Invalid Element IDs that are longer than the limit stated in the EBMLMaxI | ||||
| DLength Element of the EBML Header.</t> | ||||
| </li> | ||||
| <li><t>Invalid Element IDs that are not encoded in the shortest-possible way.</t | ||||
| > | ||||
| </li> | ||||
| <li><t>Invalid Element Data Size values that are longer than the limit stated in | ||||
| the EBMLMaxSizeLength Element of the EBML Header.</t> | ||||
| </li> | ||||
| </ul> | ||||
| <t>Element IDs that are unknown to the EBML Reader <bcp14>MAY</bcp14> be | ||||
| accepted as valid EBML IDs in order to skip such elements.</t> | ||||
| <t>EBML Elements with a string type may contain extra data after the first | ||||
| 0x00. These data <bcp14>MUST</bcp14> be discarded according to the | ||||
| <xref target="terminating-elements"></xref> rules.</t> | ||||
| <t>An EBML Reader may discard some or all data if the following errors are found | ||||
| in the EBML Document:</t> | ||||
| <ul> | ||||
| <li><t>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-o | ||||
| f-bounds issues).</t> | ||||
| </li> | ||||
| <li><t>Very high lengths in order to force out-of-memory situations resulting in | ||||
| a denial of service, access-out-of-bounds issues, etc.</t> | ||||
| </li> | ||||
| <li><t>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 | ||||
| .</t> | ||||
| </li> | ||||
| <li><t>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).</t> | ||||
| </li> | ||||
| <li><t>Usage of invalid data in EBML Elements with a date type, triggering bogus | ||||
| date accesses.</t> | ||||
| </li> | ||||
| <li><t>The CRC-32 Element (see <xref target="crc-32-element"></xref>) of a Maste | ||||
| r Element doesn't match the rest of the content of that Master Element.</t> | ||||
| </li> | ||||
| </ul> | ||||
| <t>Side-channel attacks could exploit:</t> | ||||
| <ul> | ||||
| <li><t>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 seman | ||||
| tic level invalid.</t> | ||||
| </li> | ||||
| <li><t>The semantic equivalence of VINT_DATA within Element Data Size with two d | ||||
| ifferent lengths due to left-padding zero bits, making comparison at the semanti | ||||
| c level invalid.</t> | ||||
| </li> | ||||
| <li><t>Data contained within a Master Element that is not itself part of a Child | ||||
| Element, which can trigger incorrect parsing behavior in EBML Readers.</t> | ||||
| </li> | ||||
| <li><t>Extraneous copies of Identically Recurring Element, making parsing unnece | ||||
| ssarily slow to the point of not being usable.</t> | ||||
| </li> | ||||
| <li><t>Copies of Identically Recurring Element within a Parent Element that cont | ||||
| ain invalid CRC-32 Elements. EBML Readers not checking the CRC-32 might use the | ||||
| version of the element with mismatching CRC-32s.</t> | ||||
| </li> | ||||
| <li><t>Use of Void Elements that could be used to hide content or create bogus r | ||||
| esynchronization points seen by some EBML Readers and not others.</t> | ||||
| </li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="iana-considerations"><name>IANA Considerations</name> | ||||
| <section anchor="ebml-element-ids-registry"><name>EBML Element IDs Registry</nam | ||||
| e> | ||||
| <t>This document creates a new IANA registry called the | ||||
| "EBML Element IDs" registry.</t> | ||||
| <t>Element IDs are described in <xref target="element-id"></xref>. Element | ||||
| IDs are encoded using the VINT mechanism described in | ||||
| <xref target="variable-size-integer"></xref> and can be between one and five | ||||
| octets long. Five-octet-long Element IDs are possible only if declared | ||||
| in the header.</t> | ||||
| <t>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.</t> | ||||
| <t>One-octet Element IDs <bcp14>MUST</bcp14> 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 <xref target="RFC8126"></xref>.</t> | ||||
| <t>The following one-octet Element IDs are RESERVED: 0xFF and | ||||
| 0x80.</t> | ||||
| <t>Values in the one-octet range of 0x00 to 0x7F are not valid for use | ||||
| as an Element ID.</t> | ||||
| <t>Two-octet Element IDs <bcp14>MUST</bcp14> be between 0x407F and | ||||
| 0x7FFE. Element IDs are to be allocated within this range according to | ||||
| the "Specification Required" policy | ||||
| <xref target="RFC8126"></xref>.</t> | ||||
| <t>The following two-octet Element IDs are RESERVED: 0x7FFF and | ||||
| 0x4000.</t> | ||||
| <t>Values in the two-octet ranges of 0x0000 to 0x3FFF and 0x8000 to 0xFFFF are | ||||
| not valid for use as an Element ID.</t> | ||||
| <t>Three-octet Element IDs <bcp14>MUST</bcp14> be between 0x203FFF and 0x3FFFFE. | ||||
| Element IDs are to be allocated within this range according to the "First | ||||
| Come First Served" policy <xref target="RFC8126"></xref>.</t> | ||||
| <t>The following three-octet Element IDs are RESERVED: 0x3FFFFF and | ||||
| 0x200000.</t> | ||||
| <t>Values in the three-octet ranges of 0x000000 to 0x1FFFFF and | ||||
| 0x400000 to 0xFFFFFF are not valid for use as an Element ID.</t> | ||||
| <t>Four-octet Element IDs <bcp14>MUST</bcp14> 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) <bcp14>MUST</bcp14> be allocated by the "Specification | ||||
| Required" policy. Sequential allocation of values is not | ||||
| required: specifications <bcp14>SHOULD</bcp14> include a specific | ||||
| request and are encouraged to do early allocations.</t> | ||||
| <t>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.</t> | ||||
| <t>Other four-octet Element IDs may be allocated by the "First Come First S | ||||
| erved" policy.</t> | ||||
| <t>The following four-octet Element IDs are RESERVED: 0x1FFFFFFF and 0x10000000 | ||||
| .</t> | ||||
| <t>Values in the four-octet ranges of 0x00000000 to 0x0FFFFFFF and 0x20000000 | ||||
| to 0xFFFFFFFF are not valid for use as an Element ID.</t> | ||||
| <t>Five-octet Element IDs (values from 0x080FFFFFFF to 0x0FFFFFFFFE) are RESERVE | ||||
| D according to the "Experimental Use" policy <xref target="RFC8126"></ | ||||
| xref>: they may be used by anyone at any time, but there is no coordination.</t> | ||||
| <t>ID Values found in this document are assigned as initial values as follows:</ | ||||
| t> | ||||
| <table><name>IDs and Names for EBML Elements assigned by this document | ||||
| </name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align="right">Element ID</th> | ||||
| <th align="left">Element Name</th> | ||||
| <th align="left">Reference</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td align="right">0x1A45DFA3</td> | ||||
| <td align="left">EBML</td> | ||||
| <td align="left">Described in <xref target="ebml-element"></xref></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0x4286</td> | ||||
| <td align="left">EBMLVersion</td> | ||||
| <td align="left">Described in <xref target="ebmlversion-element"></xref></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0x42F7</td> | ||||
| <td align="left">EBMLReadVersion</td> | ||||
| <td align="left">Described in <xref target="ebmlreadversion-element"></xref></td | ||||
| > | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0x42F2</td> | ||||
| <td align="left">EBMLMaxIDLength</td> | ||||
| <td align="left">Described in <xref target="ebmlmaxidlength-element"></xref></td | ||||
| > | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0x42F3</td> | ||||
| <td align="left">EBMLMaxSizeLength</td> | ||||
| <td align="left">Described in <xref target="ebmlmaxsizelength-element"></xref></ | ||||
| td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0x4282</td> | ||||
| <td align="left">DocType</td> | ||||
| <td align="left">Described in <xref target="doctype-element"></xref></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0x4287</td> | ||||
| <td align="left">DocTypeVersion</td> | ||||
| <td align="left">Described in <xref target="doctypeversion-element"></xref></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0x4285</td> | ||||
| <td align="left">DocTypeReadVersion</td> | ||||
| <td align="left">Described in <xref target="doctypereadversion-element"></xref>< | ||||
| /td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0x4281</td> | ||||
| <td align="left">DocTypeExtension</td> | ||||
| <td align="left">Described in <xref target="doctypeextension-element"></xref></t | ||||
| d> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0x4283</td> | ||||
| <td align="left">DocTypeExtensionName</td> | ||||
| <td align="left">Described in <xref target="doctypeextensionname-element"></xref | ||||
| ></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0x4284</td> | ||||
| <td align="left">DocTypeExtensionVersion</td> | ||||
| <td align="left">Described in <xref target="doctypeextensionversion-element"></x | ||||
| ref></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0xBF</td> | ||||
| <td align="left">CRC-32</td> | ||||
| <td align="left">Described in <xref target="crc-32-element"></xref></td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td align="right">0xEC</td> | ||||
| <td align="left">Void</td> | ||||
| <td align="left">Described in <xref target="void-element"></xref></td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table></section> | ||||
| <section anchor="ebml-doctypes-registry"><name>EBML DocTypes Registry</name> | ||||
| <t>This document creates a new IANA registry called the "EBML DocTypes" | ||||
| ; registry.</t> | ||||
| <t>To register a new DocType in this registry, one needs a DocType name, a Descr | ||||
| iption of the DocType, a Change Controller (IESG or email of registrant), and an | ||||
| optional Reference to a document describing the DocType.</t> | ||||
| <t>DocType values are described in <xref target="doctype"></xref>. DocTypes | ||||
| are ASCII strings, defined in <xref target="string-element"></xref>, which | ||||
| label the official name of the EBML Document Type. The strings may be | ||||
| allocated according to the "First Come First Served" policy.</t> | ||||
| <t>The use of ASCII corresponds to the types and code already in use; the | ||||
| value is not meant to be visible to the user.</t> | ||||
| <t>DocType string values of "matroska" and "webm" are RESERV | ||||
| ED to the IETF for future use. | ||||
| These can be assigned via the "IESG Approval" or "RFC Required&qu | ||||
| ot; policies <xref target="RFC8126"></xref>.</t> | ||||
| </section> | ||||
| </section> | ||||
| </middle> | ||||
| <back> | ||||
| <displayreference target="I-D.ietf-cellar-matroska" to="Matroska"/> | ||||
| <references><name>Normative References</name> | ||||
| <reference anchor="IEEE.754" target="https://standards.ieee.org/standard/754-201 | ||||
| 9.html"> | ||||
| <front> | ||||
| <title>IEEE Standard for Binary Floating-Point Arithmetic</title> | ||||
| <author> | ||||
| <organization>IEEE</organization> | ||||
| </author> | ||||
| <date year="2019" month="June" day="13"></date> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="ISO3309" target="https://www.iso.org/standard/8558.html"> | ||||
| <front> | ||||
| <title>Data communication -- High-level data link control procedures -- Fram | ||||
| e structure</title> | ||||
| <author> | ||||
| <organization>International Organization for Standardization</organization | ||||
| > | ||||
| </author> | ||||
| <date year="1984" month="October"></date> | ||||
| </front> | ||||
| <seriesInfo name="ISO" value="3309, 3rd Edition"></seriesInfo> | ||||
| </reference> | ||||
| <reference anchor="ISO9899" target="https://www.iso.org/standard/57853.html"> | ||||
| <front> | ||||
| <title>Information technology -- Programming languages -- C</title> | ||||
| <author> | ||||
| <organization>International Organization for Standardization</organization | ||||
| > | ||||
| </author> | ||||
| <date year="2011"></date> | ||||
| </front> | ||||
| <seriesInfo name="ISO/IEC" value="9899:2011"></seriesInfo> | ||||
| </reference> | ||||
| <reference anchor="ITU.V42" target="https://www.itu.int/rec/T-REC-V.42"> | ||||
| <front> | ||||
| <title>Error-correcting procedures for DCEs using asynchronous-to-synchronou | ||||
| s conversion</title> | ||||
| <author> | ||||
| <organization>International Telecommunications Union</organization> | ||||
| </author> | ||||
| <date year="2002" month="March"></date> | ||||
| </front> | ||||
| <seriesInfo name="ITU-T Recommendation" value="V.42"></seriesInfo> | ||||
| </reference> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.0020. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2141. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2648. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3339. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3629. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3688. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5234. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5646. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7405. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8126. | ||||
| xml"/> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. | ||||
| xml"/> | ||||
| <reference anchor="XHTML" target="https://www.w3.org/TR/2018/SPSD-xhtml-basic-20 | ||||
| 180327/"> | ||||
| <front> | ||||
| <title>XHTML(tm) Basic 1.1 -- Second Edition</title> | ||||
| <author fullname="Shane McCarron" initials="S." surname="McCarron"> | ||||
| </author> | ||||
| <date year="2018" month="March" day="27"></date> | ||||
| </front> | ||||
| <seriesInfo name="Latest version available at" value="https://www.w3.org/TR/xh | ||||
| tml-basic"></seriesInfo> | ||||
| </reference> | ||||
| <reference anchor="XML" target="https://www.w3.org/TR/2008/REC-xml-20081126/"> | ||||
| <front> | ||||
| <title>Extensible Markup Language (XML) 1.0 (Fifth Edition)</title> | ||||
| <author initials="T." surname="Bray" role="editor"> | ||||
| <organization>Textuality and Netscape</organization> | ||||
| </author> | ||||
| <author initials="J" surname="Paoli" role="editor"> | ||||
| </author> | ||||
| <author initials="C.M" surname="Sperberg-McQueen" role="editor"> | ||||
| </author> | ||||
| <author initials="E." surname="Maler" role="editor"> | ||||
| </author> | ||||
| <author initials="F." surname="Yergeau" role="editor"> | ||||
| </author> | ||||
| <date year="2008" month="November" day="26"></date> | ||||
| </front> | ||||
| <seriesInfo name="Latest version available at" value="https://www.w3.org/TR/xm | ||||
| l/"></seriesInfo> | ||||
| </reference> | ||||
| <reference anchor="XML-SCHEMA" target="https://www.w3.org/TR/2004/REC-xmlschema- | ||||
| 0-20041028/"> | ||||
| <front> | ||||
| <title>XML Schema Part 0: Primer Second Edition</title> | ||||
| <author fullname="David C. Fallside" initials="D.C." surname="Fallside"> | ||||
| </author> | ||||
| <author fullname="Priscilla Walmsley" initials="P" surname="Walmsley"> | ||||
| </author> | ||||
| <date year="2004" month="October" day="28"></date> | ||||
| </front> | ||||
| <seriesInfo name="Latest version available at" value="http://www.w3.org/TR/xml | ||||
| schema-0/"></seriesInfo> | ||||
| </reference> | ||||
| </references> | ||||
| <references><name>Informative References</name> | ||||
| <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml-ids/reference.I-D.i | ||||
| etf-cellar-matroska.xml"/> | ||||
| <reference anchor="WebM" target="https://www.webmproject.org/docs/container/"> | ||||
| <front> | ||||
| <title>WebM Container Guidelines</title> | ||||
| <author> | ||||
| <organization>The WebM Project</organization> | ||||
| </author> | ||||
| <date year="2017" month="November" day="28"></date> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="XPath" target="https://www.w3.org/TR/1999/REC-xpath-19991116" | ||||
| > | ||||
| <front> | ||||
| <title>XML Path Language (XPath) Version 1.0</title> | ||||
| <author initials="J." surname="Clark" role="editor"> | ||||
| </author> | ||||
| <author initials="S" surname="DeRose"> | ||||
| </author> | ||||
| <date year="1999" month="November" day="16"></date> | ||||
| </front> | ||||
| <seriesInfo name="Latest version available at" value="https://www.w3.org/TR/xp | ||||
| ath"></seriesInfo> | ||||
| </reference> | ||||
| </references> | ||||
| </back> | ||||
| </rfc> | ||||
| End of changes. 1 change blocks. | ||||
| lines changed or deleted | lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||