summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-05-24 11:26:50 +0100
committerCarl Hetherington <cth@carlh.net>2016-05-24 11:26:50 +0100
commit437f928f7d7209c9e4c8ea3e3b5d0e8dc43b54a8 (patch)
tree50feb1d8277cf6ad7fb8da83b36b0d5782c55326
parent23644a666637d3db3ccf2007a7cbbcdf4f2d29a2 (diff)
Add reporting of DCP type.
-rw-r--r--src/cpl.cc8
-rw-r--r--src/cpl.h7
-rw-r--r--src/dcp.cc24
-rw-r--r--src/dcp.h8
-rw-r--r--src/exceptions.cc6
-rw-r--r--src/exceptions.h6
-rw-r--r--test/read_dcp_test.cc22
-rw-r--r--test/ref/DCP/dcp_test3/ASSETMAP2
-rw-r--r--test/ref/DCP/dcp_test3/VOLINDEX2
-rw-r--r--test/ref/DCP/dcp_test3/cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml76
-rw-r--r--test/ref/DCP/dcp_test3/j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxfbin0 -> 561776 bytes
-rw-r--r--test/ref/DCP/dcp_test3/pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxfbin0 -> 881174 bytes
-rw-r--r--test/ref/DCP/dcp_test3/pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml76
13 files changed, 234 insertions, 3 deletions
diff --git a/src/cpl.cc b/src/cpl.cc
index b96e15d2..0d8221e2 100644
--- a/src/cpl.cc
+++ b/src/cpl.cc
@@ -70,6 +70,14 @@ CPL::CPL (boost::filesystem::path file)
cxml::Document f ("CompositionPlaylist");
f.read_file (file);
+ if (f.namespace_uri() == cpl_interop_ns) {
+ _standard = INTEROP;
+ } else if (f.namespace_uri() == cpl_smpte_ns) {
+ _standard = SMPTE;
+ } else {
+ boost::throw_exception (XMLError ("Unrecognised CPL namespace " + f.namespace_uri()));
+ }
+
_id = remove_urn_uuid (f.string_child ("Id"));
_annotation_text = f.optional_string_child ("AnnotationText").get_value_or ("");
_metadata.issuer = f.optional_string_child ("Issuer").get_value_or ("");
diff --git a/src/cpl.h b/src/cpl.h
index 9d22cbd4..5ff320d2 100644
--- a/src/cpl.h
+++ b/src/cpl.h
@@ -114,6 +114,10 @@ public:
int64_t duration () const;
+ boost::optional<Standard> standard () const {
+ return _standard;
+ }
+
protected:
/** @return type string for PKLs for this asset */
std::string pkl_type (Standard standard) const;
@@ -129,6 +133,9 @@ private:
std::string _content_version_id; ///< &lt;Id&gt; in &lt;ContentVersion&gt;
std::string _content_version_label_text; ///< &lt;LabelText&gt; in &lt;ContentVersion&gt;
std::list<boost::shared_ptr<Reel> > _reels;
+
+ /** Standard of CPL that was read in */
+ boost::optional<Standard> _standard;
};
}
diff --git a/src/dcp.cc b/src/dcp.cc
index 3298cfae..11146562 100644
--- a/src/dcp.cc
+++ b/src/dcp.cc
@@ -81,6 +81,7 @@ DCP::DCP (boost::filesystem::path directory)
_directory = boost::filesystem::canonical (_directory);
}
+/** Call this instead of throwing an exception if the error can be tolerated */
template<class T> void
survivable_error (bool keep_going, dcp::DCP::ReadErrors* errors, T const & e)
{
@@ -108,7 +109,16 @@ DCP::read (bool keep_going, ReadErrors* errors, bool ignore_incorrect_picture_mx
}
cxml::Document asset_map ("AssetMap");
+
asset_map.read_file (asset_map_file);
+ if (asset_map.namespace_uri() == assetmap_interop_ns) {
+ _standard = INTEROP;
+ } else if (asset_map.namespace_uri() == assetmap_smpte_ns) {
+ _standard = SMPTE;
+ } else {
+ boost::throw_exception (XMLError ("Unrecognised Assetmap namespace " + asset_map.namespace_uri()));
+ }
+
list<shared_ptr<cxml::Node> > asset_nodes = asset_map.node_child("AssetList")->node_children ("Asset");
map<string, boost::filesystem::path> paths;
BOOST_FOREACH (shared_ptr<cxml::Node> i, asset_nodes) {
@@ -153,11 +163,23 @@ DCP::read (bool keep_going, ReadErrors* errors, bool ignore_incorrect_picture_mx
delete p;
if (root == "CompositionPlaylist") {
- _cpls.push_back (shared_ptr<CPL> (new CPL (path)));
+ shared_ptr<CPL> cpl (new CPL (path));
+ if (_standard && cpl->standard() && cpl->standard().get() != _standard.get()) {
+ survivable_error (keep_going, errors, MismatchedStandardError ());
+ }
+ _cpls.push_back (cpl);
} else if (root == "DCSubtitle") {
+ if (_standard && _standard.get() == SMPTE) {
+ survivable_error (keep_going, errors, MismatchedStandardError ());
+ }
other_assets.push_back (shared_ptr<InteropSubtitleAsset> (new InteropSubtitleAsset (path)));
}
} else if (boost::filesystem::extension (path) == ".mxf") {
+
+ /* XXX: asdcplib does not appear to support discovery of read MXFs standard
+ (Interop / SMPTE)
+ */
+
ASDCP::EssenceType_t type;
if (ASDCP::EssenceType (path.string().c_str(), type) != ASDCP::RESULT_OK) {
throw DCPReadError ("Could not find essence type");
diff --git a/src/dcp.h b/src/dcp.h
index 05c2026b..7d6d1567 100644
--- a/src/dcp.h
+++ b/src/dcp.h
@@ -102,6 +102,11 @@ public:
void resolve_refs (std::list<boost::shared_ptr<Asset> > assets);
+ /** @return Standard of a DCP that was read in */
+ boost::optional<Standard> standard () const {
+ return _standard;
+ }
+
private:
/** Write the PKL file.
@@ -126,6 +131,9 @@ private:
boost::filesystem::path _directory;
/** the CPLs that make up this DCP */
std::list<boost::shared_ptr<CPL> > _cpls;
+
+ /** Standard of DCP that was read in */
+ boost::optional<Standard> _standard;
};
}
diff --git a/src/exceptions.cc b/src/exceptions.cc
index ed6edaa4..14ae8e9c 100644
--- a/src/exceptions.cc
+++ b/src/exceptions.cc
@@ -70,3 +70,9 @@ ProgrammingError::ProgrammingError (string file, int line)
{
}
+
+MismatchedStandardError::MismatchedStandardError ()
+ : DCPReadError ("DCP contains both Interop and SMPTE parts")
+{
+
+}
diff --git a/src/exceptions.h b/src/exceptions.h
index 801bfb01..3410337e 100644
--- a/src/exceptions.h
+++ b/src/exceptions.h
@@ -153,6 +153,12 @@ public:
ProgrammingError (std::string file, int line);
};
+class MismatchedStandardError : public DCPReadError
+{
+public:
+ MismatchedStandardError ();
+};
+
}
#endif
diff --git a/test/read_dcp_test.cc b/test/read_dcp_test.cc
index 097d0aa9..60aa3591 100644
--- a/test/read_dcp_test.cc
+++ b/test/read_dcp_test.cc
@@ -18,14 +18,15 @@
*/
#include <boost/test/unit_test.hpp>
+#include <boost/optional/optional_io.hpp>
#include "dcp.h"
#include "cpl.h"
using std::list;
using boost::shared_ptr;
-/** Read DCP that is in git and make sure that basic stuff is read in correctly */
-BOOST_AUTO_TEST_CASE (read_dcp)
+/** Read a SMPTE DCP that is in git and make sure that basic stuff is read in correctly */
+BOOST_AUTO_TEST_CASE (read_dcp_test1)
{
dcp::DCP d ("test/ref/DCP/dcp_test1");
d.read ();
@@ -35,4 +36,21 @@ BOOST_AUTO_TEST_CASE (read_dcp)
BOOST_CHECK_EQUAL (cpls.front()->annotation_text(), "A Test DCP");
BOOST_CHECK_EQUAL (cpls.front()->content_kind(), dcp::FEATURE);
+ BOOST_REQUIRE (d.standard());
+ BOOST_CHECK_EQUAL (d.standard(), dcp::SMPTE);
+}
+
+/** Read an Interop DCP that is in git and make sure that basic stuff is read in correctly */
+BOOST_AUTO_TEST_CASE (read_dcp_test2)
+{
+ dcp::DCP d ("test/ref/DCP/dcp_test3");
+ d.read ();
+
+ list<shared_ptr<dcp::CPL> > cpls = d.cpls ();
+ BOOST_CHECK_EQUAL (cpls.size(), 1);
+
+ BOOST_CHECK_EQUAL (cpls.front()->annotation_text(), "Test_FTR-1_F-119_10_2K_20160524_IOP_OV");
+ BOOST_CHECK_EQUAL (cpls.front()->content_kind(), dcp::FEATURE);
+ BOOST_REQUIRE (d.standard());
+ BOOST_CHECK_EQUAL (d.standard(), dcp::INTEROP);
}
diff --git a/test/ref/DCP/dcp_test3/ASSETMAP b/test/ref/DCP/dcp_test3/ASSETMAP
new file mode 100644
index 00000000..6b4de017
--- /dev/null
+++ b/test/ref/DCP/dcp_test3/ASSETMAP
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<AssetMap xmlns="http://www.digicine.com/PROTO-ASDCP-AM-20040311#"><Id>urn:uuid:fe6cc6ff-05f8-435e-9486-7ce432f3855a</Id><AnnotationText>Created by DCP-o-matic 2.8.4devel 4ba821a8b0</AnnotationText><VolumeCount>1</VolumeCount><IssueDate>2016-05-24T10:56:58+01:00</IssueDate><Issuer>DCP-o-matic 2.8.4devel 4ba821a8b0</Issuer><Creator>DCP-o-matic 2.8.4devel 4ba821a8b0</Creator><AssetList><Asset><Id>urn:uuid:d87a950c-bd6f-41f6-90cc-56ccd673e131</Id><PackingList>true</PackingList><ChunkList><Chunk><Path>pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml</Path><VolumeIndex>1</VolumeIndex><Offset>0</Offset><Length>8175</Length></Chunk></ChunkList></Asset><Asset><Id>urn:uuid:cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296</Id><ChunkList><Chunk><Path>cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml</Path><VolumeIndex>1</VolumeIndex><Offset>0</Offset><Length>8542</Length></Chunk></ChunkList></Asset><Asset><Id>urn:uuid:c6035f97-b07d-4e1c-944d-603fc2ddc242</Id><ChunkList><Chunk><Path>j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf</Path><VolumeIndex>1</VolumeIndex><Offset>0</Offset><Length>561776</Length></Chunk></ChunkList></Asset><Asset><Id>urn:uuid:69cf9eaf-9a99-4776-b022-6902208626c3</Id><ChunkList><Chunk><Path>pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf</Path><VolumeIndex>1</VolumeIndex><Offset>0</Offset><Length>881174</Length></Chunk></ChunkList></Asset></AssetList></AssetMap>
diff --git a/test/ref/DCP/dcp_test3/VOLINDEX b/test/ref/DCP/dcp_test3/VOLINDEX
new file mode 100644
index 00000000..49dd7ecc
--- /dev/null
+++ b/test/ref/DCP/dcp_test3/VOLINDEX
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VolumeIndex xmlns="http://www.digicine.com/PROTO-ASDCP-AM-20040311#"><Index>1</Index></VolumeIndex>
diff --git a/test/ref/DCP/dcp_test3/cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml b/test/ref/DCP/dcp_test3/cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml
new file mode 100644
index 00000000..8185ddb1
--- /dev/null
+++ b/test/ref/DCP/dcp_test3/cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CompositionPlaylist xmlns="http://www.digicine.com/PROTO-ASDCP-CPL-20040511#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><Id>urn:uuid:cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296</Id><AnnotationText>Test_FTR-1_F-119_10_2K_20160524_IOP_OV</AnnotationText><IssueDate>2016-05-24T10:56:58+01:00</IssueDate><Issuer>DCP-o-matic 2.8.4devel 4ba821a8b0</Issuer><Creator>DCP-o-matic 2.8.4devel 4ba821a8b0</Creator><ContentTitleText>Test_FTR-1_F-119_10_2K_20160524_IOP_OV</ContentTitleText><ContentKind>feature</ContentKind><ContentVersion><Id>urn:uuid:dc199ce3-c0ab-4e4c-84fa-7f2e5b34a4af</Id><LabelText>urn:uuid:dc199ce3-c0ab-4e4c-84fa-7f2e5b34a4af2016-05-24T10:56:58+01:00</LabelText></ContentVersion><RatingList/><ReelList><Reel><Id>urn:uuid:439ff814-0e1b-44ab-9165-2b265b355f20</Id><AssetList><MainPicture><Id>urn:uuid:c6035f97-b07d-4e1c-944d-603fc2ddc242</Id><AnnotationText>j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf</AnnotationText><EditRate>24 1</EditRate><IntrinsicDuration>24</IntrinsicDuration><EntryPoint>0</EntryPoint><Duration>24</Duration><Hash>42m6Sxyk+CT/aq0dEnjGXX//AjA=</Hash><FrameRate>24 1</FrameRate><ScreenAspectRatio>1.85</ScreenAspectRatio></MainPicture><MainSound><Id>urn:uuid:69cf9eaf-9a99-4776-b022-6902208626c3</Id><AnnotationText>pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf</AnnotationText><EditRate>24 1</EditRate><IntrinsicDuration>24</IntrinsicDuration><EntryPoint>0</EntryPoint><Duration>24</Duration><Hash>a+7/nC9SIvCIziRyH9BXOr4r0fk=</Hash></MainSound></AssetList></Reel></ReelList><Signer><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=FZN\+C9r\+P8srz0\+uH45JHcDHb0g=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName><dsig:X509SerialNumber>7</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509SubjectName>dnQualifier=S9Mf7OiiXsCV2LGoSr1LKsRcat0=,CN=CS.dcpomatic.smpte-430-2.LEAF,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509SubjectName></dsig:X509Data></Signer><dsig:Signature><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>D4hqt7drQ3mOOk9N7uQ4h3I8skc=</dsig:DigestValue></dsig:Reference></dsig:SignedInfo><dsig:SignatureValue>KF8cjLvn5dwNxzHUXxT/ux479kEJmakBb2y6VCJ7scbH50NKVfDaufxMDf8Owt7A
+RKy0yGTo9IzOcooBUDbtQypKxZEN2I9zPOWBSsgFRthMPODbJ9oHa5i0JoiHePW6
+pn/jrEI62WoF6O7+u2Y1WAGY/aERJyD285387OXLWHVjKOQtG2MoorbRyIBtG6vL
+g6lYum8B/etyKxoJ5Rpc6BMqe/X+6kGtgxmrEqOaDuEm49GMw4c1sXqjE6/NtOUo
+gE7oBooOzKw9J2GKv4haUwbauVaezyDXBQRHOWJ4WGRRhfbmP93ouKsr0ZqohbGQ
+4xovNoDaN513KXzGSo/87g==</dsig:SignatureValue><dsig:KeyInfo><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=FZN\+C9r\+P8srz0\+uH45JHcDHb0g=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName><dsig:X509SerialNumber>7</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEaTCCA1GgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBhTEWMBQGA1UECgwNZGNw
+b21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGljLmNvbTEsMCoGA1UEAwwjLmRj
+cG9tYXRpYy5zbXB0ZS00MzAtMi5JTlRFUk1FRElBVEUxJTAjBgNVBC4THEZaTitD
+OXIrUDhzcnowK3VINDVKSGNESGIwZz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTEy
+MTIyNjA4WjB/MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3Bv
+bWF0aWMuY29tMSYwJAYDVQQDDB1DUy5kY3BvbWF0aWMuc21wdGUtNDMwLTIuTEVB
+RjElMCMGA1UELhMcUzlNZjdPaWlYc0NWMkxHb1NyMUxLc1JjYXQwPTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKxEJwAKDOwDLron0tTs+uMYdFBXCUsq
+Y+wxFhQCkuAgnD8evF91kUIBd79W0fd3XByGj6tyi5S0JOIYtDmq8bA3RnpQ/R9S
+KQKESnHtt9Zptxk5KbIUUShiEBTTLfeLtubn8IFqgsarPEJPdXyjvzzyNEqbWpW0
+SVYC09/GzhOFjRzikAdG+MrWa93xGyf7/Bonmt4Z/pE2C+Enq7Oj0ascBYtWDB9T
+U5IihXvo9VcAfiXWQlDoWrCP+YxjwRgMByh21RGJxdtqwV6KaBhmCEy976IVr8VW
+DLmq8c5Nnz6vwypGCbdtLFr9Gxd93JbA+KPvXp7zx6d5+WfOJx8sE4sCAwEAAaOB
+6DCB5TAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIFoDAdBgNVHQ4EFgQUS9Mf7Oii
+XsCV2LGoSr1LKsRcat0wgagGA1UdIwSBoDCBnYAUFZN+C9r+P8srz0+uH45JHcDH
+b0ihgYGkfzB9MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3Bv
+bWF0aWMuY29tMSQwIgYDVQQDDBsuZGNwb21hdGljLnNtcHRlLTQzMC0yLlJPT1Qx
+JTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNFWDNVTzEzUGlrK0l2cz2CAQYwDQYJKoZI
+hvcNAQELBQADggEBAK2GcL7gKu6C/deJtQqZgeM/hHXEpo+jRwBuOe6D5Z7CN2O3
+DuhO54otN+mL6ImyrUvDZCoJa70gdnjLzrx8soBHXQ8IgMUh5+HItUYbX/U+vnTK
+f8Ox1XybZenYNi8quwuodGBBZOWbXjLiMdVKkrCSjOiQRG6dCyFLIUZH/lsCETRI
+7E+bdQmIh3+tiUtQar2D4kO2G1GrMKzpGWL1Vap6vEK2Lrvj8xQNmDT6VOUGE3Yz
+qx0kHkPEYazi8aX/h7VG/ikTtR9Y57UNJTs7pG7EUIQZPRjaSptTQsB1qAP6ZsH8
++Ko1kgIe6OKqckVkZyZDqM1LlgbC+3cRk5bf6/E=</dsig:X509Certificate></dsig:X509Data><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=AOgKVeMg6NImCEX3UO13Pik\+Ivs=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName><dsig:X509SerialNumber>6</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEbTCCA1WgAwIBAgIBBjANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKDA1kY3Bv
+bWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29tMSQwIgYDVQQDDBsuZGNw
+b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNF
+WDNVTzEzUGlrK0l2cz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTEzMTIyNjA4WjCB
+hTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGljLmNv
+bTEsMCoGA1UEAwwjLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5JTlRFUk1FRElBVEUx
+JTAjBgNVBC4THEZaTitDOXIrUDhzcnowK3VINDVKSGNESGIwZz0wggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0io5HerL+iBGM+CWbpq5ZaTu35dA5Gp79
+iGl8J0S2tgzkkX5lXyJTtI5GZYMtaJWHwQYtbpmYsOxvhc4Xv/Jhfr0fPwQTFZTW
+2jJQaLg2wno4SbP2mNU5QBCqPPkPvoNAmu0fqWmkBX8HAEIrYHxDDR4e/ZgEEnJp
+D1RpwiMxVX9dCvtcmr8vqz8PSQ5xBJA+tw8WJgV+T/woDEvYZ9t65O4Opg70TGWS
+hNRCJc7NUXP354zutfLjibLNyScQCf37ssh/2P8rp1+JdIxYqEhOIKNox9eHeBOT
+P54W685/KJ8GGsHc+sKydMzJIu4HkVqHhY5WSLc2wj/07Hq59tffAgMBAAGjge4w
+geswEgYDVR0TAQH/BAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFBWT
+fgva/j/LK89Prh+OSR3Ax29IMIGoBgNVHSMEgaAwgZ2AFADoClXjIOjSJghF91Dt
+dz4pPiL7oYGBpH8wfTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwN
+ZGNwb21hdGljLmNvbTEkMCIGA1UEAwwbLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5S
+T09UMSUwIwYDVQQuExxBT2dLVmVNZzZOSW1DRVgzVU8xM1BpaytJdnM9ggEFMA0G
+CSqGSIb3DQEBCwUAA4IBAQCYfqgS0+IPUUOgnYp59XXJxDq8sFE+eq0CTueJYgNQ
+NglLhxz5jg+BsaFgK+yrcZNewNFTmXoXzJVAa2SjMscekk3qatJetFOcuidyo35b
+Gp5tCQ+hZgVbzj29k7SAWzxZuSjcq3thjdvuC3pqqtd5W4MKXs4Tq8636NaR4rdi
++7/PCOznwmvBPLil0HjStWLuICNSauNarlvnloz6/hrik8XLKy5aXoFzKqW47T/C
+lSymaosY/U/1U/UbwsACVtZ5l29SNeVfLT3AkLokskuP1ceIWzi/2biTbErUIQaM
+SnqVheFcP0A/FDF6ql+okHDFuN0TsehGX9p17zuxGcN5</dsig:X509Certificate></dsig:X509Data><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=AOgKVeMg6NImCEX3UO13Pik\+Ivs=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName><dsig:X509SerialNumber>5</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEZDCCA0ygAwIBAgIBBTANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKDA1kY3Bv
+bWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29tMSQwIgYDVQQDDBsuZGNw
+b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNF
+WDNVTzEzUGlrK0l2cz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTE0MTIyNjA4WjB9
+MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29t
+MSQwIgYDVQQDDBsuZGNwb21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4T
+HEFPZ0tWZU1nNk5JbUNFWDNVTzEzUGlrK0l2cz0wggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQDjajsB3pAAVr+/ZpUBHDIUTumgjvnCZRBxoYoRUjaH0wWG
+UnbRU4DVh/0JcpZo3fcgpOhv34WPq+UHpXj/So2eMwiZIlx4EC/F8VqQkiXohJEE
+JNKcDbLKLoQEs2sNayZ1SF0IY7D57CGifHMIUpZRwyv1LYweVbP7nIsvBxhoABg3
+8li3azYXiFgEGbjkmHOVyy3kR+SLn+PQ99qGhc6Qh7fR2aduDqHl971LKwpfoKqy
+WoE62x8XrK1udWqmZNhvxvfh0YIXNyEJ0nVae77y/iiBLiVMQq81QQioGZblBD2n
+um8gCuwsCay1Md9++D7Hzzc695LH8Ntx2elhtl/DAgMBAAGjge4wgeswEgYDVR0T
+AQH/BAgwBgEB/wIBAzALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFADoClXjIOjSJghF
+91Dtdz4pPiL7MIGoBgNVHSMEgaAwgZ2AFADoClXjIOjSJghF91Dtdz4pPiL7oYGB
+pH8wfTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGlj
+LmNvbTEkMCIGA1UEAwwbLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5ST09UMSUwIwYD
+VQQuExxBT2dLVmVNZzZOSW1DRVgzVU8xM1BpaytJdnM9ggEFMA0GCSqGSIb3DQEB
+CwUAA4IBAQCT59b0YpNVyW2L19k69rqkzvSAB08mNhDkzWF66zAqtI9GT5ZEPSTn
+U/84icV7EAFGyuSXjUnQNHyV5fIJu68vrg+dAHhRYKUi2xPgxHPKpxuPmmzKeqCw
+UgCoV802RQNVFMwUo0khOi7LLsvOb3FDkA0yLflngOCBmLdKMBZJPrcAVO++qWJB
+gpkZkt5Q7snLsw4oLvLklL4wdX8qkn2PUiZohY5r68kIalEg89MZXtFiWWTh3K9R
+vr++lap40maqjMFG0xFO/K7Ujyc19m03fVRhCEZJIyyE7jJFis669Jh/IlF6UyrD
+rm43765q3A5P1Y6iCVbprbuPbZ6VE/CJ</dsig:X509Certificate></dsig:X509Data></dsig:KeyInfo></dsig:Signature></CompositionPlaylist>
diff --git a/test/ref/DCP/dcp_test3/j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf b/test/ref/DCP/dcp_test3/j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf
new file mode 100644
index 00000000..f1907030
--- /dev/null
+++ b/test/ref/DCP/dcp_test3/j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf
Binary files differ
diff --git a/test/ref/DCP/dcp_test3/pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf b/test/ref/DCP/dcp_test3/pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf
new file mode 100644
index 00000000..fccb2ef0
--- /dev/null
+++ b/test/ref/DCP/dcp_test3/pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf
Binary files differ
diff --git a/test/ref/DCP/dcp_test3/pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml b/test/ref/DCP/dcp_test3/pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml
new file mode 100644
index 00000000..a795c95c
--- /dev/null
+++ b/test/ref/DCP/dcp_test3/pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<PackingList xmlns="http://www.digicine.com/PROTO-ASDCP-PKL-20040311#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><Id>urn:uuid:d87a950c-bd6f-41f6-90cc-56ccd673e131</Id><AnnotationText>Test_FTR-1_F-119_10_2K_20160524_IOP_OV</AnnotationText><IssueDate>2016-05-24T10:56:58+01:00</IssueDate><Issuer>DCP-o-matic 2.8.4devel 4ba821a8b0</Issuer><Creator>DCP-o-matic 2.8.4devel 4ba821a8b0</Creator><AssetList><Asset><Id>urn:uuid:cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296</Id><AnnotationText>cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296</AnnotationText><Hash>1MZ0cQr217LcIgobkC1/emgJrTU=</Hash><Size>8542</Size><Type>text/xml;asdcpKind=CPL</Type></Asset><Asset><Id>urn:uuid:c6035f97-b07d-4e1c-944d-603fc2ddc242</Id><AnnotationText>c6035f97-b07d-4e1c-944d-603fc2ddc242</AnnotationText><Hash>42m6Sxyk+CT/aq0dEnjGXX//AjA=</Hash><Size>561776</Size><Type>application/x-smpte-mxf;asdcpKind=Picture</Type></Asset><Asset><Id>urn:uuid:69cf9eaf-9a99-4776-b022-6902208626c3</Id><AnnotationText>69cf9eaf-9a99-4776-b022-6902208626c3</AnnotationText><Hash>a+7/nC9SIvCIziRyH9BXOr4r0fk=</Hash><Size>881174</Size><Type>application/x-smpte-mxf;asdcpKind=Sound</Type></Asset></AssetList><Signer><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=FZN\+C9r\+P8srz0\+uH45JHcDHb0g=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName><dsig:X509SerialNumber>7</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509SubjectName>dnQualifier=S9Mf7OiiXsCV2LGoSr1LKsRcat0=,CN=CS.dcpomatic.smpte-430-2.LEAF,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509SubjectName></dsig:X509Data></Signer><dsig:Signature><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>avzD/rIrawR3OhFlc4RNgYKC3UY=</dsig:DigestValue></dsig:Reference></dsig:SignedInfo><dsig:SignatureValue>rEKXBDgklh0uiEeOeMipEixNdjBlSX3/9Urq822IXQDwm9Ty9fevo5LlfBqHsghD
+0dh6N5il0CTn5LvokmuKcRjOdn5gEntpxfJvXLVZqMTVBxSgbuQMkVxKQYucx70k
++wP62PpMvOdPI7Aro+CeyTf0mwS5u/w2YMvGahR/gvlwgw32Lf3Ebe0KWHbG0lbd
+zdfm3R7x2zb6XY4OB6TtH80JaIozyCe+Hs1ie7JmeXRBdxXZpGpNfhZ5+1Xw/Abm
+x+FAb07KijyxMhtLRqFN/qBeEu68XChbjDK6zxKCUiuNS5I6Kh6DodMuOE9JpMSl
+UZpVSCjsIVFd1kL8eFdvSA==</dsig:SignatureValue><dsig:KeyInfo><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=FZN\+C9r\+P8srz0\+uH45JHcDHb0g=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName><dsig:X509SerialNumber>7</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEaTCCA1GgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBhTEWMBQGA1UECgwNZGNw
+b21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGljLmNvbTEsMCoGA1UEAwwjLmRj
+cG9tYXRpYy5zbXB0ZS00MzAtMi5JTlRFUk1FRElBVEUxJTAjBgNVBC4THEZaTitD
+OXIrUDhzcnowK3VINDVKSGNESGIwZz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTEy
+MTIyNjA4WjB/MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3Bv
+bWF0aWMuY29tMSYwJAYDVQQDDB1DUy5kY3BvbWF0aWMuc21wdGUtNDMwLTIuTEVB
+RjElMCMGA1UELhMcUzlNZjdPaWlYc0NWMkxHb1NyMUxLc1JjYXQwPTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKxEJwAKDOwDLron0tTs+uMYdFBXCUsq
+Y+wxFhQCkuAgnD8evF91kUIBd79W0fd3XByGj6tyi5S0JOIYtDmq8bA3RnpQ/R9S
+KQKESnHtt9Zptxk5KbIUUShiEBTTLfeLtubn8IFqgsarPEJPdXyjvzzyNEqbWpW0
+SVYC09/GzhOFjRzikAdG+MrWa93xGyf7/Bonmt4Z/pE2C+Enq7Oj0ascBYtWDB9T
+U5IihXvo9VcAfiXWQlDoWrCP+YxjwRgMByh21RGJxdtqwV6KaBhmCEy976IVr8VW
+DLmq8c5Nnz6vwypGCbdtLFr9Gxd93JbA+KPvXp7zx6d5+WfOJx8sE4sCAwEAAaOB
+6DCB5TAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIFoDAdBgNVHQ4EFgQUS9Mf7Oii
+XsCV2LGoSr1LKsRcat0wgagGA1UdIwSBoDCBnYAUFZN+C9r+P8srz0+uH45JHcDH
+b0ihgYGkfzB9MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3Bv
+bWF0aWMuY29tMSQwIgYDVQQDDBsuZGNwb21hdGljLnNtcHRlLTQzMC0yLlJPT1Qx
+JTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNFWDNVTzEzUGlrK0l2cz2CAQYwDQYJKoZI
+hvcNAQELBQADggEBAK2GcL7gKu6C/deJtQqZgeM/hHXEpo+jRwBuOe6D5Z7CN2O3
+DuhO54otN+mL6ImyrUvDZCoJa70gdnjLzrx8soBHXQ8IgMUh5+HItUYbX/U+vnTK
+f8Ox1XybZenYNi8quwuodGBBZOWbXjLiMdVKkrCSjOiQRG6dCyFLIUZH/lsCETRI
+7E+bdQmIh3+tiUtQar2D4kO2G1GrMKzpGWL1Vap6vEK2Lrvj8xQNmDT6VOUGE3Yz
+qx0kHkPEYazi8aX/h7VG/ikTtR9Y57UNJTs7pG7EUIQZPRjaSptTQsB1qAP6ZsH8
++Ko1kgIe6OKqckVkZyZDqM1LlgbC+3cRk5bf6/E=</dsig:X509Certificate></dsig:X509Data><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=AOgKVeMg6NImCEX3UO13Pik\+Ivs=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName><dsig:X509SerialNumber>6</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEbTCCA1WgAwIBAgIBBjANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKDA1kY3Bv
+bWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29tMSQwIgYDVQQDDBsuZGNw
+b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNF
+WDNVTzEzUGlrK0l2cz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTEzMTIyNjA4WjCB
+hTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGljLmNv
+bTEsMCoGA1UEAwwjLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5JTlRFUk1FRElBVEUx
+JTAjBgNVBC4THEZaTitDOXIrUDhzcnowK3VINDVKSGNESGIwZz0wggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0io5HerL+iBGM+CWbpq5ZaTu35dA5Gp79
+iGl8J0S2tgzkkX5lXyJTtI5GZYMtaJWHwQYtbpmYsOxvhc4Xv/Jhfr0fPwQTFZTW
+2jJQaLg2wno4SbP2mNU5QBCqPPkPvoNAmu0fqWmkBX8HAEIrYHxDDR4e/ZgEEnJp
+D1RpwiMxVX9dCvtcmr8vqz8PSQ5xBJA+tw8WJgV+T/woDEvYZ9t65O4Opg70TGWS
+hNRCJc7NUXP354zutfLjibLNyScQCf37ssh/2P8rp1+JdIxYqEhOIKNox9eHeBOT
+P54W685/KJ8GGsHc+sKydMzJIu4HkVqHhY5WSLc2wj/07Hq59tffAgMBAAGjge4w
+geswEgYDVR0TAQH/BAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFBWT
+fgva/j/LK89Prh+OSR3Ax29IMIGoBgNVHSMEgaAwgZ2AFADoClXjIOjSJghF91Dt
+dz4pPiL7oYGBpH8wfTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwN
+ZGNwb21hdGljLmNvbTEkMCIGA1UEAwwbLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5S
+T09UMSUwIwYDVQQuExxBT2dLVmVNZzZOSW1DRVgzVU8xM1BpaytJdnM9ggEFMA0G
+CSqGSIb3DQEBCwUAA4IBAQCYfqgS0+IPUUOgnYp59XXJxDq8sFE+eq0CTueJYgNQ
+NglLhxz5jg+BsaFgK+yrcZNewNFTmXoXzJVAa2SjMscekk3qatJetFOcuidyo35b
+Gp5tCQ+hZgVbzj29k7SAWzxZuSjcq3thjdvuC3pqqtd5W4MKXs4Tq8636NaR4rdi
++7/PCOznwmvBPLil0HjStWLuICNSauNarlvnloz6/hrik8XLKy5aXoFzKqW47T/C
+lSymaosY/U/1U/UbwsACVtZ5l29SNeVfLT3AkLokskuP1ceIWzi/2biTbErUIQaM
+SnqVheFcP0A/FDF6ql+okHDFuN0TsehGX9p17zuxGcN5</dsig:X509Certificate></dsig:X509Data><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=AOgKVeMg6NImCEX3UO13Pik\+Ivs=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com</dsig:X509IssuerName><dsig:X509SerialNumber>5</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEZDCCA0ygAwIBAgIBBTANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKDA1kY3Bv
+bWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29tMSQwIgYDVQQDDBsuZGNw
+b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNF
+WDNVTzEzUGlrK0l2cz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTE0MTIyNjA4WjB9
+MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29t
+MSQwIgYDVQQDDBsuZGNwb21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4T
+HEFPZ0tWZU1nNk5JbUNFWDNVTzEzUGlrK0l2cz0wggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQDjajsB3pAAVr+/ZpUBHDIUTumgjvnCZRBxoYoRUjaH0wWG
+UnbRU4DVh/0JcpZo3fcgpOhv34WPq+UHpXj/So2eMwiZIlx4EC/F8VqQkiXohJEE
+JNKcDbLKLoQEs2sNayZ1SF0IY7D57CGifHMIUpZRwyv1LYweVbP7nIsvBxhoABg3
+8li3azYXiFgEGbjkmHOVyy3kR+SLn+PQ99qGhc6Qh7fR2aduDqHl971LKwpfoKqy
+WoE62x8XrK1udWqmZNhvxvfh0YIXNyEJ0nVae77y/iiBLiVMQq81QQioGZblBD2n
+um8gCuwsCay1Md9++D7Hzzc695LH8Ntx2elhtl/DAgMBAAGjge4wgeswEgYDVR0T
+AQH/BAgwBgEB/wIBAzALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFADoClXjIOjSJghF
+91Dtdz4pPiL7MIGoBgNVHSMEgaAwgZ2AFADoClXjIOjSJghF91Dtdz4pPiL7oYGB
+pH8wfTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGlj
+LmNvbTEkMCIGA1UEAwwbLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5ST09UMSUwIwYD
+VQQuExxBT2dLVmVNZzZOSW1DRVgzVU8xM1BpaytJdnM9ggEFMA0GCSqGSIb3DQEB
+CwUAA4IBAQCT59b0YpNVyW2L19k69rqkzvSAB08mNhDkzWF66zAqtI9GT5ZEPSTn
+U/84icV7EAFGyuSXjUnQNHyV5fIJu68vrg+dAHhRYKUi2xPgxHPKpxuPmmzKeqCw
+UgCoV802RQNVFMwUo0khOi7LLsvOb3FDkA0yLflngOCBmLdKMBZJPrcAVO++qWJB
+gpkZkt5Q7snLsw4oLvLklL4wdX8qkn2PUiZohY5r68kIalEg89MZXtFiWWTh3K9R
+vr++lap40maqjMFG0xFO/K7Ujyc19m03fVRhCEZJIyyE7jJFis669Jh/IlF6UyrD
+rm43765q3A5P1Y6iCVbprbuPbZ6VE/CJ</dsig:X509Certificate></dsig:X509Data></dsig:KeyInfo></dsig:Signature></PackingList>