2 Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
4 This file is part of libdcp.
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.
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.
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/>.
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
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.
36 * @brief Miscellaneous types
40 #ifndef LIBDCP_TYPES_H
41 #define LIBDCP_TYPES_H
45 #include <libcxml/cxml.h>
46 LIBDCP_DISABLE_WARNINGS
47 #include <asdcp/KLV.h>
48 LIBDCP_ENABLE_WARNINGS
50 #include <boost/function.hpp>
54 /* windows.h defines this but we want to use it */
68 * @brief The integer, two-dimensional size of something.
79 float ratio () const {
80 return float (width) / height;
88 extern bool operator== (Size const & a, Size const & b);
89 extern bool operator!= (Size const & a, Size const & b);
92 /** Identifier for a sound channel */
96 CENTRE = 2, ///< centre
97 LFE = 3, ///< low-frequency effects (sub)
98 LS = 4, ///< left surround
99 RS = 5, ///< right surround
102 /* 8 and 9 are not used */
113 std::vector<dcp::Channel> used_audio_channels ();
116 enum class MCASoundField
124 extern std::string channel_to_mca_id (Channel c, MCASoundField field);
125 extern Channel mca_id_to_channel (std::string);
126 extern std::string channel_to_mca_name (Channel c, MCASoundField field);
127 extern ASDCP::UL channel_to_mca_universal_label (Channel c, MCASoundField field, ASDCP::Dictionary const* dict);
138 extern std::string effect_to_string (Effect e);
139 extern Effect string_to_effect (std::string s);
144 LEFT, ///< horizontal position is distance from left of screen to left of subtitle
145 CENTER, ///< horizontal position is distance from centre of screen to centre of subtitle
146 RIGHT, ///< horizontal position is distance from right of screen to right of subtitle
150 extern std::string halign_to_string (HAlign a);
151 extern HAlign string_to_halign (std::string s);
156 /** vertical position is distance:
157 * from top of screen to top of subtitle (for SMPTE 428-7:{2007,2010} or
158 * from top of screen to subtitle baseline (for Interop or SMPTE 428-7:2014)
161 /** vertical position is distance:
162 * from centre of screen to centre of subtitle (for SMPTE 428-7:{2007,2010}) or
163 * from centre of screen to subtitle baseline (for Interop or SMPTE 428-7:2014)
166 /** vertical position is distance:
167 * from bottom of screen to bottom of subtitle (for SMPTE 428-7:{2007,2010}) or
168 * from bottom of screen to subtitle baseline (for Interop or SMPTE 428-7:2014)
174 extern std::string valign_to_string (VAlign a);
175 extern VAlign string_to_valign (std::string s);
178 /** Direction for subtitle test */
181 LTR, ///< left-to-right
182 RTL, ///< right-to-left
183 TTB, ///< top-to-bottom
184 BTT ///< bottom-to-top
188 extern std::string direction_to_string (Direction a);
189 extern Direction string_to_direction (std::string s);
200 * @brief A fraction (i.e. a thing with an integer numerator and an integer denominator).
205 /** Construct a fraction of 0/0 */
206 Fraction() = default;
208 explicit Fraction (std::string s);
209 /** Construct a fraction with a specified numerator and denominator.
210 * @param n Numerator.
211 * @param d Denominator.
213 Fraction (int n, int d) : numerator (n), denominator (d) {}
215 float as_float () const {
216 return float (numerator) / denominator;
219 std::string as_string () const;
226 extern bool operator== (Fraction const & a, Fraction const & b);
227 extern bool operator!= (Fraction const & a, Fraction const & b);
230 enum class NoteType {
237 enum class Standard {
243 enum class Formulation {
244 MODIFIED_TRANSITIONAL_1,
245 MULTIPLE_MODIFIED_TRANSITIONAL_1,
251 std::string formulation_to_string (dcp::Formulation formulation);
252 dcp::Formulation string_to_formulation (std::string forumulation);
256 * @brief An RGB colour
261 /** Construct a Colour, initialising it to black */
264 /** Construct a Colour from R, G and B. The values run between
267 Colour (int r_, int g_, int b_);
269 /** Construct a Colour from an ARGB hex string; the alpha value is ignored.
270 * @param argb_hex A string of the form AARRGGBB, where e.g. RR is a two-character
273 explicit Colour (std::string argb_hex);
275 int r = 0; ///< red component, from 0 to 255
276 int g = 0; ///< green component, from 0 to 255
277 int b = 0; ///< blue component, from 0 to 255
279 /** @return An RGB string of the form RRGGBB, where e.g. RR is a two-character
282 std::string to_rgb_string () const;
284 /** @return An ARGB string of the form AARRGGBB, where e.g. RR is a two-character
285 * hex value. The alpha value will always be FF (ie 255; maximum alpha).
287 std::string to_argb_string () const;
291 extern bool operator== (Colour const & a, Colour const & b);
292 extern bool operator!= (Colour const & a, Colour const & b);
295 typedef boost::function<void (NoteType, std::string)> NoteHandler;
298 /** Maximum absolute difference between dcp::SubtitleString::aspect_adjust values that
299 * are considered equal
301 constexpr float ASPECT_ADJUST_EPSILON = 1e-3;
304 /** Maximum absolute difference between dcp::SubtitleString alignment values that
305 * are considered equal.
307 constexpr float ALIGN_EPSILON = 1e-3;
310 /** Maximum absolute difference between dcp::SubtitleString space_before values that
311 * are considered equal.
313 constexpr float SPACE_BEFORE_EPSILON = 1e-3;
317 FFOC, ///< first frame of composition
318 LFOC, ///< last frame of composition
319 FFTC, ///< first frame of title credits
320 LFTC, ///< last frame of title credits
321 FFOI, ///< first frame of intermission
322 LFOI, ///< last frame of intermission
323 FFEC, ///< first frame of end credits
324 LFEC, ///< last frame of end credits
325 FFMC, ///< first frame of moving credits
326 LFMC ///< last frame of moving credits
330 std::string marker_to_string (Marker);
331 Marker marker_from_string (std::string);
336 FINAL, ///< final version
337 TEMP, ///< temporary version (picture/sound unfinished)
338 PRE ///< pre-release (picture/sound finished)
342 extern std::string status_to_string (Status s);
343 extern Status string_to_status (std::string s);
351 explicit ContentVersion (cxml::ConstNodePtr node);
353 explicit ContentVersion (std::string label_text_);
355 ContentVersion (std::string id_, std::string label_text_)
357 , label_text (label_text_)
360 void as_xml (xmlpp::Element* parent) const;
363 std::string label_text;
371 CANDELA_PER_SQUARE_METRE,
375 Luminance (cxml::ConstNodePtr node);
377 Luminance (float value, Unit unit);
379 void set_value (float v);
380 void set_unit (Unit u) {
384 float value () const {
392 float value_in_foot_lamberts () const;
394 void as_xml (xmlpp::Element* parent, std::string ns) const;
396 static std::string unit_to_string (Unit u);
397 static Unit string_to_unit (std::string u);
405 bool operator== (Luminance const& a, Luminance const& b);
408 class MainSoundConfiguration
411 explicit MainSoundConfiguration(std::string);
412 MainSoundConfiguration (MCASoundField field_, int channels);
414 MCASoundField field () const {
418 int channels () const {
419 return _channels.size();
422 boost::optional<Channel> mapping (int index) const;
423 void set_mapping (int index, Channel channel);
425 std::string to_string () const;
428 MCASoundField _field;
429 std::vector<boost::optional<Channel>> _channels;