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 /* MinGW seems to define this, but we want to use it */
68 * @brief The integer, two-dimensional size of something.
82 float ratio () const {
83 return float (width) / height;
91 extern bool operator== (Size const & a, Size const & b);
92 extern bool operator!= (Size const & a, Size const & b);
95 /** Identifier for a sound channel */
99 CENTRE = 2, ///< centre
100 LFE = 3, ///< low-frequency effects (sub)
101 LS = 4, ///< left surround
102 RS = 5, ///< right surround
105 /* 8 and 9 are not used */
116 std::vector<dcp::Channel> used_audio_channels ();
119 enum class MCASoundField
126 extern std::string channel_to_mca_id (Channel c, MCASoundField field);
127 extern Channel mca_id_to_channel (std::string);
128 extern std::string channel_to_mca_name (Channel c, MCASoundField field);
129 extern ASDCP::UL channel_to_mca_universal_label (Channel c, MCASoundField field, ASDCP::Dictionary const* dict);
140 extern std::string effect_to_string (Effect e);
141 extern Effect string_to_effect (std::string s);
146 LEFT, ///< horizontal position is distance from left of screen to left of subtitle
147 CENTER, ///< horizontal position is distance from centre of screen to centre of subtitle
148 RIGHT, ///< horizontal position is distance from right of screen to right of subtitle
152 extern std::string halign_to_string (HAlign a);
153 extern HAlign string_to_halign (std::string s);
158 /** vertical position is distance:
159 * from top of screen to top of subtitle (for SMPTE) or
160 * from top of screen to subtitle baseline (for Interop)
163 /** vertical position is distance:
164 * from centre of screen to centre of subtitle (for SMPTE) or
165 * from centre of screen to subtitle baseline (for Interop)
168 /** vertical position is distance:
169 * from bottom of screen to bottom of subtitle (for SMPTE) or
170 * from bottom of screen to subtitle baseline (for Interop)
176 extern std::string valign_to_string (VAlign a);
177 extern VAlign string_to_valign (std::string s);
180 /** Direction for subtitle test */
183 LTR, ///< left-to-right
184 RTL, ///< right-to-left
185 TTB, ///< top-to-bottom
186 BTT ///< bottom-to-top
190 extern std::string direction_to_string (Direction a);
191 extern Direction string_to_direction (std::string s);
202 * @brief A fraction (i.e. a thing with an integer numerator and an integer denominator).
207 /** Construct a fraction of 0/0 */
209 explicit Fraction (std::string s);
210 /** Construct a fraction with a specified numerator and denominator.
211 * @param n Numerator.
212 * @param d Denominator.
214 Fraction (int n, int d) : numerator (n), denominator (d) {}
216 float as_float () const {
217 return float (numerator) / denominator;
220 std::string as_string () const;
227 extern bool operator== (Fraction const & a, Fraction const & b);
228 extern bool operator!= (Fraction const & a, Fraction const & b);
231 /** @struct EqualityOptions
232 * @brief A class to describe what "equality" means for a particular test.
234 * When comparing things, we want to be able to ignore some differences;
235 * this class expresses those differences.
237 * It also contains some settings for how the comparison should be done.
239 struct EqualityOptions
241 /** Construct an EqualityOptions where nothing at all can differ */
242 EqualityOptions () {}
244 /** The maximum allowable mean difference in pixel value between two images */
245 double max_mean_pixel_error = 0;
246 /** The maximum standard deviation of the differences in pixel value between two images */
247 double max_std_dev_pixel_error = 0;
248 /** The maximum difference in audio sample value between two soundtracks */
249 int max_audio_sample_error = 0;
250 /** true if the <AnnotationText> nodes of CPLs are allowed to differ */
251 bool cpl_annotation_texts_can_differ = false;
252 /** true if the <AnnotationText> nodes of Reels are allowed to differ */
253 bool reel_annotation_texts_can_differ = false;
254 /** true if <Hash>es in Reels can differ */
255 bool reel_hashes_can_differ = false;
256 /** true if IssueDate nodes can differ */
257 bool issue_dates_can_differ = false;
258 bool load_font_nodes_can_differ = false;
259 bool keep_going = false;
260 /** true to save the first pair of differeng image subtitles to the current working directory */
261 bool export_differing_subtitles = false;
265 enum class NoteType {
272 enum class Standard {
278 enum class Formulation {
279 MODIFIED_TRANSITIONAL_1,
280 MULTIPLE_MODIFIED_TRANSITIONAL_1,
286 std::string formulation_to_string (dcp::Formulation formulation);
287 dcp::Formulation string_to_formulation (std::string forumulation);
291 * @brief An RGB colour
296 /** Construct a Colour, initialising it to black */
299 /** Construct a Colour from R, G and B. The values run between
302 Colour (int r_, int g_, int b_);
304 /** Construct a Colour from an ARGB hex string; the alpha value is ignored.
305 * @param argb_hex A string of the form AARRGGBB, where e.g. RR is a two-character
308 explicit Colour (std::string argb_hex);
310 int r = 0; ///< red component, from 0 to 255
311 int g = 0; ///< green component, from 0 to 255
312 int b = 0; ///< blue component, from 0 to 255
314 /** @return An RGB string of the form RRGGBB, where e.g. RR is a two-character
317 std::string to_rgb_string () const;
319 /** @return An ARGB string of the form AARRGGBB, where e.g. RR is a two-character
320 * hex value. The alpha value will always be FF (ie 255; maximum alpha).
322 std::string to_argb_string () const;
326 extern bool operator== (Colour const & a, Colour const & b);
327 extern bool operator!= (Colour const & a, Colour const & b);
330 typedef boost::function<void (NoteType, std::string)> NoteHandler;
333 /** Maximum absolute difference between dcp::SubtitleString::aspect_adjust values that
334 * are considered equal
336 constexpr float ASPECT_ADJUST_EPSILON = 1e-3;
339 /** Maximum absolute difference between dcp::SubtitleString alignment values that
340 * are considered equal.
342 constexpr float ALIGN_EPSILON = 1e-3;
345 /** Maximum absolute difference between dcp::SubtitleString space_before values that
346 * are considered equal.
348 constexpr float SPACE_BEFORE_EPSILON = 1e-3;
352 FFOC, ///< first frame of composition
353 LFOC, ///< last frame of composition
354 FFTC, ///< first frame of title credits
355 LFTC, ///< last frame of title credits
356 FFOI, ///< first frame of intermission
357 LFOI, ///< last frame of intermission
358 FFEC, ///< first frame of end credits
359 LFEC, ///< last frame of end credits
360 FFMC, ///< first frame of moving credits
361 LFMC ///< last frame of moving credits
365 std::string marker_to_string (Marker);
366 Marker marker_from_string (std::string);
371 FINAL, ///< final version
372 TEMP, ///< temporary version (picture/sound unfinished)
373 PRE ///< pre-release (picture/sound finished)
377 extern std::string status_to_string (Status s);
378 extern Status string_to_status (std::string s);
386 explicit ContentVersion (cxml::ConstNodePtr node);
388 explicit ContentVersion (std::string label_text_);
390 ContentVersion (std::string id_, std::string label_text_)
392 , label_text (label_text_)
395 void as_xml (xmlpp::Element* parent) const;
398 std::string label_text;
406 CANDELA_PER_SQUARE_METRE,
410 Luminance (cxml::ConstNodePtr node);
412 Luminance (float value, Unit unit);
414 void set_value (float v);
415 void set_unit (Unit u) {
419 float value () const {
427 float value_in_foot_lamberts () const;
429 void as_xml (xmlpp::Element* parent, std::string ns) const;
431 static std::string unit_to_string (Unit u);
432 static Unit string_to_unit (std::string u);
440 bool operator== (Luminance const& a, Luminance const& b);
443 class MainSoundConfiguration
446 MainSoundConfiguration (std::string);
447 MainSoundConfiguration (MCASoundField field_, int channels);
449 MCASoundField field () const {
453 int channels () const {
454 return _channels.size();
457 boost::optional<Channel> mapping (int index) const;
458 void set_mapping (int index, Channel channel);
460 std::string to_string () const;
463 MCASoundField _field;
464 std::vector<boost::optional<Channel>> _channels;