summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cscript25
-rw-r--r--examples/wscript2
-rw-r--r--src/compose.hpp393
-rw-r--r--src/cpl.cc20
-rw-r--r--src/subtitle_asset.cc1
-rw-r--r--src/subtitle_asset.h11
-rw-r--r--test/rewrite_subs.cc1
-rw-r--r--test/wscript6
-rw-r--r--tools/wscript4
-rw-r--r--wscript2
10 files changed, 441 insertions, 24 deletions
diff --git a/cscript b/cscript
index 5413fdbc..23dea9cd 100644
--- a/cscript
+++ b/cscript
@@ -1,17 +1,28 @@
import os
-def build(env, target):
- cmd = './waf configure --prefix=%s' % env.work_dir_cscript()
+def dependencies(target):
+ if target.platform == 'windows':
+ return ()
+ else:
+ # XXX: should be some versions in here
+ return (('libcxml', None), ('openjpeg-cdist', None))
+
+def build(target):
+ cmd = './waf configure --prefix=%s' % target.work_dir_cscript()
if target.platform == 'linux':
- cmd += ' --static-libdcp --static-openjpeg'
+ cmd += ' --static'
elif target.platform == 'windows':
cmd += ' --target-windows'
elif target.platform == 'osx':
cmd += ' --osx'
- env.command(cmd)
- env.command('./waf build install')
-def make_doxygen(env):
+ if target.debug:
+ cmd += ' --enable-debug'
+
+ target.command(cmd)
+ target.command('./waf build install')
+
+def make_doxygen(target):
os.makedirs('build/doc')
- env.command('doxygen')
+ target.command('doxygen')
return os.path.abspath('build/doc/html')
diff --git a/examples/wscript b/examples/wscript
index 46d3287b..05cca98f 100644
--- a/examples/wscript
+++ b/examples/wscript
@@ -2,7 +2,7 @@ def build(bld):
obj = bld(features = 'cxx cxxprogram')
obj.name = 'examples'
obj.use = 'libdcp'
- obj.uselib = 'OPENJPEG'
+ obj.uselib = 'OPENJPEG CXML'
obj.source = 'make_dcp.cc'
obj.target = 'make_dcp'
obj.install_path = ''
diff --git a/src/compose.hpp b/src/compose.hpp
new file mode 100644
index 00000000..b3f410c8
--- /dev/null
+++ b/src/compose.hpp
@@ -0,0 +1,393 @@
+/* Defines String::compose(fmt, arg...) for easy, i18n-friendly
+ * composition of strings.
+ *
+ * Version 1.0.
+ *
+ * Copyright (c) 2002 Ole Laursen <olau@hardworking.dk>.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ */
+
+//
+// Basic usage is like
+//
+// std::cout << String::compose("This is a %1x%2 matrix.", rows, cols);
+//
+// See http://www.cs.aau.dk/~olau/compose/ or the included README.compose for
+// more details.
+//
+
+#ifndef STRING_COMPOSE_H
+#define STRING_COMPOSE_H
+
+#include <sstream>
+#include <string>
+#include <list>
+#include <map> // for multimap
+
+namespace StringPrivate
+{
+ // the actual composition class - using string::compose is cleaner, so we
+ // hide it here
+ class Composition
+ {
+ public:
+ // initialize and prepare format string on the form "text %1 text %2 etc."
+ explicit Composition(std::string fmt);
+
+ // supply an replacement argument starting from %1
+ template <typename T>
+ Composition &arg(const T &obj);
+
+ // compose and return string
+ std::string str() const;
+
+ private:
+ std::ostringstream os;
+ int arg_no;
+
+ // we store the output as a list - when the output string is requested, the
+ // list is concatenated to a string; this way we can keep iterators into
+ // the list instead of into a string where they're possibly invalidated on
+ // inserting a specification string
+ typedef std::list<std::string> output_list;
+ output_list output;
+
+ // the initial parse of the format string fills in the specification map
+ // with positions for each of the various %?s
+ typedef std::multimap<int, output_list::iterator> specification_map;
+ specification_map specs;
+ };
+
+ // helper for converting spec string numbers
+ inline int char_to_int(char c)
+ {
+ switch (c) {
+ case '0': return 0;
+ case '1': return 1;
+ case '2': return 2;
+ case '3': return 3;
+ case '4': return 4;
+ case '5': return 5;
+ case '6': return 6;
+ case '7': return 7;
+ case '8': return 8;
+ case '9': return 9;
+ default: return -1000;
+ }
+ }
+
+ inline bool is_number(int n)
+ {
+ switch (n) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+
+ // implementation of class Composition
+ template <typename T>
+ inline Composition &Composition::arg(const T &obj)
+ {
+ os << obj;
+
+ std::string rep = os.str();
+
+ if (!rep.empty()) { // manipulators don't produce output
+ for (specification_map::const_iterator i = specs.lower_bound(arg_no),
+ end = specs.upper_bound(arg_no); i != end; ++i) {
+ output_list::iterator pos = i->second;
+ ++pos;
+
+ output.insert(pos, rep);
+ }
+
+ os.str(std::string());
+ //os.clear();
+ ++arg_no;
+ }
+
+ return *this;
+ }
+
+ inline Composition::Composition(std::string fmt)
+ : arg_no(1)
+ {
+ std::string::size_type b = 0, i = 0;
+
+ // fill in output with the strings between the %1 %2 %3 etc. and
+ // fill in specs with the positions
+ while (i < fmt.length()) {
+ if (fmt[i] == '%' && i + 1 < fmt.length()) {
+ if (fmt[i + 1] == '%') { // catch %%
+ fmt.replace(i, 2, "%");
+ ++i;
+ }
+ else if (is_number(fmt[i + 1])) { // aha! a spec!
+ // save string
+ output.push_back(fmt.substr(b, i - b));
+
+ int n = 1; // number of digits
+ int spec_no = 0;
+
+ do {
+ spec_no += char_to_int(fmt[i + n]);
+ spec_no *= 10;
+ ++n;
+ } while (i + n < fmt.length() && is_number(fmt[i + n]));
+
+ spec_no /= 10;
+ output_list::iterator pos = output.end();
+ --pos; // safe since we have just inserted a string>
+
+ specs.insert(specification_map::value_type(spec_no, pos));
+
+ // jump over spec string
+ i += n;
+ b = i;
+ }
+ else
+ ++i;
+ }
+ else
+ ++i;
+ }
+
+ if (i - b > 0) // add the rest of the string
+ output.push_back(fmt.substr(b, i - b));
+ }
+
+ inline std::string Composition::str() const
+ {
+ // assemble string
+ std::string str;
+
+ for (output_list::const_iterator i = output.begin(), end = output.end();
+ i != end; ++i)
+ str += *i;
+
+ return str;
+ }
+}
+
+// now for the real thing(s)
+namespace String
+{
+ // a series of functions which accept a format string on the form "text %1
+ // more %2 less %3" and a number of templated parameters and spits out the
+ // composited string
+ template <typename T1>
+ inline std::string compose(const std::string &fmt, const T1 &o1)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1);
+ return c.str();
+ }
+
+ template <typename T1, typename T2>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4, const T5 &o5)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4, const T5 &o5, const T6 &o6)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4, const T5 &o5, const T6 &o6,
+ const T7 &o7)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4, const T5 &o5, const T6 &o6,
+ const T7 &o7, const T8 &o8)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4, const T5 &o5, const T6 &o6,
+ const T7 &o7, const T8 &o8, const T9 &o9)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4, const T5 &o5, const T6 &o6,
+ const T7 &o7, const T8 &o8, const T9 &o9,
+ const T10 &o10)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
+ .arg(o10);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4, const T5 &o5, const T6 &o6,
+ const T7 &o7, const T8 &o8, const T9 &o9,
+ const T10 &o10, const T11 &o11)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
+ .arg(o10).arg(o11);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4, const T5 &o5, const T6 &o6,
+ const T7 &o7, const T8 &o8, const T9 &o9,
+ const T10 &o10, const T11 &o11, const T12 &o12)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
+ .arg(o10).arg(o11).arg(o12);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4, const T5 &o5, const T6 &o6,
+ const T7 &o7, const T8 &o8, const T9 &o9,
+ const T10 &o10, const T11 &o11, const T12 &o12,
+ const T13 &o13)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
+ .arg(o10).arg(o11).arg(o12).arg(o13);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4, const T5 &o5, const T6 &o6,
+ const T7 &o7, const T8 &o8, const T9 &o9,
+ const T10 &o10, const T11 &o11, const T12 &o12,
+ const T13 &o13, const T14 &o14)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
+ .arg(o10).arg(o11).arg(o12).arg(o13).arg(o14);
+ return c.str();
+ }
+
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14,
+ typename T15>
+ inline std::string compose(const std::string &fmt,
+ const T1 &o1, const T2 &o2, const T3 &o3,
+ const T4 &o4, const T5 &o5, const T6 &o6,
+ const T7 &o7, const T8 &o8, const T9 &o9,
+ const T10 &o10, const T11 &o11, const T12 &o12,
+ const T13 &o13, const T14 &o14, const T15 &o15)
+ {
+ StringPrivate::Composition c(fmt);
+ c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
+ .arg(o10).arg(o11).arg(o12).arg(o13).arg(o14).arg(o15);
+ return c.str();
+ }
+}
+
+
+#endif // STRING_COMPOSE_H
diff --git a/src/cpl.cc b/src/cpl.cc
index 1ca64f88..c59fc853 100644
--- a/src/cpl.cc
+++ b/src/cpl.cc
@@ -28,6 +28,8 @@
#include "reel.h"
#include "metadata.h"
#include "encryption.h"
+#include "exceptions.h"
+#include "compose.hpp"
using std::string;
using std::stringstream;
@@ -175,7 +177,7 @@ CPL::add_reel (shared_ptr<const Reel> reel)
}
void
-CPL::write_xml (shared_ptr<Encryption> crypt, XMLMetadata const & metadata) const
+CPL::write_xml (XMLMetadata const & metadata, shared_ptr<Encryption> crypt) const
{
boost::filesystem::path p;
p /= _directory;
@@ -279,17 +281,19 @@ CPL::equals (CPL const & other, EqualityOptions opt, boost::function<void (NoteT
}
if (_fps != other._fps) {
- note (ERROR, "frames per second differ");
+ note (ERROR, String::compose ("frames per second differ (%1 vs %2)", _fps, other._fps));
return false;
}
if (_length != other._length) {
- note (ERROR, "lengths differ");
+ stringstream s;
+ s << "lengths differ (" << _length << " cf " << other._length << ")";
+ note (ERROR, String::compose ("lengths differ (%1 vs %2)", _length, other._length));
return false;
}
if (_reels.size() != other._reels.size()) {
- note (ERROR, "reel counts differ");
+ note (ERROR, String::compose ("reel counts differ (%1 vs %2)", _reels.size(), other._reels.size()));
return false;
}
@@ -329,10 +333,10 @@ CPL::make_kdm (
authenticated_public->set_attribute("Id", "ID_AuthenticatedPublic");
xmlAddID (0, doc->cobj(), (const xmlChar *) "ID_AuthenticatedPublic", authenticated_public->get_attribute("Id")->cobj());
- authenticated_public->add_child("MessageId")->add_child_text("urn:uuid:" + make_uuid());
- authenticated_public->add_child("MessageType")->add_child_text("http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type");
- authenticated_public->add_child("AnnotationText")->add_child_text(Metadata::instance()->product_name);
- authenticated_public->add_child("IssueDate")->add_child_text(Metadata::instance()->issue_date);
+ authenticated_public->add_child("MessageId")->add_child_text ("urn:uuid:" + make_uuid());
+ authenticated_public->add_child("MessageType")->add_child_text ("http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type");
+ authenticated_public->add_child("AnnotationText")->add_child_text (MXFMetadata::instance()->product_name);
+ authenticated_public->add_child("IssueDate")->add_child_text (MXFMetadata::instance()->issue_date);
{
xmlpp::Element* signer = authenticated_public->add_child("Signer");
diff --git a/src/subtitle_asset.cc b/src/subtitle_asset.cc
index 80cc1ea6..7f4d47d0 100644
--- a/src/subtitle_asset.cc
+++ b/src/subtitle_asset.cc
@@ -22,6 +22,7 @@
#include <boost/algorithm/string.hpp>
#include <libxml++/nodes/element.h>
#include "subtitle_asset.h"
+#include "parse/subtitle.h"
#include "util.h"
#include "xml.h"
diff --git a/src/subtitle_asset.h b/src/subtitle_asset.h
index 2da1ce7b..a76a3076 100644
--- a/src/subtitle_asset.h
+++ b/src/subtitle_asset.h
@@ -17,14 +17,21 @@
*/
+#include <libcxml/cxml.h>
#include "asset.h"
-#include "xml.h"
#include "dcp_time.h"
-#include "parse/subtitle.h"
namespace libdcp
{
+namespace parse
+{
+ class Font;
+ class Text;
+ class Subtitle;
+ class LoadFont;
+}
+
class Subtitle
{
public:
diff --git a/test/rewrite_subs.cc b/test/rewrite_subs.cc
index adb9f6b4..8c055d9e 100644
--- a/test/rewrite_subs.cc
+++ b/test/rewrite_subs.cc
@@ -3,6 +3,7 @@
#include "cpl.h"
#include "reel.h"
#include "subtitle_asset.h"
+#include "exceptions.h"
using std::cout;
using std::cerr;
diff --git a/test/wscript b/test/wscript
index d22875e9..2892bf9e 100644
--- a/test/wscript
+++ b/test/wscript
@@ -18,7 +18,7 @@ def configure(conf):
def build(bld):
obj = bld(features = 'cxx cxxprogram')
obj.name = 'tests'
- obj.uselib = 'BOOST_TEST OPENJPEG XMLSEC1'
+ obj.uselib = 'BOOST_TEST OPENJPEG CXML XMLSEC1'
obj.use = 'libdcp'
obj.source = 'tests.cc'
obj.target = 'tests'
@@ -26,7 +26,7 @@ def build(bld):
obj = bld(features = 'cxx cxxprogram')
obj.name = 'subs_in_out'
- obj.uselib = 'BOOST_TEST OPENJPEG'
+ obj.uselib = 'BOOST_TEST OPENJPEG CXML'
obj.use = 'libdcp'
obj.source = 'subs_in_out.cc'
obj.target = 'subs_in_out'
@@ -34,7 +34,7 @@ def build(bld):
obj = bld(features = 'cxx cxxprogram')
obj.name = 'rewrite_subs'
- obj.uselib = 'BOOST_TEST OPENJPEG'
+ obj.uselib = 'BOOST_TEST OPENJPEG CXML'
obj.use = 'libdcp'
obj.source = 'rewrite_subs.cc'
obj.target = 'rewrite_subs'
diff --git a/tools/wscript b/tools/wscript
index a79b3c9d..e4a32534 100644
--- a/tools/wscript
+++ b/tools/wscript
@@ -1,13 +1,13 @@
def build(bld):
obj = bld(features = 'cxx cxxprogram')
obj.use = ['libdcp']
- obj.uselib = 'OPENJPEG'
+ obj.uselib = 'OPENJPEG CXML'
obj.source = 'dcpdiff.cc'
obj.target = 'dcpdiff'
obj = bld(features = 'cxx cxxprogram')
obj.use = ['libdcp']
- obj.uselib = 'OPENJPEG'
+ obj.uselib = 'OPENJPEG CXML'
obj.source = 'dcpinfo.cc'
obj.target = 'dcpinfo'
diff --git a/wscript b/wscript
index 3bc5bd82..80044104 100644
--- a/wscript
+++ b/wscript
@@ -2,7 +2,7 @@ import subprocess
import os
APPNAME = 'libdcp'
-VERSION = '0.54pre'
+VERSION = '0.55pre'
def options(opt):
opt.load('compiler_cxx')