Pour résumer ce que nous avons vu précédemment :
Alors maintenant que nous avons vu ce qu'était un KLV et les formats proposés, voyons maintenant leur utilité.
Nous avions vu qu'un MXF était comme un gros carton. Je vais proposer une autre métaphore : celui de l'armoire. Un MXF est comme une grande et longue armoire avec des milliers et des milliers de tiroirs :
Chaque tiroir est un KLV unique : Les premiers tiroirs du haut sont les KLV avec des entêtes et métadonnées (cf. Header), les tiroirs du milieu sont ceux contenant les essences (images, sons, sous-titres, ..) et enfin, les derniers tiroirs sont les métadonnées de terminaisons (cf. Footer)
Lorsqu'on construit un MXF, on va devoir remplir l'ensemble de ces tiroirs et certains sont déjà pré-définis pour des usages spécifiques.
Restons toujours sur notre métaphore : imaginons que nous remplissions les tiroirs du milieu avec tout un tas d'objets : des chaussettes, des t-shirts, des pantalons et des serviettes. Et on referme ces tiroirs.
Maintenant, nous allons prendre du papier et crayon, et noter tout plein d'informations à propos de ces objets : le nombre d'objets, le nombre de chaussettes / t-shirts / pantalons / serviettes, leurs couleurs, leurs tailles, leurs emplacements, leurs matières et encore tous pleins d'informations qui pourraient être utiles (ou pas).
Ces feuilles d'inventaires, nous allons les ranger dans les premiers tiroirs (cf. Header). Nous refermons le tout et nous allons finir de noter quelques informations (par exemple, le nombre de tiroirs utilisés pour stocker les feuilles) en toute fin sur une dernière feuille que nous placerons dans le dernier tiroir, le plus en bas (cf. Footer).
Si quelqu'un souhaite de l'information sur cette armoire, il lui suffit soit d'ouvrir directement tous les tiroirs du milieu, fouiller et perdre beaucoup de temps pour étudier chaque objet. Soit tout simplement ouvrir les tiroirs du haut et lire les feuilles d'inventaires.
Vous remarquerez qu'on utilise les termes "tiroirs d'en haut", "tiroirs du milieu" et "derniers tiroirs" pour regrouper certains tiroirs. Ce n'est pas une coïncidence.
Il faut savoir qu'un MXF est segmenté en 3 parties 1. Ces segments sont appelés Partitions, elles regroupent plusieurs KLV et portent respectivement les noms de Header, Body et Footer:
Attention à ne pas vous tromper sur le concept des partitions : Les KLV ne sont pas enrobées par une couche supplémentaire qu'on aurait appelée partition. Les partitions sont simplement représentées par des KLV supplémentaires - appelé Partition Pack - qui font office de séparateur entre les différents groupes de KLV. Rien de plus.
Chaque partition a plusieurs KLV :
Pour Header, vous aurez une 20-30ène de KLV différents pour décrire le MXF, donner ses propres informations internes et les informations sur les contenus qui seront dans Body.
Cette partie est assez variable car suivant le type de contenu dans Body, vous aurez plus ou moins de métadonnées, donc plus ou moins de KLV.
À simple titre indicatif, voici un rapide tableau du nombre possible de KLV par type de contenu :
Type de contenu | Nombre de KLV Headers |
---|---|
Aucun | 20 |
Picture | 22 |
Sound | 21 (jusqu'à 38 si MCA activé) |
Subtitle | 22 |
Dolby Atmos | 22 |
Cryptographie | +3 |
Comme vous le constatez avec la première ligne : vous aurez une bonne vingtaine de KLV de base dans Header pour décrire un MXF. Les KLV headers supplémentaires seront dépendants du type de contenu dans Body.
Pour Body, vous aurez une infinité de KLV contenant les essences, c'est la partie la plus importante d'un MXF. Par exemple, chaque image d'un film sera placée dans un KLV qui sera placé dans cette partition. Un film, c'est environ 200.000 images, donc 200.000 KLV. C'est la partition la plus imposante d'un MXF.
Pour Footer, vous aurez 2-3 KLV, pas plus.
À titre d'informations, voici les différents KLV possibles dans un MXF DCP Picture, c'est probablement le MXF le plus simple :
Nom du KLV | Universal Label |
---|---|
Partition Pack - Header | 060e2b34.02050101.0d010201.01020400 |
Primer Pack | 060e2b34.02050101.0d010201.01050100 |
Preface | 060e2b34.02530101.0d010101.01012f00 |
Identification | 060e2b34.02530101.0d010101.01013000 |
Content Storage | 060e2b34.02530101.0d010101.01011800 |
Essence Container Data | 060e2b34.02530101.0d010101.01012300 |
Material Package | 060e2b34.02530101.0d010101.01013600 |
Timeline Track | 060e2b34.02530101.0d010101.01013b00 |
Sequence | 060e2b34.02530101.0d010101.01010f00 |
Timecode Component | 060e2b34.02530101.0d010101.01011400 |
Timeline Track | 060e2b34.02530101.0d010101.01013b00 |
Sequence | 060e2b34.02530101.0d010101.01010f00 |
Source Clip | 060e2b34.02530101.0d010101.01011100 |
Source Package | 060e2b34.02530101.0d010101.01013700 |
Timeline Track | 060e2b34.02530101.0d010101.01013b00 |
Sequence | 060e2b34.02530101.0d010101.01010f00 |
Timecode Component | 060e2b34.02530101.0d010101.01011400 |
Timeline Track | 060e2b34.02530101.0d010101.01013b00 |
Sequence | 060e2b34.02530101.0d010101.01010f00 |
Source Clip | 060e2b34.02530101.0d010101.01011100 |
RGBA Essence Descriptor | 060e2b34.02530101.0d010101.01012900 |
JPEG2000 Picture Sub-Descriptor | 060e2b34.02530101.0d010101.01015a00 |
KLV Fill item | 060e2b34.01010102.03010210.01000000 |
Partition Pack - Body | 060e2b34.02050101.0d010201.01030400 |
Picture Essence - JPEG2000 - Image #1 | 060e2b34.01020101.0d010301.15010801 |
Picture Essence - JPEG2000 - Image #2 | 060e2b34.01020101.0d010301.15010801 |
Picture Essence - JPEG2000 - Image #3 | 060e2b34.01020101.0d010301.15010801 |
• • • • • • | |
Picture Essence - JPEG2000 - Image #X | 060e2b34.01020101.0d010301.15010801 |
Partition Pack - Footer | 060e2b34.02050101.0d010201.01040400 |
Index Table Segment | 060e2b34.02530101.0d010201.01100100 |
( Random Index Pack ) | 060e2b34.02050101.0d010201.01110100 |
En vert, la partition Header avec l'ensemble de ces KLV métadonnées dont notamment deux KLV de métadonnées spécifiques pour le JPEG2000 (en vert foncé). Si vous voyez plusieurs fois certains KLV (comme Sequence ou Timeline Track), c'est normal.
En bleu, la partition Body avec les frames au format JPEG2000.
En rouge, la partition Footer avec les deux derniers KLV de métadonnées.
Vous remarquerez que chaque partition débute par un KLV spécifique appelé Partition Pack. Ce sont nos fameuses séparations pour nos différentes partitions. Comme vous voyez, ce ne sont que de simples KLV insérés entre deux KLV - qui vont intégrer des informations décrivant la nouvelle partition qui débute.
Il peut arriver que le KLV Partition Pack - Body n'existe pas dans certains MXF de DCP. Si vous tombez dessus, c'est que vous êtes sur un MXF Interop et non SMPTE.
Dans ce paragraphe, j'ignore le KLV Fill Item car c'est un KLV ne contenant aucune information, il ne contient que des 0x0
de remplissage et ne sert qu'à aligner les octets avant de passer à la partition Body. Pour plus d'informations, section Fill Item
Hormis quelques KLV, il se peut que certains KLV ne soit pas dans cet ordre au sein du fichier (même si cela sera le cas 99% du temps)
Nous allons voir chaque KLV que nous aurons dans l'entête (Partition Header) et le pied (Partition Footer), leurs aspects, leurs raisons d'être et leurs interactions. Nous verrons les autres KLV spécifiques pour Picture, Sound, Subtitle, AuxData, DolbyAtmos, DBOX, ... dans des sections séparées juste après.
Ce sont les KLV les plus communs, sauf rares exceptions, ils seront fréquemment présents dans la Partition Header pour intégrer des métadonnées du MXF et des assets :
Les packages :
Les descripteurs :
Ces parties intégrent des KLV supplémentaires qui seront réparties dans Header et dans Body et selon le type de contenu ou de MXF :
Pictures :
Sounds :
Autres :
La cryptographie est commune à tous les types de contenu. Un paragraphe Cryptographie est disponible.
Quelques images pour comprendre rapidement les interactions entre les KLV.
(note : les informations sont basées sur l'ancien output de mxf-analyzer, certaines valeurs peuvent être mal interprétées, l'important se trouve surtout sur le réseau de relation)
La norme MXF permet une multitude de Partitions - pas forcément que trois (Au moins un Header, aucun, un seul ou plusieurs Body et aucun ou un seul Footer). Mais dans notre cas, nous n'aurons qu'une partition Header, qu'une partition Body et qu'une partition Footer. Voir note 2 ↩
La norme SMPTE pour le MXF permet d'avoir plusieurs Partition Body : ↩
6.2.6 Body Partition - There shall be zero or more Body Partitions in an MXF file -- SMPTE 377-1-2009 - MXF - File Format Specification
Partition Kinds - Body Partitions : one or more partitions located in the file body. Multiple body partitions can be used to divide an essence container into a sequence of parts, provide for multiple essence containers or provide for multiple essence containers each of which are divided into a sequence of parts -- SMPTE 377-3-2013 - MXF Engineering Guideline
Cependant, la norme SMPTE 429-3-2007 - DCP - Sound And Pictures Track File impose une seule partition Body : 4.3.5 Partitions - A Track File shall have three partitions: Header, Body and Footer. The closed and complete Header Metadata shall be carried in the Header Partition, the Essence Container shall be contained in the single Body Partition. et dans SMPTE 390-2011 - MXF - Specialized Operational Pattern OP-Atom 9. Recommended Partitioning of OP-Atom Files, le terme Body Partition est au singulier.