Matroska Element Ordering
Except for the EBML Header and the CRC-32 Element, the EBML specification does not
require any particular storage order for Elements. This specification however
defines mandates and recommendations for ordering certain Elements in order to facilitate
better playback, seeking, and editing efficiency. This section describes and offers
rationale for ordering requirements and recommendations for Matroska.
Top-Level Elements
The Info Element is the only REQUIRED Top-Level Element in a Matroska file.
To be playable, Matroska MUST also contain at least one Tracks Element and Cluster Element.
The first Info Element and the first Tracks Element MUST either be stored before the first
Cluster Element or both SHALL be referenced by a SeekHead Element occurring before the first Cluster Element.
All Top-Level Elements MUST use a 4-octet long EBML Element ID.
When using Medium Linking, chapters are used to reference other Segments to play in a given order (#medium-linking).
A Segment containing these linked Chapters does not require a Track Element or a Cluster Element.
It is possible to edit a Matroska file after it has been created. For example, chapters,
tags, or attachments can be added. When new Top-Level Elements are added to a Matroska file,
the SeekHead Element(s) MUST be updated so that the SeekHead Element(s) itemize
the identity and position of all Top-Level Elements.
Editing, removing, or adding
Elements to a Matroska file often requires that some existing Elements be voided
or extended.
Transforming the existing Elements into Void Elements as padding can be used
as a method to avoid moving large amounts of data around.
CRC-32
As noted by the EBML specification, if a CRC-32 Element is used, then the CRC-32 Element
MUST be the first ordered Element within its Parent Element.
In Matroska all Top-Level Elements of an EBML Document SHOULD include a CRC-32 Element
as a their first Child Element.
The Segment Element, which is the Root Element, SHOULD NOT have a CRC-32 Element.
SeekHead
If used, the first SeekHead Element MUST be the first non-CRC-32 Child Element
of the Segment Element. If a second SeekHead Element is used, then the first
SeekHead Element MUST reference the identity and position of the second SeekHead.
Additionally, the second SeekHead Element MUST only reference Cluster Elements
and not any other Top-Level Element already contained within the first SeekHead Element.
The second SeekHead Element MAY be stored in any order relative to the other Top-Level Elements.
Whether one or two SeekHead Element(s) are used, the SeekHead Element(s) MUST
collectively reference the identity and position of all Top-Level Elements except
for the first SeekHead Element.
Cues (index)
The Cues Element is RECOMMENDED to optimize seeking access in Matroska. It is
programmatically simpler to add the Cues Element after all Cluster Elements
have been written because this does not require a prediction of how much space to
reserve before writing the Cluster Elements. However, storing the Cues Element
before the Cluster Elements can provide some seeking advantages. If the Cues Element
is present, then it SHOULD either be stored before the first Cluster Element
or be referenced by a SeekHead Element.
Info
The first Info Element SHOULD occur before the first Tracks Element and first
Cluster Element except when referenced by a SeekHead Element.
Chapters Element
The Chapters Element SHOULD be placed before the Cluster Element(s). The
Chapters Element can be used during playback even if the user does not need to seek.
It immediately gives the user information about what section is being read and what
other sections are available. In the case of Ordered Chapters it is RECOMMENDED to evaluate
the logical linking even before playing. The Chapters Element SHOULD be placed before
the first Tracks Element and after the first Info Element.
Attachments
The Attachments Element is not intended to be used by default when playing the file,
but could contain information relevant to the content, such as cover art or fonts.
Cover art is useful even before the file is played and fonts could be needed before playback
starts for initialization of subtitles. The Attachments Element MAY be placed before
the first Cluster Element; however if the Attachments Element is likely to be edited,
then it SHOULD be placed after the last Cluster Element.
Tags
The Tags Element is most subject to changes after the file was originally created.
For easier editing, the Tags Element SHOULD be placed at the end of the Segment Element,
even after the Attachments Element. On the other hand, it is inconvenient to have to
seek in the Segment for tags, especially for network streams. So it’s better if the
Tags Element is found early in the stream. When editing the Tags Element, the original
Tags Element at the beginning can be overwritten with a Void Element and a
new Tags Element written at the end of the Segment Element. The file size will only marginally change.
