summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-03-09 21:07:30 +0100
committerCarl Hetherington <cth@carlh.net>2020-03-09 21:07:30 +0100
commit5f8a8d0b4e6a476f6b4d8da655fdff51bdcab8fd (patch)
tree54482bede6b194d4897968a06dd0e59ac004d6b9
parente617a3f8073fbf8d1d9ef01b57e866dd41978b87 (diff)
parent340ae40c51ee175063578ce80131a92d911d9838 (diff)
Merge.
-rw-r--r--cscript3
-rw-r--r--src/reel.cc20
-rw-r--r--src/reel.h2
-rw-r--r--src/util.cc4
-rw-r--r--src/verify.cc25
-rw-r--r--src/verify.h6
-rw-r--r--test/ref/DCP/dcp_test8/ASSETMAP56
-rw-r--r--test/ref/DCP/dcp_test8/VOLINDEX4
-rw-r--r--test/ref/DCP/dcp_test8/cpl_d74fda30-d5f4-4c5f-870f-ebc089d97eb7.xml162
-rw-r--r--test/ref/DCP/dcp_test8/j2c_d7576dcb-a361-4139-96b8-267f5f8d7f91.mxfbin0 -> 47739 bytes
-rw-r--r--test/ref/DCP/dcp_test8/pcm_a2a87f5d-b749-4a7e-8d0c-9d48a4abf626.mxfbin0 -> 845154 bytes
-rw-r--r--test/ref/DCP/dcp_test8/pkl_0382c908-7389-45d6-b671-d5100868cbbe.xml151
-rw-r--r--test/verify_test.cc130
-rw-r--r--wscript2
-rw-r--r--xsd/Main-Stereo-Picture-CPL.xsd11
-rw-r--r--xsd/PROTO-ASDCP-AM-20040311.xsd67
-rw-r--r--xsd/PROTO-ASDCP-CPL-20040511.xsd251
-rw-r--r--xsd/PROTO-ASDCP-PKL-20040311.xsd60
18 files changed, 920 insertions, 34 deletions
diff --git a/cscript b/cscript
index 42260e40..2cdf3149 100644
--- a/cscript
+++ b/cscript
@@ -69,6 +69,9 @@ def build(target, options):
if target.debug:
cmd += ' --enable-debug'
+ if options is not None and 'force-cpp11' in options and options['force-cpp11']:
+ cmd += ' --force-cpp11'
+
target.command(cmd)
target.command('./waf build install')
diff --git a/src/reel.cc b/src/reel.cc
index 14c0b1e2..3bf249c9 100644
--- a/src/reel.cc
+++ b/src/reel.cc
@@ -282,6 +282,26 @@ Reel::add (shared_ptr<ReelAsset> asset)
}
}
+list<shared_ptr<ReelAsset> >
+Reel::assets () const
+{
+ list<shared_ptr<ReelAsset> > a;
+ if (_main_picture) {
+ a.push_back (_main_picture);
+ }
+ if (_main_sound) {
+ a.push_back (_main_sound);
+ }
+ if (_main_subtitle) {
+ a.push_back (_main_subtitle);
+ }
+ std::copy (_closed_captions.begin(), _closed_captions.end(), back_inserter(a));
+ if (_atmos) {
+ a.push_back (_atmos);
+ }
+ return a;
+}
+
void
Reel::resolve_refs (list<shared_ptr<Asset> > assets)
{
diff --git a/src/reel.h b/src/reel.h
index 0a3cf19a..3792682e 100644
--- a/src/reel.h
+++ b/src/reel.h
@@ -111,6 +111,8 @@ public:
void add (boost::shared_ptr<ReelAsset> asset);
+ std::list<boost::shared_ptr<ReelAsset> > assets () const;
+
void write_to_cpl (xmlpp::Element* node, Standard standard) const;
bool encrypted () const;
diff --git a/src/util.cc b/src/util.cc
index 9374b6e7..f755c21e 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -175,8 +175,8 @@ dcp::init ()
}
#ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING
- if (xmlSecCryptoDLLoadLibrary(BAD_CAST XMLSEC_CRYPTO) < 0) {
- throw MiscError ("unable to load default xmlsec-crypto library");
+ if (xmlSecCryptoDLLoadLibrary(BAD_CAST "openssl") < 0) {
+ throw MiscError ("unable to load openssl xmlsec-crypto library");
}
#endif
diff --git a/src/verify.cc b/src/verify.cc
index c91257be..66cd25e4 100644
--- a/src/verify.cc
+++ b/src/verify.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2018-2019 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2018-2020 Carl Hetherington <cth@carlh.net>
This file is part of libdcp.
@@ -196,6 +196,10 @@ public:
add("http://www.w3.org/2001/XMLSchema.dtd", "XMLSchema.dtd");
add("http://www.w3.org/2001/03/xml.xsd", "xml.xsd");
add("http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd", "xmldsig-core-schema.xsd");
+ add("http://www.digicine.com/schemas/437-Y/2007/Main-Stereo-Picture-CPL.xsd", "Main-Stereo-Picture-CPL.xsd");
+ add("http://www.digicine.com/PROTO-ASDCP-CPL-20040511.xsd", "PROTO-ASDCP-CPL-20040511.xsd");
+ add("http://www.digicine.com/PROTO-ASDCP-PKL-20040311.xsd", "PROTO-ASDCP-PKL-20040311.xsd");
+ add("http://www.digicine.com/PROTO-ASDCP-AM-20040311.xsd", "PROTO-ASDCP-AM-20040311.xsd");
}
InputSource* resolveEntity(XMLCh const *, XMLCh const * system_id)
@@ -245,7 +249,10 @@ validate_xml (boost::filesystem::path xml_file, boost::filesystem::path xsd_dtd_
schema["http://www.smpte-ra.org/schemas/429-7/2006/CPL"] = "SMPTE-429-7-2006-CPL.xsd";
schema["http://www.smpte-ra.org/schemas/429-8/2006/PKL"] = "SMPTE-429-8-2006-PKL.xsd";
schema["http://www.smpte-ra.org/schemas/429-9/2007/AM"] = "SMPTE-429-9-2007-AM.xsd";
- schema["http://www.w3.org/2001/03/xml.xsd"] = "xml.xsd";
+ schema["http://www.digicine.com/schemas/437-Y/2007/Main-Stereo-Picture-CPL.xsd"] = "Main-Stereo-Picture-CPL.xsd";
+ schema["http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"] = "PROTO-ASDCP-CPL-20040511.xsd";
+ schema["http://www.digicine.com/PROTO-ASDCP-PKL-20040311#"] = "PROTO-ASDCP-PKL-20040311.xsd";
+ schema["http://www.digicine.com/PROTO-ASDCP-AM-20040311#"] = "PROTO-ASDCP-AM-20040311.xsd";
string locations;
for (map<string, string>::const_iterator i = schema.begin(); i != schema.end(); ++i) {
@@ -364,6 +371,16 @@ dcp::verify (
BOOST_FOREACH (shared_ptr<Reel> reel, cpl->reels()) {
stage ("Checking reel", optional<boost::filesystem::path>());
+
+ BOOST_FOREACH (shared_ptr<ReelAsset> i, reel->assets()) {
+ if (i->duration() && (i->duration().get() * i->edit_rate().denominator / i->edit_rate().numerator) < 1) {
+ notes.push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::DURATION_TOO_SMALL, i->id()));
+ }
+ if ((i->intrinsic_duration() * i->edit_rate().denominator / i->edit_rate().numerator) < 1) {
+ notes.push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::INTRINSIC_DURATION_TOO_SMALL, i->id()));
+ }
+ }
+
if (reel->main_picture()) {
/* Check reel stuff */
Fraction const frame_rate = reel->main_picture()->frame_rate();
@@ -470,6 +487,10 @@ dcp::note_to_string (dcp::VerificationNote note)
return String::compose("An XML file is badly formed: %1 (%2:%3)", note.note().get(), note.file()->filename(), note.line().get());
case dcp::VerificationNote::MISSING_ASSETMAP:
return "No ASSETMAP or ASSETMAP.xml was found";
+ case dcp::VerificationNote::INTRINSIC_DURATION_TOO_SMALL:
+ return String::compose("The intrinsic duration of an asset is less than 1 second long: %1", note.note().get());
+ case dcp::VerificationNote::DURATION_TOO_SMALL:
+ return String::compose("The duration of an asset is less than 1 second long: %1", note.note().get());
}
return "";
diff --git a/src/verify.h b/src/verify.h
index 89069bdd..38c9ee75 100644
--- a/src/verify.h
+++ b/src/verify.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2018 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2018-2020 Carl Hetherington <cth@carlh.net>
This file is part of libdcp.
@@ -79,6 +79,10 @@ public:
XML_VALIDATION_ERROR,
/** No ASSETMAP{.xml} was found */
MISSING_ASSETMAP
+ /** An asset's IntrinsicDuration is less than 1 second */
+ INTRINSIC_DURATION_TOO_SMALL,
+ /** An asset's Duration is less than 1 second */
+ DURATION_TOO_SMALL
};
VerificationNote (Type type, Code code)
diff --git a/test/ref/DCP/dcp_test8/ASSETMAP b/test/ref/DCP/dcp_test8/ASSETMAP
new file mode 100644
index 00000000..adb1829e
--- /dev/null
+++ b/test/ref/DCP/dcp_test8/ASSETMAP
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<AssetMap xmlns="http://www.digicine.com/PROTO-ASDCP-AM-20040311#">
+ <Id>urn:uuid:5a89bd07-3af3-4f48-bdb4-b8fe6d22d8f8</Id>
+ <AnnotationText>Short_FTR-1_F_MOS_2K_20200308_IOP_OV</AnnotationText>
+ <VolumeCount>1</VolumeCount>
+ <IssueDate>2020-03-08T22:39:14+01:00</IssueDate>
+ <Issuer>DCP-o-matic 2.15.47devel caf67bef26</Issuer>
+ <Creator>DCP-o-matic 2.15.47devel caf67bef26</Creator>
+ <AssetList>
+ <Asset>
+ <Id>urn:uuid:0382c908-7389-45d6-b671-d5100868cbbe</Id>
+ <PackingList>true</PackingList>
+ <ChunkList>
+ <Chunk>
+ <Path>pkl_0382c908-7389-45d6-b671-d5100868cbbe.xml</Path>
+ <VolumeIndex>1</VolumeIndex>
+ <Offset>0</Offset>
+ <Length>8738</Length>
+ </Chunk>
+ </ChunkList>
+ </Asset>
+ <Asset>
+ <Id>urn:uuid:d74fda30-d5f4-4c5f-870f-ebc089d97eb7</Id>
+ <ChunkList>
+ <Chunk>
+ <Path>cpl_d74fda30-d5f4-4c5f-870f-ebc089d97eb7.xml</Path>
+ <VolumeIndex>1</VolumeIndex>
+ <Offset>0</Offset>
+ <Length>9079</Length>
+ </Chunk>
+ </ChunkList>
+ </Asset>
+ <Asset>
+ <Id>urn:uuid:d7576dcb-a361-4139-96b8-267f5f8d7f91</Id>
+ <ChunkList>
+ <Chunk>
+ <Path>j2c_d7576dcb-a361-4139-96b8-267f5f8d7f91.mxf</Path>
+ <VolumeIndex>1</VolumeIndex>
+ <Offset>0</Offset>
+ <Length>47739</Length>
+ </Chunk>
+ </ChunkList>
+ </Asset>
+ <Asset>
+ <Id>urn:uuid:a2a87f5d-b749-4a7e-8d0c-9d48a4abf626</Id>
+ <ChunkList>
+ <Chunk>
+ <Path>pcm_a2a87f5d-b749-4a7e-8d0c-9d48a4abf626.mxf</Path>
+ <VolumeIndex>1</VolumeIndex>
+ <Offset>0</Offset>
+ <Length>845154</Length>
+ </Chunk>
+ </ChunkList>
+ </Asset>
+ </AssetList>
+</AssetMap>
diff --git a/test/ref/DCP/dcp_test8/VOLINDEX b/test/ref/DCP/dcp_test8/VOLINDEX
new file mode 100644
index 00000000..907d8fd1
--- /dev/null
+++ b/test/ref/DCP/dcp_test8/VOLINDEX
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VolumeIndex xmlns="http://www.digicine.com/PROTO-ASDCP-VL-20040311#">
+ <Index>1</Index>
+</VolumeIndex>
diff --git a/test/ref/DCP/dcp_test8/cpl_d74fda30-d5f4-4c5f-870f-ebc089d97eb7.xml b/test/ref/DCP/dcp_test8/cpl_d74fda30-d5f4-4c5f-870f-ebc089d97eb7.xml
new file mode 100644
index 00000000..dbfd96fc
--- /dev/null
+++ b/test/ref/DCP/dcp_test8/cpl_d74fda30-d5f4-4c5f-870f-ebc089d97eb7.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CompositionPlaylist xmlns="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#">
+ <Id>urn:uuid:d74fda30-d5f4-4c5f-870f-ebc089d97eb7</Id>
+ <AnnotationText>Short_FTR-1_F_MOS_2K_20200308_IOP_OV</AnnotationText>
+ <IssueDate>2020-03-08T22:39:14+01:00</IssueDate>
+ <Issuer>DCP-o-matic 2.15.47devel caf67bef26</Issuer>
+ <Creator>DCP-o-matic 2.15.47devel caf67bef26</Creator>
+ <ContentTitleText>Short_FTR-1_F_MOS_2K_20200308_IOP_OV</ContentTitleText>
+ <ContentKind>feature</ContentKind>
+ <ContentVersion>
+ <Id>urn:uuid:52041263-579d-4b39-9f00-e50fc05def07</Id>
+ <LabelText></LabelText>
+ </ContentVersion>
+ <RatingList/>
+ <ReelList>
+ <Reel>
+ <Id>urn:uuid:cd5df0e8-1072-4f24-8770-5ca5dfb9e6ec</Id>
+ <AssetList>
+ <MainPicture>
+ <Id>urn:uuid:d7576dcb-a361-4139-96b8-267f5f8d7f91</Id>
+ <AnnotationText></AnnotationText>
+ <EditRate>24 1</EditRate>
+ <IntrinsicDuration>23</IntrinsicDuration>
+ <EntryPoint>0</EntryPoint>
+ <Duration>23</Duration>
+ <Hash>jOZgIxogFSZZm2Bo2l+SIa9JhEE=</Hash>
+ <FrameRate>24 1</FrameRate>
+ <ScreenAspectRatio>1.85</ScreenAspectRatio>
+ </MainPicture>
+ <MainSound>
+ <Id>urn:uuid:a2a87f5d-b749-4a7e-8d0c-9d48a4abf626</Id>
+ <AnnotationText></AnnotationText>
+ <EditRate>24 1</EditRate>
+ <IntrinsicDuration>23</IntrinsicDuration>
+ <EntryPoint>0</EntryPoint>
+ <Duration>23</Duration>
+ <Hash>+/1qe/yPbyof3CrPUgncvm3pfoE=</Hash>
+ </MainSound>
+ </AssetList>
+ </Reel>
+ </ReelList>
+ <Signer xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
+ <dsig:X509Data>
+ <dsig:X509IssuerSerial>
+ <dsig:X509IssuerName>dnQualifier=lZk4e0WYYlT85Lcd6WEFqLA\+RBM=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName>
+ <dsig:X509SerialNumber>7</dsig:X509SerialNumber>
+ </dsig:X509IssuerSerial>
+ <dsig:X509SubjectName>dnQualifier=gpFOP6eBu1fU6/yfdn\+UlWuFtqA=,CN=CS.dcpomatic.smpte-430-2.LEAF,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509SubjectName>
+ </dsig:X509Data>
+ </Signer>
+ <dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
+ <dsig:SignedInfo>
+ <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
+ <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
+ <dsig:Reference URI="">
+ <dsig:Transforms>
+ <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
+ </dsig:Transforms>
+ <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
+ <dsig:DigestValue>u3F0ncdRZO5TFTs6uOaSIQ+T9to=</dsig:DigestValue>
+ </dsig:Reference>
+ </dsig:SignedInfo>
+ <dsig:SignatureValue>GqylxgKM/MB6BujLTlc0XRRtMEOe4xvJFc+5dUOcqxpIRCCPHf1SLNSWyy94xC68
+hF7P2na7RZ7/ILleUmD3PRNWnZJutk7mHRDPCM8zvxTsnFz6VcvNgrGy83IN7BBM
+Gdn6liMoCSQERdqQ/KvSr5WtXjvRVBDYlXyrRYCysj0uS4yx5u4x43QNJSuBfVfw
+eJOm9fDjKURfFYEf6I05Nycwll+MfQPgA8LLgArYFuy5SbjKfIeBrxXhVqXDH7kC
+5R1QX/xa3khHhsZp6JPKZBMtr+5+SuSuQmppx0L3rbj8vTOVoV7W3DH4unzygQ+6
+UnSAhQTs6jMFUOntHN6+XA==</dsig:SignatureValue>
+ <dsig:KeyInfo>
+ <dsig:X509Data>
+ <dsig:X509IssuerSerial>
+ <dsig:X509IssuerName>dnQualifier=lZk4e0WYYlT85Lcd6WEFqLA\+RBM=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName>
+ <dsig:X509SerialNumber>7</dsig:X509SerialNumber>
+ </dsig:X509IssuerSerial>
+ <dsig:X509Certificate>MIIEazCCA1OgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBhTEWMBQGA1UEChMNZGNw
+b21hdGljLmNvbTEWMBQGA1UECxMNZGNwb21hdGljLmNvbTEsMCoGA1UEAxMjLmRj
+cG9tYXRpYy5zbXB0ZS00MzAtMi5JTlRFUk1FRElBVEUxJTAjBgNVBC4THGxaazRl
+MFdZWWxUODVMY2Q2V0VGcUxBK1JCTT0wIBcNMTkxMTI3MTIxMTA3WhgPMjA1OTEx
+MjIxMjExMDdaMH8xFjAUBgNVBAoTDWRjcG9tYXRpYy5jb20xFjAUBgNVBAsTDWRj
+cG9tYXRpYy5jb20xJjAkBgNVBAMTHUNTLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5M
+RUFGMSUwIwYDVQQuExxncEZPUDZlQnUxZlU2L3lmZG4rVWxXdUZ0cUE9MIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAulASlcMmyMzVE0LG5JPzOCDAYmQk
+kTKir43UhXqHXnRrtjLvwGcPFGOdokRP51shYn62r6HEMgYgqRQ+9DQyrasW7AUy
+s2LTSNt9W+vY3LbxtksJN4Qy+2dio2jNbCPa7BgOSH1Wi8ewYdb2ykMRQv666nYH
+bPHkr7qZOkTM5IPgciBpxztPBN2cLXxCJWQxffMXHLD7K33TLVqxXTuquD+n2/ii
+qpsmNY5Cngi3z3HVw5wql3zvdW4TlHb1gHrHwqqpKIKIFFn9JZsDUZG3KYkvG4cZ
+oSRhIvXMmLn1KOSJ2ANQG1UDX8yLo0BtAMxAZ0IFL/9d0FIcgLL6nLB2uQIDAQAB
+o4HoMIHlMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgWgMB0GA1UdDgQWBBSCkU4/
+p4G7V9Tr/J92f5SVa4W2oDCBqAYDVR0jBIGgMIGdgBSVmTh7RZhiVPzktx3pYQWo
+sD5EE6GBgaR/MH0xFjAUBgNVBAoTDWRjcG9tYXRpYy5jb20xFjAUBgNVBAsTDWRj
+cG9tYXRpYy5jb20xJDAiBgNVBAMTGy5kY3BvbWF0aWMuc21wdGUtNDMwLTIuUk9P
+VDElMCMGA1UELhMcRUpjZFVFQko1Zm1BTWN6YkJvNGI3RTdpVHVzPYIBBjANBgkq
+hkiG9w0BAQsFAAOCAQEAP8EhBofCpK9Hj8swyvHQFNUVToKohk225vsSoa+p/kOF
+VJE2odGgUgPB5GNdGZTd8kJHy9B1wzIEzAqXg78aifJXqjX5Np/Vhe6dIeR13+xL
+2ghuH6tHfQ2PmomSG5kaBUI5qXmKsFxgR7jRscXCu5GqWunPYsNFU6L9Y0LxSfVn
+wjdXM5MyHHAV6vTxNLHXIBkafswkwsUc2UPNTLZtT8nIhFP7jrGVYnEhHKQgoMuT
++E/cUKzaZkmphMjWrsucp95GjjXSL82JboGI6IeHuIjsMyNPKznE9JEEFbPRqkkx
+UNYkHpITCNDKXG/rApn/2iBADQQUWUphp4h07BwXbg==</dsig:X509Certificate>
+ </dsig:X509Data>
+ <dsig:X509Data>
+ <dsig:X509IssuerSerial>
+ <dsig:X509IssuerName>dnQualifier=EJcdUEBJ5fmAMczbBo4b7E7iTus=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName>
+ <dsig:X509SerialNumber>6</dsig:X509SerialNumber>
+ </dsig:X509IssuerSerial>
+ <dsig:X509Certificate>MIIEbzCCA1egAwIBAgIBBjANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKEw1kY3Bv
+bWF0aWMuY29tMRYwFAYDVQQLEw1kY3BvbWF0aWMuY29tMSQwIgYDVQQDExsuZGNw
+b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEVKY2RVRUJKNWZtQU1j
+emJCbzRiN0U3aVR1cz0wIBcNMTkxMTI3MTIxMTA3WhgPMjA1OTExMjMxMjExMDda
+MIGFMRYwFAYDVQQKEw1kY3BvbWF0aWMuY29tMRYwFAYDVQQLEw1kY3BvbWF0aWMu
+Y29tMSwwKgYDVQQDEyMuZGNwb21hdGljLnNtcHRlLTQzMC0yLklOVEVSTUVESUFU
+RTElMCMGA1UELhMcbFprNGUwV1lZbFQ4NUxjZDZXRUZxTEErUkJNPTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALclhoMI5k8AxUV+svXWkXcpZ4zF2/av
+C9Eg1I6v/hJWVuythbR/j2flYmLAHTMO/Lzsf9wSIBrJY/0ooGZvzLEXVTqOBn3i
++p4Rmzrc+KzaxYSrBlutMjvupGN2uikUequcqRMPLxQFed+RGJ2LOMf6VYjshCEj
+LZGLqmcArb/UPO39KDyOq852gGyc4N2uvilPdM8BsgykHEhZ+9MrsOjCqateM/h0
+OA0SEL8LtZo7Rf3yfONeczaSwdU6R38FH7oettAD1z4vu2BMVXNvF7cP/KBYCVFw
+8dux3vGch1/eLicjskJmYDlgEJ3SFGstCaeQFenNczIlPvDte5EmD1cCAwEAAaOB
+7jCB6zASBgNVHRMBAf8ECDAGAQH/AgECMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU
+lZk4e0WYYlT85Lcd6WEFqLA+RBMwgagGA1UdIwSBoDCBnYAUEJcdUEBJ5fmAMczb
+Bo4b7E7iTuuhgYGkfzB9MRYwFAYDVQQKEw1kY3BvbWF0aWMuY29tMRYwFAYDVQQL
+Ew1kY3BvbWF0aWMuY29tMSQwIgYDVQQDExsuZGNwb21hdGljLnNtcHRlLTQzMC0y
+LlJPT1QxJTAjBgNVBC4THEVKY2RVRUJKNWZtQU1jemJCbzRiN0U3aVR1cz2CAQUw
+DQYJKoZIhvcNAQELBQADggEBAIB+KmpPLpH3G+SW3ZWCLdT3gqvG0XdcOUAUAjN3
+rFO9tdSbhczCYeMoENl6AlVM78blTQKwz9PVwxUpSp3pOIV8Pi52WevPM73an8U8
+kL0Zwo0nzlFaOMsllzb/4npu2QzSC0KjYPRvpDjdWuOPDOQyfzfCSkzqmKIEvIzG
+2oPuM1MgdgKIHSD09yX4FMb+kcwFWbmIpC80S0iBfqBgIgGS1or2V1odAbLesZZf
+jVIQDrooEhmEbpryAMXNIgjq3Ylvwy41vOQ5I8LZYS5GpBZIpjqWq3IlqwA3W6BB
+d8u37dNu8FmHemnj/ZVz/31Qf5nSo8YLYHYXrDuh38XOx4A=</dsig:X509Certificate>
+ </dsig:X509Data>
+ <dsig:X509Data>
+ <dsig:X509IssuerSerial>
+ <dsig:X509IssuerName>dnQualifier=EJcdUEBJ5fmAMczbBo4b7E7iTus=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName>
+ <dsig:X509SerialNumber>5</dsig:X509SerialNumber>
+ </dsig:X509IssuerSerial>
+ <dsig:X509Certificate>MIIEZjCCA06gAwIBAgIBBTANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKEw1kY3Bv
+bWF0aWMuY29tMRYwFAYDVQQLEw1kY3BvbWF0aWMuY29tMSQwIgYDVQQDExsuZGNw
+b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEVKY2RVRUJKNWZtQU1j
+emJCbzRiN0U3aVR1cz0wIBcNMTkxMTI3MTIxMTA3WhgPMjA1OTExMjQxMjExMDda
+MH0xFjAUBgNVBAoTDWRjcG9tYXRpYy5jb20xFjAUBgNVBAsTDWRjcG9tYXRpYy5j
+b20xJDAiBgNVBAMTGy5kY3BvbWF0aWMuc21wdGUtNDMwLTIuUk9PVDElMCMGA1UE
+LhMcRUpjZFVFQko1Zm1BTWN6YkJvNGI3RTdpVHVzPTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAO2D9nYWk04QCADn7cbgZ2Oy36TMpZfm9nLs0cqyAry4
+1G1mZRUqkONsSS4uZCcnwCVH1tYqJG9XMNxEwHp3dELhKo4BgxgB8oNJYrmGcewo
+h8kd/x4YqOuyIExyhUtKo2KSVZlpw1flrv+88ly1ljCEZnRjN/wu/C3EXkq8MciR
+CMtLXpIPyYVaL09cOnHeslQ9nRXkGojz+kiuhYdJrKMItATzjdI50sIMFZnXBUci
+Bj2cvPxpPzG+Kr1qfBNYXw5ibHbsh/TGTyvkz+Z5hPDJZYe3fDW0yM/rHyXZzQuP
+5gUkoC9hisznuPQaePsTLhEqkIjgOyrzdpLduBE7sPkCAwEAAaOB7jCB6zASBgNV
+HRMBAf8ECDAGAQH/AgEDMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUEJcdUEBJ5fmA
+MczbBo4b7E7iTuswgagGA1UdIwSBoDCBnYAUEJcdUEBJ5fmAMczbBo4b7E7iTuuh
+gYGkfzB9MRYwFAYDVQQKEw1kY3BvbWF0aWMuY29tMRYwFAYDVQQLEw1kY3BvbWF0
+aWMuY29tMSQwIgYDVQQDExsuZGNwb21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAj
+BgNVBC4THEVKY2RVRUJKNWZtQU1jemJCbzRiN0U3aVR1cz2CAQUwDQYJKoZIhvcN
+AQELBQADggEBACI94oNUUisYl0PKHln+MjgHg4yBAHhn4GFlUbZtelpArDuJg5D1
+/Ba6e/JECTS0CwovyLtD6Z2agU5jvXQ0sI8svo4OkOcZSyBvgif49YeRU8HLWH+R
+pJZBmzXQrHPCXgjvY9qWN2btTcHago9TXTbB17adlpUbSnUG0pnDjkt1EdZ3T+D8
+vZVpBVciWsLh5CeuxAxfpFUw3gtbYdGa/yIgnb12l7zpCfb2VGqQEPr06U0yjl0s
+Im55V7KBJhKV3CtUdoOAc7x1y9BsVZI7dWQBHlTzTa4/Mj4KWlQ36eKpawNc+Add
+oP8O9wPyd2sOpjMqbhIjrbYS+CfKKl/P4H4=</dsig:X509Certificate>
+ </dsig:X509Data>
+ </dsig:KeyInfo>
+ </dsig:Signature>
+</CompositionPlaylist>
diff --git a/test/ref/DCP/dcp_test8/j2c_d7576dcb-a361-4139-96b8-267f5f8d7f91.mxf b/test/ref/DCP/dcp_test8/j2c_d7576dcb-a361-4139-96b8-267f5f8d7f91.mxf
new file mode 100644
index 00000000..ca6b9f76
--- /dev/null
+++ b/test/ref/DCP/dcp_test8/j2c_d7576dcb-a361-4139-96b8-267f5f8d7f91.mxf
Binary files differ
diff --git a/test/ref/DCP/dcp_test8/pcm_a2a87f5d-b749-4a7e-8d0c-9d48a4abf626.mxf b/test/ref/DCP/dcp_test8/pcm_a2a87f5d-b749-4a7e-8d0c-9d48a4abf626.mxf
new file mode 100644
index 00000000..cede2165
--- /dev/null
+++ b/test/ref/DCP/dcp_test8/pcm_a2a87f5d-b749-4a7e-8d0c-9d48a4abf626.mxf
Binary files differ
diff --git a/test/ref/DCP/dcp_test8/pkl_0382c908-7389-45d6-b671-d5100868cbbe.xml b/test/ref/DCP/dcp_test8/pkl_0382c908-7389-45d6-b671-d5100868cbbe.xml
new file mode 100644
index 00000000..fb376ef2
--- /dev/null
+++ b/test/ref/DCP/dcp_test8/pkl_0382c908-7389-45d6-b671-d5100868cbbe.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<PackingList xmlns="http://www.digicine.com/PROTO-ASDCP-PKL-20040311#">
+ <Id>urn:uuid:0382c908-7389-45d6-b671-d5100868cbbe</Id>
+ <AnnotationText>Short_FTR-1_F_MOS_2K_20200308_IOP_OV</AnnotationText>
+ <IssueDate>2020-03-08T22:39:14+01:00</IssueDate>
+ <Issuer>DCP-o-matic 2.15.47devel caf67bef26</Issuer>
+ <Creator>DCP-o-matic 2.15.47devel caf67bef26</Creator>
+ <AssetList>
+ <Asset>
+ <Id>urn:uuid:d74fda30-d5f4-4c5f-870f-ebc089d97eb7</Id>
+ <AnnotationText>d74fda30-d5f4-4c5f-870f-ebc089d97eb7</AnnotationText>
+ <Hash>1KKdwXhS0LDUe16ziYYIomKR3oQ=</Hash>
+ <Size>9079</Size>
+ <Type>text/xml;asdcpKind=CPL</Type>
+ </Asset>
+ <Asset>
+ <Id>urn:uuid:d7576dcb-a361-4139-96b8-267f5f8d7f91</Id>
+ <AnnotationText>d7576dcb-a361-4139-96b8-267f5f8d7f91</AnnotationText>
+ <Hash>jOZgIxogFSZZm2Bo2l+SIa9JhEE=</Hash>
+ <Size>47739</Size>
+ <Type>application/x-smpte-mxf;asdcpKind=Picture</Type>
+ </Asset>
+ <Asset>
+ <Id>urn:uuid:a2a87f5d-b749-4a7e-8d0c-9d48a4abf626</Id>
+ <AnnotationText>a2a87f5d-b749-4a7e-8d0c-9d48a4abf626</AnnotationText>
+ <Hash>+/1qe/yPbyof3CrPUgncvm3pfoE=</Hash>
+ <Size>845154</Size>
+ <Type>application/x-smpte-mxf;asdcpKind=Sound</Type>
+ </Asset>
+ </AssetList>
+ <Signer xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
+ <dsig:X509Data>
+ <dsig:X509IssuerSerial>
+ <dsig:X509IssuerName>dnQualifier=lZk4e0WYYlT85Lcd6WEFqLA\+RBM=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName>
+ <dsig:X509SerialNumber>7</dsig:X509SerialNumber>
+ </dsig:X509IssuerSerial>
+ <dsig:X509SubjectName>dnQualifier=gpFOP6eBu1fU6/yfdn\+UlWuFtqA=,CN=CS.dcpomatic.smpte-430-2.LEAF,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509SubjectName>
+ </dsig:X509Data>
+ </Signer>
+ <dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
+ <dsig:SignedInfo>
+ <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
+ <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
+ <dsig:Reference URI="">
+ <dsig:Transforms>
+ <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
+ </dsig:Transforms>
+ <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
+ <dsig:DigestValue>URs0kuatFBRNdUNxm0dUttWcA4Y=</dsig:DigestValue>
+ </dsig:Reference>
+ </dsig:SignedInfo>
+ <dsig:SignatureValue>BgRZ6abOezgtVvfJt+3OPhXaTryGo1B2zmK0lLXExDIQgz5a3XLVphy7XAnK/Qch
+eGMUzT9b6yujyR/PVmT47v2REk2i3B7SbIjIKB44RiZxRarI2uD1pNv9d9+pnXf1
++h+pM1Yt8ZsIAUAvd74Gg2Y84qz7PIekS3n3utNSZhQySc8xa2UEnLkjQfMrn+Pd
+0VHp2RjfKZmS4Er19BT5ZoQ2x0MWPFQeKHuuYUvaWyBW4Yywn06eHxpE0394pj0X
+P/QQmmcwUwZ5k8q8IxyrWdB0vpbkSEX9A99Ix+yreu1E61XaWFzHM7fuDb1MZj4f
+79BqWjklBx9aFkuMGUZcdQ==</dsig:SignatureValue>
+ <dsig:KeyInfo>
+ <dsig:X509Data>
+ <dsig:X509IssuerSerial>
+ <dsig:X509IssuerName>dnQualifier=lZk4e0WYYlT85Lcd6WEFqLA\+RBM=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName>
+ <dsig:X509SerialNumber>7</dsig:X509SerialNumber>
+ </dsig:X509IssuerSerial>
+ <dsig:X509Certificate>MIIEazCCA1OgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBhTEWMBQGA1UEChMNZGNw
+b21hdGljLmNvbTEWMBQGA1UECxMNZGNwb21hdGljLmNvbTEsMCoGA1UEAxMjLmRj
+cG9tYXRpYy5zbXB0ZS00MzAtMi5JTlRFUk1FRElBVEUxJTAjBgNVBC4THGxaazRl
+MFdZWWxUODVMY2Q2V0VGcUxBK1JCTT0wIBcNMTkxMTI3MTIxMTA3WhgPMjA1OTEx
+MjIxMjExMDdaMH8xFjAUBgNVBAoTDWRjcG9tYXRpYy5jb20xFjAUBgNVBAsTDWRj
+cG9tYXRpYy5jb20xJjAkBgNVBAMTHUNTLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5M
+RUFGMSUwIwYDVQQuExxncEZPUDZlQnUxZlU2L3lmZG4rVWxXdUZ0cUE9MIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAulASlcMmyMzVE0LG5JPzOCDAYmQk
+kTKir43UhXqHXnRrtjLvwGcPFGOdokRP51shYn62r6HEMgYgqRQ+9DQyrasW7AUy
+s2LTSNt9W+vY3LbxtksJN4Qy+2dio2jNbCPa7BgOSH1Wi8ewYdb2ykMRQv666nYH
+bPHkr7qZOkTM5IPgciBpxztPBN2cLXxCJWQxffMXHLD7K33TLVqxXTuquD+n2/ii
+qpsmNY5Cngi3z3HVw5wql3zvdW4TlHb1gHrHwqqpKIKIFFn9JZsDUZG3KYkvG4cZ
+oSRhIvXMmLn1KOSJ2ANQG1UDX8yLo0BtAMxAZ0IFL/9d0FIcgLL6nLB2uQIDAQAB
+o4HoMIHlMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgWgMB0GA1UdDgQWBBSCkU4/
+p4G7V9Tr/J92f5SVa4W2oDCBqAYDVR0jBIGgMIGdgBSVmTh7RZhiVPzktx3pYQWo
+sD5EE6GBgaR/MH0xFjAUBgNVBAoTDWRjcG9tYXRpYy5jb20xFjAUBgNVBAsTDWRj
+cG9tYXRpYy5jb20xJDAiBgNVBAMTGy5kY3BvbWF0aWMuc21wdGUtNDMwLTIuUk9P
+VDElMCMGA1UELhMcRUpjZFVFQko1Zm1BTWN6YkJvNGI3RTdpVHVzPYIBBjANBgkq
+hkiG9w0BAQsFAAOCAQEAP8EhBofCpK9Hj8swyvHQFNUVToKohk225vsSoa+p/kOF
+VJE2odGgUgPB5GNdGZTd8kJHy9B1wzIEzAqXg78aifJXqjX5Np/Vhe6dIeR13+xL
+2ghuH6tHfQ2PmomSG5kaBUI5qXmKsFxgR7jRscXCu5GqWunPYsNFU6L9Y0LxSfVn
+wjdXM5MyHHAV6vTxNLHXIBkafswkwsUc2UPNTLZtT8nIhFP7jrGVYnEhHKQgoMuT
++E/cUKzaZkmphMjWrsucp95GjjXSL82JboGI6IeHuIjsMyNPKznE9JEEFbPRqkkx
+UNYkHpITCNDKXG/rApn/2iBADQQUWUphp4h07BwXbg==</dsig:X509Certificate>
+ </dsig:X509Data>
+ <dsig:X509Data>
+ <dsig:X509IssuerSerial>
+ <dsig:X509IssuerName>dnQualifier=EJcdUEBJ5fmAMczbBo4b7E7iTus=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName>
+ <dsig:X509SerialNumber>6</dsig:X509SerialNumber>
+ </dsig:X509IssuerSerial>
+ <dsig:X509Certificate>MIIEbzCCA1egAwIBAgIBBjANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKEw1kY3Bv
+bWF0aWMuY29tMRYwFAYDVQQLEw1kY3BvbWF0aWMuY29tMSQwIgYDVQQDExsuZGNw
+b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEVKY2RVRUJKNWZtQU1j
+emJCbzRiN0U3aVR1cz0wIBcNMTkxMTI3MTIxMTA3WhgPMjA1OTExMjMxMjExMDda
+MIGFMRYwFAYDVQQKEw1kY3BvbWF0aWMuY29tMRYwFAYDVQQLEw1kY3BvbWF0aWMu
+Y29tMSwwKgYDVQQDEyMuZGNwb21hdGljLnNtcHRlLTQzMC0yLklOVEVSTUVESUFU
+RTElMCMGA1UELhMcbFprNGUwV1lZbFQ4NUxjZDZXRUZxTEErUkJNPTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALclhoMI5k8AxUV+svXWkXcpZ4zF2/av
+C9Eg1I6v/hJWVuythbR/j2flYmLAHTMO/Lzsf9wSIBrJY/0ooGZvzLEXVTqOBn3i
++p4Rmzrc+KzaxYSrBlutMjvupGN2uikUequcqRMPLxQFed+RGJ2LOMf6VYjshCEj
+LZGLqmcArb/UPO39KDyOq852gGyc4N2uvilPdM8BsgykHEhZ+9MrsOjCqateM/h0
+OA0SEL8LtZo7Rf3yfONeczaSwdU6R38FH7oettAD1z4vu2BMVXNvF7cP/KBYCVFw
+8dux3vGch1/eLicjskJmYDlgEJ3SFGstCaeQFenNczIlPvDte5EmD1cCAwEAAaOB
+7jCB6zASBgNVHRMBAf8ECDAGAQH/AgECMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU
+lZk4e0WYYlT85Lcd6WEFqLA+RBMwgagGA1UdIwSBoDCBnYAUEJcdUEBJ5fmAMczb
+Bo4b7E7iTuuhgYGkfzB9MRYwFAYDVQQKEw1kY3BvbWF0aWMuY29tMRYwFAYDVQQL
+Ew1kY3BvbWF0aWMuY29tMSQwIgYDVQQDExsuZGNwb21hdGljLnNtcHRlLTQzMC0y
+LlJPT1QxJTAjBgNVBC4THEVKY2RVRUJKNWZtQU1jemJCbzRiN0U3aVR1cz2CAQUw
+DQYJKoZIhvcNAQELBQADggEBAIB+KmpPLpH3G+SW3ZWCLdT3gqvG0XdcOUAUAjN3
+rFO9tdSbhczCYeMoENl6AlVM78blTQKwz9PVwxUpSp3pOIV8Pi52WevPM73an8U8
+kL0Zwo0nzlFaOMsllzb/4npu2QzSC0KjYPRvpDjdWuOPDOQyfzfCSkzqmKIEvIzG
+2oPuM1MgdgKIHSD09yX4FMb+kcwFWbmIpC80S0iBfqBgIgGS1or2V1odAbLesZZf
+jVIQDrooEhmEbpryAMXNIgjq3Ylvwy41vOQ5I8LZYS5GpBZIpjqWq3IlqwA3W6BB
+d8u37dNu8FmHemnj/ZVz/31Qf5nSo8YLYHYXrDuh38XOx4A=</dsig:X509Certificate>
+ </dsig:X509Data>
+ <dsig:X509Data>
+ <dsig:X509IssuerSerial>
+ <dsig:X509IssuerName>dnQualifier=EJcdUEBJ5fmAMczbBo4b7E7iTus=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName>
+ <dsig:X509SerialNumber>5</dsig:X509SerialNumber>
+ </dsig:X509IssuerSerial>
+ <dsig:X509Certificate>MIIEZjCCA06gAwIBAgIBBTANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKEw1kY3Bv
+bWF0aWMuY29tMRYwFAYDVQQLEw1kY3BvbWF0aWMuY29tMSQwIgYDVQQDExsuZGNw
+b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEVKY2RVRUJKNWZtQU1j
+emJCbzRiN0U3aVR1cz0wIBcNMTkxMTI3MTIxMTA3WhgPMjA1OTExMjQxMjExMDda
+MH0xFjAUBgNVBAoTDWRjcG9tYXRpYy5jb20xFjAUBgNVBAsTDWRjcG9tYXRpYy5j
+b20xJDAiBgNVBAMTGy5kY3BvbWF0aWMuc21wdGUtNDMwLTIuUk9PVDElMCMGA1UE
+LhMcRUpjZFVFQko1Zm1BTWN6YkJvNGI3RTdpVHVzPTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAO2D9nYWk04QCADn7cbgZ2Oy36TMpZfm9nLs0cqyAry4
+1G1mZRUqkONsSS4uZCcnwCVH1tYqJG9XMNxEwHp3dELhKo4BgxgB8oNJYrmGcewo
+h8kd/x4YqOuyIExyhUtKo2KSVZlpw1flrv+88ly1ljCEZnRjN/wu/C3EXkq8MciR
+CMtLXpIPyYVaL09cOnHeslQ9nRXkGojz+kiuhYdJrKMItATzjdI50sIMFZnXBUci
+Bj2cvPxpPzG+Kr1qfBNYXw5ibHbsh/TGTyvkz+Z5hPDJZYe3fDW0yM/rHyXZzQuP
+5gUkoC9hisznuPQaePsTLhEqkIjgOyrzdpLduBE7sPkCAwEAAaOB7jCB6zASBgNV
+HRMBAf8ECDAGAQH/AgEDMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUEJcdUEBJ5fmA
+MczbBo4b7E7iTuswgagGA1UdIwSBoDCBnYAUEJcdUEBJ5fmAMczbBo4b7E7iTuuh
+gYGkfzB9MRYwFAYDVQQKEw1kY3BvbWF0aWMuY29tMRYwFAYDVQQLEw1kY3BvbWF0
+aWMuY29tMSQwIgYDVQQDExsuZGNwb21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAj
+BgNVBC4THEVKY2RVRUJKNWZtQU1jemJCbzRiN0U3aVR1cz2CAQUwDQYJKoZIhvcN
+AQELBQADggEBACI94oNUUisYl0PKHln+MjgHg4yBAHhn4GFlUbZtelpArDuJg5D1
+/Ba6e/JECTS0CwovyLtD6Z2agU5jvXQ0sI8svo4OkOcZSyBvgif49YeRU8HLWH+R
+pJZBmzXQrHPCXgjvY9qWN2btTcHago9TXTbB17adlpUbSnUG0pnDjkt1EdZ3T+D8
+vZVpBVciWsLh5CeuxAxfpFUw3gtbYdGa/yIgnb12l7zpCfb2VGqQEPr06U0yjl0s
+Im55V7KBJhKV3CtUdoOAc7x1y9BsVZI7dWQBHlTzTa4/Mj4KWlQ36eKpawNc+Add
+oP8O9wPyd2sOpjMqbhIjrbYS+CfKKl/P4H4=</dsig:X509Certificate>
+ </dsig:X509Data>
+ </dsig:KeyInfo>
+ </dsig:Signature>
+</PackingList>
diff --git a/test/verify_test.cc b/test/verify_test.cc
index 38316f54..2ff66f69 100644
--- a/test/verify_test.cc
+++ b/test/verify_test.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2018-2019 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2018-2020 Carl Hetherington <cth@carlh.net>
This file is part of libdcp.
@@ -48,6 +48,7 @@ using std::make_pair;
using boost::optional;
static list<pair<string, optional<boost::filesystem::path> > > stages;
+static int next_verify_test_number = 1;
static void
stage (string s, optional<boost::filesystem::path> p)
@@ -62,16 +63,16 @@ progress (float)
}
static vector<boost::filesystem::path>
-setup (int n)
+setup (int reference_number, int verify_test_number)
{
- boost::filesystem::remove_all (dcp::String::compose("build/test/verify_test%1", n));
- boost::filesystem::create_directory (dcp::String::compose("build/test/verify_test%1", n));
- for (boost::filesystem::directory_iterator i("test/ref/DCP/dcp_test1"); i != boost::filesystem::directory_iterator(); ++i) {
- boost::filesystem::copy_file (i->path(), dcp::String::compose("build/test/verify_test%1", n) / i->path().filename());
+ boost::filesystem::remove_all (dcp::String::compose("build/test/verify_test%1", verify_test_number));
+ boost::filesystem::create_directory (dcp::String::compose("build/test/verify_test%1", verify_test_number));
+ for (boost::filesystem::directory_iterator i(dcp::String::compose("test/ref/DCP/dcp_test%1", reference_number)); i != boost::filesystem::directory_iterator(); ++i) {
+ boost::filesystem::copy_file (i->path(), dcp::String::compose("build/test/verify_test%1", verify_test_number) / i->path().filename());
}
vector<boost::filesystem::path> directories;
- directories.push_back (dcp::String::compose("build/test/verify_test%1", n));
+ directories.push_back (dcp::String::compose("build/test/verify_test%1", verify_test_number));
return directories;
}
@@ -115,17 +116,18 @@ dump_notes (list<dcp::VerificationNote> const & notes)
/* Check DCP as-is (should be OK) */
BOOST_AUTO_TEST_CASE (verify_test1)
{
- vector<boost::filesystem::path> directories = setup (1);
+ stages.clear ();
+ vector<boost::filesystem::path> directories = setup (1, next_verify_test_number);
list<dcp::VerificationNote> notes = dcp::verify (directories, &stage, &progress, "xsd");
- boost::filesystem::path const cpl_file = "build/test/verify_test1/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml";
- boost::filesystem::path const pkl_file = "build/test/verify_test1/pkl_ae8a9818-872a-4f86-8493-11dfdea03e09.xml";
- boost::filesystem::path const assetmap_file = "build/test/verify_test1/ASSETMAP.xml";
+ boost::filesystem::path const cpl_file = dcp::String::compose("build/test/verify_test%1/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml", next_verify_test_number);
+ boost::filesystem::path const pkl_file = dcp::String::compose("build/test/verify_test1/pkl_ae8a9818-872a-4f86-8493-11dfdea03e09.xml", next_verify_test_number);
+ boost::filesystem::path const assetmap_file = dcp::String::compose("build/test/verify_test1/ASSETMAP.xml", next_verify_test_number);
list<pair<string, optional<boost::filesystem::path> > >::const_iterator st = stages.begin();
BOOST_CHECK_EQUAL (st->first, "Checking DCP");
BOOST_REQUIRE (st->second);
- BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical("build/test/verify_test1"));
+ BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1", next_verify_test_number)));
++st;
BOOST_CHECK_EQUAL (st->first, "Checking CPL");
BOOST_REQUIRE (st->second);
@@ -136,11 +138,11 @@ BOOST_AUTO_TEST_CASE (verify_test1)
++st;
BOOST_CHECK_EQUAL (st->first, "Checking picture asset hash");
BOOST_REQUIRE (st->second);
- BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical("build/test/verify_test1/video.mxf"));
+ BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1/video.mxf", next_verify_test_number)));
++st;
BOOST_CHECK_EQUAL (st->first, "Checking sound asset hash");
BOOST_REQUIRE (st->second);
- BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical("build/test/verify_test1/audio.mxf"));
+ BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1/audio.mxf", next_verify_test_number)));
++st;
BOOST_CHECK_EQUAL (st->first, "Checking PKL");
BOOST_REQUIRE (st->second);
@@ -155,12 +157,14 @@ BOOST_AUTO_TEST_CASE (verify_test1)
dump_notes (notes);
BOOST_CHECK_EQUAL (notes.size(), 0);
+
+ next_verify_test_number++;
}
/* Corrupt the MXFs and check that this is spotted */
BOOST_AUTO_TEST_CASE (verify_test2)
{
- vector<boost::filesystem::path> directories = setup (2);
+ vector<boost::filesystem::path> directories = setup (1, next_verify_test_number++);
FILE* mod = fopen("build/test/verify_test2/video.mxf", "r+b");
BOOST_REQUIRE (mod);
@@ -187,7 +191,7 @@ BOOST_AUTO_TEST_CASE (verify_test2)
/* Corrupt the hashes in the PKL and check that the disagreement between CPL and PKL is spotted */
BOOST_AUTO_TEST_CASE (verify_test3)
{
- vector<boost::filesystem::path> directories = setup (3);
+ vector<boost::filesystem::path> directories = setup (1, next_verify_test_number++);
{
Editor e ("build/test/verify_test3/pkl_ae8a9818-872a-4f86-8493-11dfdea03e09.xml");
@@ -223,7 +227,7 @@ BOOST_AUTO_TEST_CASE (verify_test3)
/* Corrupt the ContentKind in the CPL */
BOOST_AUTO_TEST_CASE (verify_test4)
{
- vector<boost::filesystem::path> directories = setup (4);
+ vector<boost::filesystem::path> directories = setup (1, next_verify_test_number++);
{
Editor e ("build/test/verify_test4/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml");
@@ -261,7 +265,7 @@ asset_map (int n)
static
void check_after_replace (int n, boost::function<boost::filesystem::path (int)> file, string from, string to, dcp::VerificationNote::Code code1)
{
- vector<boost::filesystem::path> directories = setup (n);
+ vector<boost::filesystem::path> directories = setup (1, n);
{
Editor e (file(n));
@@ -279,7 +283,7 @@ void check_after_replace (int n, boost::function<boost::filesystem::path (int)>
static
void check_after_replace (int n, boost::function<boost::filesystem::path (int)> file, string from, string to, dcp::VerificationNote::Code code1, dcp::VerificationNote::Code code2)
{
- vector<boost::filesystem::path> directories = setup (n);
+ vector<boost::filesystem::path> directories = setup (1, n);
{
Editor e (file(n));
@@ -305,7 +309,7 @@ void check_after_replace (
dcp::VerificationNote::Code code3
)
{
- vector<boost::filesystem::path> directories = setup (n);
+ vector<boost::filesystem::path> directories = setup (1, n);
{
Editor e (file(n));
@@ -329,7 +333,7 @@ void check_after_replace (
BOOST_AUTO_TEST_CASE (verify_test5)
{
check_after_replace (
- 5, &cpl,
+ next_verify_test_number++, &cpl,
"<FrameRate>24 1", "<FrameRate>99 1",
dcp::VerificationNote::CPL_HASH_INCORRECT,
dcp::VerificationNote::INVALID_PICTURE_FRAME_RATE
@@ -339,7 +343,7 @@ BOOST_AUTO_TEST_CASE (verify_test5)
/* Missing asset */
BOOST_AUTO_TEST_CASE (verify_test6)
{
- vector<boost::filesystem::path> directories = setup (6);
+ vector<boost::filesystem::path> directories = setup (1, next_verify_test_number++);
boost::filesystem::remove ("build/test/verify_test6/video.mxf");
list<dcp::VerificationNote> notes = dcp::verify (directories, &stage, &progress, "xsd");
@@ -360,7 +364,7 @@ assetmap (int n)
BOOST_AUTO_TEST_CASE (verify_test7)
{
check_after_replace (
- 7, &assetmap,
+ next_verify_test_number++, &assetmap,
"<Path>video.mxf</Path>", "<Path></Path>",
dcp::VerificationNote::EMPTY_ASSET_PATH
);
@@ -370,7 +374,7 @@ BOOST_AUTO_TEST_CASE (verify_test7)
BOOST_AUTO_TEST_CASE (verify_test8)
{
check_after_replace (
- 8, &cpl,
+ next_verify_test_number++, &cpl,
"http://www.smpte-ra.org/schemas/429-7/2006/CPL", "http://www.digicine.com/PROTO-ASDCP-CPL-20040511#",
dcp::VerificationNote::MISMATCHED_STANDARD,
dcp::VerificationNote::XML_VALIDATION_ERROR,
@@ -383,7 +387,7 @@ BOOST_AUTO_TEST_CASE (verify_test9)
{
/* There's no CPL_HASH_INCORRECT error here because it can't find the correct hash by ID (since the ID is wrong) */
check_after_replace (
- 9, &cpl,
+ next_verify_test_number++, &cpl,
"<Id>urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375b", "<Id>urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375",
dcp::VerificationNote::XML_VALIDATION_ERROR
);
@@ -393,7 +397,7 @@ BOOST_AUTO_TEST_CASE (verify_test9)
BOOST_AUTO_TEST_CASE (verify_test10)
{
check_after_replace (
- 10, &cpl,
+ next_verify_test_number++, &cpl,
"<IssueDate>", "<IssueDate>x",
dcp::VerificationNote::XML_VALIDATION_ERROR,
dcp::VerificationNote::CPL_HASH_INCORRECT
@@ -404,7 +408,7 @@ BOOST_AUTO_TEST_CASE (verify_test10)
BOOST_AUTO_TEST_CASE (verify_test11)
{
check_after_replace (
- 11, &pkl,
+ next_verify_test_number++, &pkl,
"<Id>urn:uuid:ae8", "<Id>urn:uuid:xe8",
dcp::VerificationNote::XML_VALIDATION_ERROR
);
@@ -414,8 +418,78 @@ BOOST_AUTO_TEST_CASE (verify_test11)
BOOST_AUTO_TEST_CASE (verify_test12)
{
check_after_replace (
- 12, &asset_map,
+ next_verify_test_number++, &asset_map,
"<Id>urn:uuid:74e", "<Id>urn:uuid:x4e",
dcp::VerificationNote::XML_VALIDATION_ERROR
);
}
+
+/* Basic test of an Interop DCP */
+BOOST_AUTO_TEST_CASE (verify_test13)
+{
+ stages.clear ();
+ vector<boost::filesystem::path> directories = setup (3, next_verify_test_number);
+ list<dcp::VerificationNote> notes = dcp::verify (directories, &stage, &progress, "xsd");
+
+ boost::filesystem::path const cpl_file = dcp::String::compose("build/test/verify_test%1/cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml", next_verify_test_number);
+ boost::filesystem::path const pkl_file = dcp::String::compose("build/test/verify_test%1/pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml", next_verify_test_number);
+ boost::filesystem::path const assetmap_file = dcp::String::compose("build/test/verify_test%1/ASSETMAP", next_verify_test_number);
+
+ list<pair<string, optional<boost::filesystem::path> > >::const_iterator st = stages.begin();
+ BOOST_CHECK_EQUAL (st->first, "Checking DCP");
+ BOOST_REQUIRE (st->second);
+ BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1", next_verify_test_number)));
+ ++st;
+ BOOST_CHECK_EQUAL (st->first, "Checking CPL");
+ BOOST_REQUIRE (st->second);
+ BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(cpl_file));
+ ++st;
+ BOOST_CHECK_EQUAL (st->first, "Checking reel");
+ BOOST_REQUIRE (!st->second);
+ ++st;
+ BOOST_CHECK_EQUAL (st->first, "Checking picture asset hash");
+ BOOST_REQUIRE (st->second);
+ BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1/j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf", next_verify_test_number)));
+ ++st;
+ BOOST_CHECK_EQUAL (st->first, "Checking sound asset hash");
+ BOOST_REQUIRE (st->second);
+ BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(dcp::String::compose("build/test/verify_test%1/pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf", next_verify_test_number)));
+ ++st;
+ BOOST_CHECK_EQUAL (st->first, "Checking PKL");
+ BOOST_REQUIRE (st->second);
+ BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(pkl_file));
+ ++st;
+ BOOST_CHECK_EQUAL (st->first, "Checking ASSETMAP");
+ BOOST_REQUIRE (st->second);
+ BOOST_CHECK_EQUAL (st->second.get(), boost::filesystem::canonical(assetmap_file));
+ ++st;
+ BOOST_REQUIRE (st == stages.end());
+
+ dump_notes (notes);
+
+ BOOST_CHECK_EQUAL (notes.size(), 0);
+
+ next_verify_test_number++;
+}
+
+/* DCP with a short asset */
+BOOST_AUTO_TEST_CASE (verify_test14)
+{
+ vector<boost::filesystem::path> directories = setup (8, next_verify_test_number);
+ list<dcp::VerificationNote> notes = dcp::verify (directories, &stage, &progress, "xsd");
+
+ dump_notes (notes);
+
+ BOOST_REQUIRE_EQUAL (notes.size(), 4);
+ list<dcp::VerificationNote>::const_iterator i = notes.begin ();
+ BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::DURATION_TOO_SMALL);
+ ++i;
+ BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::INTRINSIC_DURATION_TOO_SMALL);
+ ++i;
+ BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::DURATION_TOO_SMALL);
+ ++i;
+ BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::INTRINSIC_DURATION_TOO_SMALL);
+ ++i;
+ next_verify_test_number++;
+}
+
diff --git a/wscript b/wscript
index 8b5593e9..689a84fb 100644
--- a/wscript
+++ b/wscript
@@ -231,7 +231,7 @@ def build(bld):
if not bld.env.DISABLE_EXAMPLES:
bld.recurse('examples')
- for i in ['SMPTE-429-7-2006-CPL.xsd', 'SMPTE-429-8-2006-PKL.xsd', 'SMPTE-429-9-2007-AM.xsd', 'xmldsig-core-schema.xsd', 'XMLSchema.dtd', 'XMLSchema.xsd', 'xml.xsd' ]:
+ for i in ['SMPTE-429-7-2006-CPL.xsd', 'SMPTE-429-8-2006-PKL.xsd', 'SMPTE-429-9-2007-AM.xsd', 'xmldsig-core-schema.xsd', 'XMLSchema.dtd', 'XMLSchema.xsd', 'xml.xsd', 'PROTO-ASDCP-CPL-20040511.xsd', 'PROTO-ASDCP-PKL-20040311.xsd', 'PROTO-ASDCP-AM-20040311.xsd', 'Main-Stereo-Picture-CPL.xsd' ]:
bld.install_files('${PREFIX}/share/libdcp/xsd', os.path.join('xsd', i))
bld.add_post_fun(post)
diff --git a/xsd/Main-Stereo-Picture-CPL.xsd b/xsd/Main-Stereo-Picture-CPL.xsd
new file mode 100644
index 00000000..bec275e8
--- /dev/null
+++ b/xsd/Main-Stereo-Picture-CPL.xsd
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.digicine.com/schemas/437-Y/2007/Main-Stereo-Picture-CPL"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:cpl="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
+ <xs:import namespace="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#" schemaLocation="http://www.digicine.com/PROTO-ASDCP-CPL-20040511.xsd"/>
+ <!--MainStereoscopicPicture-->
+ <xs:element name="MainStereoscopicPicture" type="cpl:PictureTrackFileAssetType"/>
+</xs:schema>
+
diff --git a/xsd/PROTO-ASDCP-AM-20040311.xsd b/xsd/PROTO-ASDCP-AM-20040311.xsd
new file mode 100644
index 00000000..f63540d0
--- /dev/null
+++ b/xsd/PROTO-ASDCP-AM-20040311.xsd
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Schema for Interop Asset Map namespace -->
+<!-- Assembled from mpeg_ii_am_spec.doc 2004-11-23 -->
+
+<xs:schema
+ targetNamespace="http://www.digicine.com/PROTO-ASDCP-AM-20040311#"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:cpl="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"
+ xmlns:am="http://www.digicine.com/PROTO-ASDCP-AM-20040311#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+
+<!--The following xs:import statements should not really be here, but are
+ provided so that XMLSpy will validate the schema itself, independently
+ of an instance of a Asset Map
+-->
+<xs:import namespace="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"
+ schemaLocation="http://www.digicine.com/PROTO-ASDCP-CPL-20040511.xsd"/>
+
+ <!-- Asset Map Type -->
+ <xs:element name="AssetMap" type="am:AssetMapType"/>
+ <xs:complexType name="AssetMapType">
+ <xs:sequence>
+ <xs:element name="Id" type="cpl:UUID"/>
+ <xs:element name="AnnotationText" type="cpl:UserText" minOccurs="0"/>
+ <xs:element name="VolumeCount" type="xs:positiveInteger"/>
+ <xs:element name="IssueDate" type="xs:dateTime"/>
+ <xs:element name="Issuer" type="cpl:UserText"/>
+ <xs:element name="Creator" type="cpl:UserText"/>
+ <xs:element name="AssetList">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="am:Asset" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <!-- Asset Type -->
+ <xs:element name="Asset" type="am:AssetType"/>
+ <xs:complexType name="AssetType">
+ <xs:sequence>
+ <xs:element name="Id" type="cpl:UUID"/>
+ <xs:element name="AnnotationText" type="cpl:UserText" minOccurs="0"/>
+ <xs:element name="PackingList" minOccurs="0"/>
+ <xs:element name="ChunkList">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="am:Chunk" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <!-- Chunk Type -->
+ <xs:element name="Chunk" type="am:ChunkType"/>
+ <xs:complexType name="ChunkType">
+ <xs:sequence>
+ <xs:element name="Path" type="xs:string"/>
+ <xs:element name="VolumeIndex" type="xs:positiveInteger" minOccurs="0"/>
+ <xs:element name="Offset" type="xs:nonNegativeInteger" minOccurs="0"/>
+ <xs:element name="Length" type="xs:positiveInteger" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/xsd/PROTO-ASDCP-CPL-20040511.xsd b/xsd/PROTO-ASDCP-CPL-20040511.xsd
new file mode 100644
index 00000000..c870811a
--- /dev/null
+++ b/xsd/PROTO-ASDCP-CPL-20040511.xsd
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Schema for Interop Composition Play List namespace -->
+<!-- Assembled from mpeg_ii_cpl_spec.doc 2004-11-23 -->
+
+<xs:schema
+ targetNamespace="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified"
+ xmlns:cpl="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+
+<!--The following xs:import statements should not really be here, but are
+ provided so that XMLSpy will validate the schema itself, independently
+ of an instance of a CPL. The schema xml.xsd is brought in for language identifiers.
+-->
+<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
+ schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"/>
+<xs:import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
+<xs:import namespace="http://www.digicine.com/schemas/437-Y/2007/Main-Stereo-Picture-CPL"
+ schemaLocation="http://www.digicine.com/schemas/437-Y/2007/Main-Stereo-Picture-CPL.xsd"/>
+
+<!-- Composition Playlist -->
+ <xs:element name="CompositionPlaylist" type="cpl:CompositionPlaylistType" />
+ <xs:complexType name="CompositionPlaylistType">
+ <xs:sequence>
+ <xs:element name="Id" type="cpl:UUID"/>
+ <xs:element name="AnnotationText" type="cpl:UserText" minOccurs="0"/>
+ <xs:element name="IconId" type="cpl:UUID" minOccurs="0"/>
+ <xs:element name="IssueDate" type="xs:dateTime"/>
+ <xs:element name="Issuer" type="cpl:UserText"/>
+ <xs:element name="Creator" type="cpl:UserText"/>
+ <xs:element name="ContentTitleText" type="cpl:UserText"/>
+ <xs:element ref="cpl:ContentKind"/>
+ <xs:element ref="cpl:ContentVersion" minOccurs="0"/>
+ <xs:element name="RatingList">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="cpl:Rating" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ReelList">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="cpl:Reel" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Signer" type="ds:KeyInfoType" minOccurs="0"/>
+ <xs:element ref="ds:Signature" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+
+<!-- Internally Defined Types -->
+
+ <!-- Marker Type -->
+ <xs:element name="Marker" type="cpl:MarkerType" />
+ <xs:complexType name="MarkerType">
+ <xs:sequence>
+ <xs:element name="Label">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="scope" type="xs:anyURI" use="optional" default="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#standard-markers" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="AnnotationText" type="cpl:UserText" minOccurs="0" />
+ <xs:element name="Offset">
+ <xs:simpleType>
+ <xs:restriction base="xs:long">
+ <xs:minInclusive value="0" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <!-- Rating Type -->
+ <xs:element name="Rating" type="cpl:RatingType"/>
+ <xs:complexType name="RatingType">
+ <xs:sequence>
+ <xs:element name="Agency" type="xs:anyURI" />
+ <xs:element name="Label" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+
+ <!-- ContentKind Type -->
+ <xs:element name="ContentKind" type="cpl:ContentKindType"/>
+ <xs:complexType name="ContentKindType">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="scope" type="xs:anyURI" use="optional" default="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#standard-content"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <!-- ContentVersion Type -->
+ <xs:element name="ContentVersion" type="cpl:ContentVersionType"/>
+ <xs:complexType name="ContentVersionType">
+ <xs:sequence>
+ <xs:element name="Id" type="xs:anyURI" minOccurs="0"/>
+ <xs:element name="LabelText" type="cpl:UserText"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <!-- Reel Type -->
+ <xs:element name="Reel" type="cpl:ReelType" />
+ <xs:complexType name="ReelType">
+ <xs:sequence>
+ <xs:element name="Id" type="cpl:UUID" />
+ <xs:element name="AnnotationText" type="cpl:UserText" minOccurs="0" />
+ <xs:element name="AssetList">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="MainMarkers" type="cpl:MarkerAssetType" minOccurs="0"/>
+ <xs:element name="MainPicture" type="cpl:PictureTrackFileAssetType" minOccurs="0"/>
+ <xs:element name="MainSound" type="cpl:SoundTrackFileAssetType" minOccurs="0"/>
+ <xs:element name="MainSubtitle" type="cpl:SubtitleTrackFileAssetType" minOccurs="0"/>
+ <xs:element name="ProjectorData" type="cpl:ProjectorDataAssetType" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <!-- GenericAsset Type -->
+ <xs:complexType name="GenericAssetType" abstract="1">
+ <xs:sequence>
+ <xs:element name="Id" type="cpl:UUID" />
+ <xs:element name="AnnotationText" type="cpl:UserText" minOccurs="0" />
+ <xs:element name="EditRate" type="cpl:Rational" />
+ <xs:element name="IntrinsicDuration" type="xs:long" />
+ <xs:element name="EntryPoint" type="xs:long" minOccurs="0" />
+ <xs:element name="Duration" type="xs:long" minOccurs="0" />
+ </xs:sequence>
+ </xs:complexType>
+
+ <!-- TrackFileAsset Type -->
+ <xs:complexType name="TrackFileAssetType" abstract="1">
+ <xs:complexContent>
+ <xs:extension base="cpl:GenericAssetType">
+ <xs:sequence>
+ <xs:element name="KeyId" type="cpl:UUID" minOccurs="0"/>
+ <xs:element name="Hash" type="xs:base64Binary" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <!-- SoundTrackFileAsset Type -->
+ <xs:complexType name="SoundTrackFileAssetType">
+ <xs:complexContent>
+ <xs:extension base="cpl:TrackFileAssetType">
+ <xs:sequence>
+ <xs:element name="Language" type="xs:language" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <!-- SubtitleTrackFileAsset Type -->
+ <xs:complexType name="SubtitleTrackFileAssetType">
+ <xs:complexContent>
+ <xs:extension base="cpl:TrackFileAssetType">
+ <xs:sequence>
+ <xs:element name="Language" type="xs:language" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <!-- PictureTrackFileAsset Type -->
+ <xs:complexType name="PictureTrackFileAssetType">
+ <xs:complexContent>
+ <xs:extension base="cpl:TrackFileAssetType">
+ <xs:sequence>
+ <xs:element name="FrameRate" type="cpl:Rational"/>
+ <xs:element name="ScreenAspectRatio">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:decimal">
+ <xs:attribute name="scope" type="xs:anyURI" use="optional" default="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#standard-aspectratio"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <!-- MarkerAsset Type -->
+ <xs:complexType name="MarkerAssetType">
+ <xs:complexContent>
+ <xs:extension base="cpl:GenericAssetType">
+ <xs:sequence>
+ <xs:element name="MarkerList">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Marker" type="cpl:MarkerType" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <!-- ProjectorDataAsset Type -->
+ <xs:complexType name="ProjectorDataAssetType">
+ <xs:complexContent>
+ <xs:extension base="cpl:GenericAssetType">
+ <xs:sequence>
+ <xs:element name="DataInfo" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <!-- Rational Type -->
+ <xs:simpleType name="Rational">
+ <xs:restriction>
+ <xs:simpleType>
+ <xs:list itemType="xs:long"/>
+ </xs:simpleType>
+ <xs:length value="2"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- UUID Type -->
+ <xs:simpleType name="UUID">
+ <xs:restriction base="xs:anyURI">
+ <xs:pattern value="urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- UserText Type -->
+ <xs:complexType name="UserText">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="xml:lang" use="optional" default="en"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+</xs:schema>
+
diff --git a/xsd/PROTO-ASDCP-PKL-20040311.xsd b/xsd/PROTO-ASDCP-PKL-20040311.xsd
new file mode 100644
index 00000000..0be3cd3d
--- /dev/null
+++ b/xsd/PROTO-ASDCP-PKL-20040311.xsd
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Schema for Interop Asset Map namespace -->
+<!-- Assembled from mpeg_ii_am_spec.doc 2004-11-23 -->
+
+<xs:schema
+ targetNamespace="http://www.digicine.com/PROTO-ASDCP-PKL-20040311#"
+ xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:pkl="http://www.digicine.com/PROTO-ASDCP-PKL-20040311#"
+ xmlns:cpl="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+
+<!--The following xs:import statements should not really be here, but are
+ provided so that XMLSpy will validate the schema itself, independently
+ of an instance of a Packing List
+-->
+<xs:import namespace="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"
+ schemaLocation="http://www.digicine.com/PROTO-ASDCP-CPL-20040511.xsd"/>
+<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
+ schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"/>
+<xs:import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
+
+<!-- Packing List Type -->
+ <xs:element name="PackingList" type="pkl:PackingListType"/>
+ <xs:complexType name="PackingListType">
+ <xs:sequence>
+ <xs:element name="Id" type="cpl:UUID"/>
+ <xs:element name="AnnotationText" type="cpl:UserText" minOccurs="0"/>
+ <xs:element name="IconId" type="cpl:UUID" minOccurs="0"/>
+ <xs:element name="IssueDate" type="xs:dateTime"/>
+ <xs:element name="Issuer" type="cpl:UserText"/>
+ <xs:element name="Creator" type="cpl:UserText"/>
+ <xs:element name="AssetList">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="pkl:Asset" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Signer" type="ds:KeyInfoType" minOccurs="0"/>
+ <xs:element ref="ds:Signature" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+
+<!-- Asset Type -->
+ <xs:element name="Asset" type="pkl:AssetType"/>
+ <xs:complexType name="AssetType">
+ <xs:sequence>
+ <xs:element name="Id" type="cpl:UUID"/>
+ <xs:element name="AnnotationText" type="cpl:UserText" minOccurs="0"/>
+ <xs:element name="Hash" type="xs:base64Binary" minOccurs="0"/>
+ <xs:element name="Size" type="xs:positiveInteger"/>
+ <xs:element name="Type" type="xs:string"/>
+ <xs:element name="OriginalFileName" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+
+</xs:schema>
+