libdcp
subtitle_asset.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
3 
4  This file is part of libdcp.
5 
6  libdcp is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10 
11  libdcp is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with libdcp. If not, see <http://www.gnu.org/licenses/>.
18 
19  In addition, as a special exception, the copyright holders give
20  permission to link the code of portions of this program with the
21  OpenSSL library under certain conditions as described in each
22  individual source file, and distribute linked combinations
23  including the two.
24 
25  You must obey the GNU General Public License in all respects
26  for all of the code used other than OpenSSL. If you modify
27  file(s) with this exception, you may extend this exception to your
28  version of the file(s), but you are not obligated to do so. If you
29  do not wish to do so, delete this exception statement from your
30  version. If you delete this exception statement from all source
31  files in the program, then also delete it here.
32 */
33 
34 
40 #ifndef LIBDCP_SUBTITLE_ASSET_H
41 #define LIBDCP_SUBTITLE_ASSET_H
42 
43 
44 #include "array_data.h"
45 #include "asset.h"
46 #include "dcp_time.h"
47 #include "subtitle_string.h"
48 #include <libcxml/cxml.h>
49 #include <boost/shared_array.hpp>
50 #include <map>
51 
52 
53 namespace xmlpp {
54  class Element;
55 }
56 
57 
58 struct interop_dcp_font_test;
59 struct smpte_dcp_font_test;
60 struct pull_fonts_test1;
61 struct pull_fonts_test2;
62 struct pull_fonts_test3;
63 
64 
65 namespace dcp {
66 
67 
68 class SubtitleString;
69 class SubtitleImage;
70 class FontNode;
71 class TextNode;
72 class SubtitleNode;
73 class LoadFontNode;
74 class ReelAsset;
75 
76 
77 namespace order {
78  class Part;
79  struct Context;
80 }
81 
82 
91 class SubtitleAsset : public Asset
92 {
93 public:
94  SubtitleAsset ();
95  explicit SubtitleAsset (boost::filesystem::path file);
96 
97  bool equals (
98  std::shared_ptr<const Asset>,
100  NoteHandler note
101  ) const override;
102 
103  std::vector<std::shared_ptr<const Subtitle>> subtitles_during (Time from, Time to, bool starting) const;
104  std::vector<std::shared_ptr<const Subtitle>> subtitles_in_reel(std::shared_ptr<const dcp::ReelAsset> asset) const;
105  std::vector<std::shared_ptr<const Subtitle>> subtitles () const;
106 
107  virtual void add (std::shared_ptr<Subtitle>);
108  virtual void add_font (std::string id, dcp::ArrayData data) = 0;
109  std::map<std::string, ArrayData> font_data () const;
110  std::map<std::string, boost::filesystem::path> font_filenames () const;
111 
112  virtual void write (boost::filesystem::path) const = 0;
113  virtual std::string xml_as_string () const = 0;
114 
115  Time latest_subtitle_out () const;
116 
117  void fix_empty_font_ids ();
118 
119  virtual std::vector<std::shared_ptr<LoadFontNode>> load_font_nodes () const = 0;
120 
121  virtual int time_code_rate () const = 0;
122 
127  virtual boost::optional<std::string> raw_xml () const {
128  return _raw_xml;
129  }
130 
131 protected:
132  friend struct ::interop_dcp_font_test;
133  friend struct ::smpte_dcp_font_test;
134 
135  struct ParseState {
136  boost::optional<std::string> font_id;
137  boost::optional<int64_t> size;
138  boost::optional<float> aspect_adjust;
139  boost::optional<bool> italic;
140  boost::optional<bool> bold;
141  boost::optional<bool> underline;
142  boost::optional<Colour> colour;
143  boost::optional<Effect> effect;
144  boost::optional<Colour> effect_colour;
145  boost::optional<float> h_position;
146  boost::optional<HAlign> h_align;
147  boost::optional<float> v_position;
148  boost::optional<VAlign> v_align;
149  boost::optional<Direction> direction;
150  boost::optional<Time> in;
151  boost::optional<Time> out;
152  boost::optional<Time> fade_up_time;
153  boost::optional<Time> fade_down_time;
154  enum class Type {
155  TEXT,
156  IMAGE
157  };
158  boost::optional<Type> type;
159  float space_before = 0;
160  };
161 
162  void parse_subtitles (xmlpp::Element const * node, std::vector<ParseState>& state, boost::optional<int> tcr, Standard standard);
163  ParseState font_node_state (xmlpp::Element const * node, Standard standard) const;
164  ParseState text_node_state (xmlpp::Element const * node) const;
165  ParseState image_node_state (xmlpp::Element const * node) const;
166  ParseState subtitle_node_state (xmlpp::Element const * node, boost::optional<int> tcr) const;
167  Time fade_time (xmlpp::Element const * node, std::string name, boost::optional<int> tcr) const;
168  void position_align (ParseState& ps, xmlpp::Element const * node) const;
169 
170  void subtitles_as_xml (xmlpp::Element* root, int time_code_rate, Standard standard) const;
171 
173  std::vector<std::shared_ptr<Subtitle>> _subtitles;
174 
175  class Font
176  {
177  public:
178  Font (std::string load_id_, std::string uuid_, boost::filesystem::path file_)
179  : load_id (load_id_)
180  , uuid (uuid_)
181  , data (file_)
182  , file (file_)
183  {}
184 
185  Font (std::string load_id_, std::string uuid_, ArrayData data_)
186  : load_id (load_id_)
187  , uuid (uuid_)
188  , data (data_)
189  {}
190 
191  std::string load_id;
192  std::string uuid;
193  ArrayData data;
195  mutable boost::optional<boost::filesystem::path> file;
196  };
197 
199  std::vector<Font> _fonts;
200 
202  mutable boost::optional<std::string> _raw_xml;
203 
204 private:
205  friend struct ::pull_fonts_test1;
206  friend struct ::pull_fonts_test2;
207  friend struct ::pull_fonts_test3;
208 
209  void maybe_add_subtitle (std::string text, std::vector<ParseState> const & parse_state, float space_before, Standard standard);
210 
211  static void pull_fonts (std::shared_ptr<order::Part> part);
212 };
213 
214 
215 }
216 
217 
218 #endif
ArrayData class.
Asset class.
Class to hold an arbitrary block of data.
Definition: array_data.h:55
Parent class for DCP assets, i.e. picture, sound, subtitles, closed captions, CPLs,...
Definition: asset.h:70
boost::optional< boost::filesystem::path > file() const
Definition: asset.h:97
boost::optional< boost::filesystem::path > file
A parent for classes representing a file containing subtitles.
std::vector< std::shared_ptr< Subtitle > > _subtitles
std::vector< Font > _fonts
virtual boost::optional< std::string > raw_xml() const
void subtitles_as_xml(xmlpp::Element *root, int time_code_rate, Standard standard) const
boost::optional< std::string > _raw_xml
A representation of time within a DCP.
Definition: dcp_time.h:73
Time class.
Namespace for everything in libdcp.
Definition: array_data.h:50
A class to describe what "equality" means for a particular test.
Definition: types.h:249
SubtitleString class.