Après l'AssetMap, le fichier Packing List
est le second fichier important d'un DCP.
Son surnom est PKL. Nous utiliserons ce terme dans le reste du document.
La PKL est un intermédiaire entre l'AssetMap et la Composition Playlist.
La PKL est définie dans la norme SMPTE ST 429-8 - D-Cinema Packaging — Packing List, agrémentée de la documentation SMPTE 429-2 - DCP Operational Constraints et complétée par l'évolution SMPTE DCP Bv2.1 Application Profile.
Son format interne :
Ces principales règles sont :
La PKL fait un peu comme l'AssetMap, elle va lister tous les assets disponibles, à ceci près que la PKL est (presque) plus complète.
Tout d'abord, il faut savoir que dans la majorité des cas, un DCP n'intègre qu'une seule PKL. Cependant, les normes permettent une multitude de PKL dans un seul DCP. Et nous trouvons régulièrement ce type de DCP dans le métier.
Il existe plusieurs possibilités de liens avec les PKL, par exemple en dessous, une AssetMap, une seule PKL mais plusieurs CPL qui vont identifier chaque version du film mais en utilisant les mêmes assets :
Dans notre exemple, la première CPL identifie le film original - en anglais - avec ses propres images et ses propres pistes sons et une piste AuxData (par exemple Dolby Atmos). La seconde CPL intègre le doublage français qui va utiliser les images d'origine et d'autres pistes sons intégrant le doublage français. La 3ème CPL va intégrer les pistes anglaises et les sous-titres français. Et enfin, la dernière CPL va intégrer la piste des images d'origine et tous les éléments francisés (sons et sous-titres). Nous reviendrons sur le rôle de la CPL dans le chapitre suivant.
A partir de l'AssetMap, il faudra donc identifier le ou les différentes PKL - à l'aide du tag PackingList.
La PKL fait référence uniquement à des assets (fichiers) physiquement présents dans le DCP. A contrario de la CPL qui peut faire référence à des assets "virtuels" (présent dans un autre DCP) :
Ainsi, si vous avez un DCP ajoutant uniquement des sous-titres pour un film déjà existant, vous aurez dans sa PKL que des références à ces propres assets (ici, l'asset des Subtitles). Sa CPL fera le lien avec les assets de l'autre DCP du film pour compléter (Pictures, Sounds, AuxData).
Voici l'exemple d'une PKL mininale intégrant les éléments et les données obligatoires, et 3 assets (CPL, video, audio) pour un film classique 2 :
<?xml version="1.0" encoding="UTF-8"?>
<PackingList xmlns="http://www.smpte-ra.org/schemas/429-8/2007/PKL">
<Id>urn:uuid:80315c01-bdbc-4bd1-af53-cd81266327f4</Id>
<IssueDate>2021-10-26T13:32:00+02:00</IssueDate>
<Issuer>Doremi Labs, Inc.</Issuer>
<Creator>orca_wrapping 3.2.0</Creator>
<AssetList>
<Asset>
<Id>urn:uuid:f6fe56a3-8ca8-4313-9be9-5b26ae54aeae</Id>
<Hash>uhsM5eUACCRUC8IZnB4xb5ZdRCA=</Hash>
<Size>984941</Size>
<Type>application/mxf</Type>
</Asset>
<Asset>
<Id>urn:uuid:07163e51-7ba8-456c-9bd7-3e5b4fa492db</Id>
<Hash>hJYrHdx89UmX90EX4Wf1oHrdSJc=</Hash>
<Size>884897</Size>
<Type>application/mxf</Type>
</Asset>
<Asset>
<Id>urn:uuid:f3e11e32-3655-4f24-b1d8-5226d1671365</Id>
<Hash>JxfPoBSetnQCWMEVfRMt+AAsuFw=</Hash>
<Size>12946</Size>
<Type>text/xml</Type>
</Asset>
</AssetList>
</PackingList>
Voici l'exemple d'une PKL complète comprenant l'ensemble des éléments, des attributs et des données possibles :
<?xml version="1.0" encoding="UTF-8"?>
<PackingList xmlns="http://www.smpte-ra.org/schemas/429-8/2007/PKL">
<Id>urn:uuid:80315c01-bdbc-4bd1-af53-cd81266327f4</Id>
<AnnotationText language="en">DCP-INSIDE_TST-2D-24_C_FR-XX_51_4K_20220102_SMPTE_OV</AnnotationText>
<IssueDate>2021-10-26T13:32:00+02:00</IssueDate>
<Issuer language="en">Doremi Labs, Inc.</Issuer>
<Creator language="en">orca_wrapping 3.2.0</Creator>
<AssetList>
<Asset>
<Id>urn:uuid:f6fe56a3-8ca8-4313-9be9-5b26ae54aeae</Id>
<AnnotationText language="en">Video</AnnotationText>
<Hash>uhsM5eUACCRUC8IZnB4xb5ZdRCA=</Hash>
<Size>984941</Size>
<Type>application/mxf</Type>
<OriginalFileName language="en">video.mxf</OriginalFileName>
</Asset>
<Asset>
<Id>urn:uuid:07163e51-7ba8-456c-9bd7-3e5b4fa492db</Id>
<AnnotationText language="en">Audio</AnnotationText>
<Hash>hJYrHdx89UmX90EX4Wf1oHrdSJc=</Hash>
<Size>884897</Size>
<Type>application/mxf</Type>
<OriginalFileName language="en">audio.mxf</OriginalFileName>
</Asset>
<Asset>
<Id>urn:uuid:f3e11e32-3655-4f24-b1d8-5226d1671365</Id>
<AnnotationText language="en">CPL</AnnotationText>
<Hash>JxfPoBSetnQCWMEVfRMt+AAsuFw=</Hash>
<Size>12946</Size>
<Type>text/xml</Type>
<OriginalFileName language="en">CPL.xml</OriginalFileName>
</Asset>
</AssetList>
<!-- Signer -->
<Signer xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=\+LLvuYNO4YBJSp9Jjmlv8oippzQ=,CN=.DC.DMS.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>39</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509SubjectName>dnQualifier=Sbv3L5YQRoaBBIhNsOCYypL3B18=,CN=ME CS SM.DMSJP2K-70037.DC.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509SubjectName>
</ds:X509Data>
</Signer>
<!-- Signature -->
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>nVtYP+T900DaKGaraN6JiGntUUQ=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>aT8jWTY+rqEFJ5yxMWkWNVBtT5SHh9sywFLkOg6kra46OFgA
CkRbOn9NY1sMEfyyr6e4lHzCpxKZ9cevgLCc5F3K3Qza2Q/b5Kpc3l9AdeyPknkidLAdarVW
kVBMi+DpL+XnlxWfyFJBENnQSM7GEzs3+zdW0uGumZLXBSrPxUuR88OBiDDnuuNFTl0DoGak
gtgtqz/obABnO2MMs6a4LQIHYae90FBpfuSM/l5Wwda3xKU2tdAkE5pVsb3cRwazueTYAh9L
42yB525XCD6BGW3xktO4sJQq/mVn9G99wrmW0MsmfelIxwOfreKL0mepqcymIzA15rZZxj2t
eNW4Kw==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=\+LLvuYNO4YBJSp9Jjmlv8oippzQ=,CN=.DC.DMS.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>39</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509Certificate>MIIEfzCCA2egAwIBAgIBJzANBgkqhkiG9w0BAQsFADCBgjEh
MB8GA1UEChMYREMyLlNNUFRFLkRPUkVNSUxBQlMuQ09NMRowGAYDVQQLExFEQy5ET1JFTUlMQUJT
LkNPTTEaMBgGA1UEAxMRLkRDLkRNUy5EQzIuU01QVEUxJTAjBgNVBC4THCtMTHZ1WU5PNFlCSlNw
OUpqbWx2OG9pcHB6UT0wHhcNMDcwMTAxMDAwMDAwWhcNMjUxMjMxMjM1OTU5WjCBlDEhMB8GA1UE
ChMYREMyLlNNUFRFLkRPUkVNSUxBQlMuQ09NMRowGAYDVQQLExFEQy5ET1JFTUlMQUJTLkNPTTEs
MCoGA1UEAxMjTUUgQ1MgU00uRE1TSlAySy03MDAzNy5EQy5EQzIuU01QVEUxJTAjBgNVBC4THFNi
djNMNVlRUm9hQkJJaE5zT0NZeXBMM0IxOD0wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQDNpEzIexpQYWBA1BeC2jCTtG8MKUQnFW3EG3688LTbRud+KbUJdeIsGuq/swHieptyoLxiCEWY
sdx/RGJ/HgxgdcYsWpE326nMQ0y2HutrQNsA2cb2l+q9fk/FqKygAeyuz9z3G66DKfNvaaPc54uj
qMMTKM/gpyub0sk2IRLf5iEdbhH+CnGQNFAh8XvovzDGmZ/WLR1WV9Tg4WuR1m3nYKGV4IZ4++2s
95JG7pGLsTPIZX4hGi/ofjX8vKI3E2qfjwHdEIZpNDw18gzjXSxilDmyb1MfQFmsT86IP0kj4r/M
0ydlJkE8XnaN3jXw1wlS79M/tbc14lekxU4ihw1dAgMBAAGjgeswgegwDAYDVR0TAQH/BAIwADAL
BgNVHQ8EBAMCBLAwHQYDVR0OBBYEFEm79y+WEEaGgQSITbDgmMqS9wdfMIGrBgNVHSMEgaMwgaCA
FPiy77mDTuGASUqfSY5pb/KIqac0oYGEpIGBMH8xITAfBgNVBAoTGERDMi5TTVBURS5ET1JFTUlM
QUJTLkNPTTEaMBgGA1UECxMRREMuRE9SRU1JTEFCUy5DT00xFzAVBgNVBAMTDi5ETVMuREMyLlNN
UFRFMSUwIwYDVQQuExxSUS81M1JtdUxzYnpnZlBYR2xSWW1KcnV3TXM9ggECMA0GCSqGSIb3DQEB
CwUAA4IBAQAPENa5pIGqV2mBzPr/s+6lvB4r3zOuzZByFecxh+2Q4HWInd5kALEE3AXb4Jgl5ZhO
mEvvrvdFIWyrPIvfu9zAdAHf+VFElWlpOTEfNI3yZE7o83+eAUB9PKu22+wAZAX2/5vTqn+KhuZS
diDPsq931+J6PdVX1Hn6KuaNxu8pnUfpyiN5byXoFRrVQYh55DF+KVFm9mI+8YvIWgf0P0Ebnvc4
jd6FW0UN0de5FhG7biXMxusLoT29UEFqsufcAPjeWP/DUtljdworYZG1bMZzplYaEPpZBwtEf/0k
qfoeTGQ2Vin9a+udU9/jrSFAvHU2lT8neer722G+CzP/zjFD</ds:X509Certificate>
</ds:X509Data>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=RQ/53RmuLsbzgfPXGlRYmJruwMs=,CN=.DMS.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>2</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509Certificate>MIIEdjCCA16gAwIBAgIBAjANBgkqhkiG9w0BAQsFADB/MSEw
HwYDVQQKExhEQzIuU01QVEUuRE9SRU1JTEFCUy5DT00xGjAYBgNVBAsTEURDLkRPUkVNSUxBQlMu
Q09NMRcwFQYDVQQDEw4uRE1TLkRDMi5TTVBURTElMCMGA1UELhMcUlEvNTNSbXVMc2J6Z2ZQWEds
UlltSnJ1d01zPTAeFw0wNzAxMDEwMDAwMDBaFw0yNTEyMzEyMzU5NTlaMIGCMSEwHwYDVQQKExhE
QzIuU01QVEUuRE9SRU1JTEFCUy5DT00xGjAYBgNVBAsTEURDLkRPUkVNSUxBQlMuQ09NMRowGAYD
VQQDExEuREMuRE1TLkRDMi5TTVBURTElMCMGA1UELhMcK0xMdnVZTk80WUJKU3A5SmptbHY4b2lw
cHpRPTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUyBakS7Eb79G3ZFMZ4zOOn/cZ3
qJcck+MAMwjwV8LkK303uBv51cXYNWxalMQQ6h1iPAu6si9RR9XNLGqakHFLUfjt0eC8VJ5/YaC+
DvVq1j9iM5/Jz+CjSqkOlrzXbX92HyMNE0hjCGa4WU6oyRCzFvPZclOI5a2LDKOxC/ngD0LomWjo
MDP7BSkUUzqQnZ2fRuXdOgAfzWm+hBxruWcyEqSGwmV93YBnoHB2WpxVfD+Ztinnp/NJKCadiKf/
sSQpPoqe4j97gY+Zw2DtgT6wddx97ZtCf10QASF5hXgKyCku6O7IlGLroM4TUOldrTClNjR2xSGc
THxcxOltUQcCAwEAAaOB+DCB9TATBgNVHRMBAf8ECTAHAQH/AgIA7TALBgNVHQ8EBAMCAQYwHQYD
VR0OBBYEFPiy77mDTuGASUqfSY5pb/KIqac0MIGxBgNVHSMEgakwgaaAFEUP+d0Zri7G84Hz1xpU
WJia7sDLoYGKpIGHMIGEMSEwHwYDVQQKExhEQzIuU01QVEUuRE9SRU1JTEFCUy5DT00xGjAYBgNV
BAsTEURDLkRPUkVNSUxBQlMuQ09NMRwwGgYDVQQDExMuUFJPRFVDVFMuREMyLlNNUFRFMSUwIwYD
VQQuExxwa0NCOWo1S3JBam5kaGNCa2MzZk9kZkwvQlE9ggEEMA0GCSqGSIb3DQEBCwUAA4IBAQCd
l6G6uFf9+waSrTQqG946Ff1t0b1ANkI6IQQo2sq15aArKjehmrCJzctBfFm3vQj1KlRBI191Mj2m
5Oh/sxcwtG40bSzFeyGZPg9zKA2Cd8oRdw35/8ZLnP96Z/rCxoGNVJAmy9EP8jP9AT/bOk50KvZ/
wo//VN/pscoDrDCaZVLNPAkTdsMNWy+YpV9cnzUGx73jK/iMao++GQ/SEWssBHhjxn3oHWiZi4Xt
ykib8XQqQjyKu4c66jDwu6Ct+MVqUd7ZFPTFListIamu55RnpTXhDKkoN8fIunBsWOs9Kbqbxglx
4zsyE0AGuj2nDstRBWLRy+5SlCByTIKp/PL/</ds:X509Certificate>
</ds:X509Data>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=pkCB9j5KrAjndhcBkc3fOdfL/BQ=,CN=.PRODUCTS.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>4</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509Certificate>MIIEdDCCA1ygAwIBAgIBBDANBgkqhkiG9w0BAQsFADCBhDEh
MB8GA1UEChMYREMyLlNNUFRFLkRPUkVNSUxBQlMuQ09NMRowGAYDVQQLExFEQy5ET1JFTUlMQUJT
LkNPTTEcMBoGA1UEAxMTLlBST0RVQ1RTLkRDMi5TTVBURTElMCMGA1UELhMccGtDQjlqNUtyQWpu
ZGhjQmtjM2ZPZGZML0JRPTAeFw0wNzAxMDEwMDAwMDBaFw0yNTEyMzEyMzU5NTlaMH8xITAfBgNV
BAoTGERDMi5TTVBURS5ET1JFTUlMQUJTLkNPTTEaMBgGA1UECxMRREMuRE9SRU1JTEFCUy5DT00x
FzAVBgNVBAMTDi5ETVMuREMyLlNNUFRFMSUwIwYDVQQuExxSUS81M1JtdUxzYnpnZlBYR2xSWW1K
cnV3TXM9MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuqXUXsGFKhmSNFaqAMHloGUp
vTFkFlnjHwRYxUv1JhQjKmysUhyqvXRf7jnx54zsRKdvOXUw3HfGrX9R9gPODL8uVbME406OTqD1
fhhhZ0co02TgXPpaYxkQZlgv9Ygz3pHA51+qXOaMRbPU364gTMPVgXyqljIlDKknZTXeiqp8KB1N
iTdslrn3IajOxm3pd1Mh2kq2/FyC9qAyZJPbgdcSfm4ZWkxgvllikZ4HQGEuT+P31xmN3K7SQrpk
3jRS1PgFHvUUnCeyQh1jtRlepy2Im4SPpWh1sY+hiR2dakqZCFNKB11wEyZOX3nCqOeDfJL60BNm
9RKgSwPVh6SSywIDAQABo4H0MIHxMBMGA1UdEwEB/wQJMAcBAf8CAgDuMAsGA1UdDwQEAwIBBjAd
BgNVHQ4EFgQURQ/53RmuLsbzgfPXGlRYmJruwMswga0GA1UdIwSBpTCBooAUpkCB9j5KrAjndhcB
kc3fOdfL/BShgYakgYMwgYAxITAfBgNVBAoTGERDMi5TTVBURS5ET1JFTUlMQUJTLkNPTTEaMBgG
A1UECxMRREMuRE9SRU1JTEFCUy5DT00xGDAWBgNVBAMTDy5ST09ULkRDMi5TTVBURTElMCMGA1UE
LhMcYS93VUlITHVGVzdSS1hwTlFHbVE5NjZ4T3Y4PYIBAjANBgkqhkiG9w0BAQsFAAOCAQEAXgI7
+4euCqODivtBpzIunWJBGr+v5jojDLFp6e3fBDznYEY6p4R4B741C7HZ6qE39vV6ZqcBmDjDi7cE
fOa9QmC7Mj0MUM/XXrVlLvHmIRwVcOoZdxz/5JSfQkwPGyXT2MTmgGyTAqeB/NXazjR6YzCOcoqm
CcFRgvubRscN4V5GFC2k7JdvP/s9QeU5cGBePy09sUTm54aFS9MbdQGZa+hqCoNetMvjEGhuUxpe
twOLhXUca9KMT2ikxoA4bNc1P5Ekma8HqX0Dv/BKXtz7YTYUUN2YE12PMaqFLonjvl/mB/n9CHc/
AAVM+A/J+q+14LJqcElnzHkvNTv2Qvp5+g==</ds:X509Certificate>
</ds:X509Data>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=a/wUIHLuFW7RKXpNQGmQ966xOv8=,CN=.ROOT.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>2</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509Certificate>MIIEdjCCA16gAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBgDEh
MB8GA1UEChMYREMyLlNNUFRFLkRPUkVNSUxBQlMuQ09NMRowGAYDVQQLExFEQy5ET1JFTUlMQUJT
LkNPTTEYMBYGA1UEAxMPLlJPT1QuREMyLlNNUFRFMSUwIwYDVQQuExxhL3dVSUhMdUZXN1JLWHBO
UUdtUTk2NnhPdjg9MB4XDTA3MDEwMTAwMDAwMFoXDTI1MTIzMTIzNTk1OVowgYQxITAfBgNVBAoT
GERDMi5TTVBURS5ET1JFTUlMQUJTLkNPTTEaMBgGA1UECxMRREMuRE9SRU1JTEFCUy5DT00xHDAa
BgNVBAMTEy5QUk9EVUNUUy5EQzIuU01QVEUxJTAjBgNVBC4THHBrQ0I5ajVLckFqbmRoY0JrYzNm
T2RmTC9CUT0wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTXmBvZYW1jYsr8GaPzJeD
zeWN+Vus/RDVdaWQ9hLXKw2nLjNFNX+RYB76QiugCGUwBZ71kOL0RQ6kSAkz9FBQGYca9sh2imTc
pEuw/qjbHxClO7DNyd0af5oYtZdopBBy71ksrUWOIFeKgfa1C3iLKJWVeTDZll4s78Xzo0hdQVwF
oFyVRiQRkyr2urj0euMMcykBD5KD+hjKNpxZukzxu8VKKBSJwjifL4SsmV+zsTDJH/nRaySnhLCB
L+aO7MF6d4DF+ANKcD5LX6CQW3NIqPHhdPFC+lAol2/6sPBkbnFEfbWiHbDHS34LJaWaLkqJ3tt/
/ETe6FZe761vkeUbAgMBAAGjgfQwgfEwEwYDVR0TAQH/BAkwBwEB/wICAO8wCwYDVR0PBAQDAgEG
MB0GA1UdDgQWBBSmQIH2PkqsCOd2FwGRzd8518v8FDCBrQYDVR0jBIGlMIGigBRr/BQgcu4VbtEp
ek1AaZD3rrE6/6GBhqSBgzCBgDEhMB8GA1UEChMYREMyLlNNUFRFLkRPUkVNSUxBQlMuQ09NMRow
GAYDVQQLExFEQy5ET1JFTUlMQUJTLkNPTTEYMBYGA1UEAxMPLlJPT1QuREMyLlNNUFRFMSUwIwYD
VQQuExxhL3dVSUhMdUZXN1JLWHBOUUdtUTk2NnhPdjg9ggEBMA0GCSqGSIb3DQEBCwUAA4IBAQCd
sDTq1a3Q96o8ShsyKmEKVUCNnX6ez5XcVg5LXb8QJxXzLD+ffbf15Jj201iElpPQCNU9QHNOOoR9
IoObGZBOLi5ekMhfpfffcpwkwmq3nmb3h6WPLU7PAxLYcE3nNZdbv5QocblNs3e4Ecc3nK2bIS0K
9/e+75UT6wfOCWWCF+AHQt+1Uej6G2f2yZJ5aWqeOv3mqXEtWV8W/iiUEhz6pONdb8Vs0Bhn6FMa
jjTkpSVaC/w7W38htkG0Nk9T5Lf/TdIQHjoALB12suLTZymj8hq53PVxIN+aa0cboVE0PEtwYI5J
tIY/GaHgNIVKoTRvgq7YXTVnvGqgolL1zwDx</ds:X509Certificate>
</ds:X509Data>
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=a/wUIHLuFW7RKXpNQGmQ966xOv8=,CN=.ROOT.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>1</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509Certificate>MIIEcjCCA1qgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgDEh
MB8GA1UEChMYREMyLlNNUFRFLkRPUkVNSUxBQlMuQ09NMRowGAYDVQQLExFEQy5ET1JFTUlMQUJT
LkNPTTEYMBYGA1UEAxMPLlJPT1QuREMyLlNNUFRFMSUwIwYDVQQuExxhL3dVSUhMdUZXN1JLWHBO
UUdtUTk2NnhPdjg9MB4XDTA3MDEwMTAwMDAwMFoXDTI1MTIzMTIzNTk1OVowgYAxITAfBgNVBAoT
GERDMi5TTVBURS5ET1JFTUlMQUJTLkNPTTEaMBgGA1UECxMRREMuRE9SRU1JTEFCUy5DT00xGDAW
BgNVBAMTDy5ST09ULkRDMi5TTVBURTElMCMGA1UELhMcYS93VUlITHVGVzdSS1hwTlFHbVE5NjZ4
T3Y4PTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ/xde0jhq2qV0aBlsyv8Cl4vH1+
RRiAl7DyBwKFk0riupyj+/8naVxcWG0Mx9zkWNyDJKowhMqMAMzNzssphxJoFGTOSVDM+WDlS3JZ
BEgdIrvyTjERWMea32nC3uUu8I6JdEhuiUZBHb2FmQBVsp6S3ss9m0iV5zo/zf3Ev2J0j7mDxcp3
Q68zcpmIeik48qpgtfez+svz2tX9eI1mYZW77v9oQiMRZXMGlaiwNlXp3FqkBjAD6MTEWGInEp6b
OtjksVXwZPbFlHlke+wK1wlWMB0wPFAwGsTfeUbTlaaonSHz0JAf0MORYW49cIbInKJffdrZMRBR
tPmsmNDvlIMCAwEAAaOB9DCB8TATBgNVHRMBAf8ECTAHAQH/AgIA8DALBgNVHQ8EBAMCAQYwHQYD
VR0OBBYEFGv8FCBy7hVu0Sl6TUBpkPeusTr/MIGtBgNVHSMEgaUwgaKAFGv8FCBy7hVu0Sl6TUBp
kPeusTr/oYGGpIGDMIGAMSEwHwYDVQQKExhEQzIuU01QVEUuRE9SRU1JTEFCUy5DT00xGjAYBgNV
BAsTEURDLkRPUkVNSUxBQlMuQ09NMRgwFgYDVQQDEw8uUk9PVC5EQzIuU01QVEUxJTAjBgNVBC4T
HGEvd1VJSEx1Rlc3UktYcE5RR21ROTY2eE92OD2CAQEwDQYJKoZIhvcNAQELBQADggEBAH+n8SDy
Hs9JItFnOOgdxKY9/d8iZUJh5GFWdDpInaW6XRoz5dV6vdXPGAiQwvZuKDniWgg4yhrBbesp4RU4
64p2jzL+YUqnUPews7ZT+u2YVbSfh+fO011kSHZLdzTkdA8BWQCVM0e0rCVLRZMw4VPQpwYmnkeM
gheqKfNSyGKiafhuKGqTnqDrr/74/gIq8ZGl/doidoF/DBiiQlYR7eqlMCsTDam+C9E2cpwBN3A1
5yeuD8d+foFVYVmIR71pHFrJ6tRzuRDwqWdVNQa6/kk3pS1Lut7AWpmNirjIhKWJgDW57KlDGIsw
Bw/YZzykpHYmuzBxLriBb5TYsWziILI=</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</PackingList>
On sera bien d'accord que ceci est un simple exemple et que le nombre d'assets peut être plus important.
Vous remarquez que la différence majeure entre la version minimale et la version complète se porte sur la partie cryptographique : Signer et Signature.
Voici un schéma visuel simplifié de la structure interne d'une PKL.
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. Si une case est doublée (ex Asset), ce qu'il peut en avoir plusieurs autres.
Id
est un élément à la racine et contient un identifiantAssetList
va contenir un ou plusieurs Asset
Asset
possède plusieurs élements comme Id
, Hash
, ... Important : Les éléments doivent suivre cet ordre. 3
Déjà vu dans AssetMap
Déjà vu dans AssetMap
Déjà vu dans AssetMap
Déjà vu dans AssetMap
Déjà vu dans AssetMap
Élément jamais utilisé.
Il permet de définir un UUID lié à une image permettant de représenter le package.
Ce truc est tellement pas utilisé que même dans la documentation SMPTE, nous n'avons pas plus d'informations : le type de format ? le type d'encodage ? Rien.
Élément jamais utilisé.
Il permet de définir un UUID qui va lier plusieurs DCP. Selon la documentation :
Comme pour IconId, ce truc est tellement pas utilisé que même dans la documentation SMPTE, il indique que l'utilisation est en dehors de leur scope.
Dans les faits, tous les DCP sont sans GroupId, même ceux où certains assets se trouvent dans d'autres DCP (cas de figure des DCP VersionFile). Les players - qui se retrouvent avec des DCP incomplets - indiquent simplement que certains assets sont manquants. Charge au projectionniste d'ingester les autres DCP pour compléter tous les assets.
AssetList est une collection d'Asset.
Chaque asset est un fichier stocké dans le DCP. Même principe que pour l'AssetMap -> AssetList.
Identifiant unique de l'asset, déjà vu dans AssetMap Ces identifiants doivent être extraits des différents assets.
Type d'asset | Lien chapitre |
---|---|
Pour une CPL | Récupération de l'identifiant (ID) d'une CPL |
Pour un MXF | Récuparation de l'identifiant AssetUUID d'un MXF |
Déjà vu dans AssetMap
Simple texte faciment lisible qui va donner des infos sur l'asset. Il n'y a aucune règle précise, c'est au libre choix de la personne qui a créé le DCP; D'autant plus que ce champ est optionnel.
C'est l'empreinte du fichier.
Calcul effectué avec l'algorithme de hash SHA-1 du fichier, enrobé dans un encodage Base64.
Concrètement, nous effectuons ce calcul :
Pour effectuer un calcul avec OpenSSL sur video.mxf :
Donne la taille du fichier en octets.
Définit le type de l'asset sous son format MIME. Officiellement, vous pouvez mettre ce que vous voulez comme type de MIME.
Dans les faits, vous n'aurez que ces valeurs :
Type | Informations | |
---|---|---|
text/xml |
Fichiers XML (CPL, Sous-titres, ...) | SMPTE |
application/mxf |
Fichiers MXF (Picture, Sound, ...) | SMPTE |
Vous pouvez rencontrer ces autres types dans certaines PKL :
Type | Informations |
---|---|
text/xml;asdcpKind=CPL |
CPL |
text/xml;asdcpKind=Subtitle |
Subtitle XML |
application/x-smpte-mxf;asdcpKind=Picture |
MXF Picture |
application/x-smpte-mxf;asdcpKind=Sound |
MXF Sound |
application/ttf |
Subtitle Font |
image/png |
Subtitle Image |
Il n'existe aucune réfernce de ces types dans les documentations SMPTE, mais elles peuvent exister dans certaines PKL.
Malgré son nom très évocateur, ce tag ne doit pas être pris pour argent comptant : le créateur de la PKL peut y placer ce qu'il veut.
Certains encodeurs donnent le nom véritable du fichier, tandis que d'autres ne mettent qu'un nom générique sur le type de fichier (exemple "CPL", "PKL", etc...). D'autres encodeurs peuvent mettre le nom du fichier dans AnnotationText... En plus d'être optionnel, OriginalFileName n'est pas une solution viable.
N'utilisez jamais OriginalFileName pour identifier ou rechercher un fichier.
La cryptographie dans une PKL va au delà du simple Hash
dans les assets, elle s'applique également lors de la signature du fichier qui va permettre d'authentifier les informations.
<Signer xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=\+LLvuYNO4YBJSp9Jjmlv8oippzQ=,CN=.DC.DMS.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>39</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509SubjectName>dnQualifier=Sbv3L5YQRoaBBIhNsOCYypL3B18=,CN=ME CS SM.DMSJP2K-70037.DC.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509SubjectName>
</ds:X509Data>
</Signer>
Identifie électroniquement l'encodeur qui a généré la PKL.
Si le bloc Signer est présent alors le bloc Signature est également présent (et inversement).
L'identité du certificat de l'encodeur se trouve dans X509SubjectName. La partie Issuer est le certificat parent de ce certificat. Nous verrons plus en détail ceci dans le chapitre Certificats avec la chaîne de certification.
La Signature est étudiée dans le chapitre KDM Signature
Cependant, il existe deux principales différences avec KDM Signature :
L'attribut URI de Reference n'est pas défini : Le calcul de l'empreinte et de la signature s'appliquent sur l'ensemble de la PKL.
Présence d'un tag Transform qui va définir le type de méthode utilisée : la transformation est normée par la documentation XMLsec, dont les principales références ont déjà été étudiées dans KDM Signature - agrémentée des parties Enveloped Signature Transform et XPath Filtering pour la partie Transform spécifique à la PKL.
Un exemple simplifié :
<ds:Reference URI=""> <== URI non défini
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform> <== Transform ajouté
</ds:Transforms>
(...)
</ds:Reference>
Voici un template (sans chaîne de certificats, pour la lisibilité seulement) prêt à être signer :
<?xml version="1.0" encoding="UTF-8"?>
<PackingList xmlns="http://www.smpte-ra.org/schemas/429-8/2007/PKL">
<Id>urn:uuid:0aa34dd5-34da-4b61-9611-7469611fdfc3</Id>
<AnnotationText>DCP-INSIDE-CRYPTE_TST-2D-24_C_FR-XX_51_4K_20220102_SMPTE_OV</AnnotationText>
<IssueDate>2021-10-26T13:41:54+02:00</IssueDate>
<Issuer>Doremi Labs, Inc.</Issuer>
<Creator>orca_wrapping 3.2.0</Creator>
<AssetList>
<Asset>
<Id>urn:uuid:3bd3d849-117b-46b0-bc45-3d3228c987c6</Id>
<Hash>hnBSgENJXOvI6bfpat7GA1VImss=</Hash>
<Size>989547</Size>
<Type>application/mxf</Type>
<OriginalFileName>jp2k_3bd3d849-117b-46b0-bc45-3d3228c987c6_video.mxf</OriginalFileName>
</Asset>
<Asset>
<Id>urn:uuid:3433a00f-4bc8-4c16-b33c-b0b0d65711af</Id>
<Hash>ACd4Aky39E608RNnVfAOisPICZ4=</Hash>
<Size>889695</Size>
<Type>application/mxf</Type>
<OriginalFileName>wav_3433a00f-4bc8-4c16-b33c-b0b0d65711af_audio.mxf</OriginalFileName>
</Asset>
<Asset>
<Id>urn:uuid:4aa03fde-da81-4451-baaa-4d85bf4773d0</Id>
<AnnotationText>CPL: DCP-INSIDE-CRYPTE_TST-2D-24_C_FR-XX_51_4K_20220102_SMPTE_OV</AnnotationText>
<Hash>YOdZjnEy0JynObowRG9FLXx8tD4=</Hash>
<Size>13102</Size>
<Type>text/xml</Type>
<OriginalFileName>CPL_4aa03fde-da81-4451-baaa-4d85bf4773d0.xml</OriginalFileName>
</Asset>
</AssetList>
<Signer xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data>
<ds:X509IssuerSerial>
<ds:X509IssuerName>dnQualifier=\+LLvuYNO4YBJSp9Jjmlv8oippzQ=,CN=.DC.DMS.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
<ds:X509SerialNumber>39</ds:X509SerialNumber>
</ds:X509IssuerSerial>
<ds:X509SubjectName>dnQualifier=Sbv3L5YQRoaBBIhNsOCYypL3B18=,CN=ME CS SM.DMSJP2K-70037.DC.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509SubjectName>
</ds:X509Data>
</Signer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue></ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue></ds:SignatureValue>
</ds:Signature>
</PackingList>
Vous voyez que notre partie Signature est totalement vide de données. Le bloc KeyInfo - qui contient notre chaîne de certificats - a été supprimé seulement pour des raisons de visibilité, non pour des raisons cryptographiques, ils n'entrent pas dans le calcul, ni du DigestValue, ni de la SignatureValue, nous pouvons donc les exclure pour l'instant.
Pour rappel de la documentation KDM Signature, DigestValue est la simple empreinte de la PKL (sans le bloc Signature) - et la SignatureValue est la signature de toute la PKL comprenant aussi le bloc Signature avec son DigestValue déjà calculé et - en utilisant la clef privée de l'encodeur (la signature sera un résultat cryptographie à l'aide de la suite algorithmique rsa-sha256)
Nous pouvons maintenant signer notre template vu ci-dessus - à l'aide de l'outil xmlsec1 (ou tout autre outil gérant la norme xmldsig) - en utilisant la clef privée de l'encodeur (Signer) :
# xmlsec1 sign --privkey-pem "encoder.pem" "PKL.template-xmlsec.xml"
(...)
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>oaFoCRQ0/2dFTxOk79qahgJQmMk=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>fEXBsbpfMRJ+uVgFKUfz1eZe3KLmoddWMBYN5+0Jw17BHga9P0bJTMIS2w8C4em7
HFUaXubW8Ej/jq1srDuuyT69CJW4ZPJUeZTj/V+6NL9Zgu6DPYermsef23Mcl0Dt
2291Pn8xvyELjHyd81PbMf5sZ8DuvKbl+9HHTmltCtp/P1BvjA95yYs/RoLJIVFe
cM6uepzIonN+eSST7mTMfAtOn6DUye+qbZnrmAdACUu9W0V26USoXPIsgoOm+rLW
A+nrTE6ugn/z+a3ZhD1BozK29tNH8bug2jk4HWh68X127e0hu6Ix0+qS6T3lFFEr
hO0d8dC+ZLiI266Ab+Fliw==</ds:SignatureValue>
</ds:Signature>
</PackingList>
S'il y a un bloc Signature, il faudra intégrer la chaine de certificats du Signer dans la partie KeyInfo.
Tout cette partie signature est nécessaire pour que le récepteur (recipient) puisse vérifier l'intégrité de la PKL et de ses liens avec les différents assets, surtout si le DCP contient des assets chiffrés, dans ce cas, la signature devient obligatoire.
Enfin, toute la partie KeyInfo a été étudiée dans KDM Signature : elle contient l'ensemble de la chaîne de certification, du certificat public de l'encodeur jusqu'au certificat racine du constructeur.
Pour plus d'informations à propos des certificats et de la chaîne de certifications, vous pouvez vous reporter au chapitre Certificats.
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 429-2 - DCP Operational Constraints ↩
Il faut au minimum une PKL et un asset (la CPL étant considéré comme un asset). 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 : ↩
Si on essaye de faire un DCP le plus minimal possible, nous pourrions avoir seulement 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.
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 PKL. Par exemple, à la racine, vous devez respecter que les éléments Id
, AnnotationText
, Creator
, etc.. 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 la PKL: si les éléments sont entourés du tag xs:sequence
, il faut respecter un ordre. ↩