diff options
Diffstat (limited to 'src/im_cpl.cc')
| -rw-r--r-- | src/im_cpl.cc | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/im_cpl.cc b/src/im_cpl.cc new file mode 100644 index 00000000..f45a3db0 --- /dev/null +++ b/src/im_cpl.cc @@ -0,0 +1,113 @@ +/* + Copyright (C) 2016 Carl Hetherington <cth@carlh.net> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "im_cpl.h" +#include "util.h" +#include "xml.h" +#include "dcp_assert.h" +#include "segment.h" +#include <libcxml/cxml.h> +#include <libxml++/libxml++.h> +#include <boost/foreach.hpp> + +using std::list; +using std::string; +using boost::shared_ptr; +using namespace dcp::im; + +CPL::CPL (boost::filesystem::path file) + : Asset (file) +{ + cxml::Document f ("CompositionPlaylist"); + f.read_file (file); + + _id = remove_urn_uuid (f.string_child ("Id")); + + /* XXX: I don't know whether these things are required or optional */ + + _annotation = f.optional_string_child("Annotation").get_value_or (""); + _issue_date = f.string_child("IssueDate"); + _issuer = f.optional_string_child("Issuer").get_value_or (""); + _creator = f.optional_string_child("Creator").get_value_or (""); + /* ContentOriginator? */ + _content_title = f.optional_string_child("ContentTitle").get_value_or (""); + _content_kind = content_kind_from_string (f.string_child ("ContentKind")); + BOOST_FOREACH (cxml::ConstNodePtr i, f.node_child("ContentVersionList")->node_children("ContentVersion")) { + _content_versions.push_back (make_pair (remove_urn_uuid(i->string_child("Id")), i->string_child("LabelText"))); + } + /* EssenceDescriptorList */ + _edit_rate = Fraction (f.string_child("EditRate")); + /* ExtensionProperties */ + + _segments = type_grand_children<Segment> (f, "SegmentList", "Segment"); + + /* f.done (); */ +} + +void +CPL::resolve_refs (list<shared_ptr<Asset> > assets) +{ + /* XXX */ +} + +string +CPL::pkl_type (Standard standard) const +{ + switch (standard) { + case DCP_INTEROP: + case DCP_SMPTE: + /* This class shouldn't be writing DCP CPLs */ + DCP_ASSERT (false); + case IMP: + return "text/xml"; + } + + return ""; +} + +/** Write an CompositonPlaylist XML file. + * @param file Filename to write. + * @param standard Must be IMP. + * @param signer Signer to sign the CPL, or 0 to add no signature. + */ +void +CPL::write_xml (boost::filesystem::path file, Standard standard, shared_ptr<const CertificateChain> signer) const +{ + xmlpp::Document doc; + xmlpp::Element* root = 0; + + switch (standard) { + case DCP_INTEROP: + case DCP_SMPTE: + /* This class shouldn't be writing DCP CPLs */ + root = doc.create_root_node ("CompositionPlaylist", "http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"); + break; + case IMP: + root = doc.create_root_node ("CompositionPlaylist", "http://www.smpte-ra.org/schemas/429-7/2006/CPL"); + break; + } + + if (signer) { + root->set_namespace_declaration ("http://www.w3.org/2000/09/xmldsig#", "dsig"); + } + + /* XXX */ + + set_file (file); +} |
