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
44 #include <libcxml/cxml.h>
45 #include <asdcp/KLV.h>
47 #include <boost/function.hpp>
51 /* MinGW seems to define this, but we want to use it */
65 * @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
123 extern std::string channel_to_mca_id (Channel c, MCASoundField field);
124 extern Channel mca_id_to_channel (std::string);
125 extern std::string channel_to_mca_name (Channel c, MCASoundField field);
126 extern ASDCP::UL channel_to_mca_universal_label (Channel c, MCASoundField field, ASDCP::Dictionary const* dict);
129 enum class ContentKind
139 PUBLIC_SERVICE_ANNOUNCEMENT,
146 extern std::string content_kind_to_string (ContentKind kind);
147 extern ContentKind content_kind_from_string (std::string kind);
158 extern std::string effect_to_string (Effect e);
159 extern Effect string_to_effect (std::string s);
164 LEFT, ///< horizontal position is distance from left of screen to left of subtitle
165 CENTER, ///< horizontal position is distance from centre of screen to centre of subtitle
166 RIGHT, ///< horizontal position is distance from right of screen to right of subtitle
170 extern std::string halign_to_string (HAlign a);
171 extern HAlign string_to_halign (std::string s);
176 TOP, ///< vertical position is distance from top of screen to top of subtitle
177 CENTER, ///< vertical position is distance from centre of screen to centre of subtitle
178 BOTTOM ///< vertical position is distance from bottom of screen to bottom of subtitle
182 extern std::string valign_to_string (VAlign a);
183 extern VAlign string_to_valign (std::string s);
186 /** Direction for subtitle test */
189 LTR, ///< left-to-right
190 RTL, ///< right-to-left
191 TTB, ///< top-to-bottom
192 BTT ///< bottom-to-top
196 extern std::string direction_to_string (Direction a);
197 extern Direction string_to_direction (std::string s);
208 * @brief A fraction (i.e. a thing with an integer numerator and an integer denominator).
213 /** Construct a fraction of 0/0 */
215 explicit Fraction (std::string s);
216 /** Construct a fraction with a specified numerator and denominator.
217 * @param n Numerator.
218 * @param d Denominator.
220 Fraction (int n, int d) : numerator (n), denominator (d) {}
222 float as_float () const {
223 return float (numerator) / denominator;
226 std::string as_string () const;
233 extern bool operator== (Fraction const & a, Fraction const & b);
234 extern bool operator!= (Fraction const & a, Fraction const & b);
237 /** @struct EqualityOptions
238 * @brief A class to describe what "equality" means for a particular test.
240 * When comparing things, we want to be able to ignore some differences;
241 * this class expresses those differences.
243 * It also contains some settings for how the comparison should be done.
245 struct EqualityOptions
247 /** Construct an EqualityOptions where nothing at all can differ */
248 EqualityOptions () {}
250 /** The maximum allowable mean difference in pixel value between two images */
251 double max_mean_pixel_error = 0;
252 /** The maximum standard deviation of the differences in pixel value between two images */
253 double max_std_dev_pixel_error = 0;
254 /** The maximum difference in audio sample value between two soundtracks */
255 int max_audio_sample_error = 0;
256 /** true if the <AnnotationText> nodes of CPLs are allowed to differ */
257 bool cpl_annotation_texts_can_differ = false;
258 /** true if the <AnnotationText> nodes of Reels are allowed to differ */
259 bool reel_annotation_texts_can_differ = false;
260 /** true if <Hash>es in Reels can differ */
261 bool reel_hashes_can_differ = false;
262 /** true if IssueDate nodes can differ */
263 bool issue_dates_can_differ = false;
264 bool load_font_nodes_can_differ = false;
265 bool keep_going = false;
266 /** true to save the first pair of differeng image subtitles to the current working directory */
267 bool export_differing_subtitles = false;
271 enum class NoteType {
278 enum class Standard {
284 enum class Formulation {
285 MODIFIED_TRANSITIONAL_1,
286 MULTIPLE_MODIFIED_TRANSITIONAL_1,
289 /** For testing: adds no AuthorizedDeviceInfo tag */
290 MODIFIED_TRANSITIONAL_TEST
295 * @brief An RGB colour
300 /** Construct a Colour, initialising it to black */
303 /** Construct a Colour from R, G and B. The values run between
306 Colour (int r_, int g_, int b_);
308 /** Construct a Colour from an ARGB hex string; the alpha value is ignored.
309 * @param argb_hex A string of the form AARRGGBB, where e.g. RR is a two-character
312 explicit Colour (std::string argb_hex);
314 int r = 0; ///< red component, from 0 to 255
315 int g = 0; ///< green component, from 0 to 255
316 int b = 0; ///< blue component, from 0 to 255
318 /** @return An RGB string of the form RRGGBB, where e.g. RR is a two-character
321 std::string to_rgb_string () const;
323 /** @return An ARGB string of the form AARRGGBB, where e.g. RR is a two-character
324 * hex value. The alpha value will always be FF (ie 255; maximum alpha).
326 std::string to_argb_string () const;
330 extern bool operator== (Colour const & a, Colour const & b);
331 extern bool operator!= (Colour const & a, Colour const & b);
334 typedef boost::function<void (NoteType, std::string)> NoteHandler;
337 /** Maximum absolute difference between dcp::SubtitleString::aspect_adjust values that
338 * are considered equal
340 constexpr float ASPECT_ADJUST_EPSILON = 1e-3;
343 /** Maximum absolute difference between dcp::SubtitleString alignment values that
344 * are considered equal.
346 constexpr float ALIGN_EPSILON = 1e-3;
350 FFOC, ///< first frame of composition
351 LFOC, ///< last frame of composition
352 FFTC, ///< first frame of title credits
353 LFTC, ///< last frame of title credits
354 FFOI, ///< first frame of intermission
355 LFOI, ///< last frame of intermission
356 FFEC, ///< first frame of end credits
357 LFEC, ///< last frame of end credits
358 FFMC, ///< first frame of moving credits
359 LFMC ///< last frame of moving credits
363 std::string marker_to_string (Marker);
364 Marker marker_from_string (std::string);
370 Rating (std::string agency_, std::string label_)
375 explicit Rating (cxml::ConstNodePtr node);
377 void as_xml (xmlpp::Element* parent) const;
379 /** URI of the agency issuing the rating */
381 /** Rating (e.g. PG, PG-13, 12A etc) */
386 extern bool operator== (Rating const & a, Rating const & b);
391 FINAL, ///< final version
392 TEMP, ///< temporary version (picture/sound unfinished)
393 PRE ///< pre-release (picture/sound finished)
397 extern std::string status_to_string (Status s);
398 extern Status string_to_status (std::string s);
406 explicit ContentVersion (cxml::ConstNodePtr node);
408 explicit ContentVersion (std::string label_text_);
410 ContentVersion (std::string id_, std::string label_text_)
412 , label_text (label_text_)
415 void as_xml (xmlpp::Element* parent) const;
418 std::string label_text;
426 CANDELA_PER_SQUARE_METRE,
430 Luminance (cxml::ConstNodePtr node);
432 Luminance (float value, Unit unit);
434 void set_value (float v);
435 void set_unit (Unit u) {
439 float value () const {
447 void as_xml (xmlpp::Element* parent, std::string ns) const;
449 static std::string unit_to_string (Unit u);
450 static Unit string_to_unit (std::string u);
458 bool operator== (Luminance const& a, Luminance const& b);
461 class MainSoundConfiguration
464 MainSoundConfiguration (std::string);
465 MainSoundConfiguration (MCASoundField field_, int channels);
467 MCASoundField field () const {
471 int channels () const {
472 return _channels.size();
475 boost::optional<Channel> mapping (int index) const;
476 void set_mapping (int index, Channel channel);
478 std::string to_string () const;
481 MCASoundField _field;
482 std::vector<boost::optional<Channel> > _channels;