Merge master; MXF subtitle stuff not included.
authorCarl Hetherington <cth@carlh.net>
Wed, 26 Feb 2014 18:41:41 +0000 (18:41 +0000)
committerCarl Hetherington <cth@carlh.net>
Wed, 26 Feb 2014 18:41:41 +0000 (18:41 +0000)
34 files changed:
.gitmodules [new file with mode: 0644]
TESTING [new file with mode: 0644]
cscript
run-tests.sh [deleted file]
run/tests [new file with mode: 0755]
src/asset.cc
src/asset.h
src/content.h
src/cpl.cc
src/cpl.h
src/dcp.cc
src/mxf.cc
src/mxf.h
src/picture_mxf.h
src/signer_chain.cc
src/sound_mxf.h
src/subtitle_content.cc
src/subtitle_content.h
test/dcp_test.cc
test/decryption_test.cc
test/encryption_test.cc
test/private [new submodule]
test/ref/DCP/bar/402c5a88-2512-4465-9c0b-cfa687dbc5d0_pkl.xml [deleted file]
test/ref/DCP/bar/63c3aece-c581-4603-b612-75e43f0c0430_cpl.xml [deleted file]
test/ref/DCP/bar/7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_cpl.xml [new file with mode: 0644]
test/ref/DCP/bar/ASSETMAP.xml
test/ref/DCP/bar/VOLINDEX.xml
test/ref/DCP/bar/a12d2c1f-0daa-4a30-a4cd-c4266ac172a7_pkl.xml [new file with mode: 0644]
test/ref/DCP/bar/audio.mxf
test/ref/DCP/bar/video.mxf
test/rewrite_subs.cc
test/test.cc
test/test.h
wscript

diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..f7fb9ff
--- /dev/null
@@ -0,0 +1,3 @@
+[submodule "test/private"]
+       path = test/private
+       url = ssh://carlh.dyndns.org/home/carl/git/libdcp-test.git
diff --git a/TESTING b/TESTING
new file mode 100644 (file)
index 0000000..5896f24
--- /dev/null
+++ b/TESTING
@@ -0,0 +1,4 @@
+libdcp has unit tests which are run with
+
+run/tests
+
diff --git a/cscript b/cscript
index 578cd24775b7516a7068c4229bc6e5087dd1ed8b..784e1c7f0d71f7dd82f95f19c2f88c258450ff8b 100644 (file)
--- a/cscript
+++ b/cscript
@@ -1,7 +1,7 @@
 import os
 
 def dependencies(target):
-    return (('libcxml', '27780878701f85ad597addacd541f2e897719978'), ('openjpeg-cdist', '9717d8fd0217b3a5e12ed7afbab1fd9d4499fc4d'))
+    return (('libcxml', '27780878701f85ad597addacd541f2e897719978'), ('openjpeg-cdist', '13b69c2'))
 
 def build(target, options):
     cmd = './waf configure --prefix=%s' % target.work_dir_cscript()
diff --git a/run-tests.sh b/run-tests.sh
deleted file mode 100755 (executable)
index fc56b24..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/bin/bash -e
-
-#
-# Runs our test suite, which (amongst other things)
-# builds a couple of DCPs.
-# The outputs are compared against the ones
-# in test/ref/DCP, and an error is given
-# if anything is different.
-#
-
-if [ ! -e "../libdcp-test" ]; then
-  echo "Test corpus not found"
-  exit 1
-fi
-
-if [ "$1" == "--debug" ]; then
-  shift
-  LD_LIBRARY_PATH=build/src:build/asdcplib/src gdb --args build/test/tests
-elif [ "$1" == "--valgrind" ]; then
-  shift
-  LD_LIBRARY_PATH=build/src:build/asdcplib/src valgrind --tool="memcheck" build/test/tests
-else
-  LD_LIBRARY_PATH=build/src:build/asdcplib/src build/test/tests $*
-fi
-
-diff -ur test/ref/DCP/foo build/test/foo
-if [ "$?" != "0" ]; then
-  echo "FAIL: files differ"
-  exit 1
-fi
-
-diff -ur test/ref/DCP/bar build/test/bar
-if [ "$?" != "0" ]; then
-  echo "FAIL: files differ"
-  exit 1
-fi
-
-rm -f build/test/info.log
-
-for d in `find ../libdcp-test -mindepth 1 -maxdepth 1 -type d | sort`; do
-  if [ `basename $d` != ".git" ]; then
-    LD_LIBRARY_PATH=build/src:build/asdcplib/src build/tools/dcpinfo -s $d >> build/test/info.log
-    if [ "$?" != "0" ]; then
-      echo "FAIL: dcpinfo failed for $d"
-      exit 1
-    fi
-  fi
-done
-
-diff -q build/test/info.log ../libdcp-test/info.log
-if [ "$?" != "0" ]; then
-  echo "FAIL: dcpinfo output incorrect"
-  exit 1
-fi
-
-rm -f build/test/info2.log
-rm -rf build/test/libdcp-test
-
-cp -r ../libdcp-test build/test
-for d in `find build/test/libdcp-test -mindepth 1 -maxdepth 1 -type d | sort`; do
-  if [ `basename $d` != ".git" ]; then
-    LD_LIBRARY_PATH=build/src:build/asdcplib/src build/test/rewrite_subs $d
-    LD_LIBRARY_PATH=build/src:build/asdcplib/src build/tools/dcpinfo -s $d >> build/test/info2.log
-  fi
-done
-
-sed -i "s/DCP: build\/test/DCP: \.\./g" build/test/info2.log
-
-diff -q build/test/info2.log ../libdcp-test/info.log
-if [ "$?" != "0" ]; then
-  echo "FAIL: dcpinfo output from rewrite incorrect"
-  exit 1
-fi
-
-diff build/test/baz/video1.mxf build/test/baz/video2.mxf
-if [ "$?" != "0" ]; then
-  echo "FAIL: MXFs from recovery incorrect"
-  exit 1
-fi
-    
-echo "PASS"
diff --git a/run/tests b/run/tests
new file mode 100755 (executable)
index 0000000..1a028b6
--- /dev/null
+++ b/run/tests
@@ -0,0 +1,95 @@
+#!/bin/bash -e
+#
+# Run our test suite, which (amongst other things)
+# builds a couple of DCPs.
+# The outputs are compared against the ones
+# in test/ref/DCP, and an error is given
+# if anything is different.
+
+private=test/private
+work=build/test
+
+export LD_LIBRARY_PATH=build/src:build/asdcplib/src
+
+# Run the unit tests in test/
+if [ "$1" == "--debug" ]; then
+    shift
+    gdb --args $work/tests
+elif [ "$1" == "--valgrind" ]; then
+    shift
+    valgrind --tool="memcheck" $work/tests
+else
+    $work/tests $*
+fi
+
+if [ ! -e "test/private/info.log" ]; then
+    echo "Private data not found: some tests will not run"
+fi
+
+# Check the first DCP written by the unit tests
+diff -ur test/ref/DCP/foo $work/DCP/foo
+if [ "$?" != "0" ]; then
+    echo "FAIL: files differ"
+    exit 1
+fi
+
+# Check the second DCP written by the unit tests
+diff -ur test/ref/DCP/bar $work/DCP/bar
+if [ "$?" != "0" ]; then
+    echo "FAIL: files differ"
+    exit 1
+fi
+
+# Run dcpinfo on all the DCPs in private/metadata, writing $work/info.log
+rm -f $work/info.log
+for d in `find $private/metadata -mindepth 1 -maxdepth 1 -type d | sort`; do
+    if [ `basename $d` != ".git" ]; then
+        build/tools/dcpinfo -s $d >> $work/info.log
+        if [ "$?" != "0" ]; then
+            echo "FAIL: dcpinfo failed for $d"
+            exit 1
+        fi
+    fi
+done
+
+# Check info.log is what it should be
+diff -q $work/info.log $private/info.log
+if [ "$?" != "0" ]; then
+    echo "FAIL: dcpinfo output incorrect"
+    exit 1
+fi
+
+# Copy test/private into build/ then re-write the subtitles of every DCP using 
+# $work/rewrite_subs.  This tests round-trip of subtitle reading/writing.
+rm -f $work/info2.log
+rm -rf $work/private
+cp -r $private $work
+for d in `find $work/private/metadata -mindepth 1 -maxdepth 1 -type d | sort`; do
+    if [ `basename $d` != ".git" ]; then
+        $work/rewrite_subs $d
+        build/tools/dcpinfo -s $d >> $work/info2.log
+    fi
+done
+
+# Fudge the output
+sed -i "s/DCP: build\/test/DCP: test/g" $work/info2.log
+
+# And check it
+diff -q $work/info2.log $private/info.log
+if [ "$?" != "0" ]; then
+    echo "FAIL: dcpinfo output from rewrite incorrect"
+    exit 1
+fi
+
+# Dump the subs of JourneyToJah... (which has MXF-wrapped subtitles)
+# and check that they are right
+build/tools/dcpinfo -s $private/JourneyToJah_TLR-1_F_EN-DE-FR_CH_51_2K_LOK_20140225_DGL_SMPTE_OV >> $work/jah.log
+
+# Check a MXF written by the unit tests
+diff $work/baz/video1.mxf $work/baz/video2.mxf
+if [ "$?" != "0" ]; then
+    echo "FAIL: MXFs from recovery incorrect"
+    exit 1
+fi
+    
+echo "PASS"
index f8de10b6529d2e3125433628374cc467bb7c081f..aaa79dc75660bd2877f52254a6c952e0bf386f7f 100644 (file)
@@ -60,7 +60,7 @@ Asset::Asset (string id)
 }
 
 void
-Asset::write_to_pkl (xmlpp::Node* node) const
+Asset::write_to_pkl (xmlpp::Node* node, Standard standard) const
 {
        assert (!_file.empty ());
        
@@ -69,7 +69,7 @@ Asset::write_to_pkl (xmlpp::Node* node) const
        asset->add_child("AnnotationText")->add_child_text (_id);
        asset->add_child("Hash")->add_child_text (hash ());
        asset->add_child("Size")->add_child_text (lexical_cast<string> (boost::filesystem::file_size (_file)));
-       asset->add_child("Type")->add_child_text (pkl_type ());
+       asset->add_child("Type")->add_child_text (pkl_type (standard));
 }
 
 void
index 57143310a1b95b8cd229c473e2d822259c060296..bad982f1878b2584741ef0955a65253c022ff19f 100644 (file)
@@ -62,8 +62,9 @@ public:
 
        /** Write details of the asset to a PKL AssetList node.
         *  @param node Parent node.
+        *  @param standard Standard to use.
         */
-       void write_to_pkl (xmlpp::Node* node) const;
+       void write_to_pkl (xmlpp::Node* node, Standard standard) const;
 
        boost::filesystem::path file () const {
                return _file;
@@ -75,7 +76,7 @@ public:
        std::string hash (boost::function<void (float)> progress = 0) const;
 
 protected:
-       virtual std::string pkl_type () const = 0;
+       virtual std::string pkl_type (Standard standard) const = 0;
 
        /** The disk file that represents this asset, if one exists */
        mutable boost::filesystem::path _file;
index e7445d473024548c92d0a6709d00207bab45889f..2059c8f54a9380339b675aaf16b00ee51472f8e7 100644 (file)
@@ -71,6 +71,8 @@ public:
 
 protected:
        friend class MXFWriter;
+
+       virtual std::string asdcp_kind () const = 0;
        
        Fraction _edit_rate;
        int64_t _intrinsic_duration;
index cd255309dcb65fbdab8b3bd6d49d9dd2f518be97..9eae09ad51d456168af3d37f18f2a8f3b9b4a4ae 100644 (file)
@@ -158,6 +158,7 @@ list<shared_ptr<const Content> >
 CPL::content () const
 {
        list<shared_ptr<const Content> > c;
+
        for (list<shared_ptr<Reel> >::const_iterator i = _reels.begin(); i != _reels.end(); ++i) {
                if ((*i)->main_picture ()) {
                        c.push_back ((*i)->main_picture()->mxf ());
@@ -251,3 +252,17 @@ CPL::resolve_refs (list<shared_ptr<Object> > objects)
                (*i)->resolve_refs (objects);
        }
 }
+
+string
+CPL::pkl_type (Standard standard) const
+{
+       switch (standard) {
+       case INTEROP:
+               return "text/xml;asdcpKind=CPL";
+       case SMPTE:
+               return "text/xml";
+       default:
+               assert (false);
+       }
+}
+       
index 6ef992fd6a15a70e4b02025baefa4a189571d4c3..8458a028c022be17ab2e663b922b1afcfee53b93 100644 (file)
--- a/src/cpl.h
+++ b/src/cpl.h
@@ -111,9 +111,7 @@ public:
 
 protected:
        /** @return type string for PKLs for this asset */
-       std::string pkl_type () const {
-               return "text/xml";
-       }
+       std::string pkl_type (Standard standard) const;
 
 private:
        std::string _annotation_text;               ///< &lt;AnnotationText&gt;
index 36eedcf799d2814afa8c7b5f77b743f96fc1c566..88e365062f305d3d542eb1b9ffe3970f3c7f990d 100644 (file)
@@ -240,7 +240,7 @@ DCP::write_pkl (Standard standard, string pkl_uuid, XMLMetadata metadata, shared
 
        xmlpp::Element* asset_list = pkl->add_child("AssetList");
        for (list<shared_ptr<Asset> >::const_iterator i = _assets.begin(); i != _assets.end(); ++i) {
-               (*i)->write_to_pkl (asset_list);
+               (*i)->write_to_pkl (asset_list, standard);
        }
 
        if (signer) {
@@ -258,14 +258,31 @@ void
 DCP::write_volindex (Standard standard) const
 {
        boost::filesystem::path p = _directory;
-       if (standard == INTEROP) {
+       switch (standard) {
+       case INTEROP:
                p /= "VOLINDEX";
-       } else {
+               break;
+       case SMPTE:
                p /= "VOLINDEX.xml";
+               break;
+       default:
+               assert (false);
        }
 
        xmlpp::Document doc;
-       xmlpp::Element* root = doc.create_root_node ("VolumeIndex", "http://www.smpte-ra.org/schemas/429-9/2007/AM");
+       xmlpp::Element* root;
+
+       switch (standard) {
+       case INTEROP:
+               root = doc.create_root_node ("VolumeIndex", "http://www.digicine.com/PROTO-ASDCP-AM-20040311#");
+               break;
+       case SMPTE:
+               root = doc.create_root_node ("VolumeIndex", "http://www.smpte-ra.org/schemas/429-9/2007/AM");
+               break;
+       default:
+               assert (false);
+       }
+       
        root->add_child("Index")->add_child_text ("1");
        doc.write_to_file (p.string (), "UTF-8");
 }
@@ -274,32 +291,50 @@ void
 DCP::write_assetmap (Standard standard, string pkl_uuid, int pkl_length, XMLMetadata metadata) const
 {
        boost::filesystem::path p = _directory;
-       if (standard == INTEROP) {
+       
+       switch (standard) {
+       case INTEROP:
                p /= "ASSETMAP";
-       } else {
+               break;
+       case SMPTE:
                p /= "ASSETMAP.xml";
+               break;
+       default:
+               assert (false);
        }
 
        xmlpp::Document doc;
        xmlpp::Element* root;
-       if (standard == INTEROP) {
+
+       switch (standard) {
+       case INTEROP:
                root = doc.create_root_node ("AssetMap", "http://www.digicine.com/PROTO-ASDCP-AM-20040311#");
-       } else {
+               break;
+       case SMPTE:
                root = doc.create_root_node ("AssetMap", "http://www.smpte-ra.org/schemas/429-9/2007/AM");
+               break;
+       default:
+               assert (false);
        }
 
        root->add_child("Id")->add_child_text ("urn:uuid:" + make_uuid());
        root->add_child("AnnotationText")->add_child_text ("Created by " + metadata.creator);
-       if (standard == INTEROP) {
+
+       switch (standard) {
+       case INTEROP:
                root->add_child("VolumeCount")->add_child_text ("1");
                root->add_child("IssueDate")->add_child_text (metadata.issue_date);
                root->add_child("Issuer")->add_child_text (metadata.issuer);
                root->add_child("Creator")->add_child_text (metadata.creator);
-       } else {
+               break;
+       case SMPTE:
                root->add_child("Creator")->add_child_text (metadata.creator);
                root->add_child("VolumeCount")->add_child_text ("1");
                root->add_child("IssueDate")->add_child_text (metadata.issue_date);
                root->add_child("Issuer")->add_child_text (metadata.issuer);
+               break;
+       default:
+               assert (false);
        }
                
        xmlpp::Node* asset_list = root->add_child ("AssetList");
index 3c75997b907bbeeb6cae6f19d52ac4364fe37ae2..e1ed9650a77a75877d36f9a4d70b6440d7af88b9 100644 (file)
@@ -29,6 +29,7 @@
 #include "metadata.h"
 #include "exceptions.h"
 #include "kdm.h"
+#include "compose.hpp"
 #include <libxml++/nodes/element.h>
 #include <boost/filesystem.hpp>
 #include <iostream>
@@ -152,3 +153,16 @@ MXF::read_writer_info (ASDCP::WriterInfo const & info)
        Kumu::bin2UUIDhex (info.AssetUUID, 16, buffer, 64);
        _id = buffer;
 }
+
+string
+MXF::pkl_type (Standard standard) const
+{
+       switch (standard) {
+       case INTEROP:
+               return String::compose ("application/x-smpte-mxf;asdcpKind=%1", asdcp_kind ());
+       case SMPTE:
+               return "application/x-smpte-mxf";
+       default:
+               assert (false);
+       }
+}
index 525ac701c1b0542d13dfc57b63cc8da35a08f49b..48a1f64ea6c553e9fbcc020a0d3e1f849a08fa49 100644 (file)
--- a/src/mxf.h
+++ b/src/mxf.h
@@ -102,10 +102,7 @@ public:
        }
 
 protected:
-       std::string pkl_type () const {
-               return "application/x-smpte-mxf";
-       }
-       
+       std::string pkl_type (Standard standard) const;
        void read_writer_info (ASDCP::WriterInfo const &);
        
        ASDCP::AESEncContext* _encryption_context;
index 38a1819e6589f7c55208ce0f2e9c189106a1dbb1..1ce2e7de08836d061a6f1af42bc70824be8f458d 100644 (file)
@@ -103,6 +103,9 @@ protected:
 
 private:
        std::string key_type () const;
+       std::string asdcp_kind () const {
+               return "Picture";
+       }
 };
        
 
index 87bacc5302b07cfa95a6f15662638b4838524e7a..3b75b06ccae717939c46fea3bf52a6b2417682fa 100644 (file)
@@ -78,6 +78,7 @@ command (string cmd)
 
        delete[] buffer;
 #else
+       cmd += " 2> /dev/null";
        int const r = system (cmd.c_str ());
        int const code = WEXITSTATUS (r);
 #endif
index 8d1f8db38ff7dbff6dca30c91ce15e25718024a7..50d109570e0c02b5f1af4995f89b6d6a61c06d7e 100644 (file)
@@ -65,6 +65,9 @@ public:
 
 private:
        std::string key_type () const;
+       std::string asdcp_kind () const {
+               return "Sound";
+       }
 
        int _channels;      ///< number of channels
        int _sampling_rate; ///< sampling rate in Hz
index e32118c45d232acdc29e92566a8bd7622ec26d44..f338517e407e35a4136eb1864d7db84b7f5bbd30 100644 (file)
@@ -34,6 +34,7 @@ using std::list;
 using std::ostream;
 using std::ofstream;
 using std::stringstream;
+using std::cout;
 using boost::shared_ptr;
 using boost::lexical_cast;
 using boost::optional;
@@ -59,7 +60,7 @@ SubtitleContent::SubtitleContent (boost::filesystem::path file)
        /* Now make Subtitle objects to represent the raw XML nodes
           in a sane way.
        */
-
+       
        ParseState parse_state;
        examine_font_nodes (xml, font_nodes, parse_state);
 }
@@ -230,7 +231,7 @@ SubtitleContent::xml_as_string () const
        if (!_load_font_nodes.empty ()) {
                xmlpp::Element* load_font = root->add_child("LoadFont");
                load_font->set_attribute("Id", _load_font_nodes.front()->id);
-               load_font->set_attribute("URI",  _load_font_nodes.front()->uri);
+               load_font->set_attribute("URI", _load_font_nodes.front()->uri);
        }
 
        list<shared_ptr<SubtitleString> > sorted = _subtitles;
index c4d0012bc9f7cbe76c08091bdb1c1f4ac7090c88..410c5934a23cb1a4b96f07a2a95f2583a9d586bb 100644 (file)
@@ -67,9 +67,13 @@ public:
        Glib::ustring xml_as_string () const;
 
 protected:
-       std::string pkl_type () const {
+       std::string pkl_type (Standard) const {
                return "text/xml";
        }
+
+       std::string asdcp_kind () const {
+               return "Subtitle";
+       }
        
 private:
        std::string font_id_to_name (std::string id) const;
index 07defce0f38110fe0ccd8c5068f27b8a92cc1ed0..1736cb602a60b2d0ebfaadbc21e31de3a41b62f2 100644 (file)
@@ -52,16 +52,16 @@ BOOST_AUTO_TEST_CASE (dcp_test)
        mxf_meta.product_version = "0.0.25";
 
        /* We're making build/test/foo */
-       boost::filesystem::remove_all ("build/test/foo");
-       boost::filesystem::create_directories ("build/test/foo");
-       dcp::DCP d ("build/test/foo");
+       boost::filesystem::remove_all ("build/test/DCP/foo");
+       boost::filesystem::create_directories ("build/test/DCP/foo");
+       dcp::DCP d ("build/test/DCP/foo");
        shared_ptr<dcp::CPL> cpl (new dcp::CPL ("A Test DCP", dcp::FEATURE));
        cpl->set_content_version_id ("urn:uri:81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
        cpl->set_content_version_label_text ("81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00");
 
        shared_ptr<dcp::MonoPictureMXF> mp (new dcp::MonoPictureMXF (dcp::Fraction (24, 1)));
        mp->set_metadata (mxf_meta);
-       shared_ptr<dcp::PictureMXFWriter> picture_writer = mp->start_write ("build/test/foo/video.mxf", dcp::SMPTE, false);
+       shared_ptr<dcp::PictureMXFWriter> picture_writer = mp->start_write ("build/test/DCP/foo/video.mxf", dcp::SMPTE, false);
        dcp::File j2c ("test/data/32x32_red_square.j2c");
        for (int i = 0; i < 24; ++i) {
                picture_writer->write (j2c.data (), j2c.size ());
@@ -70,7 +70,7 @@ BOOST_AUTO_TEST_CASE (dcp_test)
 
        shared_ptr<dcp::SoundMXF> ms (new dcp::SoundMXF (dcp::Fraction (24, 1), 48000, 1));
        ms->set_metadata (mxf_meta);
-       shared_ptr<dcp::SoundMXFWriter> sound_writer = ms->start_write ("build/test/foo/audio.mxf", dcp::SMPTE);
+       shared_ptr<dcp::SoundMXFWriter> sound_writer = ms->start_write ("build/test/DCP/foo/audio.mxf", dcp::SMPTE);
 
        SF_INFO info;
        info.format = 0;
@@ -103,5 +103,5 @@ BOOST_AUTO_TEST_CASE (dcp_test)
 
        d.write_xml (dcp::SMPTE, xml_meta);
 
-       /* build/test/foo is checked against test/ref/DCP/foo by run-tests.sh */
+       /* build/test/DCP/foo is checked against test/ref/DCP/foo by run-tests.sh */
 }
index 030f0b58576b110dd0b7dd0094f2ae0cc9337ad3..8dfeffa658d36a3e498345cb01c3cb65454e1bb2 100644 (file)
@@ -46,13 +46,13 @@ get_frame (dcp::DCP const & dcp)
 /** Decrypt an encrypted test DCP and check that its first frame is the same as the unencrypted version */
 BOOST_AUTO_TEST_CASE (decryption_test)
 {
-       boost::filesystem::path plaintext_path = test_corpus;
+       boost::filesystem::path plaintext_path = private_test;
        plaintext_path /= "TONEPLATES-SMPTE-PLAINTEXT_TST_F_XX-XX_ITL-TD_51-XX_2K_WOE_20111001_WOE_OV";
        dcp::DCP plaintext (plaintext_path.string ());
        plaintext.read ();
        BOOST_CHECK_EQUAL (plaintext.encrypted (), false);
 
-       boost::filesystem::path encrypted_path = test_corpus;
+       boost::filesystem::path encrypted_path = private_test;
        encrypted_path /= "TONEPLATES-SMPTE-ENCRYPTED_TST_F_XX-XX_ITL-TD_51-XX_2K_WOE_20111001_WOE_OV";
        dcp::DCP encrypted (encrypted_path.string ());
        encrypted.read ();
index a0633b072b2a0bff2784b1219b6a5ff5135bfdc5..b4a895443b49d138bfaa101e39a913aa5e9aeca7 100644 (file)
@@ -64,15 +64,16 @@ BOOST_AUTO_TEST_CASE (encryption_test)
        boost::filesystem::create_directories ("build/test/DCP/bar");
        dcp::DCP d ("build/test/DCP/bar");
 
+       /* Use test/ref/crypt so this test is repeatable */
        dcp::CertificateChain chain;
-       chain.add (shared_ptr<dcp::Certificate> (new dcp::Certificate (boost::filesystem::path ("build/test/signer/ca.self-signed.pem"))));
-       chain.add (shared_ptr<dcp::Certificate> (new dcp::Certificate (boost::filesystem::path ("build/test/signer/intermediate.signed.pem"))));
-       chain.add (shared_ptr<dcp::Certificate> (new dcp::Certificate (boost::filesystem::path ("build/test/signer/leaf.signed.pem"))));
+       chain.add (shared_ptr<dcp::Certificate> (new dcp::Certificate (boost::filesystem::path ("test/ref/crypt/ca.self-signed.pem"))));
+       chain.add (shared_ptr<dcp::Certificate> (new dcp::Certificate (boost::filesystem::path ("test/ref/crypt/intermediate.signed.pem"))));
+       chain.add (shared_ptr<dcp::Certificate> (new dcp::Certificate (boost::filesystem::path ("test/ref/crypt/leaf.signed.pem"))));
 
        shared_ptr<dcp::Signer> signer (
                new dcp::Signer (
                        chain,
-                       "build/test/signer/leaf.key"
+                       "test/ref/crypt/leaf.key"
                        )
                );
 
@@ -110,12 +111,21 @@ BOOST_AUTO_TEST_CASE (encryption_test)
                );
 
        kdm.as_xml ("build/test/bar.kdm.xml");
-       system ("xmllint --path schema --nonet --noout --schema schema/SMPTE-430-1-2006-Amd-1-2009-KDM.xsd build/test/bar.kdm.xml");
-       system ("xmlsec1 verify "
-               "--pubkey-cert-pem build/test/signer/leaf.signed.pem "
-               "--trusted-pem build/test/signer/intermediate.signed.pem "
-               "--trusted-pem build/test/signer/ca.self-signed.pem "
+       
+       int r = system (
+               "xmllint --path schema --nonet --noout --schema schema/SMPTE-430-1-2006-Amd-1-2009-KDM.xsd build/test/bar.kdm.xml "
+               "> build/test/xmllint.log 2>&1 < /dev/null"
+               );
+       
+       BOOST_CHECK_EQUAL (WEXITSTATUS (r), 0);
+               
+       r = system ("xmlsec1 verify "
+               "--pubkey-cert-pem test/ref/crypt/leaf.signed.pem "
+               "--trusted-pem test/ref/crypt/intermediate.signed.pem "
+               "--trusted-pem test/ref/crypt/ca.self-signed.pem "
                "--id-attr:Id http://www.smpte-ra.org/schemas/430-3/2006/ETM:AuthenticatedPublic "
                "--id-attr:Id http://www.smpte-ra.org/schemas/430-3/2006/ETM:AuthenticatedPrivate "
-               "build/test/bar.kdm.xml");
+                   "build/test/bar.kdm.xml > build/test/xmlsec1.log 2>&1 < /dev/null");
+       
+       BOOST_CHECK_EQUAL (WEXITSTATUS (r), 0);
 }
diff --git a/test/private b/test/private
new file mode 160000 (submodule)
index 0000000..b1b5665
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit b1b56652bd67e74817e02933412190b33d4823b6
diff --git a/test/ref/DCP/bar/402c5a88-2512-4465-9c0b-cfa687dbc5d0_pkl.xml b/test/ref/DCP/bar/402c5a88-2512-4465-9c0b-cfa687dbc5d0_pkl.xml
deleted file mode 100644 (file)
index a87f9e2..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<PackingList xmlns="http://www.smpte-ra.org/schemas/429-8/2007/PKL">
-  <Id>urn:uuid:402c5a88-2512-4465-9c0b-cfa687dbc5d0</Id>
-  <AnnotationText>A Test DCP</AnnotationText>
-  <IssueDate>2012-07-17T04:45:18+00:00</IssueDate>
-  <Issuer>OpenDCP 0.0.25</Issuer>
-  <Creator>OpenDCP 0.0.25</Creator>
-  <AssetList>
-    <Asset>
-      <Id>urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95</Id>
-      <AnnotationText>video.mxf</AnnotationText>
-      <Hash>fTMi9Xvr8NzuRhm7LmSTk6k1HYo=</Hash>
-      <Size>28840</Size>
-      <Type>application/mxf</Type>
-    </Asset>
-    <Asset>
-      <Id>urn:uuid:aa3fb133-0d18-4083-a039-e441b0788e79</Id>
-      <AnnotationText>audio.mxf</AnnotationText>
-      <Hash>2MlsntiFrekkQvwbRPLC2XEMU78=</Hash>
-      <Size>308398</Size>
-      <Type>application/mxf</Type>
-    </Asset>
-    <Asset>
-      <Id>urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430</Id>
-      <Hash>l/g+bdCKF6ofhedin5qrLcObS1E=</Hash>
-      <Size>1526</Size>
-      <Type>text/xml</Type>
-    </Asset>
-  </AssetList>
-</PackingList>
diff --git a/test/ref/DCP/bar/63c3aece-c581-4603-b612-75e43f0c0430_cpl.xml b/test/ref/DCP/bar/63c3aece-c581-4603-b612-75e43f0c0430_cpl.xml
deleted file mode 100644 (file)
index 43edb1b..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<CompositionPlaylist xmlns="http://www.smpte-ra.org/schemas/429-7/2006/CPL">
-  <Id>urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430</Id>
-  <AnnotationText>A Test DCP</AnnotationText>
-  <IssueDate>2012-07-17T04:45:18+00:00</IssueDate>
-  <Creator>OpenDCP 0.0.25</Creator>
-  <ContentTitleText>A Test DCP</ContentTitleText>
-  <ContentKind>feature</ContentKind>
-  <ContentVersion>
-    <Id>urn:uri:63c3aece-c581-4603-b612-75e43f0c0430_2012-07-17T04:45:18+00:00</Id>
-    <LabelText>63c3aece-c581-4603-b612-75e43f0c0430_2012-07-17T04:45:18+00:00</LabelText>
-  </ContentVersion>
-  <RatingList/>
-  <ReelList>
-    <Reel>
-      <Id>urn:uuid:7d861d35-c775-48e6-a4f8-fbfdbfc1556a</Id>
-      <AssetList>
-        <MainPicture>
-          <Id>urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95</Id>
-          <AnnotationText>video.mxf</AnnotationText>
-          <EditRate>24 1</EditRate>
-          <IntrinsicDuration>24</IntrinsicDuration>
-          <EntryPoint>0</EntryPoint>
-          <Duration>24</Duration>
-          <FrameRate>24 1</FrameRate>
-          <ScreenAspectRatio>32 32</ScreenAspectRatio>
-        </MainPicture>
-        <MainSound>
-          <Id>urn:uuid:aa3fb133-0d18-4083-a039-e441b0788e79</Id>
-          <AnnotationText>audio.mxf</AnnotationText>
-          <EditRate>24 1</EditRate>
-          <IntrinsicDuration>24</IntrinsicDuration>
-          <EntryPoint>0</EntryPoint>
-          <Duration>24</Duration>
-        </MainSound>
-      </AssetList>
-    </Reel>
-  </ReelList>
-</CompositionPlaylist>
diff --git a/test/ref/DCP/bar/7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_cpl.xml b/test/ref/DCP/bar/7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_cpl.xml
new file mode 100644 (file)
index 0000000..2e3c5b2
--- /dev/null
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CompositionPlaylist xmlns="http://www.smpte-ra.org/schemas/429-7/2006/CPL" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><Id>urn:uuid:7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c</Id><AnnotationText>A Test DCP</AnnotationText><IssueDate>2012-07-17T04:45:18+00:00</IssueDate><Issuer>OpenDCP 0.0.25</Issuer><Creator>OpenDCP 0.0.25</Creator><ContentTitleText>A Test DCP</ContentTitleText><ContentKind>feature</ContentKind><ContentVersion><Id>urn:uri:7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_2012-07-17T04:45:18+00:00</Id><LabelText>7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_2012-07-17T04:45:18+00:00</LabelText></ContentVersion><RatingList/><ReelList><Reel><Id>urn:uuid:947716dd-c237-4f31-a6d8-f74990b79c73</Id><AssetList><MainPicture><Id>urn:uuid:93182bd2-b1e8-41a3-b5c8-6e6564273bff</Id><AnnotationText>video.mxf</AnnotationText><EditRate>24 1</EditRate><IntrinsicDuration>24</IntrinsicDuration><EntryPoint>0</EntryPoint><Duration>24</Duration><KeyId>urn:uuid:6af1e0c1-c441-47f8-a502-3efd46b1fa4f</KeyId><FrameRate>24 1</FrameRate><ScreenAspectRatio>32 32</ScreenAspectRatio></MainPicture><MainSound><Id>urn:uuid:822bd341-c751-45b1-94d2-410e4ffcff1b</Id><AnnotationText>audio.mxf</AnnotationText><EditRate>24 1</EditRate><IntrinsicDuration>24</IntrinsicDuration><EntryPoint>0</EntryPoint><Duration>0</Duration><KeyId>urn:uuid:f28b567b-3b9a-417a-aee4-6fc1a2c6a3af</KeyId></MainSound></AssetList></Reel></ReelList><Signer><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=bmtwThq3srgxIAeRMjX6BFhgLDw=,CN=.smpte-430-2.INTERMEDIATE.NOT_FOR_PRODUCTION,OU=example.org,O=example.org</dsig:X509IssuerName><dsig:X509SerialNumber>7</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509SubjectName>dnQualifier=d95fGDzERNdxfYPgphvAR8A18L4=,CN=CS.smpte-430-2.LEAF.NOT_FOR_PRODUCTION,OU=example.org,O=example.org</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/2001/04/xmldsig-more#rsa-sha256"/><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>nxx0sUeTkcxIK9y7+JATMU5MzGg=</dsig:DigestValue></dsig:Reference></dsig:SignedInfo><dsig:SignatureValue>NTsZK+pcfddOjpQC9rkBn0eRDG1D5tVkqvwYd9d577AMj17GxXizxsBa+DadQ3mB
+GiWeoiJ8/VVW9PQ8N28uOLRkv0er8Jzl6UXdASrki/FbMLLRIGT1IMmxurahUBQN
+hXrk7yphM/cGpIIRwQnAyAuG0xO7L3uDUuMhRftDplwGPU52Qa3opEEX1FtxC9TT
+7NrOGIs+Ks3WtUFOe5ZbfLt1McmnYzg6FJdnAEOfv3/AWQCBd1vakONNgoWKmCiK
+/kmeDIMBK4slHfGrauBcn7KVPpLS8lSFgXI1erifibRe4iyANql10qJ+NiYVgdxm
+udPzL8evhgSC8StQOpAy1g==</dsig:SignatureValue><dsig:KeyInfo><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=bmtwThq3srgxIAeRMjX6BFhgLDw=,CN=.smpte-430-2.INTERMEDIATE.NOT_FOR_PRODUCTION,OU=example.org,O=example.org</dsig:X509IssuerName><dsig:X509SerialNumber>7</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEezCCA2OgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBijEUMBIGA1UEChMLZXhh
+bXBsZS5vcmcxFDASBgNVBAsTC2V4YW1wbGUub3JnMTUwMwYDVQQDFCwuc21wdGUt
+NDMwLTIuSU5URVJNRURJQVRFLk5PVF9GT1JfUFJPRFVDVElPTjElMCMGA1UELhMc
+Ym10d1RocTNzcmd4SUFlUk1qWDZCRmhnTER3PTAeFw0xMzA3MDgwOTM5MDBaFw0y
+MzA3MDQwOTM5MDBaMIGEMRQwEgYDVQQKEwtleGFtcGxlLm9yZzEUMBIGA1UECxML
+ZXhhbXBsZS5vcmcxLzAtBgNVBAMUJkNTLnNtcHRlLTQzMC0yLkxFQUYuTk9UX0ZP
+Ul9QUk9EVUNUSU9OMSUwIwYDVQQuExxkOTVmR0R6RVJOZHhmWVBncGh2QVI4QTE4
+TDQ9MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4Ai70YT7amWSvXWO
+2LL9HrkNEQkR0HNO4kZS+2v3CnbrlSnSkLgA4rgsmSPNhHHgskr3ljzxH/MugKv3
+tLlSHywcqPxj06SUCvd7aWfUKIGR33XxZwFB9Hc6hCKMcOYxFJISfFxcknSgcmQj
+RPnLTbaCc/i/sOHQiLnZXmTVIe43VrE+zzYJO7BBnU7Xnj1MGTzz7ccooL3dp8iS
+t4E7E3mGGVMyTndIEE3fx8y1tPFigNKdPKBo1fXD7pFkL7idH+DO5Phwf/OSjS4Z
+egBCrb96fRpWvzhh6z7USOe8iKY5xDir5c4UKY15JsVw2ESxkPF9wFpFHCyXt2YS
+kDYbHQIDAQABo4HvMIHsMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgWgMB0GA1Ud
+DgQWBBR33l8YPMRE13F9g+CmG8BHwDXwvjCBrwYDVR0jBIGnMIGkgBRua3BOGrey
+uDEgB5EyNfoEWGAsPKGBiKSBhTCBgjEUMBIGA1UEChMLZXhhbXBsZS5vcmcxFDAS
+BgNVBAsTC2V4YW1wbGUub3JnMS0wKwYDVQQDFCQuc21wdGUtNDMwLTIuUk9PVC5O
+T1RfRk9SX1BST0RVQ1RJT04xJTAjBgNVBC4THG5kTkQ5QS9jT0RvMnJUZHJiTFZt
+ZlFub2FTYz2CAQYwDQYJKoZIhvcNAQELBQADggEBAKTd8vC9j06NL727VdnYZEwa
+D4MUTnv1UW5d/FdQR87WpGV+17CKblWGJtLTfFmV9LwcGlys6ZzrLRYpBf+81vYq
+VUhl7rrU7askIiacSlfYx4riv9KH5JLmyLdo7sjX4dhfj5IH/ilan7le1shjEl0P
+UrEgYX1dt5OOnMpzaIRHU+GWVlkY3M5VDdDfMPstuPJ+MeAP1fH0Ylajhc4O5nmu
+hWfXc9qa5bxOLzNDBOsXS8hbnTpUS1qpqzea5NSogdxGIiyk/OluU1ZJJPQhf0iK
+K6U6e4+TpHKVvqUwQcPUw9TcBGIDkwJTtLF48ZhFI9Gv016SmSwUobgcDA9e97o=</dsig:X509Certificate></dsig:X509Data><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=ndND9A/cODo2rTdrbLVmfQnoaSc=,CN=.smpte-430-2.ROOT.NOT_FOR_PRODUCTION,OU=example.org,O=example.org</dsig:X509IssuerName><dsig:X509SerialNumber>6</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEfzCCA2egAwIBAgIBBjANBgkqhkiG9w0BAQsFADCBgjEUMBIGA1UEChMLZXhh
+bXBsZS5vcmcxFDASBgNVBAsTC2V4YW1wbGUub3JnMS0wKwYDVQQDFCQuc21wdGUt
+NDMwLTIuUk9PVC5OT1RfRk9SX1BST0RVQ1RJT04xJTAjBgNVBC4THG5kTkQ5QS9j
+T0RvMnJUZHJiTFZtZlFub2FTYz0wHhcNMTMwNzA4MDkzODU5WhcNMjMwNzA1MDkz
+ODU5WjCBijEUMBIGA1UEChMLZXhhbXBsZS5vcmcxFDASBgNVBAsTC2V4YW1wbGUu
+b3JnMTUwMwYDVQQDFCwuc21wdGUtNDMwLTIuSU5URVJNRURJQVRFLk5PVF9GT1Jf
+UFJPRFVDVElPTjElMCMGA1UELhMcYm10d1RocTNzcmd4SUFlUk1qWDZCRmhnTER3
+PTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMrCpaiKl7M/NYtKNQAo
+H+zUcnBTNQ6xhRIDxvPAgvcGH4tf0kpXmZ8ppTU/ZZKaFZB+/pIU+9JfiCuuquvw
+4EQnLABr61m6aJlE1v+0ygzZsCyHyiRnp6OyOTrJnyL6ygniX/ggp+7zkuh4upAl
+QUaCDqNbUfs6Wh9BvmaBllvI3PxfaqDlQVgY53Ar991BA0kcFOdd/4ZLqZwhEiiE
+Y1s3ChYLTxlqPM/UxOeRLUphmGmTSKBKc9ppTN+2/04sQJ1Ux+RZ5PmJ4+eAEcW8
+CjKM5EqZAO3EA3u88Do3uZjLXMxSGeJzs3KQX/lVZklFsO5d1eAQm9ZizfCbPPoK
+f2kCAwEAAaOB9TCB8jASBgNVHRMBAf8ECDAGAQH/AgECMAsGA1UdDwQEAwIBBjAd
+BgNVHQ4EFgQUbmtwThq3srgxIAeRMjX6BFhgLDwwga8GA1UdIwSBpzCBpIAUA7Qg
+bb/sj/jyHsjw8TKBB7AIliihgYikgYUwgYIxFDASBgNVBAoTC2V4YW1wbGUub3Jn
+MRQwEgYDVQQLEwtleGFtcGxlLm9yZzEtMCsGA1UEAxQkLnNtcHRlLTQzMC0yLlJP
+T1QuTk9UX0ZPUl9QUk9EVUNUSU9OMSUwIwYDVQQuExxuZE5EOUEvY09EbzJyVGRy
+YkxWbWZRbm9hU2M9ggEFMA0GCSqGSIb3DQEBCwUAA4IBAQBnlzVaMqhuenDQV7Zg
+aMa6IisupI3k9J6Z24fiEOGhCfAp0fiulx2oCSrXlYnJFGe6ndeWWer9UN1h+lAc
+ozKYwxsJx8jSkgwGYX5v8Cn2Sp2/gV5umCcmpZfIExEOZRmjgKzqyr658EyvmrYJ
+nqrig/N8wUWeS5EzMSiE1sVfyIZmUpKhuqmGQUXnftVMCKSrqAh+Au7ndlR77/dm
+ZBJzzX79nn4L9XqghdoFCPRt4rx1CMU26MmiuEzNcYJ3uSJc1SSz5tT69JQvp8Fj
+InhKTMv0wWysEsfE6+aARPtrqAUJBRAG83oP6L0gdJYWJagGFVoZLfjPf+v9JgYZ
+Wo+D</dsig:X509Certificate></dsig:X509Data><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=ndND9A/cODo2rTdrbLVmfQnoaSc=,CN=.smpte-430-2.ROOT.NOT_FOR_PRODUCTION,OU=example.org,O=example.org</dsig:X509IssuerName><dsig:X509SerialNumber>5</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEdzCCA1+gAwIBAgIBBTANBgkqhkiG9w0BAQsFADCBgjEUMBIGA1UEChMLZXhh
+bXBsZS5vcmcxFDASBgNVBAsTC2V4YW1wbGUub3JnMS0wKwYDVQQDFCQuc21wdGUt
+NDMwLTIuUk9PVC5OT1RfRk9SX1BST0RVQ1RJT04xJTAjBgNVBC4THG5kTkQ5QS9j
+T0RvMnJUZHJiTFZtZlFub2FTYz0wHhcNMTMwNzA4MDkzODU4WhcNMjMwNzA2MDkz
+ODU4WjCBgjEUMBIGA1UEChMLZXhhbXBsZS5vcmcxFDASBgNVBAsTC2V4YW1wbGUu
+b3JnMS0wKwYDVQQDFCQuc21wdGUtNDMwLTIuUk9PVC5OT1RfRk9SX1BST0RVQ1RJ
+T04xJTAjBgNVBC4THG5kTkQ5QS9jT0RvMnJUZHJiTFZtZlFub2FTYz0wggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTZ9Xu3AxKzsCf8haW7QtEZEauMUfo
+SkbzUmNZUYOwzuOvfhqSzO1BpRVI8/k3ZzkXR7XsWp8SbPsE17s5WPLwo4uDSro9
+XtRDOFFaZ023Ed9o2Zvoc6bwz8CpnKpiBB1XHMw9Bmi3q886f7Kk0SCsbX9OJeUC
+5/FUfwDSZUs8qjRkXYd2zjxgFGvYbokKSW1ZwkoLIRoJJhScjSnwTd/aAlcenfcw
+DV6ccjOJph4Dsru1NpCm50vi5/PRr00vBXMxdC2YgNyWONM5k8InBiU0uCmWmU5Y
+SRSc9A3cVtrKzP1WHE2978TNFqKpjEa8tgOYualSfI2pMtA23EVG14RJAgMBAAGj
+gfUwgfIwEgYDVR0TAQH/BAgwBgEB/wIBAzALBgNVHQ8EBAMCAQYwHQYDVR0OBBYE
+FAO0IG2/7I/48h7I8PEygQewCJYoMIGvBgNVHSMEgacwgaSAFAO0IG2/7I/48h7I
+8PEygQewCJYooYGIpIGFMIGCMRQwEgYDVQQKEwtleGFtcGxlLm9yZzEUMBIGA1UE
+CxMLZXhhbXBsZS5vcmcxLTArBgNVBAMUJC5zbXB0ZS00MzAtMi5ST09ULk5PVF9G
+T1JfUFJPRFVDVElPTjElMCMGA1UELhMcbmRORDlBL2NPRG8yclRkcmJMVm1mUW5v
+YVNjPYIBBTANBgkqhkiG9w0BAQsFAAOCAQEAp2V3npo0m7Vmdhpr6mk5UybM16Hx
+M99zoKGUpm6k9PYRk8ysEhD7M8hDuwiiFoRJj1+X8V4HLwNU3JTTQzSl88pMvLg8
+Tyl4ICELg9MN/Eyfnu6iyGDfPzcsuv8xZN53211LobqW+HGK8r+slf5GPDILka8r
+GB7sFRjvq3SEGpqupKI9sJFmvHyQplJ1ixrIkSnTEuBFBrDtQj+cjrqlvRw/dReo
+3uELGe5GyvBcP0hDgrvZQmTdCLQfo4998MMhLDyxvD9/D4jpRcCrLzs2uB3Tw3kT
+1KkAjDA/33J1XCZEkb1ArS2L/I12T0DoSQqb17NE3xccY+6iRFXRMFWDIQ==</dsig:X509Certificate></dsig:X509Data></dsig:KeyInfo></dsig:Signature></CompositionPlaylist>
index 359f453fed467ec5e1b385e7980f020f11f77612..6b0ae98182c8455647b1eeba6334977f9ed998c7 100644 (file)
@@ -1,55 +1,2 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<AssetMap xmlns="http://www.smpte-ra.org/schemas/429-9/2007/AM">
-  <Id>urn:uuid:58f161a5-16d1-4896-93df-52a5a330082f</Id>
-  <Creator>OpenDCP 0.0.25</Creator>
-  <VolumeCount>1</VolumeCount>
-  <IssueDate>2012-07-17T04:45:18+00:00</IssueDate>
-  <Issuer>OpenDCP 0.0.25</Issuer>
-  <AssetList>
-    <Asset>
-      <Id>urn:uuid:402c5a88-2512-4465-9c0b-cfa687dbc5d0</Id>
-      <PackingList>true</PackingList>
-      <ChunkList>
-        <Chunk>
-          <Path>402c5a88-2512-4465-9c0b-cfa687dbc5d0_pkl.xml</Path>
-          <VolumeIndex>1</VolumeIndex>
-          <Offset>0</Offset>
-          <Length>1049</Length>
-        </Chunk>
-      </ChunkList>
-    </Asset>
-    <Asset>
-      <Id>urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430</Id>
-      <ChunkList>
-        <Chunk>
-          <Path>63c3aece-c581-4603-b612-75e43f0c0430_cpl.xml</Path>
-          <VolumeIndex>1</VolumeIndex>
-          <Offset>0</Offset>
-          <Length>1526</Length>
-        </Chunk>
-      </ChunkList>
-    </Asset>
-    <Asset>
-      <Id>urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95</Id>
-      <ChunkList>
-        <Chunk>
-          <Path>video.mxf</Path>
-          <VolumeIndex>1</VolumeIndex>
-          <Offset>0</Offset>
-          <Length>28840</Length>
-        </Chunk>
-      </ChunkList>
-    </Asset>
-    <Asset>
-      <Id>urn:uuid:aa3fb133-0d18-4083-a039-e441b0788e79</Id>
-      <ChunkList>
-        <Chunk>
-          <Path>audio.mxf</Path>
-          <VolumeIndex>1</VolumeIndex>
-          <Offset>0</Offset>
-          <Length>308398</Length>
-        </Chunk>
-      </ChunkList>
-    </Asset>
-  </AssetList>
-</AssetMap>
+<AssetMap xmlns="http://www.smpte-ra.org/schemas/429-9/2007/AM"><Id>urn:uuid:aa157ca6-e3e3-4b6c-a7b6-50f52fcafb7f</Id><AnnotationText>Created by OpenDCP 0.0.25</AnnotationText><Creator>OpenDCP 0.0.25</Creator><VolumeCount>1</VolumeCount><IssueDate>2012-07-17T04:45:18+00:00</IssueDate><Issuer>OpenDCP 0.0.25</Issuer><AssetList><Asset><Id>urn:uuid:a12d2c1f-0daa-4a30-a4cd-c4266ac172a7</Id><PackingList>true</PackingList><ChunkList><Chunk><Path>a12d2c1f-0daa-4a30-a4cd-c4266ac172a7_pkl.xml</Path><VolumeIndex>1</VolumeIndex><Offset>0</Offset><Length>8019</Length></Chunk></ChunkList></Asset><Asset><Id>urn:uuid:7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c</Id><ChunkList><Chunk><Path>7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_cpl.xml</Path><VolumeIndex>1</VolumeIndex><Offset>0</Offset><Length>8531</Length></Chunk></ChunkList></Asset><Asset><Id>urn:uuid:822bd341-c751-45b1-94d2-410e4ffcff1b</Id><ChunkList><Chunk><Path>audio.mxf</Path><VolumeIndex>1</VolumeIndex><Offset>0</Offset><Length>308398</Length></Chunk></ChunkList></Asset><Asset><Id>urn:uuid:93182bd2-b1e8-41a3-b5c8-6e6564273bff</Id><ChunkList><Chunk><Path>video.mxf</Path><VolumeIndex>1</VolumeIndex><Offset>0</Offset><Length>28840</Length></Chunk></ChunkList></Asset></AssetList></AssetMap>
index f66c004afae2ea4df20a6359a11295860d5ede58..021685e91f7c2738df1f77105545cc36f758b381 100644 (file)
@@ -1,4 +1,2 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<VolumeIndex xmlns="http://www.smpte-ra.org/schemas/429-9/2007/AM">
-  <Index>1</Index>
-</VolumeIndex>
+<VolumeIndex xmlns="http://www.smpte-ra.org/schemas/429-9/2007/AM"><Index>1</Index></VolumeIndex>
diff --git a/test/ref/DCP/bar/a12d2c1f-0daa-4a30-a4cd-c4266ac172a7_pkl.xml b/test/ref/DCP/bar/a12d2c1f-0daa-4a30-a4cd-c4266ac172a7_pkl.xml
new file mode 100644 (file)
index 0000000..60bc204
--- /dev/null
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<PackingList xmlns="http://www.smpte-ra.org/schemas/429-8/2007/PKL" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><Id>urn:uuid:a12d2c1f-0daa-4a30-a4cd-c4266ac172a7</Id><AnnotationText>A Test DCP</AnnotationText><IssueDate>2012-07-17T04:45:18+00:00</IssueDate><Issuer>OpenDCP 0.0.25</Issuer><Creator>OpenDCP 0.0.25</Creator><AssetList><Asset><Id>urn:uuid:822bd341-c751-45b1-94d2-410e4ffcff1b</Id><AnnotationText>audio.mxf</AnnotationText><Hash>00dwsDwm9AGtL2ylcUZzm/UH/P8=</Hash><Size>308398</Size><Type>application/mxf</Type></Asset><Asset><Id>urn:uuid:93182bd2-b1e8-41a3-b5c8-6e6564273bff</Id><AnnotationText>video.mxf</AnnotationText><Hash>twmVEuhyyqVkEQo6tQbCN/V4MuY=</Hash><Size>28840</Size><Type>application/mxf</Type></Asset><Asset><Id>urn:uuid:7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c</Id><Hash>mTFgIKBQeWMqD6y+8CanXIJj7pQ=</Hash><Size>8531</Size><Type>text/xml</Type></Asset></AssetList><Signer><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=bmtwThq3srgxIAeRMjX6BFhgLDw=,CN=.smpte-430-2.INTERMEDIATE.NOT_FOR_PRODUCTION,OU=example.org,O=example.org</dsig:X509IssuerName><dsig:X509SerialNumber>7</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509SubjectName>dnQualifier=d95fGDzERNdxfYPgphvAR8A18L4=,CN=CS.smpte-430-2.LEAF.NOT_FOR_PRODUCTION,OU=example.org,O=example.org</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/2001/04/xmldsig-more#rsa-sha256"/><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>/xGgOim2E6rPVUvuWH97evvZ3E0=</dsig:DigestValue></dsig:Reference></dsig:SignedInfo><dsig:SignatureValue>X18JIXvv5fWjLTJPJYPg/KliGBtM1mZvEjaS0m+SUaM26WpTMT52nowtT/6PcGDX
+Qd0Klm6j2YZpXnXbVapyhY9hXpm8h2dTDRR8S3r2fC6lVc6LAEPz6WRhW7F0ltZ7
+LFYnOraZOm0hegih1lM2bPin9rbsrtSguSEAYMP7z0SNAHViJ/eiY4b/va8n1eVe
+bKqmdjN7CrD5OnxobDRSgBLeO9BqtrudPJlk4rCJmXIOxPrzywdRGd18VpoIqdNZ
+hOmkgKZZrCk/QDZGKZLd1pnZ6AxxUl3Qwap+rxuTINNW8rDmKVEO8tLe/swHN/TA
+zxrk+JtqOI/nDK5QRci2nQ==</dsig:SignatureValue><dsig:KeyInfo><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=bmtwThq3srgxIAeRMjX6BFhgLDw=,CN=.smpte-430-2.INTERMEDIATE.NOT_FOR_PRODUCTION,OU=example.org,O=example.org</dsig:X509IssuerName><dsig:X509SerialNumber>7</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEezCCA2OgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBijEUMBIGA1UEChMLZXhh
+bXBsZS5vcmcxFDASBgNVBAsTC2V4YW1wbGUub3JnMTUwMwYDVQQDFCwuc21wdGUt
+NDMwLTIuSU5URVJNRURJQVRFLk5PVF9GT1JfUFJPRFVDVElPTjElMCMGA1UELhMc
+Ym10d1RocTNzcmd4SUFlUk1qWDZCRmhnTER3PTAeFw0xMzA3MDgwOTM5MDBaFw0y
+MzA3MDQwOTM5MDBaMIGEMRQwEgYDVQQKEwtleGFtcGxlLm9yZzEUMBIGA1UECxML
+ZXhhbXBsZS5vcmcxLzAtBgNVBAMUJkNTLnNtcHRlLTQzMC0yLkxFQUYuTk9UX0ZP
+Ul9QUk9EVUNUSU9OMSUwIwYDVQQuExxkOTVmR0R6RVJOZHhmWVBncGh2QVI4QTE4
+TDQ9MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4Ai70YT7amWSvXWO
+2LL9HrkNEQkR0HNO4kZS+2v3CnbrlSnSkLgA4rgsmSPNhHHgskr3ljzxH/MugKv3
+tLlSHywcqPxj06SUCvd7aWfUKIGR33XxZwFB9Hc6hCKMcOYxFJISfFxcknSgcmQj
+RPnLTbaCc/i/sOHQiLnZXmTVIe43VrE+zzYJO7BBnU7Xnj1MGTzz7ccooL3dp8iS
+t4E7E3mGGVMyTndIEE3fx8y1tPFigNKdPKBo1fXD7pFkL7idH+DO5Phwf/OSjS4Z
+egBCrb96fRpWvzhh6z7USOe8iKY5xDir5c4UKY15JsVw2ESxkPF9wFpFHCyXt2YS
+kDYbHQIDAQABo4HvMIHsMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgWgMB0GA1Ud
+DgQWBBR33l8YPMRE13F9g+CmG8BHwDXwvjCBrwYDVR0jBIGnMIGkgBRua3BOGrey
+uDEgB5EyNfoEWGAsPKGBiKSBhTCBgjEUMBIGA1UEChMLZXhhbXBsZS5vcmcxFDAS
+BgNVBAsTC2V4YW1wbGUub3JnMS0wKwYDVQQDFCQuc21wdGUtNDMwLTIuUk9PVC5O
+T1RfRk9SX1BST0RVQ1RJT04xJTAjBgNVBC4THG5kTkQ5QS9jT0RvMnJUZHJiTFZt
+ZlFub2FTYz2CAQYwDQYJKoZIhvcNAQELBQADggEBAKTd8vC9j06NL727VdnYZEwa
+D4MUTnv1UW5d/FdQR87WpGV+17CKblWGJtLTfFmV9LwcGlys6ZzrLRYpBf+81vYq
+VUhl7rrU7askIiacSlfYx4riv9KH5JLmyLdo7sjX4dhfj5IH/ilan7le1shjEl0P
+UrEgYX1dt5OOnMpzaIRHU+GWVlkY3M5VDdDfMPstuPJ+MeAP1fH0Ylajhc4O5nmu
+hWfXc9qa5bxOLzNDBOsXS8hbnTpUS1qpqzea5NSogdxGIiyk/OluU1ZJJPQhf0iK
+K6U6e4+TpHKVvqUwQcPUw9TcBGIDkwJTtLF48ZhFI9Gv016SmSwUobgcDA9e97o=</dsig:X509Certificate></dsig:X509Data><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=ndND9A/cODo2rTdrbLVmfQnoaSc=,CN=.smpte-430-2.ROOT.NOT_FOR_PRODUCTION,OU=example.org,O=example.org</dsig:X509IssuerName><dsig:X509SerialNumber>6</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEfzCCA2egAwIBAgIBBjANBgkqhkiG9w0BAQsFADCBgjEUMBIGA1UEChMLZXhh
+bXBsZS5vcmcxFDASBgNVBAsTC2V4YW1wbGUub3JnMS0wKwYDVQQDFCQuc21wdGUt
+NDMwLTIuUk9PVC5OT1RfRk9SX1BST0RVQ1RJT04xJTAjBgNVBC4THG5kTkQ5QS9j
+T0RvMnJUZHJiTFZtZlFub2FTYz0wHhcNMTMwNzA4MDkzODU5WhcNMjMwNzA1MDkz
+ODU5WjCBijEUMBIGA1UEChMLZXhhbXBsZS5vcmcxFDASBgNVBAsTC2V4YW1wbGUu
+b3JnMTUwMwYDVQQDFCwuc21wdGUtNDMwLTIuSU5URVJNRURJQVRFLk5PVF9GT1Jf
+UFJPRFVDVElPTjElMCMGA1UELhMcYm10d1RocTNzcmd4SUFlUk1qWDZCRmhnTER3
+PTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMrCpaiKl7M/NYtKNQAo
+H+zUcnBTNQ6xhRIDxvPAgvcGH4tf0kpXmZ8ppTU/ZZKaFZB+/pIU+9JfiCuuquvw
+4EQnLABr61m6aJlE1v+0ygzZsCyHyiRnp6OyOTrJnyL6ygniX/ggp+7zkuh4upAl
+QUaCDqNbUfs6Wh9BvmaBllvI3PxfaqDlQVgY53Ar991BA0kcFOdd/4ZLqZwhEiiE
+Y1s3ChYLTxlqPM/UxOeRLUphmGmTSKBKc9ppTN+2/04sQJ1Ux+RZ5PmJ4+eAEcW8
+CjKM5EqZAO3EA3u88Do3uZjLXMxSGeJzs3KQX/lVZklFsO5d1eAQm9ZizfCbPPoK
+f2kCAwEAAaOB9TCB8jASBgNVHRMBAf8ECDAGAQH/AgECMAsGA1UdDwQEAwIBBjAd
+BgNVHQ4EFgQUbmtwThq3srgxIAeRMjX6BFhgLDwwga8GA1UdIwSBpzCBpIAUA7Qg
+bb/sj/jyHsjw8TKBB7AIliihgYikgYUwgYIxFDASBgNVBAoTC2V4YW1wbGUub3Jn
+MRQwEgYDVQQLEwtleGFtcGxlLm9yZzEtMCsGA1UEAxQkLnNtcHRlLTQzMC0yLlJP
+T1QuTk9UX0ZPUl9QUk9EVUNUSU9OMSUwIwYDVQQuExxuZE5EOUEvY09EbzJyVGRy
+YkxWbWZRbm9hU2M9ggEFMA0GCSqGSIb3DQEBCwUAA4IBAQBnlzVaMqhuenDQV7Zg
+aMa6IisupI3k9J6Z24fiEOGhCfAp0fiulx2oCSrXlYnJFGe6ndeWWer9UN1h+lAc
+ozKYwxsJx8jSkgwGYX5v8Cn2Sp2/gV5umCcmpZfIExEOZRmjgKzqyr658EyvmrYJ
+nqrig/N8wUWeS5EzMSiE1sVfyIZmUpKhuqmGQUXnftVMCKSrqAh+Au7ndlR77/dm
+ZBJzzX79nn4L9XqghdoFCPRt4rx1CMU26MmiuEzNcYJ3uSJc1SSz5tT69JQvp8Fj
+InhKTMv0wWysEsfE6+aARPtrqAUJBRAG83oP6L0gdJYWJagGFVoZLfjPf+v9JgYZ
+Wo+D</dsig:X509Certificate></dsig:X509Data><dsig:X509Data><dsig:X509IssuerSerial><dsig:X509IssuerName>dnQualifier=ndND9A/cODo2rTdrbLVmfQnoaSc=,CN=.smpte-430-2.ROOT.NOT_FOR_PRODUCTION,OU=example.org,O=example.org</dsig:X509IssuerName><dsig:X509SerialNumber>5</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509Certificate>MIIEdzCCA1+gAwIBAgIBBTANBgkqhkiG9w0BAQsFADCBgjEUMBIGA1UEChMLZXhh
+bXBsZS5vcmcxFDASBgNVBAsTC2V4YW1wbGUub3JnMS0wKwYDVQQDFCQuc21wdGUt
+NDMwLTIuUk9PVC5OT1RfRk9SX1BST0RVQ1RJT04xJTAjBgNVBC4THG5kTkQ5QS9j
+T0RvMnJUZHJiTFZtZlFub2FTYz0wHhcNMTMwNzA4MDkzODU4WhcNMjMwNzA2MDkz
+ODU4WjCBgjEUMBIGA1UEChMLZXhhbXBsZS5vcmcxFDASBgNVBAsTC2V4YW1wbGUu
+b3JnMS0wKwYDVQQDFCQuc21wdGUtNDMwLTIuUk9PVC5OT1RfRk9SX1BST0RVQ1RJ
+T04xJTAjBgNVBC4THG5kTkQ5QS9jT0RvMnJUZHJiTFZtZlFub2FTYz0wggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTZ9Xu3AxKzsCf8haW7QtEZEauMUfo
+SkbzUmNZUYOwzuOvfhqSzO1BpRVI8/k3ZzkXR7XsWp8SbPsE17s5WPLwo4uDSro9
+XtRDOFFaZ023Ed9o2Zvoc6bwz8CpnKpiBB1XHMw9Bmi3q886f7Kk0SCsbX9OJeUC
+5/FUfwDSZUs8qjRkXYd2zjxgFGvYbokKSW1ZwkoLIRoJJhScjSnwTd/aAlcenfcw
+DV6ccjOJph4Dsru1NpCm50vi5/PRr00vBXMxdC2YgNyWONM5k8InBiU0uCmWmU5Y
+SRSc9A3cVtrKzP1WHE2978TNFqKpjEa8tgOYualSfI2pMtA23EVG14RJAgMBAAGj
+gfUwgfIwEgYDVR0TAQH/BAgwBgEB/wIBAzALBgNVHQ8EBAMCAQYwHQYDVR0OBBYE
+FAO0IG2/7I/48h7I8PEygQewCJYoMIGvBgNVHSMEgacwgaSAFAO0IG2/7I/48h7I
+8PEygQewCJYooYGIpIGFMIGCMRQwEgYDVQQKEwtleGFtcGxlLm9yZzEUMBIGA1UE
+CxMLZXhhbXBsZS5vcmcxLTArBgNVBAMUJC5zbXB0ZS00MzAtMi5ST09ULk5PVF9G
+T1JfUFJPRFVDVElPTjElMCMGA1UELhMcbmRORDlBL2NPRG8yclRkcmJMVm1mUW5v
+YVNjPYIBBTANBgkqhkiG9w0BAQsFAAOCAQEAp2V3npo0m7Vmdhpr6mk5UybM16Hx
+M99zoKGUpm6k9PYRk8ysEhD7M8hDuwiiFoRJj1+X8V4HLwNU3JTTQzSl88pMvLg8
+Tyl4ICELg9MN/Eyfnu6iyGDfPzcsuv8xZN53211LobqW+HGK8r+slf5GPDILka8r
+GB7sFRjvq3SEGpqupKI9sJFmvHyQplJ1ixrIkSnTEuBFBrDtQj+cjrqlvRw/dReo
+3uELGe5GyvBcP0hDgrvZQmTdCLQfo4998MMhLDyxvD9/D4jpRcCrLzs2uB3Tw3kT
+1KkAjDA/33J1XCZEkb1ArS2L/I12T0DoSQqb17NE3xccY+6iRFXRMFWDIQ==</dsig:X509Certificate></dsig:X509Data></dsig:KeyInfo></dsig:Signature></PackingList>
index 1188e5fc1df216a57b165081969dd8057106ab48..9fbf73b8c35bf2f9f496ee569154f414d774212a 100644 (file)
Binary files a/test/ref/DCP/bar/audio.mxf and b/test/ref/DCP/bar/audio.mxf differ
index 20eb6f4a414c5a9773d5ef43d4cff12b4a1d668f..2aae069f56f7f7abf1c9a61a276b26fa9eb12a9c 100644 (file)
Binary files a/test/ref/DCP/bar/video.mxf and b/test/ref/DCP/bar/video.mxf differ
index fdb41a2c30d524391f279bf1abd945a9f1d670ae..3b177b2184588d497715f324a8f970aa2a557e06 100644 (file)
@@ -33,32 +33,39 @@ using namespace dcp;
 
 int
 main (int argc, char* argv[])
-try
 {
-       if (argc < 2) {
-               cerr << "Syntax: " << argv[0] << " <dcp>\n";
-               exit (EXIT_FAILURE);
-       }
-
-       DCP* dcp = new DCP (argv[1]);
-       dcp->read ();
-       
-       list<shared_ptr<CPL> > cpls = dcp->cpls ();
-       for (list<boost::shared_ptr<CPL> >::iterator i = cpls.begin(); i != cpls.end(); ++i) {
-
-               list<shared_ptr<Reel> > reels = (*i)->reels ();
-               for (list<shared_ptr<Reel> >::iterator j = reels.begin(); j != reels.end(); ++j) {
-
-                       if ((*j)->main_subtitle()) {
-                               (*j)->main_subtitle()->subtitle_content()->write_xml ();
+       try {
+               if (argc < 2) {
+                       cerr << "Syntax: " << argv[0] << " <dcp>\n";
+                       exit (EXIT_FAILURE);
+               }
+               
+               DCP* dcp = new DCP (argv[1]);
+               dcp->read ();
+               
+               list<shared_ptr<CPL> > cpls = dcp->cpls ();
+               for (list<boost::shared_ptr<CPL> >::iterator i = cpls.begin(); i != cpls.end(); ++i) {
+                       
+                       list<shared_ptr<Reel> > reels = (*i)->reels ();
+                       for (list<shared_ptr<Reel> >::iterator j = reels.begin(); j != reels.end(); ++j) {
+                               
+                               if ((*j)->main_subtitle()) {
+                                       (*j)->main_subtitle()->subtitle_content()->write_xml ();
+                               }
                        }
                }
        }
 
+       catch (FileError& e)
+       {
+               cerr << e.what() << " (" << e.filename() << ") when reading " << argv[1] << "\n";
+               exit (EXIT_FAILURE);
+       }
+       catch (DCPReadError& e)
+       {
+               cerr << e.what() << " when reading " << argv[1] << "\n";
+               exit (EXIT_FAILURE);
+       }
+       
        return 0;
 }
-catch (FileError& e)
-{
-       cerr << e.what() << " (" << e.filename() << ")\n";
-       exit (EXIT_FAILURE);
-}
index f30a9db8470a09301ef7cd4ff2d1158765239d86..0b56b9036ac0c8190e39ec66f9d3921fb9f1ed6e 100644 (file)
@@ -47,5 +47,5 @@ wav (dcp::Channel)
        return "test/data/1s_24-bit_48k_silence.wav";
 }
 
-string test_corpus = "../libdcp-test";
+string private_test = "test/private";
 
index bc6baccdd43d1be6eba6112979aefae5f53e4c4c..f139fa283313ff14935fe355c07d3301d03313ad 100644 (file)
@@ -17,4 +17,4 @@
 
 */
 
-extern std::string test_corpus;
+extern std::string private_test;
diff --git a/wscript b/wscript
index dc78f8cae1e7c20de71f4728e0e7ae2d383f63c0..a26e357d558e5a7d9df524928fe38cca22c2366d 100644 (file)
--- a/wscript
+++ b/wscript
@@ -119,7 +119,7 @@ def build(bld):
     bld(source='libdcp%s.pc.in' % bld.env.API_VERSION,
         version=VERSION,
         includedir='%s/include/libdcp%s' % (bld.env.PREFIX, bld.env.API_VERSION),
-        libs="-L${libdir} -ldcp%s -lasdcp-libdcp%s -lkumu-libdcp%s -lboost_system%s" % (API_VERSION, API_VERSION, API_VERSION, boost_lib_suffix),
+        libs="-L${libdir} -ldcp%s -lasdcp-libdcp%s -lkumu-libdcp%s -lcxml -lboost_system%s" % (API_VERSION, API_VERSION, API_VERSION, boost_lib_suffix),
         install_path='${LIBDIR}/pkgconfig')
 
     bld.recurse('src')