summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-01-10 14:13:43 +0000
committerCarl Hetherington <cth@carlh.net>2016-01-10 14:13:43 +0000
commit0ffc4c35a9ae232f3bed9329997c043c42372f6f (patch)
tree9d1373403362572518600e163e7caad2f63b67a4 /src
parent93f29880839dc5589bb35f63260a7152ead7655f (diff)
Template Package and bring some stuff up to there and PackageBase.
Diffstat (limited to 'src')
-rw-r--r--src/dc_package.cc133
-rw-r--r--src/dc_package.h19
-rw-r--r--src/im_package.cc9
-rw-r--r--src/im_package.h4
-rw-r--r--src/package.h51
-rw-r--r--src/package_base.cc (renamed from src/package.cc)113
-rw-r--r--src/package_base.h62
-rw-r--r--src/wscript2
8 files changed, 223 insertions, 170 deletions
diff --git a/src/dc_package.cc b/src/dc_package.cc
index e1c69b63..b78f3e85 100644
--- a/src/dc_package.cc
+++ b/src/dc_package.cc
@@ -66,38 +66,11 @@ using boost::algorithm::starts_with;
using namespace dcp::dc;
Package::Package (boost::filesystem::path directory)
- : dcp::Package (directory)
+ : dcp::Package<CPL> (directory)
{
}
-void
-Package::read (bool keep_going, ReadErrors* errors)
-{
- list<shared_ptr<dcp::Asset> > other_assets;
-
- BOOST_FOREACH (shared_ptr<dcp::Asset> i, read_assetmap (keep_going, errors)) {
- shared_ptr<CPL> cpl = dynamic_pointer_cast<CPL> (i);
- if (cpl) {
- _cpls.push_back (cpl);
- } else {
- other_assets.push_back (i);
- }
- }
-
- BOOST_FOREACH (shared_ptr<CPL> i, cpls ()) {
- i->resolve_refs (other_assets);
- }
-}
-
-void
-Package::resolve_refs (list<shared_ptr<dcp::Asset> > assets)
-{
- BOOST_FOREACH (shared_ptr<CPL> i, cpls ()) {
- i->resolve_refs (assets);
- }
-}
-
bool
Package::equals (Package const & other, dcp::EqualityOptions opt, dcp::NoteHandler note) const
{
@@ -198,110 +171,6 @@ Package::write_pkl (dcp::Standard standard, string pkl_uuid, dcp::XMLMetadata me
return p.string ();
}
-/** Write the VOLINDEX file.
- * @param standard DCP standard to use (INTEROP or SMPTE)
- */
-void
-Package::write_volindex (Standard standard) const
-{
- boost::filesystem::path p = _directory;
- switch (standard) {
- case DCP_INTEROP:
- p /= "VOLINDEX";
- break;
- case DCP_SMPTE:
- p /= "VOLINDEX.xml";
- break;
- case IMP:
- /* XXX */
- DCP_ASSERT (false);
- break;
- }
-
- xmlpp::Document doc;
- xmlpp::Element* root = 0;
-
- switch (standard) {
- case DCP_INTEROP:
- root = doc.create_root_node ("VolumeIndex", "http://www.digicine.com/PROTO-ASDCP-AM-20040311#");
- break;
- case DCP_SMPTE:
- case IMP:
- root = doc.create_root_node ("VolumeIndex", "http://www.smpte-ra.org/schemas/429-9/2007/AM");
- break;
- }
-
- root->add_child("Index")->add_child_text ("1");
- doc.write_to_file (p.string (), "UTF-8");
-}
-
-void
-Package::write_assetmap (Standard standard, string pkl_uuid, int pkl_length, dcp::XMLMetadata metadata) const
-{
- boost::filesystem::path p = _directory;
-
- switch (standard) {
- case DCP_INTEROP:
- p /= "ASSETMAP";
- break;
- case DCP_SMPTE:
- case IMP:
- p /= "ASSETMAP.xml";
- break;
- }
-
- xmlpp::Document doc;
- xmlpp::Element* root = 0;
-
- switch (standard) {
- case DCP_INTEROP:
- root = doc.create_root_node ("AssetMap", "http://www.digicine.com/PROTO-ASDCP-AM-20040311#");
- break;
- case DCP_SMPTE:
- case IMP:
- root = doc.create_root_node ("AssetMap", "http://www.smpte-ra.org/schemas/429-9/2007/AM");
- break;
- }
-
- root->add_child("Id")->add_child_text ("urn:uuid:" + make_uuid());
- root->add_child("AnnotationText")->add_child_text ("Created by " + metadata.creator);
-
- switch (standard) {
- case DCP_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);
- break;
- case DCP_SMPTE:
- case IMP:
- 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;
- }
-
- xmlpp::Node* asset_list = root->add_child ("AssetList");
-
- xmlpp::Node* asset = asset_list->add_child ("Asset");
- asset->add_child("Id")->add_child_text ("urn:uuid:" + pkl_uuid);
- asset->add_child("PackingList")->add_child_text ("true");
- xmlpp::Node* chunk_list = asset->add_child ("ChunkList");
- xmlpp::Node* chunk = chunk_list->add_child ("Chunk");
- chunk->add_child("Path")->add_child_text ("pkl_" + pkl_uuid + ".xml");
- chunk->add_child("VolumeIndex")->add_child_text ("1");
- chunk->add_child("Offset")->add_child_text ("0");
- chunk->add_child("Length")->add_child_text (raw_convert<string> (pkl_length));
-
- BOOST_FOREACH (shared_ptr<dcp::Asset> i, assets ()) {
- i->write_to_assetmap (asset_list, _directory);
- }
-
- /* This must not be the _formatted version otherwise signature digests will be wrong */
- doc.write_to_file (p.string (), "UTF-8");
-}
-
/** Write all the XML files for this DCP.
* @param standand INTEROP or SMPTE.
* @param metadata Metadata to use for PKL and asset map files.
diff --git a/src/dc_package.h b/src/dc_package.h
index eb194398..c0348419 100644
--- a/src/dc_package.h
+++ b/src/dc_package.h
@@ -56,7 +56,7 @@ class DCPReadError;
/** @class Package
* @brief A class to create or read a DCP.
*/
-class Package : public dcp::Package
+class Package : public dcp::Package<CPL>
{
public:
/** Construct a DCP package. You can pass an existing DCP's directory
@@ -68,12 +68,6 @@ public:
*/
Package (boost::filesystem::path directory);
- /** Read the DCP's structure into this object.
- * @param keep_going true to try to keep going in the face of (some) errors.
- * @param errors List of errors that will be added to if keep_going is true.
- */
- void read (bool keep_going = false, ReadErrors* errors = 0);
-
/** Compare this DCP with another, according to various options.
* @param other DCP to compare this one to.
* @param options Options to define what "equality" means.
@@ -111,19 +105,8 @@ private:
boost::shared_ptr<const CertificateChain> signer
) const;
- void write_volindex (Standard standard) const;
-
- /** Write the ASSETMAP file.
- * @param pkl_uuid UUID of our PKL.
- * @param pkl_length Length of our PKL in bytes.
- */
- void write_assetmap (Standard standard, std::string pkl_uuid, int pkl_length, XMLMetadata metadata) const;
-
boost::shared_ptr<dcp::Asset> xml_asset_factory (boost::filesystem::path file, std::string root) const;
boost::shared_ptr<dcp::Asset> mxf_asset_factory (boost::filesystem::path file) const;
-
- /** the CPLs that make up this DCP */
- std::list<boost::shared_ptr<CPL> > _cpls;
};
}
diff --git a/src/im_package.cc b/src/im_package.cc
index aeef6760..852f3505 100644
--- a/src/im_package.cc
+++ b/src/im_package.cc
@@ -22,7 +22,14 @@
using namespace dcp::im;
Package::Package (boost::filesystem::path directory)
- : dcp::Package (directory)
+ : dcp::Package<CPL> (directory)
{
}
+
+list<Asset>
+Package::assets () const
+{
+ /* XXX */
+ return list<Asset> ();
+}
diff --git a/src/im_package.h b/src/im_package.h
index 46c0872d..4056ae8e 100644
--- a/src/im_package.h
+++ b/src/im_package.h
@@ -20,10 +20,12 @@
namespace dcp {
namespace im {
-class Package : public dcp::Package
+class Package : public dcp::Package<CPL>
{
public:
Package (boost::filesystem::path directory);
+
+ std::list<boost::shared_ptr<Asset> > assets () const;
};
}
diff --git a/src/package.h b/src/package.h
index b3d3b4ed..ac33ac9f 100644
--- a/src/package.h
+++ b/src/package.h
@@ -20,29 +20,52 @@
#ifndef LIBDCP_PACKAGE_H
#define LIBDCP_PACKAGE_H
-#include "exceptions.h"
-#include <boost/filesystem.hpp>
+#include "package_base.h"
+#include "dc_cpl.h"
+#include <boost/foreach.hpp>
namespace dcp {
class Asset;
-class Package
+template <class T>
+class Package : public PackageBase
{
public:
- Package (boost::filesystem::path directory);
-
- typedef std::list<boost::shared_ptr<PackageReadError> > ReadErrors;
+ Package (boost::filesystem::path directory)
+ : PackageBase (directory)
+ {
+
+ }
+
+ void read (bool keep_going = false, ReadErrors* errors = 0)
+ {
+ std::list<boost::shared_ptr<dcp::Asset> > other_assets;
+
+ BOOST_FOREACH (boost::shared_ptr<dcp::Asset> i, read_assetmap (keep_going, errors)) {
+ boost::shared_ptr<T> cpl = boost::dynamic_pointer_cast<T> (i);
+ if (cpl) {
+ _cpls.push_back (cpl);
+ } else {
+ other_assets.push_back (i);
+ }
+ }
+
+ BOOST_FOREACH (boost::shared_ptr<T> i, _cpls) {
+ i->resolve_refs (other_assets);
+ }
+ }
+
+ void resolve_refs (std::list<boost::shared_ptr<dcp::Asset> > assets)
+ {
+ BOOST_FOREACH (boost::shared_ptr<T> i, _cpls) {
+ i->resolve_refs (assets);
+ }
+ }
protected:
-
- virtual boost::shared_ptr<Asset> xml_asset_factory (boost::filesystem::path file, std::string root) const = 0;
- virtual boost::shared_ptr<Asset> mxf_asset_factory (boost::filesystem::path file) const = 0;
-
- std::list<boost::shared_ptr<Asset> > read_assetmap (bool keep_going, ReadErrors* errors) const;
-
- /** the directory that the package is in */
- boost::filesystem::path _directory;
+ /** the CPLs that make up this package */
+ std::list<boost::shared_ptr<T> > _cpls;
};
}
diff --git a/src/package.cc b/src/package_base.cc
index 74ab725c..aa4658d2 100644
--- a/src/package.cc
+++ b/src/package_base.cc
@@ -17,11 +17,13 @@
*/
-#include "package.h"
+#include "package_base.h"
#include "compose.hpp"
#include "exceptions.h"
#include "util.h"
+#include "dcp_assert.h"
#include "font_asset.h"
+#include "raw_convert.h"
#include <libcxml/cxml.h>
#include <libxml++/libxml++.h>
#include <boost/foreach.hpp>
@@ -34,7 +36,7 @@ using boost::shared_ptr;
using boost::algorithm::starts_with;
using namespace dcp;
-Package::Package (boost::filesystem::path directory)
+PackageBase::PackageBase (boost::filesystem::path directory)
{
if (!boost::filesystem::exists (directory)) {
boost::filesystem::create_directories (directory);
@@ -44,7 +46,7 @@ Package::Package (boost::filesystem::path directory)
}
list<shared_ptr<Asset> >
-Package::read_assetmap (bool keep_going, ReadErrors* errors) const
+PackageBase::read_assetmap (bool keep_going, ReadErrors* errors) const
{
boost::filesystem::path asset_map_file;
if (boost::filesystem::exists (_directory / "ASSETMAP")) {
@@ -116,3 +118,108 @@ Package::read_assetmap (bool keep_going, ReadErrors* errors) const
return assets;
}
+
+
+/** Write the VOLINDEX file.
+ * @param standard DCP standard to use (INTEROP or SMPTE)
+ */
+void
+PackageBase::write_volindex (Standard standard) const
+{
+ boost::filesystem::path p = _directory;
+ switch (standard) {
+ case DCP_INTEROP:
+ p /= "VOLINDEX";
+ break;
+ case DCP_SMPTE:
+ p /= "VOLINDEX.xml";
+ break;
+ case IMP:
+ /* XXX */
+ DCP_ASSERT (false);
+ break;
+ }
+
+ xmlpp::Document doc;
+ xmlpp::Element* root = 0;
+
+ switch (standard) {
+ case DCP_INTEROP:
+ root = doc.create_root_node ("VolumeIndex", "http://www.digicine.com/PROTO-ASDCP-AM-20040311#");
+ break;
+ case DCP_SMPTE:
+ case IMP:
+ root = doc.create_root_node ("VolumeIndex", "http://www.smpte-ra.org/schemas/429-9/2007/AM");
+ break;
+ }
+
+ root->add_child("Index")->add_child_text ("1");
+ doc.write_to_file (p.string (), "UTF-8");
+}
+
+void
+PackageBase::write_assetmap (Standard standard, string pkl_uuid, int pkl_length, dcp::XMLMetadata metadata) const
+{
+ boost::filesystem::path p = _directory;
+
+ switch (standard) {
+ case DCP_INTEROP:
+ p /= "ASSETMAP";
+ break;
+ case DCP_SMPTE:
+ case IMP:
+ p /= "ASSETMAP.xml";
+ break;
+ }
+
+ xmlpp::Document doc;
+ xmlpp::Element* root = 0;
+
+ switch (standard) {
+ case DCP_INTEROP:
+ root = doc.create_root_node ("AssetMap", "http://www.digicine.com/PROTO-ASDCP-AM-20040311#");
+ break;
+ case DCP_SMPTE:
+ case IMP:
+ root = doc.create_root_node ("AssetMap", "http://www.smpte-ra.org/schemas/429-9/2007/AM");
+ break;
+ }
+
+ root->add_child("Id")->add_child_text ("urn:uuid:" + make_uuid());
+ root->add_child("AnnotationText")->add_child_text ("Created by " + metadata.creator);
+
+ switch (standard) {
+ case DCP_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);
+ break;
+ case DCP_SMPTE:
+ case IMP:
+ 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;
+ }
+
+ xmlpp::Node* asset_list = root->add_child ("AssetList");
+
+ xmlpp::Node* asset = asset_list->add_child ("Asset");
+ asset->add_child("Id")->add_child_text ("urn:uuid:" + pkl_uuid);
+ asset->add_child("PackingList")->add_child_text ("true");
+ xmlpp::Node* chunk_list = asset->add_child ("ChunkList");
+ xmlpp::Node* chunk = chunk_list->add_child ("Chunk");
+ chunk->add_child("Path")->add_child_text ("pkl_" + pkl_uuid + ".xml");
+ chunk->add_child("VolumeIndex")->add_child_text ("1");
+ chunk->add_child("Offset")->add_child_text ("0");
+ chunk->add_child("Length")->add_child_text (raw_convert<string> (pkl_length));
+
+ BOOST_FOREACH (shared_ptr<dcp::Asset> i, assets ()) {
+ i->write_to_assetmap (asset_list, _directory);
+ }
+
+ /* This must not be the _formatted version otherwise signature digests will be wrong */
+ doc.write_to_file (p.string (), "UTF-8");
+}
diff --git a/src/package_base.h b/src/package_base.h
new file mode 100644
index 00000000..090d9955
--- /dev/null
+++ b/src/package_base.h
@@ -0,0 +1,62 @@
+/*
+ Copyright (C) 2012-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.
+
+*/
+
+#ifndef LIBDCP_PACKAGE_BASE_H
+#define LIBDCP_PACKAGE_BASE_H
+
+#include "exceptions.h"
+#include "types.h"
+#include "metadata.h"
+#include <boost/filesystem.hpp>
+
+namespace dcp {
+
+class Asset;
+
+class PackageBase
+{
+public:
+ PackageBase (boost::filesystem::path directory);
+
+ typedef std::list<boost::shared_ptr<PackageReadError> > ReadErrors;
+
+ virtual std::list<boost::shared_ptr<Asset> > assets () const = 0;
+
+protected:
+
+ virtual boost::shared_ptr<Asset> xml_asset_factory (boost::filesystem::path file, std::string root) const = 0;
+ virtual boost::shared_ptr<Asset> mxf_asset_factory (boost::filesystem::path file) const = 0;
+
+ std::list<boost::shared_ptr<Asset> > read_assetmap (bool keep_going, ReadErrors* errors) const;
+
+ void write_volindex (Standard standard) const;
+
+ /** Write the ASSETMAP file.
+ * @param pkl_uuid UUID of our PKL.
+ * @param pkl_length Length of our PKL in bytes.
+ */
+ void write_assetmap (Standard standard, std::string pkl_uuid, int pkl_length, XMLMetadata metadata) const;
+
+ /** the directory that the package is in */
+ boost::filesystem::path _directory;
+};
+
+}
+
+#endif
diff --git a/src/wscript b/src/wscript
index ff722325..8442c6de 100644
--- a/src/wscript
+++ b/src/wscript
@@ -51,7 +51,7 @@ def build(bld):
asset_writer.cc
object.cc
openjpeg_image.cc
- package.cc
+ package_base.cc
picture_asset.cc
picture_asset_writer.cc
reel.cc