summaryrefslogtreecommitdiff
path: root/src/im_cpl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/im_cpl.cc')
-rw-r--r--src/im_cpl.cc113
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);
+}