Matroska 仕様

EBML

Matroska は、バイナリフォーマットの XML というべき、EBML という構造に基づいている。

EBML では、基本的に

Element ID (1-4 Byte) + Data Size (1-8 Byte) + Data (?? Byte)

という構造で、データを格納する。

XML で Element の内容に Element を格納できるのと同様に、Data 内部に他の Element を 含めることができる。

Element ID と Data Size は、UTF-8 に似た可変長バイトでエンコードされ、コーディング方法は、 以下のとおりである。

Element ID

1xxx xxxx                                  - Class A IDs (2^7 -1 possible values) (base 0x8X)
01xx xxxx  xxxx xxxx                       - Class B IDs (2^14-1 possible values) (base 0x4X 0xXX)
001x xxxx  xxxx xxxx  xxxx xxxx            - Class C IDs (2^21-1 possible values) (base 0x2X 0xXX 0xXX)
0001 xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx - Class D IDs (2^28-1 possible values) (base 0x1X 0xXX 0xXX 0xXX)

Data Size

1xxx xxxx                                                                              - value 0 to  2^7-2
01xx xxxx  xxxx xxxx                                                                   - value 0 to 2^14-2
001x xxxx  xxxx xxxx  xxxx xxxx                                                        - value 0 to 2^21-2
0001 xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                                             - value 0 to 2^28-2
0000 1xxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                                  - value 0 to 2^35-2
0000 01xx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                       - value 0 to 2^42-2
0000 001x  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx            - value 0 to 2^49-2
0000 0001  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx - value 0 to 2^56-2

Matroska

Matroska は、非常に高機能のコンテナで、構成要素となる Element は多岐にわたるが、 ここでは、ミニマルな構成について述べる。

Header

EBML 構成要素で、ドキュメントタイプなど、ファイルに関する情報を保持する。Matroska では、 ドキュメントタイプに、"matroska" を設定する。

EBML_ID_HEADER (0x1A45DFA3)
  EBML_ID_DOCTYPE (0x4282)
  その他

Segment

Matroska のルート要素で、トップレベル構造を形成している。

MATROSKA_ID_SEGMENT (0x18538067)
  MATROSKA_ID_SEEKHEAD (0x114D9B74)
  MATROSKA_ID_INFO     (0x1549A966)
  MATROSKA_ID_TRACKS   (0x1654AE6B)
  MATROSKA_ID_CLUSTER  (0x1F43B675)
  MATROSKA_ID_CUES     (0x1C53BB6B)

Meta Seek Infomation

上位要素のファイル内での位置情報を格納する。この情報を元に、ファイル内の 各要素へランダムアクセスできるようになる。

MATROSKA_ID_SEEKHEAD (0x114D9B74)
  MATROSKA_ID_SEEKENTRY (0x4DBB)
    MATROSKA_ID_SEEKID       (0x53AB)
    MATROSKA_ID_SEEKPOSITION (0x53AC)

Segment Infomation

ファイル全体の情報を格納する。

Track

ファイル内の各 Track に関する情報を格納する。

Cluster

Track 別の各メディアデータの全てが格納される。

Cueing Data

シークのためのインデックス情報を格納する。

Cluster

Cluster 要素内には、全てのメディアデータが格納される。一般的に Cluster 要素は、ファイル内 に複数個存在する。

ランダムアクセスの際の処理単位となるため、粒度は適切な大きさであることが望ましい。

MATROSKA_ID_CLUSTER (0x1F43B675)
  MATROSKA_ID_CLUSTERTIMECODE (0xE7)
  MATROSKA_ID_SIMPLEBLOCK (0xA3)
  MATROSKA_ID_BLOCKGROUP (0xA0)
    MATROSKA_ID_BLOCK (0xA1)
    MATROSKA_ID_BLOCKDURATION (0x9B)
    MATROSKA_ID_BLOCKREFERENCE (0xFB)

Cluster には、タイムスタンプ (MATROSKA_ID_CLUSTERTIMECODE) が付加される。

各 Track 別のメディアデータは、Block に格納される。Block に付加データが必要ない場合は、 MATROSKA_ID_SIMPLEBLOCK が、付加データがある場合は、MATROSKA_ID_BLOCKGROUP, MATROSKA_ID_BLOCK が使用される。

一般的に、Cluster 内には、複数の Block が格納される。

Lacing

デコードアクセス単位となる Frame の大きさの粒度が小さい場合、データ格納効率を向上させるため、 Block 内に複数の Frame を格納することができる。

Block 内で、各 Frame の区切りをエンコードするため、次の4つのモードが規定されている。

  1. なし (Block == Frame)
  2. 固定長
  3. Xiph lacing
  4. EBML lacing