2 Copyright (C) 2012-2019 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.
35 * @brief Miscellaneous types.
38 #ifndef LIBDCP_TYPES_H
39 #define LIBDCP_TYPES_H
41 #include <boost/shared_ptr.hpp>
42 #include <boost/function.hpp>
49 * @brief The integer, two-dimensional size of something.
63 float ratio () const {
64 return float (width) / height;
71 extern bool operator== (Size const & a, Size const & b);
72 extern bool operator!= (Size const & a, Size const & b);
73 extern std::ostream& operator<< (std::ostream& s, Size const & a);
75 /** Identifier for a sound channel */
79 CENTRE = 2, ///< centre
80 LFE = 3, ///< low-frequency effects (sub)
81 LS = 4, ///< left surround
82 RS = 5, ///< right surround
101 PUBLIC_SERVICE_ANNOUNCEMENT,
107 extern std::string content_kind_to_string (ContentKind kind);
108 extern ContentKind content_kind_from_string (std::string kind);
117 extern std::string effect_to_string (Effect e);
118 extern Effect string_to_effect (std::string s);
122 HALIGN_LEFT, ///< horizontal position is distance from left of screen to left of subtitle
123 HALIGN_CENTER, ///< horizontal position is distance from centre of screen to centre of subtitle
124 HALIGN_RIGHT, ///< horizontal position is distance from right of screen to right of subtitle
127 extern std::string halign_to_string (HAlign a);
128 extern HAlign string_to_halign (std::string s);
132 VALIGN_TOP, ///< vertical position is distance from top of screen to top of subtitle
133 VALIGN_CENTER, ///< vertical position is distance from centre of screen to centre of subtitle
134 VALIGN_BOTTOM ///< vertical position is distance from bottom of screen to bottom of subtitle
137 extern std::string valign_to_string (VAlign a);
138 extern VAlign string_to_valign (std::string s);
140 /** Direction for subtitle test */
143 DIRECTION_LTR, ///< left-to-right
144 DIRECTION_RTL, ///< right-to-left
145 DIRECTION_TTB, ///< top-to-bottom
146 DIRECTION_BTT ///< bottom-to-top
149 extern std::string direction_to_string (Direction a);
150 extern Direction string_to_direction (std::string s);
159 * @brief A fraction (i.e. a thing with an integer numerator and an integer denominator).
164 /** Construct a fraction of 0/0 */
165 Fraction () : numerator (0), denominator (0) {}
166 explicit Fraction (std::string s);
167 /** Construct a fraction with a specified numerator and denominator.
168 * @param n Numerator.
169 * @param d Denominator.
171 Fraction (int n, int d) : numerator (n), denominator (d) {}
173 float as_float () const {
174 return float (numerator) / denominator;
177 std::string as_string () const;
183 extern bool operator== (Fraction const & a, Fraction const & b);
184 extern bool operator!= (Fraction const & a, Fraction const & b);
185 extern std::ostream& operator<< (std::ostream& s, Fraction const & f);
187 /** @struct EqualityOptions
188 * @brief A class to describe what "equality" means for a particular test.
190 * When comparing things, we want to be able to ignore some differences;
191 * this class expresses those differences.
193 struct EqualityOptions
195 /** Construct an EqualityOptions where nothing at all can differ */
197 : max_mean_pixel_error (0)
198 , max_std_dev_pixel_error (0)
199 , max_audio_sample_error (0)
200 , cpl_annotation_texts_can_differ (false)
201 , reel_annotation_texts_can_differ (false)
202 , reel_hashes_can_differ (false)
203 , issue_dates_can_differ (false)
207 /** The maximum allowable mean difference in pixel value between two images */
208 double max_mean_pixel_error;
209 /** The maximum standard deviation of the differences in pixel value between two images */
210 double max_std_dev_pixel_error;
211 /** The maximum difference in audio sample value between two soundtracks */
212 int max_audio_sample_error;
213 /** true if the <AnnotationText> nodes of CPLs are allowed to differ */
214 bool cpl_annotation_texts_can_differ;
215 /** true if the <AnnotationText> nodes of Reels are allowed to differ */
216 bool reel_annotation_texts_can_differ;
217 /** true if <Hash>es in Reels can differ */
218 bool reel_hashes_can_differ;
219 /** true if IssueDate nodes can differ */
220 bool issue_dates_can_differ;
224 /* I've been unable to make mingw happy with ERROR as a symbol, so
225 I'm using a DCP_ prefix here.
239 MODIFIED_TRANSITIONAL_1,
240 MULTIPLE_MODIFIED_TRANSITIONAL_1,
243 /** For testing: adds no AuthorizedDeviceInfo tag */
244 MODIFIED_TRANSITIONAL_TEST
248 * @brief An RGB colour.
254 Colour (int r_, int g_, int b_);
255 explicit Colour (std::string argb_hex);
257 int r; ///< red component, from 0 to 255
258 int g; ///< green component, from 0 to 255
259 int b; ///< blue component, from 0 to 255
261 std::string to_rgb_string () const;
262 std::string to_argb_string () const;
265 extern bool operator== (Colour const & a, Colour const & b);
266 extern bool operator!= (Colour const & a, Colour const & b);
267 extern std::ostream & operator<< (std::ostream & s, Colour const & c);
269 typedef boost::function<void (NoteType, std::string)> NoteHandler;
271 /** Maximum absolute difference between dcp::SubtitleString::aspect_adjust values that
272 * are considered equal.
274 const float ASPECT_ADJUST_EPSILON = 1e-3;
276 /** Maximum absolute difference between dcp::SubtitleString alignment values that
277 * are considered equal.
279 const float ALIGN_EPSILON = 1e-3;