Fix interop verification and add some tests for it.
authorCarl Hetherington <cth@carlh.net>
Tue, 3 Mar 2020 21:02:03 +0000 (22:02 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 3 Mar 2020 21:02:03 +0000 (22:02 +0100)
src/verify.cc
test/verify_test.cc
wscript
xsd/Main-Stereo-Picture-CPL.xsd [new file with mode: 0644]
xsd/PROTO-ASDCP-AM-20040311.xsd [new file with mode: 0644]
xsd/PROTO-ASDCP-CPL-20040511.xsd [new file with mode: 0644]
xsd/PROTO-ASDCP-PKL-20040311.xsd [new file with mode: 0644]

index ca53a4c1c2968cd863e7656c3dc4368e6352bf27..10e91320a739e7e4c5461d1eb71b5f9b1838b618 100644 (file)
@@ -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) {
index 38316f546488401fda565a5ce75fb27f0b518436..b506902302005f5fba4d22b4e88fce58fb6d736d 100644 (file)
@@ -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,56 @@ 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++;
+}
diff --git a/wscript b/wscript
index 8b5593e9857fbee4fb2ab3af761c2fad695f9d2a..689a84fb9096cb0a8decd81b50d7fa17a21d7551 100644 (file)
--- 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 (file)
index 0000000..bec275e
--- /dev/null
@@ -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 (file)
index 0000000..f63540d
--- /dev/null
@@ -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 (file)
index 0000000..c870811
--- /dev/null
@@ -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 (file)
index 0000000..0be3cd3
--- /dev/null
@@ -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>
+