KLV : Key: L'identifiant de type (ou Universal Label)

La normalisation de la clef est définie dans la documentation SMPTE 298 : Universal Labels (UL) for Unique Identification of Digital Data.

En résumé : C'est une clef unique par type de KLV, mais pas unique par KLV : vous pouvez avoir plusieurs fois la même clef dans un MXF. Les exemples parfaits sont les KLV pour les frames : vous aurez plusieurs milliers de fois la même clef pour chaque KLV contenant une frame.

Un Universal Label (UL) a une certaine forme :

Représentation hexadécimale brute = 060e2b34020501010d01020101020400
Représentation au format SMPTE    = 060e2b34.02050101.0d010201.01020400

Il en existe énormément dont voici une poignée ci-dessous :

Key / Universal Label (UL) Type de KLV
060e2b34.02050101.0d010201.01020400 Partition Pack - Header
060e2b34.02050101.0d010201.01030400 Partition Pack - Body
060e2b34.02050101.0d010201.01040400 Partition Pack - Footer
060e2b34.02050101.0d010201.01050100 Primer Pack
060e2b34.02530101.0d010101.01013000 Identification
060e2b34.02530101.0d010101.01013600 Material Package
060e2b34.02530101.0d010101.01010f00 Sequence
060e2b34.02530101.0d010101.01011100 Source Clip
060e2b34.02050101.0d010201.01110100 Random Index Pack
060e2b34.02040107.0d010301.027e0100 Encrypted Essence
060e2b34.01020101.0d010301.15010801 Picture Essence
...

Comme on le constate, chaque Universal Label (UL) identifie un type de KLV.

On remarquera que l'entête (060e2b34) est toujours identique. Puis, après, et suivant le type du KLV, cela change un peu :-)

Après l'entête, tous les octets sont importants car ils sont comme des paramètres, des options ou des statuts du KLV. Pour être plus sincère, ce sont justes des identifiants pour chaque type de KLV, mais on essaye de respecter une certaine nomenclature pour certains afin de garder une cohérence, par exemple, les Partitions Packs qui possèdent plusieurs identifiants - dont la base est commune - qui permet de déterminer si c'est un Header, un Body ou un Footer, et pour spécifier si ces derniers sont complets ou incomplets, ouverts ou fermés, etc.

On va prendre notre exemple des Partition Packs et mettre en avant leurs différences :

Universal Label (UL) Type
060e2b34.02050101.0d010201.01020400 Partition Pack - Header
060e2b34.02050101.0d010201.01030400 Partition Pack - Body
060e2b34.02050101.0d010201.01040400 Partition Pack - Footer

Pour le cas des Partition Pack, vous remarquerez que seuls leurs avant-avant-derniers octets (en gras) changent, ils représentent respectivement :

La valeur juste après (04) détermine le statut du Partition Pack : Avec 04, il est considéré comme Closed & Complete.

Chaque KLV a ses propres spécificités : Il faudra lire chaque documentation SMPTE pour comprendre et récolter ces précieux paramètres et ainsi identifier des Universal Labels pour chaque type de KLV (c'est comme des Pokemons).

Vous pouvez également récupérer un listing des différents Universal Labels auprès de ces registres, mais ils ne vous indiqueront pas à quoi correspondent chaque octet :

Nous allons voir en détail comment est composé un Universal Label (UL), l'intérieur d'une clef. Notez que savoir cela n'est pas essentiel et ne vous empêchera aucunement l'interprétation des données dans Value. C'est un bonus pour votre savoir.

L'intérieur de Key

Comme nous l'avons vu, après l'entête de la clef (060e2b34), chaque octet a une caractéristique propre.

Voici une représentation schématisée de l'intérieur du «K» d'un KLV :

MXF key

La taille d'un Universal Label (UL) est de 16 octets et est subdivisible en 3 grandes parties :

Ce tableau permet de voir rapidement les différentes parties d'une clef :

UL Header UL Designators Item Designator
2 octets 6 octets 8 octets
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Object ID UL Size UL Code SMPTE Designator Category Designator Registry Designator Structure Designator Version Number #1 #2 #3 #4 #5 #6 #7 #8
Signature
0x06 0x0E 0x2B 0x34
4 octets

Normalisée, les 4 premiers octets débuteront toujours par la séquence hexadécimale : 0x06,0x0e, 0x2b,0x34. C'est sa signature - et cela permet ainsi d'identifier rapidement ces KLV 1.

Si vous regardez l'UL Header - 2 premiers octets : Object ID + UL Size - possède un format qui va vous paraître familier : nous débutons avec un identifiant puis une taille et on termine avec d'autres données... Oui, c'est bien le format KLV qui charpente aussi l'intérieur de la clef :-)

Ainsi, le second octet (UL Size) est la taille des données de Key : 0x0E représente 14 octets : cela correspond donc aux octets suivants : De SMPTE Designator au dernier Item Designator #8.

Voici un tableau descriptif de chaque octet de l'Universal Label (UL) :

Nom du champ Description Données
1 Object ID Son identifiant 0x06 UL Header
2 UL Size Taille restante de la clef 0x0E UL Header
3 UL Code Sous-identifiant ISO + ORG 0x2B UL Designator
4 SMPTE Designator Sous-identifiant SMPTE 0x34 UL Designator
5 Category Designator Types de données 0x01-0x7E UL Designator
6 Registry Designator Universal Sets 0x?? UL Designator
7 Structure Designator 0x?? UL Designator
8 Version Number Version du registre 0x?? UL Designator
9-16 Universal-Set Designator Paramètres & Options .... Item Designator

Revoyons une dernière fois ce schéma de Key :

MXF key

Maintenant que vous connaissez tout ceci, vous pouvez le ranger quelque part.

Hormis de savoir à quoi correspondent Category et Registry pour connaitre rapidement le type de données, cela n'aura pas beaucoup d'impact - ou presque - sur votre façon de traiter les données : ces informations essentielles seront disponibles dans chaque norme décrivant la donnée et comment la traiter :)

Gardez juste en tête que un identifiant = Universal Label (UL) = un type de données.

Voyons maintenant la partie Length d'un KLV

Notes


  1. Nous verrons par la suite qu'il y a des KLV principaux, les Universal Sets et des sous-KLV - placés dans les parties Value - appelés Local Sets 

  2. Variable entre 1 octet et 4 octets mais pour notre cas, c'est 2 octets seulement. Cela est déterminé par la valeur du Registry Designator. Si vous vous souvenez, nous avions plusieurs Local Set avec des valeurs de Registry Designator comme 0x03, 0x13 et 0x53

    Cependant, ce qu'une infime partie des valeurs possibles. Dans la documentation, il en existe beaucoup plus. Chaque valeur représente une taille Local Tag et une taille de Length pour l'item en question.

    Dans les MXF de DCP, nous n'aurons que la valeur 0x53 qui correspond à un Length et Local Tag à 2 octets (16 bits) chacun.

    A titre informatif, voici un tableau récapitulatif des différentes valeurs du Registry Designator pour les autres Local Set, seul le vert nous serra utile (nous ne verrons jamais les autres) :

    6 premiers octets
    de l'Universal Label
    Registry Designator
    (position 6)
    Taille du
    Local Tag
    Taille
    de Length
    Informations
    060e2b34.0203 0x03 1 octet BER short/long Toute taille
    060e2b34.020b 0x0b BER OID BER short/long Toute taille
    060e2b34.0213 0x13 2 octets BER short/long Toute taille
    060e2b34.021b 0x1b 4 octets BER short/long Toute taille
    060e2b34.0223 0x23 1 octet 1 octet Taille jusqu'à 255
    060e2b34.022b 0x2b BER OID 1 octet Taille jusqu'à 255
    060e2b34.0233 0x33 2 octets 1 octet Taille jusqu'à 255
    060e2b34.023b 0x3b 4 octets 1 octet Taille jusqu'à 255
    060e2b34.0243 0x43 1 octet 2 octets Taille jusqu'à 65535
    060e2b34.024b 0x4b BER OID 2 octets Taille jusqu'à 65535
    060e2b34.0253 0x53 2 octets 2 octets Taille jusqu'à 65535
    060e2b34.025b 0x5b 4 octets 2 octets Taille jusqu'à 65535
    060e2b34.0263 0x63 1 octet 4 octets Taille jusqu'à ( 232 )-1 (jusqu'à 4.294.967.295)
    060e2b34.026b 0x6b BER OID 4 octets Taille jusqu'à ( 232 )-1
    060e2b34.0273 0x73 2 octets 4 octets Taille jusqu'à ( 232 )-1
    060e2b34.027b 0x7b 4 octets 4 octets Taille jusqu'à ( 232 )-1
  3. Variable entre 1 octet et 4 octets mais pour notre cas, c'est un BER. Cela est déterminé par la valeur du Registry Designator.  

    A titre informatif, voici un tableau récapitulatif des différentes valeurs du Registry Designator pour les autres Variable-Length Pack, seul le vert nous serra utile (nous ne verrons jamais les autres) :

    6 premiers octets
    Universal Label
    Registry
    Designator
    (6)
    Taille
    Length
    Informations
    060e2b34.0204 0x04 BER short/long Toute taille
    060e2b34.0224 0x24 1 octet Taille jusqu'à 255
    060e2b34.0244 0x44 2 octets Taille jusqu'à 65535
    060e2b34.0264 0x64 4 octets Taille jusqu'à (232 - 1)
  4. La norme est coquine, elle indique que la taille de Item Designator peut être entre 1 à 8 octets. Si c'est le cas, elle sera complétée qu'avec des zéros pour faire ... 8 octets - En gros, Item Designator sera toujours de 8 octets :)