AssetMap

Préface

DCP simple

L'AssetMap est le premier fichier d'un DCP, c'est un index, il sert à identifier tous les fichiers présents d'un DCP - qui sont surnommés assets d'où le nom de AssetMap.

L'AssetMap est défini dans la norme SMPTE ST 429-9 - D-Cinema Packaging — Asset Mapping and File Segmentation

Son format interne :

Ces principales règles sont :

Description

L'AssetMap est l'équivalent de la table des matières d'un livre à la différence qu'il va lister tous les fichiers présents dans le répertoire contenant le DCP.

L'AssetMap sert d'index, il va donner un listing complet des noms des différents fichiers (assets) présents dans celui-ci. Les assets sont parfois accompagnés d'informations supplémentaires telles qu'une annotation, une taille, un offset et si cet asset est une Packing List (PKL) (qu'on étudiera plus tard).

C'est le point d'entrée pour tous logiciels manipulant du DCP.

Notez le "présents" : un DCP peut ne contenir qu'une petite partie des assets d'une oeuvre (par exemple, seulement les sous-titres) et - grâce aux fichiers de métadonnées Packing List (PKL) et Composition Playlist (CPL) - faire uniquement des références à d'autres assets venant d'autres DCP. Dans l'exemple du livre, ce serait les références vers d'autres ouvrages. Dans notre exemple, l'AssetMap ne fera référence qu'au fichier de sous-titres (en plus des deux fichiers de métadonnées).

L'AssetMap minimale

Voici l'exemple d'une AssetMap mininale intégrant les éléments et les données obligatoires, et 4 assets (PKL, CPL, video, audio) pour un film classique 3 :

<?xml version="1.0" encoding="UTF-8"?>
<AssetMap xmlns="http://www.smpte-ra.org/schemas/429-9/2007/AM">
  <Id>urn:uuid:606e9f2d-3a4c-49e2-ba4a-fc213caf1e64</Id>
  <Creator>DCP Inside</Creator>
  <VolumeCount>1</VolumeCount>
  <IssueDate>2022-01-01T00:00:00-00:00</IssueDate>
  <Issuer>DCP Inside</Issuer>
  <AssetList>
    <Asset>
      <Id>urn:uuid:ce5c22c8-a640-428c-9004-2107e1f3c94e</Id>
      <PackingList>true</PackingList>
      <ChunkList>
        <Chunk>
          <Path>PKL.xml</Path>
        </Chunk>
      </ChunkList>
    </Asset>
    <Asset>
      <Id>urn:uuid:d2e32d20-1f85-4d86-b09f-2ee40ac097a0</Id>
      <ChunkList>
        <Chunk>
          <Path>CPL.xml</Path>
        </Chunk>
      </ChunkList>
    </Asset>
    <Asset>
      <Id>urn:uuid:af457798-e34e-4233-9fe1-3cc974ca33e9</Id>
      <ChunkList>
        <Chunk>
          <Path>picture.mxf</Path>
        </Chunk>
      </ChunkList>
    </Asset>
    <Asset>
      <Id>urn:uuid:6e007158-b706-4168-964d-53f35e7d2b74</Id>
      <ChunkList>
        <Chunk>
          <Path>audio.mxf</Path>
        </Chunk>
      </ChunkList>
    </Asset>
  </AssetList>
</AssetMap>

Rapidement, nous voyons les quatres assets : PKL.xml, CPL.xml, picture.mxf et audio.mxf. Nous y reviendrons en détails plus tard.

L'AssetMap complète

Voici l'exemple d'une AssetMap complète comprenant l'ensemble des éléments, des attributs et des données possibles :

<?xml version="1.0" encoding="UTF-8"?>
<AssetMap xmlns="http://www.smpte-ra.org/schemas/429-9/2007/AM">
  <Id>urn:uuid:606e9f2d-3a4c-49e2-ba4a-fc213caf1e64</Id>
  <AnnotationText language="en">DCP-INSIDE_FTR-2D-24_S_FR-FR_FR_71-FR_4K_UP_20220101_SMPTE_OV</AnnotationText>
  <Creator language="en">DCP Inside</Creator>
  <VolumeCount>1</VolumeCount>
  <IssueDate>2022-01-01T00:00:00-00:00</IssueDate>
  <Issuer language="en">DCP Inside</Issuer>
  <AssetList>
    <Asset>
      <Id>urn:uuid:ce5c22c8-a640-428c-9004-2107e1f3c94e</Id>
      <AnnotationText language="en">Packing List (PKL)</AnnotationText>
      <PackingList>true</PackingList>
      <ChunkList>
        <Chunk>
          <Path>PKL.xml</Path>
          <VolumeIndex>1</VolumeIndex>
          <Offset>0</Offset>
          <Length>1690</Length>
        </Chunk>
      </ChunkList>
    </Asset>
    <Asset>
      <Id>urn:uuid:d2e32d20-1f85-4d86-b09f-2ee40ac097a0</Id>
      <AnnotationText language="en">Composition Playlist (CPL)</AnnotationText>
      <ChunkList>
        <Chunk>
          <Path>CPL.xml</Path>
          <VolumeIndex>1</VolumeIndex>
          <Offset>0</Offset>
          <Length>1901</Length>
        </Chunk>
      </ChunkList>
    </Asset>
    <Asset>
      <Id>urn:uuid:af457798-e34e-4233-9fe1-3cc974ca33e9</Id>
      <AnnotationText language="en">Asset Picture</AnnotationText>
      <ChunkList>
        <Chunk>
          <Path>picture.mxf</Path>
          <VolumeIndex>1</VolumeIndex>
          <Offset>0</Offset>
          <Length>1280112340</Length>
        </Chunk>
      </ChunkList>
    </Asset>
    <Asset>
      <Id>urn:uuid:6e007158-b706-4168-964d-53f35e7d2b74</Id>
      <AnnotationText language="en">Asset Sound</AnnotationText>
      <ChunkList>
        <Chunk>
          <Path>audio.mxf</Path>
          <VolumeIndex>1</VolumeIndex>
          <Offset>0</Offset>
          <Length>56172026</Length>
        </Chunk>
      </ChunkList>
    </Asset>
  </AssetList>
</AssetMap>

On sera bien d'accord que ceci est un simple exemple et que le nombre d'assets peut être plus important.

Schéma visuel de la structure XML

Voici un schéma visuel simplifié de la structure interne d'une AssetMap.

AssetMap Structure

Une explication rapide sur comment lire le schéma :

Chaque case représente un élément (tag), les flèches indiquent une structure enfante existante (child), les cases grises représentent l'optionalité de l'élément et les pointillés représentent plusieurs éléments potentiels, ainsi :

Important : Les éléments doivent suivre cet ordre. 4

Explication de la structure XML

La structure racine :

À la racine, nous avons 7 éléments de base, dont un optionnel :

Nom Format Exemple
Id UUID urn:uuid:49d8371e-393b-48d8-a3d7-059f43bc637c Obligatoire
AnnotationText Texte DCP-INSIDE_FTR-2D-24_S_FR-FR_FR_71-FR_4K_UP_20220101_SMPTE_OV Optionnel
Creator Texte DCP Inside Obligatoire
VolumeCount Integer 1 Obligatoire
IssueDate DateTime 2022-01-01T00:00:00-00:00 Obligatoire
Issuer Texte DCP Inside Obligatoire
AssetList xml:AssetList <AssetList><Asset/></AssetList> Obligatoire

La structure AssetList :

La structure AssetList contient uniquement un ou plusieurs Asset :

La structure Asset:

Nom Format Exemple Obligatoire
Id UUID urn:uuid:86a13dd1-b9a7-4ab2-82f7-d36907d47745 Obligatoire
AnnotationText Texte Asset Picture Optionnel
PackingList Boolean true Optionnel
ChunkList xml:ChunkList <ChunkList><Chunk/></ChunkList> Obligatoire

La structure ChunkList :

Dans ChunkList, vous avez un seul Chunk.

La structure Chunk:

Nom Format Exemple Obligatoire
Path Texte (URI) CPL.xml Obligatoire
VolumeIndex Integer 1 Optionnel
Offset Integer 0 Optionnel
Length Integer (Bytes) 56172026 Optionnel

Explications des différents éléments

L'AssetMap a une sorte d'en-tête (header) intégrant des informations comme son identifiant unique, son titre descriptif, son créateur, sa date de création.

Cet en-tête est composé de :

Et finalisé par un AssetList

Id

Type de présence : Obligatoire

Description : Ce champ définit un identifiant unique appelé UUID.

Au format UUID - normé par la RFC 4122 - il est obligatoirement préfixé par un urn:uuid suivi de son UUID.

Exemple d'un Id :

<Id>urn:uuid:606e9f2d-3a4c-49e2-ba4a-fc213caf1e64</Id>

Et son champ de version sera toujours à 4 (pour tous les UUID utilisant la RFC 4122, que ce soit pour les assets ou les identifiants de clés de chiffrage (KeyId) :

<Id>urn:uuid:606e9f2d-3a4c-49e2-ba4a-fc213caf1e64</Id>

AnnotationText

Type de présence : Optionnel

Description : Ce champ définit titre descriptif du DCP.

Au format texte, la composition de ce champ est libre. Cependant, il est fortement recommandé d'appliquer la syntaxe Digital Cinema Naming Convention. Notez que le non respect de ce formalisme ne vaut pas l'invalidation du DCP.

L'AnnotationText peut s'écrire de cette façon:

<AnnotationText>AssetMap</AnnotationText>

Ou encore en utilisant la convention de nommage :

<AnnotationText>DCP-INSIDE_FTR-2D-24_S_FR-FR_FR_71-FR_4K_UP_20220101_SMPTE_OV</AnnotationText>

Ou encore avec l'attribut optionnel "language" permettant de définir la langue de ce contenu :

<AnnotationText language="en">DCP-INSIDE_FTR-2D-24_S_FR-FR_FR_71-FR_4K_UP_20220101_SMPTE_OV</AnnotationText>

Creator

Type de présence : Obligatoire

Description : Ce champ définit le matériel ou logiciel qui a généré ce DCP.

Au format texte, la composition de ce champ est libre.

Le Creator peut s'écrire de cette façon:

<Creator>DCP Inside</Creator>

Ou encore avec l'attribution optionnel "language" permettant de définir la langue de ce contenu :

<Creator language="en">DCP Inside</Creator>

Sur différents DCP, vous pourrez avoir des noms de "Creator" comme :

VolumeCount

Type de présence : Obligatoire

Description : Ce champ est censé définir un nombre de volume mais la fonctionnalité n'a jamais été normalisée et donc jamais utilisée, vous pouvez donc l'ignorer sans état d'âme. Sa valeur sera toujours 1

IssueDate

Type de présence : Obligatoire

Description : Ce champ définit la date de création du DCP. Elle doit respecter la normalisation DateTime ISO-8601.

La syntaxe habituelle est la suivante :

YYYY-MM-DDThh:mm:ss+hh:mm

Ce qui correspond :

Symbole Description
YYYY Année sur 4 chiffres
MM Mois sur 2 chiffres - de 01 à 12
DD Jour sur 2 chiffres - de 01 à 31
T Séparateur de temps (time)
hh Heure sur 2 chiffres - de 01 à 23
mm Minute sur 2 chiffres - de 01 à 59
ss Seconde sur 2 chiffres - de 01 à 59
+/-/Z Séparateur fuseau horaire. Ce séparateur peut être soit +, soit -, soit Z. Si Z est utilisé, les 2 champs suivants ne sont pas utilisés
hh Heure de décalage - de 01 à 23
mm Minute de déclage - de 01 à 59

L'IssueDate peut s'écrire de cette façon :

<IssueDate>2022-01-15T09:30:00+00:00</IssueDate>

Issuer

Type de présence : Obligatoire.

Description : Ce champ définit le créateur (personne ou société) du DCP.

Au format texte, la composition de ce champ est libre.

Le Issuer peut s'écrire de cette façon:

<Issuer>DCP Inside</Issuer>

Ou encore avec l'attribution optionnel "language" permettant de définir la langue de ce contenu :

<Issuer language="en">DCP Inside</Issuer>

Sur différents DCP, vous pourrez des noms de "Issuer" comme :

AssetList

Type de présence : Obligatoire.

Description : Il n'est qu'un container, il ne fait que contenir une liste d'éléments de type Asset. Il ne contient aucun autre élément.

Les règles principales sont :

Schématiquement, une AssetList ressemble à cela, rien de plus :

<AssetList>
    <Asset>(...)</Asset>
    <Asset>(...)</Asset>
    <Asset>(...)</Asset>
    <Asset>(...)</Asset>
</AssetList>

AssetList ➔ Asset

Un exemple d'un Asset :

<Asset>
  <Id>urn:uuid:ce5c22c8-a640-428c-9004-2107e1f3c94e</Id>
  <AnnotationText language="en">Packing List (PKL)</AnnotationText>
  <PackingList>true</PackingList>
  <ChunkList>
    <Chunk>
      <Path>PKL.xml</Path>
      <VolumeIndex>1</VolumeIndex>
      <Offset>0</Offset>
      <Length>1690</Length>
    </Chunk>
  </ChunkList>
</Asset>

Type de présence : Obligatoire (au minimum 1)

Description : Asset est un container intégrant les informations de l'asset (fichier)

Il faut un élément Asset par fichier présent dans le DCP (à l'exception de l'AssetMap)

L'élément Asset possède 4 sous-éléments, dont 2 optionnels :

A noter que la bonne syntaxe est :

<PackingList>true</PackingList>

Les autres syntaxes doivent être considérées comme nulle 5 :

<PackingList/>
<PackingList></PackingList>
<PackingList>false</PackingList>

Les éléments Id, AnnotationText (si présent), PackingList (si présent) et ChunkList doivent suivre cet ordre.

AssetList ➔ Asset ➔ ChunkList

Dans ChunkList, il n'existe qu'un seul Chunk.

Tout comme d'autres éléments prévus mais jamais utilisés, il était prévu de pouvoir découper les fichiers en plusieurs petits morceaux (chunks).

AssetList ➔ Asset ➔ ChunkList ➔ Chunk

Type de présence : Obligatoire (un seul)

Description : Est un container intégrant les informations de la partie ou de la totalité de l'asset (fichier) - dans notre cas, c'est la totalité.

Le Chunk n'a qu'un seul élément obligatoire : c'est le Path : le chemin d'accès vers le fichier. C'est le minimum vital pour l'AssetMap.

Le Path est soumis à quelques règles :

Voici des exemples de valeurs de Path valides ou invalides :

Chemin Statut Notes
fichier.mxf Valide
dossier/fichier.mxf Valide
./dossier/fichier.mxf Valide
dossier/../fichier.mxf Valide Est dans la structure du dossier racine
/fichier.mxf Invalide Les chemins absolus sont interdits
../fichier.mxf Invalide N'est pas dans la structure du dossier racine, il est en dehors
PKL.xml Valide
pAcKinGLiSt.xml Valide
PKL_58c333cb-11dc-44e8-b7ae-fdd5b8514d66.xml Valide
subtitles/Arial.ttf Valide
subtitles/Reel01.xml Valide
english-version_1234/subtitles-English-V2.xml Valide
f0e3118a-567d-465b-bdd1-f0cb84012dfe/subs.xml Valide
subs/subtitles_fr.mxf Valide
vidéo-reel-1.mxf Invalide Présence d'un caractère non valide ("é")
audio (piste).mxf Invalide Présence d'un espace et des parenthèses
CPL[42].xml Invalide Présence des crochets

Vous retrouverez les 666.795 Paths respectant cette règle et 684 Paths ne la respectant pas - mais aperçu dans des DCP (ces derniers pouvant avoir été créés mais pouvant avoir été rejetés par la suite).

Sur plus de 80.000 AssetMap étudiés, dans tous les cas, les fichiers se trouvent à la racine du DCP et s'il y a un répertoire, il ne sert qu'à stocker et séparer certains types d'assets, comme des sous-titres par exemple. Jamais constaté : une cascade de sous-répertoires, même sur des gros DCP (plusieurs PKL, plusieurs CPL).

Les autres éléments sont totalement facultatifs :

Vous devez respecter cet ordre. Si vous utilisez des éléments optionnels, il suffit de suivre l'ordre, par exemple : Path puis Length.

Cryptographie : Le grand manquant

A contrario des autres éléments du DCP, l'AssetMap est le seul élément du DCP ne contenant aucune forme de cryptographie : Aucun hash (ou empreinte numérique), aucune signature ou authentification, ni aucun chiffrement.

Interop vs SMPTE

Les différences entre une AssetMap SMPTE et une AssetMap Interop :

Notes


  1. Voir Interop vs SMPTE 

  2. La norme SMPTE accepte le fait d'avoir des AssetMaps dans des sous-répertoires. Dans ce cas, l'AssetMap présente à la racine sera ignorée. Considérez ce cas de figure comme inutile : si plusieurs AssetMaps sont dans différents sous-répertoires, ce sont juste plusieurs DCP dans un répertoire commun. Rien de plus.  

  3. Selon la norme SMPTE, il faut au minimum une PKL et un asset (la CPL étant considérée comme un asset)  

    A DCP shall consist of one Packing List and one or more assets (i.e., Composition Playlists and/or Track Files), referenced by the Packing List.-- SMPTE ST 429-2-2013 - DCP Operational Constraints - Chap. "Minimum Contents".

    Ici, nous avons pris l'exemple d'un film classique le plus minimal possible - avec qu'une piste d'image et qu'une piste sonore seulement, donc :

    • une AssetMap
    • une PackingList (PKL)
    • une CompositionPlaylist (CPL)
    • un MXF Picture
    • un MXF Audio.

    Si on essaye de faire un DCP le plus minimal possible, nous pourrions avoir que la combinaison "AssetMap + PKL + CPL" sans aucun asset. L'AssetMap ne faisant que référence à la PKL et la CPL. La CPL ne faisant références qu'à des assets dits "virtuels" donc qui proviennent d'autres DCP.

  4. Malgré l'utilisation du XML qui permet de placer les éléments dans n'importe quel ordre. Ici, on ne peut changer la position des différents éléments dans une AssetMap. Par exemple, à la racine, vous devez respecter que les éléments Id, AnnotationText, Creator, VolumeCount, IssueDate, Issuer et AssetList se suivent dans cet ordre. De même que pour d'autres éléments à d'autres endroits. Vérifiez dans le schéma XSD de l'AssetMap: si les éléments sont entourés du tag xs:sequence, il faut respecter un ordre.  

  5. La forme <PackingList/> est acceptée sur des DCP Interop.  

  6. À noter que même le nom du répertoire contenant le DCP, où se trouve l'AssetMap, doit être limiter à 100 caractères.