Partition Pack

Références SMPTE 377-1-2011 - MXF - File Format Specification
Chapitre 6 - Overall Specification P26
Chapitre 7 - Partitions P40
SMPTE 429-3-2007 - DCP - Sound And Pictures Track File
Chapitre 4.3.5 - Partitions P5
Modèle KLV Fixed-Length Pack
Universal Label
06.0e.2b.34.02.05.01.01.0d.01.02.01.01.XX.XX.00 (SMPTE)

Préface

Emplacement du Partition Pack Header dans un MXF

Les Partitions Pack sont des KLV spécifiques de séparations entre les différentes parties d'un KLV.

Voyez les Partitions Packs comme des intercalaires dans un classeur afin de séparer différentes parties de documents.

Dans un MXF de DCP, vous avez au minimum 3 KLV Partition Packs : un Header, un Body et un Footer. Chacun ayant une spécificité :

La Partition Pack Header est le premier KLV d'un MXF.

Description

Nos trois Partition Packs ont un Universal Label :

Nom du KLV Partition Pack UUID
Partition Pack - Header 060e2b34.02050101.0d010201.01020400
Partition Pack - Body 060e2b34.02050101.0d010201.01030400
Partition Pack - Body Generic Stream 060e2b34.02050101.0d010201.01031100
Partition Pack - Footer 060e2b34.02050101.0d010201.01040400

Les différents Partition Pack possèdent une base commune dans leur Universal Label qui est : 060e2b34.02050101.0d010201.01XXXX00

Les derniers octets définissent un type et un statut particulier :

C'est quoi « Body Generic Stream » ?

Leurs présences seront après un Partition Pack Body classique.

Vous ne les rencontrerez que dans des MXF sous-titres, ils serviront à séparer les différents types de données (sous-titres XML, sous-titres PNG, données Font, ...) à l'intérieur d'un Partition Pack Body.

Un exemple de pile KLV avec un MXF sous-titres:

- Partition Pack - Body - TimedText - Essence (XML) - Partition Pack - Body (<-- Generic Stream Partition) - TimedText - Ancillary Resource (Font) - Partition Pack - Footer

Les métadonnées

Le KLV est de type Fixed-Length Pack : chaque métadonnées est à un emplacement précis avec une taille pré-définie.

Interprétations des données binaires et sortie du logiciel

Les données et intitulés que vous verrez ci-dessous sont des interprétations par rapport aux données binaires stockées dans le KLV.

Ainsi, vous ne trouverez pas dans les données brutes, les termes Major Version, ThisPartition ou encore Operational Pattern ou autres JPEG2000 Picture Element, mais seulement des codes et des identifiants (UUID, UL, LocalTag, etc..) qui sont référencés dans les documentations SMPTE.

Avec un autre logiciel, vous pourrez avoir d'autres noms et intitulés. Normalement, les différences seront mineures car basées sur les informations des documentations SMPTE.

Pour en savoir si les données binaires brutes, référez-vous au paragraphe en fin de ce chapitre

Voici un exemple de données après parsing et interprétations des trois Partition Pack (Header, Body, Footer)

  0 │ 060e2b34.02050101.0d010201.01020400 │ Partition Pack - Header - Closed & Complete
 ╓───────────────────────────────────────────────────────────────────────────────────────────
 ║   Major Version            ║  1
 ║   Minor Version            ║  2
 ║   KAGSize                  ║  1
 ║   ThisPartition            ║  0
 ║   PreviousPartition        ║  0
 ║   FooterPartition          ║  56844
 ║   HeaderByteCount          ║  16244
 ║   IndexByteCount           ║  0
 ║   IndexSID                 ║  0
 ║   BodyOffset               ║  0
 ║   BodySID                  ║  0
 ║   Operational Pattern      ║  060e2b34.04010102.0d010201.10000000    
 ║                            ║  Operational Pattern - Specialized Pattern - OP Atom - SMPTE
 ║   EssenceContainers        ║  2 item(s): 
 ║                            ║  - 060e2b34.04010103.0d010301.027f0100  
 ║                            ║    MXF Generic Container
 ║                            ║  - 060e2b34.04010107.0d010301.020b0100  
 ║                            ║    JPEG2000 Picture Element - Frame Wrapped
 ╙───────────────────────────────────────────────────────────────────────────────────────────
  16384 │ 060e2b34.02050101.0d010201.01030400 │ Partition Pack - Body - Closed & Complete
 ╓───────────────────────────────────────────────────────────────────────────────────────────
 ║   Major Version            ║  1
 ║   Minor Version            ║  2
 ║   KAGSize                  ║  1
 ║   ThisPartition            ║  16384
 ║   PreviousPartition        ║  0
 ║   FooterPartition          ║  0
 ║   HeaderByteCount          ║  0
 ║   IndexByteCount           ║  0
 ║   IndexSID                 ║  0
 ║   BodyOffset               ║  0
 ║   BodySID                  ║  1
 ║   Operational Pattern      ║  060e2b34.04010102.0d010201.10000000    
 ║                            ║  Operational Pattern - Specialized Pattern - OP Atom - SMPTE
 ║   EssenceContainers        ║  2 item(s): 
 ║                            ║  - 060e2b34.04010103.0d010301.027f0100  
 ║                            ║    MXF Generic Container
 ║                            ║  - 060e2b34.04010107.0d010301.020b0100  
 ║                            ║    JPEG2000 Picture Element - Frame Wrapped
 ╙───────────────────────────────────────────────────────────────────────────────────────────
  56844 │ 060e2b34.02050101.0d010201.01040400 │ Partition Pack - Footer - Closed & Complete
 ╓───────────────────────────────────────────────────────────────────────────────────────────
 ║   Major Version            ║  1
 ║   Minor Version            ║  2
 ║   KAGSize                  ║  1
 ║   ThisPartition            ║  56844
 ║   PreviousPartition        ║  16384
 ║   FooterPartition          ║  56844
 ║   HeaderByteCount          ║  0
 ║   IndexByteCount           ║  151
 ║   IndexSID                 ║  129
 ║   BodyOffset               ║  0
 ║   BodySID                  ║  0
 ║   Operational Pattern      ║  060e2b34.04010102.0d010201.10000000    
 ║                            ║  (Operational Pattern - Specialized Pattern - OP Atom - SMPTE)
 ║   EssenceContainers        ║  2 item(s): 
 ║                            ║  - 060e2b34.04010103.0d010301.027f0100  
 ║                            ║    MXF Generic Container
 ║                            ║  - 060e2b34.04010107.0d010301.020b0100  
 ║                            ║    JPEG2000 Picture Element - Frame Wrapped
 ╙───────────────────────────────────────────────────────────────────────────────────────────

Voici les informations à propos des métadonnées :

Major et Minor Version : Normalement, Minor devrait être maintenant à 3 (SMPTE 377-2011) mais pour garder la compatibilité (SMPTE 377-2004), on reste en Minor Version 2.

KAGSize indique la taille du KLV Alignment Grid pour la partition. Ici, il est à 1, cela veut dire que... bah en fait il y a pas d'alignement. Ne cherchez pas, c'est SMPTE. Si elle était à 0, c'est qu'elle serait indéfinie. Et si elle était entre 2 et 1048576 (ça fait 1Mo). Vous ne verrez -normalement- jamais autre chose que la valeur 1. Juste pour expliquer le KLV Alignement Grid, on rajoute des octets de bourrage pour aligner les KLV. C'est seulement utile si on veut avoir des tailles parfaitement calibrées.

ThisPartition identifie sa position dans le fichier, par exemple, pour le premier, nous avons 0, ce qui est normal, c'est la première partition, donc elle est à l'offset 0 dans le fichier. Le second - Body - se trouve à l'offset 16384 et le dernier le Footer se trouve à l'offset 56844.

PreviousPartition définit où se trouve la partition précédente dans le fichier.
Pour le premier, toujours normal, c'est 0, nous n'avons pas de partition précédente (ou bien c'est lui-même).
Pour Body, on a un PreviousPartition à 0, donc identifiant le Header.
Et enfin, le Footer va indiquer l'offset de Body, qui est 16384. C'est comme une liste chainée.

FooterPartition définit où se trouve la Partition Footer.
Sur certains Partition Body, le FooterPartition se trouvera très souvent à 0.
Ne me demande pas pourquoi, la norme impose pourtant un chiffre si le Partition Footer est bien présent.

HeaderByteCount indique la taille de l'entête entier, sans la taille du Partition Pack Header.
Cela permet de jumper directement à Body.

IndexSID indique (et identifie) simplement si un KLV "Index Table Segment" est présent.
Vous remarquerez que ce champ n'est pas à 0 seulement le Footer, contenant justement un KLV "Index Table Segment"

BodyOffset indique le nombre d'octet où démarre le segment Essence Container dans cette partition (pour l'instant, toujours à 0)

BodySID indique (et identifie) simplement si un KLV de données sera présent.
Vous le verrez à 1 que dans Partition Pack Body (avec les sous-titres, vous aurez plusieurs Body avec des BodySID supérieur à 1)

Operational Pattern désigne le type de modèle de MXF.
Pour en savoir plus, voyez du côté du chapitre Operational Pattern (mais ce n'est pas obligatoire :)

Essence Containers sont les Universal Labels identifiant le type des différentes essences.
Ici, nous voyons que nous un MXF Generic Container et un JPEG2000 Picture Element

BodySID indique s'il y a des containeurs d'essence (Essence Container).
Vu que Partition Body possède des essences, il est normal que ce soit le seul qui soit à 1.

IndexByteCount indique la taille de l'Index Table Segment

Relation entre les différents partitions packs

Voici la relation entre les 3 Partitions Packs :

Item name Header Body Footer
Major Version 1 1 1
Minor Version 2 2 2
KAGSize 1 1 1
ThisPartition 0 16384 56844
PreviousPartition 0 0 16384
FooterPartition 56844 0 56844
HeaderByteCount 16244 0 0
IndexByteCount 0 0 151
IndexSID 0 0 129
BodyOffset 0 0 0
BodySID 0 1 0
Operational Pattern 060e2b34.04010102.0d010201.10000000
(SMPTE)
060e2b34.04010102.0d010201.10000000
(SMPTE)
060e2b34.04010102.0d010201.10000000
(SMPTE)
EssenceContainers 2 item(s):
060e2b34.04010103.0d010301.027f0100
060e2b34.04010107.0d010301.020b0100
2 item(s):
060e2b34.04010103.0d010301.027f0100
060e2b34.04010107.0d010301.020b0100
2 item(s):
060e2b34.04010103.0d010301.027f0100
060e2b34.04010107.0d010301.020b0100

Position de ces KLV dans un MXF

Les Partitions Pack se trouvent à différents endroits du MXF. Le Header se trouve en tout premier, le Footer en (presque) fin. En règle général, il n'y aura qu'un Body dans la plupart des assets, à l'exception de certains comme les sous-titres qui peuvent intégrer des Body supplémentaires pour séparer les différents assets stockés (sous-titres XML, sous-titres PNG, les données de Fonts, ...)

Partition Pack Header

La Partition Pack Header se trouve toujours en haut du MXF.

Partition Pack Body

La Partition Pack Body se trouve après l'ensemble des KLV headers et intègre les contenus (Essence) :

Partition Pack Footer

La Partition Pack Footer se trouve en fin de fichier juste avant le KLV Index Table Segment.

Les données brutes du KLV

Le KLV étant de type Fixed, chaque donnée est à une place définie avec une taille fixe.

Voici les données au format hexadécimal de la Value de notre KLV du Partition Pack Header :

000100020000000100000000000000000000000000000000000000000000dd68000000000000
3f74000000000000000000000000000000000000000000000000060e2b34040101020d010201
100000000000000200000010060e2b34040101030d010301027f0100060e2b34040101070d01
0301020c0100

Comme vous le voyez, c'est très brut et très réduit.

Si vous scrutez bien, vous verrez rapidement quelques valeurs qui vous diront quelque chose comme les Universal Label :

000100020000000100000000000000000000000000000000000000000000dd68000000000000 3f74000000000000000000000000000000000000000000000000060e2b34040101020d010201 100000000000000200000010060e2b34040101030d010301027f0100060e2b34040101070d01 0301020c0100

Le premier UL sera notre Operational Pattern. Le second UL sera notre 1er EssenceContainers. Le troisième UL sera notre 2nd EssenceContainers.

A noter que notre EssenceContainers peut contenir plusieurs autres UL. Pour savoir, il suffit de lire la donnée en amont qui va nous donner toutes les informations utiles :

000100020000000100000000000000000000000000000000000000000000dd68000000000000 3f74000000000000000000000000000000000000000000000000060e2b34040101020d010201 100000000000000200000010060e2b34040101030d010301027f0100060e2b34040101070d01 0301020c0100

Regardez le bloc de données en jaune, orange et rouge. Notre première donnée est le nombre d'élément, le second sa taille (0x10 = 16 en décimal)

Voici le tableau récapitulatif des différentes données :

Nom Taille Type
Major Version 2 octets uint16
Minor Version 2 octets uint16
KAGSize 4 octets uint32
ThisPartition 8 octets uint64
PreviousPartition 8 octets uint64
FooterPartition 8 octets uint64
HeaderByteCount 8 octets uint64
IndexByteCount 8 octets uint64
IndexSID 4 octets uint32
BodyOffset 8 octets uint64
BodySID 4 octets uint32
OperationalPattern 16 octets UUID (UL)
EssenceContainers variable Batch-UL

Batch UL = Nombre d'éléments (4 octets) + Taille d'un élément (4 octets) + ( Nombre d'élement * UL (16 octets) )

Etude rapide de l'Universal Label de Partition Pack

UL = 06.0E.2B.34.02.05.01.vv.0D.01.02.01.01.xx.yy.00
                             ^^------------------------------ Item Designator   : Organizationally registered
                                ^^--------------------------- Organization      : AAF
                                   ^^------------------------ Application       : MXF File Structure
                                      ^^--------------------- Structure Version : Version 1
                                         ^^------------------ Structure Kind    : MXF File Structure Sets & Packs
                                            ^^--------------- Set/Pack Kind     : (see below)
                                               ^^------------ Partition Status  : (see below)