Extensible Binary Meta Language
Extensible Binary Meta Language (EBML) est un format de données général pour (théoriquement) tout type de données dont le but est d'être un équivalent binaire des fichiers au format XML.
À la différence de XML néanmoins, le support d'un DTD dans un fichier EBML n'est pas encore supporté. L'application doit obligatoirement connaître le format pour accéder aux données. Le format EBML n'est donc pas extensible de la même manière que l'est le XML.
Il possède tout de même un avantage majeur sur d'autres formats qui est son extensibilité et sa compatibilité binaire ascendante et descendante.
Ce format a été développé au départ pour les fichiers multimédia Matroska.
Structure du fichier
Le fichier repose sur une structure de chunk un dérivé du format IFF comme le sont les formats PNG ou WAV. Ces fichiers sont des fichiers binaires structurés ainsi :
- Un type de données, écrit sur plusieurs octets ("RIFF" pour le WAV sur 4 octets)
- suivi d'une longueur (sur 4 octets pour le WAV)
- suivi des données concernées par ce chunk. Ces données pouvant elles aussi être écrites suivant la même syntaxe.
Par exemple les fichiers de Autodesk 3ds Max, utilisent deux octets pour le type, 4 octets pour la longueur alors que PNG utilise toujours 4 octets.
La spécificité de EBML est d'avoir standardisé cette structure Type, Longueur, Valeur. Ainsi le type a une longueur variable de 1 à 4 octets et la longueur utilise 1 à 8 octets (8 octets permettent de définir un chunk de 72 000 téraoctets alors qu'un octets permet de définir un chunk de 127 octets). Ceci permet de créer un format plus ou moins compact. La valeur de la longueur ne concerne que la longueur des données qui suivent. De plus, EBML est capable de manipuler des types de données prédéfinis comme les entiers, les flottants, les chaines de caractères. Il est donc possible d'écrire un parser générique auquel au ajoute des briques spécifiques pour répondre à un format spécifique. Un parser de fichiers MKV n'est qu'un parser EBML spécialisé qui prend en considération, par exemple, que le chunk de type 0x4489 contient un float qui représente la durée d'un segment.