/*
- Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+ 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
*/
+#ifndef LIBDCP_SUBTITLE_ASSET_H
+#define LIBDCP_SUBTITLE_ASSET_H
+
#include "asset.h"
-#include "xml.h"
#include "dcp_time.h"
+#include "subtitle_string.h"
+#include "data.h"
+#include <libcxml/cxml.h>
+#include <boost/shared_array.hpp>
+#include <map>
+
+namespace xmlpp {
+ class Element;
+}
-namespace libdcp
+struct interop_dcp_font_test;
+struct smpte_dcp_font_test;
+
+namespace dcp
{
-class Text : public XMLNode
+class SubtitleString;
+class FontNode;
+class TextNode;
+class SubtitleNode;
+class LoadFontNode;
+
+/** @class SubtitleAsset
+ * @brief A parent for classes representing a file containing subtitles.
+ *
+ * This class holds a list of SubtitleString objects which it can extract
+ * from the appropriate part of either an Interop or SMPTE XML file.
+ * Its subclasses InteropSubtitleAsset and SMPTESubtitleAsset handle the
+ * differences between the two types.
+ */
+class SubtitleAsset : public Asset
{
public:
- Text () {}
- Text (xmlpp::Node const * node);
+ SubtitleAsset ();
+ SubtitleAsset (boost::filesystem::path file);
- float v_position () const {
- return _v_position;
- }
+ bool equals (
+ boost::shared_ptr<const Asset>,
+ EqualityOptions,
+ NoteHandler note
+ ) const;
- std::string text () const {
- return _text;
+ std::list<SubtitleString> subtitles_during (Time from, Time to, bool starting) const;
+ std::list<SubtitleString> const & subtitles () const {
+ return _subtitles;
}
-private:
- float _v_position;
- std::string _text;
-};
+ virtual void add (SubtitleString);
+ virtual void add_font (std::string id, boost::filesystem::path file) = 0;
+ std::map<std::string, Data> fonts_with_load_ids () const;
-class Subtitle : public XMLNode
-{
-public:
- Subtitle () {}
- Subtitle (xmlpp::Node const * node);
+ virtual void write (boost::filesystem::path) const = 0;
+ virtual std::string xml_as_string () const = 0;
- Time in () const {
- return _in;
- }
+ Time latest_subtitle_out () const;
- Time out () const {
- return _out;
- }
+ virtual std::list<boost::shared_ptr<LoadFontNode> > load_font_nodes () const = 0;
- std::list<boost::shared_ptr<Text> > const & texts () const {
- return _texts;
- }
+protected:
+ friend struct ::interop_dcp_font_test;
+ friend struct ::smpte_dcp_font_test;
-private:
- std::list<boost::shared_ptr<Text> > _texts;
- Time _in;
- Time _out;
-};
+ void parse_subtitles (
+ boost::shared_ptr<cxml::Document> xml,
+ std::list<boost::shared_ptr<FontNode> > font_nodes,
+ std::list<boost::shared_ptr<SubtitleNode> > subtitle_nodes
+ );
-class Font : public XMLNode
-{
-public:
- Font () {}
- Font (xmlpp::Node const * node);
+ void subtitles_as_xml (xmlpp::Element* root, int time_code_rate, Standard standard) const;
- std::list<boost::shared_ptr<Subtitle> > const & subtitles () const {
- return _subtitles;
- }
+ /** All our subtitles, in no particular order */
+ std::list<SubtitleString> _subtitles;
- std::list<boost::shared_ptr<Text> > subtitles_at (Time t) const;
-
-private:
- std::list<boost::shared_ptr<Subtitle> > _subtitles;
-};
-
-class SubtitleAsset : public Asset, public XMLFile
-{
-public:
- SubtitleAsset (std::string directory, std::string xml);
-
- void write_to_cpl (std::ostream&) const {}
- virtual std::list<std::string> equals (boost::shared_ptr<const Asset>, EqualityOptions) const {
- return std::list<std::string> ();
- }
+ class Font
+ {
+ public:
+ Font (std::string load_id_, std::string uuid_, boost::filesystem::path file_)
+ : load_id (load_id_)
+ , uuid (uuid_)
+ , data (file_)
+ , file (file_)
+ {}
- std::string language () const {
- return _language;
- }
+ Font (std::string load_id_, std::string uuid_, Data data_)
+ : load_id (load_id_)
+ , uuid (uuid_)
+ , data (data_)
+ {}
- std::list<boost::shared_ptr<Text> > subtitles_at (Time t) const;
+ std::string load_id;
+ std::string uuid;
+ Data data;
+ /** .ttf file that this data was last written to, if applicable */
+ mutable boost::optional<boost::filesystem::path> file;
+ };
- std::list<boost::shared_ptr<Font> > const & fonts () const {
- return _fonts;
- }
+ std::list<Font> _fonts;
private:
- std::string _subtitle_id;
- std::string _movie_title;
- int64_t _reel_number;
- std::string _language;
- std::list<boost::shared_ptr<Font> > _fonts;
+ /** @struct ParseState
+ * @brief A struct to hold state when parsing a subtitle XML file.
+ */
+ struct ParseState {
+ std::list<boost::shared_ptr<FontNode> > font_nodes;
+ std::list<boost::shared_ptr<TextNode> > text_nodes;
+ std::list<boost::shared_ptr<SubtitleNode> > subtitle_nodes;
+ };
+
+ void maybe_add_subtitle (std::string text, ParseState const & parse_state);
+
+ void examine_nodes (
+ boost::shared_ptr<const cxml::Node> xml,
+ std::list<boost::shared_ptr<FontNode> > const & font_nodes,
+ ParseState& parse_state
+ );
+
+ void examine_nodes (
+ boost::shared_ptr<const cxml::Node> xml,
+ std::list<boost::shared_ptr<TextNode> > const & text_nodes,
+ ParseState& parse_state
+ );
+
+ void examine_nodes (
+ boost::shared_ptr<const cxml::Node> xml,
+ std::list<boost::shared_ptr<SubtitleNode> > const & subtitle_nodes,
+ ParseState& parse_state
+ );
};
}
+
+#endif