summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2017-01-11 10:57:09 +0000
committerCarl Hetherington <cth@carlh.net>2017-01-11 10:58:11 +0000
commitf528fc50162db6fcecbaa2cd6121c7ee86a82777 (patch)
treeb5dec339a41dee33fb3ddbc31b1054e0008feffc /src
parentefb00e9649aa03a2c12bb6a63c5e7efdfd99506a (diff)
Replace DCP parser with basic version that uses libdcp.libdcp-again
Diffstat (limited to 'src')
-rw-r--r--src/dcp/font.cc76
-rw-r--r--src/dcp/font.h58
-rw-r--r--src/dcp/interop_load_font.cc56
-rw-r--r--src/dcp/interop_load_font.h43
-rw-r--r--src/dcp/load_font.h38
-rw-r--r--src/dcp/smpte_load_font.cc31
-rw-r--r--src/dcp/smpte_load_font.h41
-rw-r--r--src/dcp/subtitle.cc119
-rw-r--r--src/dcp/subtitle.h58
-rw-r--r--src/dcp/text.cc65
-rw-r--r--src/dcp/text.h57
-rw-r--r--src/dcp/wscript1
-rw-r--r--src/dcp_reader.cc165
-rw-r--r--src/dcp_reader.h30
-rw-r--r--src/font_size.cc8
-rw-r--r--src/font_size.h1
-rw-r--r--src/interop_dcp_reader.cc42
-rw-r--r--src/interop_dcp_reader.h38
-rw-r--r--src/reader_factory.cc16
-rw-r--r--src/smpte_dcp_reader.cc64
-rw-r--r--src/smpte_dcp_reader.h37
-rw-r--r--src/wscript9
22 files changed, 106 insertions, 947 deletions
diff --git a/src/dcp/font.cc b/src/dcp/font.cc
deleted file mode 100644
index 64787c7..0000000
--- a/src/dcp/font.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- Copyright (C) 2012-2014 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 "font.h"
-#include "text.h"
-#include <libcxml/cxml.h>
-#include <boost/foreach.hpp>
-
-using std::string;
-using std::list;
-using boost::shared_ptr;
-using boost::optional;
-using namespace sub;
-
-dcp::Font::Font (cxml::ConstNodePtr node)
-{
- id = node->optional_string_attribute ("Id");
- size = node->optional_number_attribute<int64_t> ("Size").get_value_or (0);
- italic = node->optional_bool_attribute ("Italic");
- optional<string> c = node->optional_string_attribute ("Color");
- if (c) {
- colour = Colour::from_argb_hex (c.get ());
- }
- optional<string> const e = node->optional_string_attribute ("Effect");
- if (e) {
- effect = string_to_effect (e.get ());
- }
- c = node->optional_string_attribute ("EffectColor");
- if (c) {
- effect_colour = Colour::from_argb_hex (c.get ());
- }
-}
-
-dcp::Font::Font (std::list<boost::shared_ptr<Font> > const & font_nodes)
- : size (0)
- , italic (false)
- , colour (Colour::from_argb_hex ("FFFFFFFF"))
- , effect_colour (Colour::from_argb_hex ("FFFFFFFF"))
-{
- for (list<shared_ptr<Font> >::const_iterator i = font_nodes.begin(); i != font_nodes.end(); ++i) {
- if ((*i)->id) {
- id = (*i)->id;
- }
- if ((*i)->size != 0) {
- size = (*i)->size;
- }
- if ((*i)->italic) {
- italic = (*i)->italic.get ();
- }
- if ((*i)->colour) {
- colour = (*i)->colour.get ();
- }
- if ((*i)->effect) {
- effect = (*i)->effect.get ();
- }
- if ((*i)->effect_colour) {
- effect_colour = (*i)->effect_colour.get ();
- }
- }
-}
diff --git a/src/dcp/font.h b/src/dcp/font.h
deleted file mode 100644
index a1d8223..0000000
--- a/src/dcp/font.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- Copyright (C) 2012-2015 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.
-
-*/
-
-/** @file src/dcp/font.h
- * @brief Font class
- */
-
-#include "../colour.h"
-#include "../effect.h"
-#include "subtitle.h"
-#include <libcxml/cxml.h>
-#include <boost/shared_ptr.hpp>
-#include <boost/optional.hpp>
-#include <list>
-
-namespace sub {
-namespace dcp {
-
-/** @class Font
- * @brief Helper class for parsing subtitle XML.
- */
-class Font
-{
-public:
- Font ()
- : size (0)
- {}
-
- Font (cxml::ConstNodePtr node);
- Font (std::list<boost::shared_ptr<Font> > const & font_nodes);
-
- boost::optional<std::string> id;
- int size;
- boost::optional<bool> italic;
- boost::optional<Colour> colour;
- boost::optional<Effect> effect;
- boost::optional<Colour> effect_colour;
-};
-
-}
-
-}
diff --git a/src/dcp/interop_load_font.cc b/src/dcp/interop_load_font.cc
deleted file mode 100644
index 2ee3ee9..0000000
--- a/src/dcp/interop_load_font.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- Copyright (C) 2012-2014 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 "interop_load_font.h"
-#include <libcxml/cxml.h>
-
-using std::string;
-using boost::shared_ptr;
-using boost::optional;
-using namespace sub;
-
-dcp::InteropLoadFont::InteropLoadFont (string id_, string uri_)
- : LoadFont (id_)
- , uri (uri_)
-{
-
-}
-
-dcp::InteropLoadFont::InteropLoadFont (cxml::ConstNodePtr node)
-{
- optional<string> x = node->optional_string_attribute ("Id");
- if (!x) {
- x = node->optional_string_attribute ("ID");
- }
- id = x.get_value_or ("");
-
- uri = node->string_attribute ("URI");
-}
-
-bool
-dcp::operator== (InteropLoadFont const & a, InteropLoadFont const & b)
-{
- return a.id == b.id && a.uri == b.uri;
-}
-
-bool
-dcp::operator!= (InteropLoadFont const & a, InteropLoadFont const & b)
-{
- return !(a == b);
-}
diff --git a/src/dcp/interop_load_font.h b/src/dcp/interop_load_font.h
deleted file mode 100644
index 373b26c..0000000
--- a/src/dcp/interop_load_font.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- Copyright (C) 2012-2015 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 "load_font.h"
-#include <libcxml/cxml.h>
-#include <boost/shared_ptr.hpp>
-#include <boost/optional.hpp>
-
-namespace sub {
-namespace dcp {
-
-class InteropLoadFont : public LoadFont
-{
-public:
- InteropLoadFont () {}
- InteropLoadFont (std::string id, std::string uri);
- InteropLoadFont (cxml::ConstNodePtr node);
-
- std::string uri;
-};
-
-bool operator== (InteropLoadFont const & a, InteropLoadFont const & b);
-bool operator!= (InteropLoadFont const & a, InteropLoadFont const & b);
-
-}
-
-}
diff --git a/src/dcp/load_font.h b/src/dcp/load_font.h
deleted file mode 100644
index f269c87..0000000
--- a/src/dcp/load_font.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- Copyright (C) 2012-2015 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 <string>
-
-namespace sub {
-namespace dcp {
-
-class LoadFont
-{
-public:
- LoadFont () {}
- LoadFont (std::string id_)
- : id (id_)
- {}
-
- std::string id;
-};
-
-}
-
-}
diff --git a/src/dcp/smpte_load_font.cc b/src/dcp/smpte_load_font.cc
deleted file mode 100644
index d433cbf..0000000
--- a/src/dcp/smpte_load_font.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- Copyright (C) 2012-2015 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 "smpte_load_font.h"
-#include <libcxml/cxml.h>
-
-using std::string;
-using boost::shared_ptr;
-using namespace sub;
-
-dcp::SMPTELoadFont::SMPTELoadFont (shared_ptr<const cxml::Node> node)
- : LoadFont (node->string_attribute ("ID"))
-{
- urn = node->content().substr (9);
-}
diff --git a/src/dcp/smpte_load_font.h b/src/dcp/smpte_load_font.h
deleted file mode 100644
index aba05c8..0000000
--- a/src/dcp/smpte_load_font.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- Copyright (C) 2012-2014 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 "load_font.h"
-#include <boost/shared_ptr.hpp>
-#include <boost/optional.hpp>
-
-namespace cxml {
- class Node;
-}
-
-namespace sub {
-namespace dcp {
-
-class SMPTELoadFont : public LoadFont
-{
-public:
- SMPTELoadFont (boost::shared_ptr<const cxml::Node> node);
-
- std::string urn;
-};
-
-}
-
-}
diff --git a/src/dcp/subtitle.cc b/src/dcp/subtitle.cc
deleted file mode 100644
index 68ca559..0000000
--- a/src/dcp/subtitle.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- Copyright (C) 2012-2015 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 "../exceptions.h"
-#include "../raw_convert.h"
-#include "subtitle.h"
-#include <libcxml/cxml.h>
-#include <boost/lexical_cast.hpp>
-#include <boost/algorithm/string.hpp>
-
-using std::string;
-using std::vector;
-using std::list;
-using boost::optional;
-using boost::shared_ptr;
-using boost::lexical_cast;
-using boost::is_any_of;
-using namespace sub;
-
-dcp::Subtitle::Subtitle (boost::shared_ptr<const cxml::Node> node, optional<int> tcr)
-{
- if (tcr) {
- in = smpte_time (node, "TimeIn", tcr.get ()).get ();
- out = smpte_time (node, "TimeOut", tcr.get ()).get ();
- } else {
- in = interop_time (node, "TimeIn").get ();
- out = interop_time (node, "TimeOut").get ();
- }
-
- if (tcr) {
- fade_up_time = smpte_time (node, "FadeUpTime", tcr.get ()).get_value_or (Time::from_hmsf (0, 0, 0, 2, Rational (tcr.get(), 1)));
- fade_down_time = smpte_time (node, "FadeDownTime", tcr.get ()).get_value_or (Time::from_hmsf (0, 0, 0, 2, Rational (tcr.get (), 1)));
- } else {
- fade_up_time = interop_time (node, "FadeUpTime").get_value_or (Time::from_hms (0, 0, 0, 80));
- if (fade_up_time > Time::from_hms (0, 0, 8, 0)) {
- fade_up_time = Time::from_hms (0, 0, 8, 0);
- }
- fade_down_time = interop_time (node, "FadeDownTime").get_value_or (Time::from_hms (0, 0, 0, 80));
- if (fade_down_time > Time::from_hms (0, 0, 8, 0)) {
- fade_down_time = Time::from_hms (0, 0, 8, 0);
- }
- }
-}
-
-optional<Time>
-dcp::Subtitle::smpte_time (shared_ptr<const cxml::Node> node, string name, int tcr)
-{
- optional<string> u = node->optional_string_attribute (name);
- if (!u) {
- return optional<Time> ();
- }
-
- vector<string> b;
- split (b, u.get (), is_any_of (":"));
- if (b.size() != 4) {
- boost::throw_exception (DCPError ("unrecognised time specification " + u.get ()));
- }
-
- return Time::from_hmsf (
- raw_convert<int> (b[0]),
- raw_convert<int> (b[1]),
- raw_convert<int> (b[2]),
- raw_convert<int> (b[3]),
- Rational (tcr, 1)
- );
-}
-
-optional<Time>
-dcp::Subtitle::interop_time (shared_ptr<const cxml::Node> node, string name)
-{
- optional<string> u = node->optional_string_attribute (name);
- if (!u) {
- return optional<Time> ();
- }
-
- if (u.get().find (":") != string::npos) {
- /* HH:MM:SS:TTT or HH:MM:SS.sss */
- vector<string> b;
- split (b, u.get(), is_any_of (":."));
- if (b.size() != 4) {
- boost::throw_exception (DCPError ("unrecognised time specification " + u.get ()));
- }
-
- if (u.get().find (".") != string::npos) {
- return Time::from_hms (
- raw_convert<int> (b[0]),
- raw_convert<int> (b[1]),
- raw_convert<int> (b[2]),
- rint (raw_convert<double> ("." + b[3]) * 1000)
- );
- } else {
- return Time::from_hms (
- raw_convert<int> (b[0]),
- raw_convert<int> (b[1]),
- raw_convert<int> (b[2]),
- raw_convert<int> (b[3]) * 4
- );
- }
- } else {
- return Time::from_hms (0, 0, 0, raw_convert<int> (u.get ()) * 4);
- }
-}
-
diff --git a/src/dcp/subtitle.h b/src/dcp/subtitle.h
deleted file mode 100644
index 672dc9a..0000000
--- a/src/dcp/subtitle.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- Copyright (C) 2012-2014 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 LIBSUB_DCP_SUBTITLE_H
-#define LIBSUB_DCP_SUBTITLE_H
-
-#include "../sub_time.h"
-#include <boost/shared_ptr.hpp>
-#include <boost/optional.hpp>
-#include <list>
-
-namespace cxml {
- class Node;
-}
-
-namespace sub {
-namespace dcp {
-
-class Font;
-class Text;
-
-class Subtitle
-{
-public:
- Subtitle () {}
- Subtitle (boost::shared_ptr<const cxml::Node> node, boost::optional<int> tcr);
-
- Time in;
- Time out;
- Time fade_up_time;
- Time fade_down_time;
-
-private:
- boost::optional<Time> smpte_time (boost::shared_ptr<const cxml::Node> node, std::string name, int tcr);
- boost::optional<Time> interop_time (boost::shared_ptr<const cxml::Node> node, std::string name);
-};
-
-}
-
-}
-
-#endif
diff --git a/src/dcp/text.cc b/src/dcp/text.cc
deleted file mode 100644
index 313ebdd..0000000
--- a/src/dcp/text.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- Copyright (C) 2012-2014 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.
-
-*/
-
-/** @file src/text.cc
- * @brief Text class for parsing DCP subtitle XML.
- */
-
-#include "../xml.h"
-#include "text.h"
-#include "font.h"
-#include <libcxml/cxml.h>
-#include <boost/foreach.hpp>
-
-using std::string;
-using std::list;
-using boost::shared_ptr;
-using boost::optional;
-using namespace sub;
-
-/** Read a &lt;Text&gt; node from a subtitle XML file, noting its contents
- * in this object's member variables.
- * @param node Node to read.
- */
-dcp::Text::Text (boost::shared_ptr<const cxml::Node> node)
- : v_align (CENTRE_OF_SCREEN)
-{
- optional<float> x = node->optional_number_attribute<float> ("VPosition");
- if (!x) {
- x = node->number_attribute<float> ("Vposition");
- }
- v_position = x.get ();
-
- optional<string> v = node->optional_string_attribute ("VAlign");
- if (!v) {
- v = node->optional_string_attribute ("Valign");
- }
-
- if (v) {
- if (v.get() == "top") {
- v_align = TOP_OF_SCREEN;
- } else if (v.get() == "center") {
- v_align = CENTRE_OF_SCREEN;
- } else if (v.get() == "bottom") {
- v_align = BOTTOM_OF_SCREEN;
- } else {
- boost::throw_exception (DCPError ("unknown subtitle valign type"));
- }
- }
-}
diff --git a/src/dcp/text.h b/src/dcp/text.h
deleted file mode 100644
index f2c5059..0000000
--- a/src/dcp/text.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- Copyright (C) 2012-2015 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.
-
-*/
-
-/** @file src/text.h
- * @brief Text class for parsing DCP subtitle XML.
- */
-
-#include "../vertical_reference.h"
-#include <boost/shared_ptr.hpp>
-#include <list>
-
-namespace cxml {
- class Node;
-}
-
-namespace sub {
-namespace dcp {
-
-class Font;
-
-/** @class Text
- * @brief Parser for Text nodes from subtitle XML.
- */
-class Text
-{
-public:
- /** Construct a default text node */
- Text ()
- : v_position (0)
- , v_align (TOP_OF_SCREEN)
- {}
-
- Text (boost::shared_ptr<const cxml::Node> node);
-
- float v_position;
- VerticalReference v_align;
-};
-
-}
-
-}
diff --git a/src/dcp/wscript b/src/dcp/wscript
deleted file mode 100644
index a70ef26..0000000
--- a/src/dcp/wscript
+++ /dev/null
@@ -1 +0,0 @@
-# This is a dummy just so my waft script works
diff --git a/src/dcp_reader.cc b/src/dcp_reader.cc
index 9727ef8..ed48ac8 100644
--- a/src/dcp_reader.cc
+++ b/src/dcp_reader.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2014-2017 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
@@ -18,97 +18,114 @@
*/
#include "dcp_reader.h"
-#include "vertical_reference.h"
-#include "xml.h"
-#include "util.h"
-#include "dcp/font.h"
-#include "dcp/text.h"
-#include "dcp/subtitle.h"
-#include <libcxml/cxml.h>
-#include <libxml++/libxml++.h>
-#include <iostream>
+#include "compose.hpp"
+#include "exceptions.h"
+#include <dcp/subtitle_string.h>
+#include <dcp/interop_subtitle_asset.h>
+#include <dcp/smpte_subtitle_asset.h>
+#include <boost/foreach.hpp>
+#include <boost/filesystem.hpp>
using std::list;
using std::cout;
using std::string;
+using std::exception;
using boost::shared_ptr;
using boost::optional;
using namespace sub;
-void
-DCPReader::parse_common (cxml::NodePtr root, optional<int> tcr)
+static Time
+dcp_to_sub_time (dcp::Time t)
{
- _reel_number = root->string_child ("ReelNumber");
- _language = root->string_child ("Language");
+ return Time::from_hms (t.h, t.m, t.s, t.e * 1000.0 / t.tcr);
+}
- ParseState parse_state;
- parse_node (root->node(), parse_state, tcr);
+static Colour
+dcp_to_sub_colour (dcp::Colour c)
+{
+ return Colour (c.r / 255.0, c.g / 255.0, c.b / 255.0);
}
-void
-DCPReader::parse_node (xmlpp::Node const * node, ParseState& parse_state, optional<int> tcr)
+DCPReader::DCPReader (boost::filesystem::path file)
{
- xmlpp::Node::NodeList children = node->get_children ();
- for (xmlpp::Node::NodeList::iterator i = children.begin(); i != children.end(); ++i) {
- xmlpp::ContentNode const * c = dynamic_cast<xmlpp::ContentNode const *> (*i);
- if (c) {
- maybe_add_subtitle (c->get_content (), parse_state);
- }
+ shared_ptr<dcp::SubtitleAsset> sc;
+ string interop_error;
+ string smpte_error;
+
+ try {
+ sc.reset (new dcp::InteropSubtitleAsset (file));
+ } catch (exception& e) {
+ interop_error = e.what ();
+ }
- xmlpp::Element* e = dynamic_cast<xmlpp::Element *> (*i);
- if (e) {
- cxml::NodePtr n (new cxml::Node (e));
- if (n->name() == "Font") {
- parse_state.font_nodes.push_back (shared_ptr<dcp::Font> (new dcp::Font (n)));
- parse_node (e, parse_state, tcr);
- parse_state.font_nodes.pop_back ();
- } else if (n->name() == "Text") {
- parse_state.text_nodes.push_back (shared_ptr<dcp::Text> (new dcp::Text (n)));
- parse_node (e, parse_state, tcr);
- parse_state.text_nodes.pop_back ();
- } else if (n->name() == "Subtitle") {
- parse_state.subtitle_nodes.push_back (shared_ptr<dcp::Subtitle> (new dcp::Subtitle (n, tcr)));
- parse_node (e, parse_state, tcr);
- parse_state.subtitle_nodes.pop_back ();
- } else if (n->name() == "SubtitleList") {
- parse_node (e, parse_state, tcr);
- }
+ if (!sc) {
+ try {
+ sc.reset (new dcp::SMPTESubtitleAsset (file));
+ } catch (exception& e) {
+ smpte_error = e.what();
}
}
-}
-void
-DCPReader::maybe_add_subtitle (string text, ParseState const & parse_state)
-{
- if (empty_or_white_space (text)) {
- return;
+ if (!sc) {
+ throw DCPError (String::compose ("Could not read subtitles (%1 / %2)", interop_error, smpte_error));
}
- if (parse_state.text_nodes.empty() || parse_state.subtitle_nodes.empty ()) {
- return;
- }
- dcp::Font effective_font (parse_state.font_nodes);
- dcp::Text effective_text (*parse_state.text_nodes.back ());
- dcp::Subtitle effective_subtitle (*parse_state.subtitle_nodes.back ());
-
- RawSubtitle rs;
-
- rs.text = text;
- rs.font = effective_font.id;
- rs.font_size.set_proportional (float (effective_font.size) / (72 * 11));
- rs.effect = effective_font.effect;
- rs.effect_colour = effective_font.effect_colour;
- rs.colour = effective_font.colour.get();
- rs.bold = false;
- rs.italic = effective_font.italic.get();
- rs.underline = false;
- rs.vertical_position.proportional = float (effective_text.v_position) / 100;
- rs.vertical_position.reference = effective_text.v_align;
- rs.from = effective_subtitle.in;
- rs.to = effective_subtitle.out;
- rs.fade_up = effective_subtitle.fade_up_time;
- rs.fade_down = effective_subtitle.fade_down_time;
-
- _subs.push_back (rs);
+ BOOST_FOREACH (dcp::SubtitleString const & i, sc->subtitles ()) {
+ RawSubtitle rs;
+ rs.text = i.text ();
+ rs.font = i.font ();
+ rs.font_size = FontSize::from_proportional (i.size() / (72.0 * 11.0));
+
+ switch (i.effect ()) {
+ case BORDER:
+ rs.effect = BORDER;
+ break;
+ case SHADOW:
+ rs.effect = SHADOW;
+ break;
+ default:
+ break;
+ }
+
+ rs.effect_colour = dcp_to_sub_colour (i.effect_colour());
+
+ rs.colour = dcp_to_sub_colour (i.colour());
+ rs.bold = i.bold ();
+ rs.italic = i.italic ();
+ rs.underline = i.underline ();
+
+ switch (i.h_align()) {
+ case dcp::HALIGN_LEFT:
+ rs.horizontal_position = LEFT;
+ break;
+ case dcp::HALIGN_CENTER:
+ rs.horizontal_position = CENTRE;
+ break;
+ case dcp::HALIGN_RIGHT:
+ rs.horizontal_position = RIGHT;
+ break;
+ }
+
+ rs.vertical_position.proportional = i.v_position();
+ switch (i.v_align()) {
+ case dcp::VALIGN_TOP:
+ rs.vertical_position.reference = TOP_OF_SCREEN;
+ break;
+ case dcp::VALIGN_CENTER:
+ rs.vertical_position.reference = CENTRE_OF_SCREEN;
+ break;
+ case dcp::VALIGN_BOTTOM:
+ rs.vertical_position.reference = BOTTOM_OF_SCREEN;
+ break;
+ }
+
+ rs.from = dcp_to_sub_time (i.in ());
+ rs.to = dcp_to_sub_time (i.out ());
+
+ rs.fade_up = dcp_to_sub_time (i.fade_up_time ());
+ rs.fade_down = dcp_to_sub_time (i.fade_down_time ());
+
+ _subs.push_back (rs);
+ }
}
diff --git a/src/dcp_reader.h b/src/dcp_reader.h
index 82a211c..8f49dfd 100644
--- a/src/dcp_reader.h
+++ b/src/dcp_reader.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2014-2017 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
@@ -21,41 +21,17 @@
#define LIBSUB_DCP_READER_H
#include "reader.h"
-#include <libcxml/cxml.h>
-#include <boost/shared_ptr.hpp>
#include <boost/filesystem.hpp>
namespace sub {
-namespace dcp {
- class Font;
- class Text;
- class Subtitle;
-}
-
/** @class DCPReader
* @brief A class which reads DCP subtitles.
*/
class DCPReader : public Reader
{
-protected:
-
- struct ParseState {
- std::list<boost::shared_ptr<dcp::Font> > font_nodes;
- std::list<boost::shared_ptr<dcp::Text> > text_nodes;
- std::list<boost::shared_ptr<dcp::Subtitle> > subtitle_nodes;
- };
-
- void parse_common (cxml::NodePtr root, boost::optional<int> tcr);
-
- std::string _id;
-
-private:
- void parse_node (xmlpp::Node const * node, ParseState& parse_state, boost::optional<int> tcr);
- void maybe_add_subtitle (std::string text, ParseState const & parse_state);
-
- std::string _reel_number;
- std::string _language;
+public:
+ DCPReader (boost::filesystem::path file);
};
}
diff --git a/src/font_size.cc b/src/font_size.cc
index 5e5fd4c..a208867 100644
--- a/src/font_size.cc
+++ b/src/font_size.cc
@@ -49,6 +49,14 @@ FontSize::from_points (int p)
return s;
}
+FontSize
+FontSize::from_proportional (float p)
+{
+ FontSize s;
+ s.set_proportional (p);
+ return s;
+}
+
bool
FontSize::specified () const
{
diff --git a/src/font_size.h b/src/font_size.h
index 2ff4a7c..4f49eb7 100644
--- a/src/font_size.h
+++ b/src/font_size.h
@@ -55,6 +55,7 @@ public:
int points (int screen_height_in_points) const;
static FontSize from_points (int p);
+ static FontSize from_proportional (float p);
private:
/** as a proportion of screen height */
diff --git a/src/interop_dcp_reader.cc b/src/interop_dcp_reader.cc
deleted file mode 100644
index 5751dcd..0000000
--- a/src/interop_dcp_reader.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- Copyright (C) 2014-2015 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 "interop_dcp_reader.h"
-#include "dcp/interop_load_font.h"
-#include "xml.h"
-#include "dcp/font.h"
-#include <libcxml/cxml.h>
-#include <boost/foreach.hpp>
-
-using std::list;
-using boost::shared_ptr;
-using boost::optional;
-using namespace sub;
-
-InteropDCPReader::InteropDCPReader (boost::filesystem::path file)
-{
- shared_ptr<cxml::Document> xml (new cxml::Document ("DCSubtitle"));
- xml->read_file (file);
- _id = xml->string_child ("SubtitleID");
-
- _movie_title = xml->string_child ("MovieTitle");
- _load_font_nodes = type_children<dcp::InteropLoadFont> (xml, "LoadFont");
-
- parse_common (xml, optional<int> ());
-}
diff --git a/src/interop_dcp_reader.h b/src/interop_dcp_reader.h
deleted file mode 100644
index 1b8b447..0000000
--- a/src/interop_dcp_reader.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- Copyright (C) 2014-2015 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 "dcp_reader.h"
-
-namespace sub {
-
-namespace dcp {
- class InteropLoadFont;
-}
-
-class InteropDCPReader : public DCPReader
-{
-public:
- InteropDCPReader (boost::filesystem::path file);
-
-private:
- std::string _movie_title;
- std::list<boost::shared_ptr<dcp::InteropLoadFont> > _load_font_nodes;
-};
-
-}
diff --git a/src/reader_factory.cc b/src/reader_factory.cc
index 6c0259d..5d38e4e 100644
--- a/src/reader_factory.cc
+++ b/src/reader_factory.cc
@@ -18,10 +18,9 @@
*/
#include "reader_factory.h"
-#include "interop_dcp_reader.h"
-#include "smpte_dcp_reader.h"
#include "stl_binary_reader.h"
#include "stl_text_reader.h"
+#include "dcp_reader.h"
#include <libxml++/libxml++.h>
#include <boost/algorithm/string.hpp>
#include <fstream>
@@ -39,21 +38,12 @@ sub::reader_factory (boost::filesystem::path file_name)
transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
if (ext == ".xml") {
- /* XXX: unfortunate API weakness in libcxml; we can't find out what a
- file's root node name is.
- */
- xmlpp::DomParser parser (file_name.string ());
- string const root = parser.get_document()->get_root_node()->get_name();
- if (root == "DCSubtitle") {
- return shared_ptr<Reader> (new InteropDCPReader (file_name));
- } else if (root == "SubtitleReel") {
- return shared_ptr<Reader> (new SMPTEDCPReader (file_name, false));
- }
+ return shared_ptr<Reader> (new DCPReader (file_name));
}
if (ext == ".mxf") {
/* Assume this is some MXF-wrapped SMPTE subtitles */
- return shared_ptr<Reader> (new SMPTEDCPReader (file_name, true));
+ return shared_ptr<Reader> (new DCPReader (file_name));
}
if (ext == ".stl") {
diff --git a/src/smpte_dcp_reader.cc b/src/smpte_dcp_reader.cc
deleted file mode 100644
index 7a3d94c..0000000
--- a/src/smpte_dcp_reader.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- Copyright (C) 2014-2015 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 "smpte_dcp_reader.h"
-#include "exceptions.h"
-#include "xml.h"
-#include "dcp/font.h"
-#include "dcp/smpte_load_font.h"
-#include <asdcp/KM_util.h>
-#include <asdcp/AS_DCP.h>
-#include <libcxml/cxml.h>
-#include <boost/foreach.hpp>
-
-using std::string;
-using std::list;
-using boost::shared_ptr;
-using namespace sub;
-
-SMPTEDCPReader::SMPTEDCPReader (boost::filesystem::path file, bool mxf)
-{
- shared_ptr<cxml::Document> xml (new cxml::Document ("SubtitleReel"));
-
- if (mxf) {
- ASDCP::TimedText::MXFReader reader;
- Kumu::Result_t r = reader.OpenRead (file.string().c_str ());
- if (ASDCP_FAILURE (r)) {
- boost::throw_exception (MXFError ("could not open MXF file for reading"));
- }
-
- string s;
- reader.ReadTimedTextResource (s, 0, 0);
- xml->read_string (s);
-
- ASDCP::WriterInfo info;
- reader.FillWriterInfo (info);
-
- char buffer[64];
- Kumu::bin2UUIDhex (info.AssetUUID, ASDCP::UUIDlen, buffer, sizeof (buffer));
- _id = buffer;
- } else {
- xml->read_file (file);
- _id = xml->string_child("Id").substr (9);
- }
-
- _load_font_nodes = type_children<dcp::SMPTELoadFont> (xml, "LoadFont");
-
- parse_common (xml, xml->number_child<int> ("TimeCodeRate"));
-}
diff --git a/src/smpte_dcp_reader.h b/src/smpte_dcp_reader.h
deleted file mode 100644
index e3257d3..0000000
--- a/src/smpte_dcp_reader.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- Copyright (C) 2014-2015 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 "dcp_reader.h"
-
-namespace sub {
-
-namespace dcp {
- class SMPTELoadFont;
-}
-
-class SMPTEDCPReader : public DCPReader
-{
-public:
- SMPTEDCPReader (boost::filesystem::path file, bool mxf);
-
-private:
- std::list<boost::shared_ptr<dcp::SMPTELoadFont> > _load_font_nodes;
-};
-
-}
diff --git a/src/wscript b/src/wscript
index a22c712..162f537 100644
--- a/src/wscript
+++ b/src/wscript
@@ -17,14 +17,12 @@ def build(bld):
effect.cc
exceptions.cc
font_size.cc
- interop_dcp_reader.cc
iso6937.cc
iso6937_tables.cc
rational.cc
raw_subtitle.cc
reader.cc
reader_factory.cc
- smpte_dcp_reader.cc
ssa_reader.cc
stl_binary_reader.cc
stl_binary_tables.cc
@@ -37,11 +35,6 @@ def build(bld):
util.cc
vertical_reference.cc
vertical_position.cc
- dcp/font.cc
- dcp/interop_load_font.cc
- dcp/smpte_load_font.cc
- dcp/subtitle.cc
- dcp/text.cc
"""
headers = """
@@ -51,11 +44,9 @@ def build(bld):
effect.h
exceptions.h
font_size.h
- interop_dcp_reader.h
rational.h
raw_subtitle.h
reader.h
- smpte_dcp_reader.h
ssa_reader.h
stl_binary_tables.h
stl_binary_reader.h