From 71de90f74085744d1c5ca35253eec003e41497a2 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 8 Feb 2014 13:30:42 +0000 Subject: Fix a couple of errors in Interop XML Reported-by: Ivan Pullman --- src/asset.cc | 9 +++++++-- src/asset.h | 5 ++++- src/cpl.cc | 8 ++++++-- src/cpl.h | 2 +- src/dcp.cc | 11 ++++++++--- src/picture_asset.h | 6 +++++- src/sound_asset.h | 6 ++++++ src/subtitle_asset.h | 6 ++++++ 8 files changed, 43 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/asset.cc b/src/asset.cc index 91a19e69..f6642d9c 100644 --- a/src/asset.cc +++ b/src/asset.cc @@ -31,6 +31,7 @@ #include "asset.h" #include "util.h" #include "metadata.h" +#include "compose.hpp" using namespace std; using namespace boost; @@ -51,14 +52,18 @@ Asset::Asset (boost::filesystem::path directory, boost::filesystem::path file_na } void -Asset::write_to_pkl (xmlpp::Node* node) const +Asset::write_to_pkl (xmlpp::Node* node, bool interop) const { xmlpp::Node* asset = node->add_child ("Asset"); asset->add_child("Id")->add_child_text ("urn:uuid:" + _uuid); asset->add_child("AnnotationText")->add_child_text (_file_name.string ()); asset->add_child("Hash")->add_child_text (digest ()); asset->add_child("Size")->add_child_text (lexical_cast (filesystem::file_size(path()))); - asset->add_child("Type")->add_child_text ("application/mxf"); + if (interop) { + asset->add_child("Type")->add_child (String::compose ("application/x-smpte-mxf;asdcpKind=%1", asdcp_kind ())); + } else { + asset->add_child("Type")->add_child_text ("application/mxf"); + } } void diff --git a/src/asset.h b/src/asset.h index 269d5c4b..773e3d48 100644 --- a/src/asset.h +++ b/src/asset.h @@ -65,7 +65,7 @@ public: /** Write details of the asset to a PKL AssetList node. * @param p Parent node. */ - void write_to_pkl (xmlpp::Node *) const; + void write_to_pkl (xmlpp::Node *, bool interop) const; /** Write details of the asset to a ASSETMAP stream. * @param s Stream. @@ -129,6 +129,9 @@ public: virtual bool equals (boost::shared_ptr other, EqualityOptions opt, boost::function) const; protected: + + /** @return Interop PKL asdcpKind for the <Type> tag e.g. Picture, Sound etc. */ + virtual std::string asdcp_kind () const = 0; std::string digest () const; diff --git a/src/cpl.cc b/src/cpl.cc index dcb730ff..e333df0d 100644 --- a/src/cpl.cc +++ b/src/cpl.cc @@ -243,13 +243,17 @@ CPL::write_xml (bool interop, XMLMetadata const & metadata, shared_ptradd_child ("Asset"); asset->add_child("Id")->add_child_text ("urn:uuid:" + _id); asset->add_child("Hash")->add_child_text (_digest); asset->add_child("Size")->add_child_text (lexical_cast (_length)); - asset->add_child("Type")->add_child_text ("text/xml"); + if (interop) { + asset->add_child("Type")->add_child_text ("text/xml;asdcpKind=CPL"); + } else { + asset->add_child("Type")->add_child_text ("text/xml"); + } } list > diff --git a/src/cpl.h b/src/cpl.h index aadc7347..c50d8f90 100644 --- a/src/cpl.h +++ b/src/cpl.h @@ -96,7 +96,7 @@ public: void write_xml (bool, XMLMetadata const &, boost::shared_ptr) const; void write_to_assetmap (xmlpp::Node *) const; - void write_to_pkl (xmlpp::Node *) const; + void write_to_pkl (xmlpp::Node *, bool) const; void add_kdm (KDM const &); diff --git a/src/dcp.cc b/src/dcp.cc index f80726fc..ae692256 100644 --- a/src/dcp.cc +++ b/src/dcp.cc @@ -111,11 +111,11 @@ DCP::write_pkl (string pkl_uuid, bool interop, XMLMetadata const & metadata, sha xmlpp::Element* asset_list = pkl->add_child("AssetList"); list > a = assets (); for (list >::const_iterator i = a.begin(); i != a.end(); ++i) { - (*i)->write_to_pkl (asset_list); + (*i)->write_to_pkl (asset_list, interop); } for (list >::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) { - (*i)->write_to_pkl (asset_list); + (*i)->write_to_pkl (asset_list, interop); } if (signer) { @@ -138,7 +138,12 @@ DCP::write_volindex (bool interop) const } xmlpp::Document doc; - xmlpp::Element* root = doc.create_root_node ("VolumeIndex", "http://www.smpte-ra.org/schemas/429-9/2007/AM"); + xmlpp::Element* root; + if (interop) { + root = doc.create_root_node ("VolumeIndex", "http://www.digicine.com/PROTO-ASDCP-AM-20040311#"); + } else { + root = doc.create_root_node ("VolumeIndex", "http://www.smpte-ra.org/schemas/429-9/2007/AM"); + } root->add_child("Index")->add_child_text ("1"); doc.write_to_file (p.string (), "UTF-8"); } diff --git a/src/picture_asset.h b/src/picture_asset.h index b8dab052..c09808e2 100644 --- a/src/picture_asset.h +++ b/src/picture_asset.h @@ -78,7 +78,11 @@ public: void write_to_cpl (xmlpp::Element *) const; -protected: +protected: + + std::string asdcp_kind () const { + return "Picture"; + } bool frame_buffer_equals ( int frame, EqualityOptions opt, boost::function note, diff --git a/src/sound_asset.h b/src/sound_asset.h index d2e49bd1..c52a5436 100644 --- a/src/sound_asset.h +++ b/src/sound_asset.h @@ -112,6 +112,12 @@ public: return _sampling_rate; } +protected: + + std::string asdcp_kind () const { + return "Sound"; + } + private: std::string key_type () const; void construct (boost::function get_path); diff --git a/src/subtitle_asset.h b/src/subtitle_asset.h index 74ab9873..0598a296 100644 --- a/src/subtitle_asset.h +++ b/src/subtitle_asset.h @@ -161,6 +161,12 @@ public: void write_xml () const; Glib::ustring xml_as_string () const; +protected: + + std::string asdcp_kind () const { + return "Subtitle"; + } + private: std::string font_id_to_name (std::string id) const; -- cgit v1.2.3 From a7dac85af6f24851079d0a91823b4725be7d6fa1 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 8 Feb 2014 18:46:32 +0000 Subject: Fix typo. --- src/asset.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/asset.cc b/src/asset.cc index f6642d9c..d51b78fd 100644 --- a/src/asset.cc +++ b/src/asset.cc @@ -60,7 +60,7 @@ Asset::write_to_pkl (xmlpp::Node* node, bool interop) const asset->add_child("Hash")->add_child_text (digest ()); asset->add_child("Size")->add_child_text (lexical_cast (filesystem::file_size(path()))); if (interop) { - asset->add_child("Type")->add_child (String::compose ("application/x-smpte-mxf;asdcpKind=%1", asdcp_kind ())); + asset->add_child("Type")->add_child_text (String::compose ("application/x-smpte-mxf;asdcpKind=%1", asdcp_kind ())); } else { asset->add_child("Type")->add_child_text ("application/mxf"); } -- cgit v1.2.3 From f3fba4af9566ae02f44dfa660c71dbaef6f4f92b Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 26 Feb 2014 15:43:53 +0000 Subject: Clean up unit testing. --- .gitmodules | 3 + TESTING | 4 + run-tests.sh | 81 ------------------- run/tests | 88 +++++++++++++++++++++ src/signer_chain.cc | 1 + test/dcp_test.cc | 16 ++-- test/decryption_test.cc | 4 +- test/encryption_test.cc | 30 ++++--- test/private | 1 + .../402c5a88-2512-4465-9c0b-cfa687dbc5d0_pkl.xml | 30 ------- .../63c3aece-c581-4603-b612-75e43f0c0430_cpl.xml | 39 --------- .../7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_cpl.xml | 77 ++++++++++++++++++ test/ref/DCP/bar/ASSETMAP.xml | 55 +------------ test/ref/DCP/bar/VOLINDEX.xml | 4 +- .../a12d2c1f-0daa-4a30-a4cd-c4266ac172a7_pkl.xml | 77 ++++++++++++++++++ test/ref/DCP/bar/audio.mxf | Bin 308398 -> 308398 bytes test/ref/DCP/bar/video.mxf | Bin 28840 -> 28840 bytes test/rewrite_subs.cc | 51 ++++++------ test/test.cc | 2 +- test/test.h | 2 +- 20 files changed, 314 insertions(+), 251 deletions(-) create mode 100644 .gitmodules create mode 100644 TESTING delete mode 100755 run-tests.sh create mode 100755 run/tests create mode 160000 test/private delete mode 100644 test/ref/DCP/bar/402c5a88-2512-4465-9c0b-cfa687dbc5d0_pkl.xml delete mode 100644 test/ref/DCP/bar/63c3aece-c581-4603-b612-75e43f0c0430_cpl.xml create mode 100644 test/ref/DCP/bar/7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_cpl.xml create mode 100644 test/ref/DCP/bar/a12d2c1f-0daa-4a30-a4cd-c4266ac172a7_pkl.xml (limited to 'src') diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..f7fb9ff8 --- /dev/null +++ b/.gitmodules @@ -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 index 00000000..5896f24b --- /dev/null +++ b/TESTING @@ -0,0 +1,4 @@ +libdcp has unit tests which are run with + +run/tests + diff --git a/run-tests.sh b/run-tests.sh deleted file mode 100755 index fc56b247..00000000 --- a/run-tests.sh +++ /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 index 00000000..97512b59 --- /dev/null +++ b/run/tests @@ -0,0 +1,88 @@ +#!/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 + +# Run the unit tests in test/ +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 + +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 build/test/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 build/test/DCP/bar +if [ "$?" != "0" ]; then + echo "FAIL: files differ" + exit 1 +fi + +# Run dcpinfo on all the DCPs in private/metadata, writing build/test/info.log +rm -f build/test/info.log +for d in `find $private/metadata -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 + +# Check info.log is what it should be +diff -q build/test/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 +# build/test/rewrite_subs. This tests round-trip of subtitle reading/writing. +rm -f build/test/info2.log +rm -rf build/test/private +cp -r $private build/test +for d in `find build/test/private/metadata -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 + +# Fudge the output +sed -i "s/DCP: build\/test/DCP: test/g" build/test/info2.log + +# And check it +diff -q build/test/info2.log $private/info.log +if [ "$?" != "0" ]; then + echo "FAIL: dcpinfo output from rewrite incorrect" + exit 1 +fi + +# Check a MXF written by the unit tests +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/src/signer_chain.cc b/src/signer_chain.cc index d407286e..f35e4ff6 100644 --- a/src/signer_chain.cc +++ b/src/signer_chain.cc @@ -70,6 +70,7 @@ static void command (string cmd) delete[] buffer; #else + cmd += " 2> /dev/null"; int const r = system (cmd.c_str ()); int const code = WEXITSTATUS (r); #endif diff --git a/test/dcp_test.cc b/test/dcp_test.cc index f70c6ce8..d0c8b973 100644 --- a/test/dcp_test.cc +++ b/test/dcp_test.cc @@ -44,13 +44,13 @@ BOOST_AUTO_TEST_CASE (dcp_test) mxf_meta.product_name = "OpenDCP"; 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"); - libdcp::DCP d ("build/test/foo"); - shared_ptr cpl (new libdcp::CPL ("build/test/foo", "A Test DCP", libdcp::FEATURE, 24, 24)); + /* We're making build/test/DCP/foo */ + boost::filesystem::remove_all ("build/test/DCP/foo"); + boost::filesystem::create_directories ("build/test/DCP/foo"); + libdcp::DCP d ("build/test/DCP/foo"); + shared_ptr cpl (new libdcp::CPL ("build/test/DCP/foo", "A Test DCP", libdcp::FEATURE, 24, 24)); - shared_ptr mp (new libdcp::MonoPictureAsset ("build/test/foo", "video.mxf")); + shared_ptr mp (new libdcp::MonoPictureAsset ("build/test/DCP/foo", "video.mxf")); mp->set_progress (&d.Progress); mp->set_edit_rate (24); mp->set_intrinsic_duration (24); @@ -59,7 +59,7 @@ BOOST_AUTO_TEST_CASE (dcp_test) mp->set_metadata (mxf_meta); mp->create (j2c); - shared_ptr ms (new libdcp::SoundAsset ("build/test/foo", "audio.mxf")); + shared_ptr ms (new libdcp::SoundAsset ("build/test/DCP/foo", "audio.mxf")); ms->set_progress (&d.Progress); ms->set_edit_rate (24); ms->set_intrinsic_duration (24); @@ -73,5 +73,5 @@ BOOST_AUTO_TEST_CASE (dcp_test) d.write_xml (false, 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 */ } diff --git a/test/decryption_test.cc b/test/decryption_test.cc index 0f5a4ef0..d0e067ee 100644 --- a/test/decryption_test.cc +++ b/test/decryption_test.cc @@ -45,13 +45,13 @@ get_frame (libdcp::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"; libdcp::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"; libdcp::DCP encrypted (encrypted_path.string ()); encrypted.read (); diff --git a/test/encryption_test.cc b/test/encryption_test.cc index dc49562c..40003413 100644 --- a/test/encryption_test.cc +++ b/test/encryption_test.cc @@ -58,15 +58,16 @@ BOOST_AUTO_TEST_CASE (encryption) boost::filesystem::create_directories ("build/test/DCP/bar"); libdcp::DCP d ("build/test/DCP/bar"); + /* Use test/ref/crypt so this test is repeatable */ libdcp::CertificateChain chain; - chain.add (shared_ptr (new libdcp::Certificate (boost::filesystem::path ("build/test/signer/ca.self-signed.pem")))); - chain.add (shared_ptr (new libdcp::Certificate (boost::filesystem::path ("build/test/signer/intermediate.signed.pem")))); - chain.add (shared_ptr (new libdcp::Certificate (boost::filesystem::path ("build/test/signer/leaf.signed.pem")))); + chain.add (shared_ptr (new libdcp::Certificate (boost::filesystem::path ("test/ref/crypt/ca.self-signed.pem")))); + chain.add (shared_ptr (new libdcp::Certificate (boost::filesystem::path ("test/ref/crypt/intermediate.signed.pem")))); + chain.add (shared_ptr (new libdcp::Certificate (boost::filesystem::path ("test/ref/crypt/leaf.signed.pem")))); shared_ptr signer ( new libdcp::Signer ( chain, - "build/test/signer/leaf.key" + "test/ref/crypt/leaf.key" ) ); @@ -110,12 +111,21 @@ BOOST_AUTO_TEST_CASE (encryption) ); 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 index 00000000..621e4b31 --- /dev/null +++ b/test/private @@ -0,0 +1 @@ +Subproject commit 621e4b317e62a278945509c776c04db94f4db6a2 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 index a87f9e27..00000000 --- a/test/ref/DCP/bar/402c5a88-2512-4465-9c0b-cfa687dbc5d0_pkl.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - urn:uuid:402c5a88-2512-4465-9c0b-cfa687dbc5d0 - A Test DCP - 2012-07-17T04:45:18+00:00 - OpenDCP 0.0.25 - OpenDCP 0.0.25 - - - urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95 - video.mxf - fTMi9Xvr8NzuRhm7LmSTk6k1HYo= - 28840 - application/mxf - - - urn:uuid:aa3fb133-0d18-4083-a039-e441b0788e79 - audio.mxf - 2MlsntiFrekkQvwbRPLC2XEMU78= - 308398 - application/mxf - - - urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 - l/g+bdCKF6ofhedin5qrLcObS1E= - 1526 - text/xml - - - 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 index 43edb1b3..00000000 --- a/test/ref/DCP/bar/63c3aece-c581-4603-b612-75e43f0c0430_cpl.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 - A Test DCP - 2012-07-17T04:45:18+00:00 - OpenDCP 0.0.25 - A Test DCP - feature - - urn:uri:63c3aece-c581-4603-b612-75e43f0c0430_2012-07-17T04:45:18+00:00 - 63c3aece-c581-4603-b612-75e43f0c0430_2012-07-17T04:45:18+00:00 - - - - - urn:uuid:7d861d35-c775-48e6-a4f8-fbfdbfc1556a - - - urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95 - video.mxf - 24 1 - 24 - 0 - 24 - 24 1 - 32 32 - - - urn:uuid:aa3fb133-0d18-4083-a039-e441b0788e79 - audio.mxf - 24 1 - 24 - 0 - 24 - - - - - 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 index 00000000..2e3c5b29 --- /dev/null +++ b/test/ref/DCP/bar/7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_cpl.xml @@ -0,0 +1,77 @@ + +urn:uuid:7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0cA Test DCP2012-07-17T04:45:18+00:00OpenDCP 0.0.25OpenDCP 0.0.25A Test DCPfeatureurn:uri:7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_2012-07-17T04:45:18+00:007b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_2012-07-17T04:45:18+00:00urn:uuid:947716dd-c237-4f31-a6d8-f74990b79c73urn:uuid:93182bd2-b1e8-41a3-b5c8-6e6564273bffvideo.mxf24 124024urn:uuid:6af1e0c1-c441-47f8-a502-3efd46b1fa4f24 132 32urn:uuid:822bd341-c751-45b1-94d2-410e4ffcff1baudio.mxf24 12400urn:uuid:f28b567b-3b9a-417a-aee4-6fc1a2c6a3afdnQualifier=bmtwThq3srgxIAeRMjX6BFhgLDw=,CN=.smpte-430-2.INTERMEDIATE.NOT_FOR_PRODUCTION,OU=example.org,O=example.org7dnQualifier=d95fGDzERNdxfYPgphvAR8A18L4=,CN=CS.smpte-430-2.LEAF.NOT_FOR_PRODUCTION,OU=example.org,O=example.orgnxx0sUeTkcxIK9y7+JATMU5MzGg=NTsZK+pcfddOjpQC9rkBn0eRDG1D5tVkqvwYd9d577AMj17GxXizxsBa+DadQ3mB +GiWeoiJ8/VVW9PQ8N28uOLRkv0er8Jzl6UXdASrki/FbMLLRIGT1IMmxurahUBQN +hXrk7yphM/cGpIIRwQnAyAuG0xO7L3uDUuMhRftDplwGPU52Qa3opEEX1FtxC9TT +7NrOGIs+Ks3WtUFOe5ZbfLt1McmnYzg6FJdnAEOfv3/AWQCBd1vakONNgoWKmCiK +/kmeDIMBK4slHfGrauBcn7KVPpLS8lSFgXI1erifibRe4iyANql10qJ+NiYVgdxm +udPzL8evhgSC8StQOpAy1g==dnQualifier=bmtwThq3srgxIAeRMjX6BFhgLDw=,CN=.smpte-430-2.INTERMEDIATE.NOT_FOR_PRODUCTION,OU=example.org,O=example.org7MIIEezCCA2OgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBijEUMBIGA1UEChMLZXhh +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=dnQualifier=ndND9A/cODo2rTdrbLVmfQnoaSc=,CN=.smpte-430-2.ROOT.NOT_FOR_PRODUCTION,OU=example.org,O=example.org6MIIEfzCCA2egAwIBAgIBBjANBgkqhkiG9w0BAQsFADCBgjEUMBIGA1UEChMLZXhh +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+DdnQualifier=ndND9A/cODo2rTdrbLVmfQnoaSc=,CN=.smpte-430-2.ROOT.NOT_FOR_PRODUCTION,OU=example.org,O=example.org5MIIEdzCCA1+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== diff --git a/test/ref/DCP/bar/ASSETMAP.xml b/test/ref/DCP/bar/ASSETMAP.xml index 359f453f..6b0ae981 100644 --- a/test/ref/DCP/bar/ASSETMAP.xml +++ b/test/ref/DCP/bar/ASSETMAP.xml @@ -1,55 +1,2 @@ - - urn:uuid:58f161a5-16d1-4896-93df-52a5a330082f - OpenDCP 0.0.25 - 1 - 2012-07-17T04:45:18+00:00 - OpenDCP 0.0.25 - - - urn:uuid:402c5a88-2512-4465-9c0b-cfa687dbc5d0 - true - - - 402c5a88-2512-4465-9c0b-cfa687dbc5d0_pkl.xml - 1 - 0 - 1049 - - - - - urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430 - - - 63c3aece-c581-4603-b612-75e43f0c0430_cpl.xml - 1 - 0 - 1526 - - - - - urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95 - - - video.mxf - 1 - 0 - 28840 - - - - - urn:uuid:aa3fb133-0d18-4083-a039-e441b0788e79 - - - audio.mxf - 1 - 0 - 308398 - - - - - +urn:uuid:aa157ca6-e3e3-4b6c-a7b6-50f52fcafb7fCreated by OpenDCP 0.0.25OpenDCP 0.0.2512012-07-17T04:45:18+00:00OpenDCP 0.0.25urn:uuid:a12d2c1f-0daa-4a30-a4cd-c4266ac172a7truea12d2c1f-0daa-4a30-a4cd-c4266ac172a7_pkl.xml108019urn:uuid:7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0c_cpl.xml108531urn:uuid:822bd341-c751-45b1-94d2-410e4ffcff1baudio.mxf10308398urn:uuid:93182bd2-b1e8-41a3-b5c8-6e6564273bffvideo.mxf1028840 diff --git a/test/ref/DCP/bar/VOLINDEX.xml b/test/ref/DCP/bar/VOLINDEX.xml index f66c004a..021685e9 100644 --- a/test/ref/DCP/bar/VOLINDEX.xml +++ b/test/ref/DCP/bar/VOLINDEX.xml @@ -1,4 +1,2 @@ - - 1 - +1 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 index 00000000..60bc2042 --- /dev/null +++ b/test/ref/DCP/bar/a12d2c1f-0daa-4a30-a4cd-c4266ac172a7_pkl.xml @@ -0,0 +1,77 @@ + +urn:uuid:a12d2c1f-0daa-4a30-a4cd-c4266ac172a7A Test DCP2012-07-17T04:45:18+00:00OpenDCP 0.0.25OpenDCP 0.0.25urn:uuid:822bd341-c751-45b1-94d2-410e4ffcff1baudio.mxf00dwsDwm9AGtL2ylcUZzm/UH/P8=308398application/mxfurn:uuid:93182bd2-b1e8-41a3-b5c8-6e6564273bffvideo.mxftwmVEuhyyqVkEQo6tQbCN/V4MuY=28840application/mxfurn:uuid:7b6616d2-9afe-4d54-a2bb-4f3f71ac6e0cmTFgIKBQeWMqD6y+8CanXIJj7pQ=8531text/xmldnQualifier=bmtwThq3srgxIAeRMjX6BFhgLDw=,CN=.smpte-430-2.INTERMEDIATE.NOT_FOR_PRODUCTION,OU=example.org,O=example.org7dnQualifier=d95fGDzERNdxfYPgphvAR8A18L4=,CN=CS.smpte-430-2.LEAF.NOT_FOR_PRODUCTION,OU=example.org,O=example.org/xGgOim2E6rPVUvuWH97evvZ3E0=X18JIXvv5fWjLTJPJYPg/KliGBtM1mZvEjaS0m+SUaM26WpTMT52nowtT/6PcGDX +Qd0Klm6j2YZpXnXbVapyhY9hXpm8h2dTDRR8S3r2fC6lVc6LAEPz6WRhW7F0ltZ7 +LFYnOraZOm0hegih1lM2bPin9rbsrtSguSEAYMP7z0SNAHViJ/eiY4b/va8n1eVe +bKqmdjN7CrD5OnxobDRSgBLeO9BqtrudPJlk4rCJmXIOxPrzywdRGd18VpoIqdNZ +hOmkgKZZrCk/QDZGKZLd1pnZ6AxxUl3Qwap+rxuTINNW8rDmKVEO8tLe/swHN/TA +zxrk+JtqOI/nDK5QRci2nQ==dnQualifier=bmtwThq3srgxIAeRMjX6BFhgLDw=,CN=.smpte-430-2.INTERMEDIATE.NOT_FOR_PRODUCTION,OU=example.org,O=example.org7MIIEezCCA2OgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBijEUMBIGA1UEChMLZXhh +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=dnQualifier=ndND9A/cODo2rTdrbLVmfQnoaSc=,CN=.smpte-430-2.ROOT.NOT_FOR_PRODUCTION,OU=example.org,O=example.org6MIIEfzCCA2egAwIBAgIBBjANBgkqhkiG9w0BAQsFADCBgjEUMBIGA1UEChMLZXhh +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+DdnQualifier=ndND9A/cODo2rTdrbLVmfQnoaSc=,CN=.smpte-430-2.ROOT.NOT_FOR_PRODUCTION,OU=example.org,O=example.org5MIIEdzCCA1+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== diff --git a/test/ref/DCP/bar/audio.mxf b/test/ref/DCP/bar/audio.mxf index 1188e5fc..9fbf73b8 100644 Binary files a/test/ref/DCP/bar/audio.mxf and b/test/ref/DCP/bar/audio.mxf differ diff --git a/test/ref/DCP/bar/video.mxf b/test/ref/DCP/bar/video.mxf index 20eb6f4a..2aae069f 100644 Binary files a/test/ref/DCP/bar/video.mxf and b/test/ref/DCP/bar/video.mxf differ diff --git a/test/rewrite_subs.cc b/test/rewrite_subs.cc index c7f8bfbd..3a982d1b 100644 --- a/test/rewrite_subs.cc +++ b/test/rewrite_subs.cc @@ -13,32 +13,39 @@ using namespace libdcp; int main (int argc, char* argv[]) -try { - if (argc < 2) { - cerr << "Syntax: " << argv[0] << " \n"; - exit (EXIT_FAILURE); - } - - DCP* dcp = new DCP (argv[1]); - dcp->read (false); - - list > cpls = dcp->cpls (); - for (list >::iterator i = cpls.begin(); i != cpls.end(); ++i) { - - list > reels = (*i)->reels (); - for (list >::iterator j = reels.begin(); j != reels.end(); ++j) { - - if ((*j)->main_subtitle()) { - (*j)->main_subtitle()->write_xml (); + try { + if (argc < 2) { + cerr << "Syntax: " << argv[0] << " \n"; + exit (EXIT_FAILURE); + } + + DCP* dcp = new DCP (argv[1]); + dcp->read (false); + + list > cpls = dcp->cpls (); + for (list >::iterator i = cpls.begin(); i != cpls.end(); ++i) { + + list > reels = (*i)->reels (); + for (list >::iterator j = reels.begin(); j != reels.end(); ++j) { + + if ((*j)->main_subtitle()) { + (*j)->main_subtitle()->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); -} diff --git a/test/test.cc b/test/test.cc index 72d0c7dd..c58966f4 100644 --- a/test/test.cc +++ b/test/test.cc @@ -46,5 +46,5 @@ wav (libdcp::Channel) return "test/data/1s_24-bit_48k_silence.wav"; } -string test_corpus = "../libdcp-test"; +string private_test = "test/private"; diff --git a/test/test.h b/test/test.h index d6691bc0..47a615d8 100644 --- a/test/test.h +++ b/test/test.h @@ -19,4 +19,4 @@ extern boost::filesystem::path j2c (int); extern boost::filesystem::path wav (libdcp::Channel); -extern std::string test_corpus; +extern std::string private_test; -- cgit v1.2.3 From 471c9d05fc19484f3e50cf805d14237b72bbb7b2 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 26 Feb 2014 17:48:29 +0000 Subject: Hacks to support MXF-wrapped subtitles. --- src/parse/subtitle.cc | 22 +++++++++++--- src/parse/subtitle.h | 2 +- src/subtitle_asset.cc | 79 +++++++++++++++++++++++++++++++++++++++++++++------ src/subtitle_asset.h | 4 ++- 4 files changed, 93 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/parse/subtitle.cc b/src/parse/subtitle.cc index 612af716..914be677 100644 --- a/src/parse/subtitle.cc +++ b/src/parse/subtitle.cc @@ -84,10 +84,14 @@ Font::Font (list > const & font_nodes) LoadFont::LoadFont (shared_ptr node) { - id = node->string_attribute ("Id"); - uri = node->string_attribute ("URI"); + optional x = node->optional_string_attribute ("Id"); + if (!x) { + x = node->optional_string_attribute ("ID"); + } + id = x.get_value_or (""); + + uri = node->optional_string_attribute ("URI"); } - Subtitle::Subtitle (shared_ptr node) { @@ -123,9 +127,19 @@ Subtitle::fade_time (shared_ptr node, string name) Text::Text (shared_ptr node) : v_align (CENTER) { + /* Vertical position */ text = node->content (); - v_position = node->number_attribute ("VPosition"); + optional x = node->optional_number_attribute ("VPosition"); + if (!x) { + x = node->number_attribute ("Vposition"); + } + v_position = x.get (); + + /* Vertical alignment */ optional v = node->optional_string_attribute ("VAlign"); + if (!v) { + v = node->optional_string_attribute ("Valign"); + } if (v) { v_align = string_to_valign (v.get ()); } diff --git a/src/parse/subtitle.h b/src/parse/subtitle.h index c20278a3..3d99d9bc 100644 --- a/src/parse/subtitle.h +++ b/src/parse/subtitle.h @@ -92,7 +92,7 @@ public: LoadFont (boost::shared_ptr node); std::string id; - std::string uri; + boost::optional uri; }; } diff --git a/src/subtitle_asset.cc b/src/subtitle_asset.cc index a48a614d..4eb1a9cd 100644 --- a/src/subtitle_asset.cc +++ b/src/subtitle_asset.cc @@ -18,9 +18,12 @@ */ #include +#include #include #include #include +#include "AS_DCP.h" +#include "KM_util.h" #include "subtitle_asset.h" #include "parse/subtitle.h" #include "util.h" @@ -31,16 +34,34 @@ 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; using namespace libdcp; -SubtitleAsset::SubtitleAsset (string directory, string xml_file) - : Asset (directory, xml_file) +SubtitleAsset::SubtitleAsset (string directory, string file) + : Asset (directory, file) , _need_sort (false) { - read_xml (path().string()); + /* Grotesque hack: we should look in the PKL to see what type this file is; + instead we'll look at the first character to decide what to do. + I think this is easily fixable (properly) in 1.0. + */ + + FILE* f = fopen_boost (path(), "r"); + if (!f) { + throw FileError ("Could not open file for reading", file, errno); + } + unsigned char test[1]; + fread (test, 1, 1, f); + fclose (f); + + if (test[0] == '<' || test[0] == 0xef) { + read_xml (path().string()); + } else { + read_mxf (path().string()); + } } SubtitleAsset::SubtitleAsset (string directory, string movie_title, string language) @@ -53,14 +74,46 @@ SubtitleAsset::SubtitleAsset (string directory, string movie_title, string langu } +void +SubtitleAsset::read_mxf (string mxf_file) +{ + ASDCP::TimedText::MXFReader reader; + Kumu::Result_t r = reader.OpenRead (mxf_file.c_str ()); + if (ASDCP_FAILURE (r)) { + boost::throw_exception (MXFFileError ("could not open MXF file for reading", mxf_file, r)); + } + + string s; + reader.ReadTimedTextResource (s, 0, 0); + shared_ptr xml (new cxml::Document ("SubtitleReel")); + stringstream t; + t << s; + xml->read_stream (t); + read_xml (xml); +} + void SubtitleAsset::read_xml (string xml_file) { shared_ptr xml (new cxml::Document ("DCSubtitle")); xml->read_file (xml_file); + read_xml (xml); +} + +void +SubtitleAsset::read_xml (shared_ptr xml) +{ + /* XXX: hacks aplenty in here; need separate parsers for DCSubtitle and SubtitleReel */ - _uuid = xml->string_child ("SubtitleID"); - _movie_title = xml->string_child ("MovieTitle"); + /* DCSubtitle */ + optional x = xml->optional_string_child ("SubtitleID"); + if (!x) { + /* SubtitleReel */ + x = xml->optional_string_child ("Id"); + } + _uuid = x.get_value_or (""); + + _movie_title = xml->optional_string_child ("MovieTitle"); _reel_number = xml->string_child ("ReelNumber"); _language = xml->string_child ("Language"); @@ -73,6 +126,12 @@ SubtitleAsset::read_xml (string xml_file) in a sane way. */ + shared_ptr subtitle_list = xml->optional_node_child ("SubtitleList"); + if (subtitle_list) { + list > font = type_children (subtitle_list, "Font"); + copy (font.begin(), font.end(), back_inserter (font_nodes)); + } + ParseState parse_state; examine_font_nodes (xml, font_nodes, parse_state); } @@ -182,7 +241,7 @@ SubtitleAsset::font_id_to_name (string id) const return ""; } - if ((*i)->uri == "arial.ttf") { + if ((*i)->uri && (*i)->uri.get() == "arial.ttf") { return "Arial"; } @@ -316,7 +375,9 @@ SubtitleAsset::xml_as_string () const root->set_attribute ("Version", "1.0"); root->add_child("SubtitleID")->add_child_text (_uuid); - root->add_child("MovieTitle")->add_child_text (_movie_title); + if (_movie_title) { + root->add_child("MovieTitle")->add_child_text (_movie_title.get ()); + } root->add_child("ReelNumber")->add_child_text (lexical_cast (_reel_number)); root->add_child("Language")->add_child_text (_language); @@ -327,7 +388,9 @@ SubtitleAsset::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); + if (_load_font_nodes.front()->uri) { + load_font->set_attribute("URI", _load_font_nodes.front()->uri.get ()); + } } list > sorted = _subtitles; diff --git a/src/subtitle_asset.h b/src/subtitle_asset.h index 0598a296..a7ec641c 100644 --- a/src/subtitle_asset.h +++ b/src/subtitle_asset.h @@ -169,6 +169,8 @@ protected: private: std::string font_id_to_name (std::string id) const; + void read_mxf (std::string); + void read_xml (boost::shared_ptr); struct ParseState { std::list > font_nodes; @@ -190,7 +192,7 @@ private: ParseState& parse_state ); - std::string _movie_title; + boost::optional _movie_title; /* strangely, this is sometimes a string */ std::string _reel_number; std::string _language; -- cgit v1.2.3