Add Rec 601 RGB->XYZ matrix from Dennis Couzin.
[libdcp.git] / test / subtitle_tests.cc
1 /*
2     Copyright (C) 2012-2013 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include <boost/test/unit_test.hpp>
21 #include "subtitle_asset.h"
22
23 using std::list;
24 using boost::shared_ptr;
25
26 /* Load a subtitle asset from XML and check that it is read correctly */
27 BOOST_AUTO_TEST_CASE (subtitles1)
28 {
29         libdcp::SubtitleAsset subs ("test/data", "subs1.xml");
30
31         BOOST_CHECK_EQUAL (subs.language(), "French");
32
33         list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_during (libdcp::Time (0, 0, 6, 1, 250), libdcp::Time (0, 0, 6, 2, 250));
34         BOOST_CHECK_EQUAL (s.size(), 1);
35         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
36                                    "Arial",
37                                    false,
38                                    libdcp::Color (255, 255, 255),
39                                    39,
40                                    libdcp::Time (0, 0, 5, 198, 250),
41                                    libdcp::Time (0, 0, 7, 115, 250),
42                                    15,
43                                    libdcp::VERTICAL_BOTTOM,
44                                    libdcp::HORIZONTAL_CENTER,
45                                    "My jacket was Idi Amin's",
46                                    libdcp::BORDER,
47                                    libdcp::Color (0, 0, 0),
48                                    libdcp::Time (0, 0, 0, 1, 250),
49                                    libdcp::Time (0, 0, 0, 1, 250)
50                                    ));
51                                                          
52         s = subs.subtitles_during (libdcp::Time (0, 0, 7, 190, 250), libdcp::Time (0, 0, 7, 191, 250));
53         BOOST_CHECK_EQUAL (s.size(), 2);
54         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
55                                    "Arial",
56                                    true,
57                                    libdcp::Color (255, 255, 255),
58                                    39,
59                                    libdcp::Time (0, 0, 7, 177, 250),
60                                    libdcp::Time (0, 0, 11, 31, 250),
61                                    21,
62                                    libdcp::VERTICAL_BOTTOM,
63                                    libdcp::HORIZONTAL_CENTER,
64                                    "My corset was H.M. The Queen's",
65                                    libdcp::BORDER,
66                                    libdcp::Color (0, 0, 0),
67                                    libdcp::Time (0, 0, 0, 1, 250),
68                                    libdcp::Time (0, 0, 0, 1, 250)
69                                    ));
70         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
71                                    "Arial",
72                                    false,
73                                    libdcp::Color (255, 255, 255),
74                                    39,
75                                    libdcp::Time (0, 0, 7, 177, 250),
76                                    libdcp::Time (0, 0, 11, 31, 250),
77                                    15,
78                                    libdcp::VERTICAL_BOTTOM,
79                                    libdcp::HORIZONTAL_CENTER,
80                                    "My large wonderbra",
81                                    libdcp::BORDER,
82                                    libdcp::Color (0, 0, 0),
83                                    libdcp::Time (0, 0, 0, 1, 250),
84                                    libdcp::Time (0, 0, 0, 1, 250)
85                                    ));
86
87         s = subs.subtitles_during (libdcp::Time (0, 0, 11, 95, 250), libdcp::Time (0, 0, 11, 96, 250));
88         BOOST_CHECK_EQUAL (s.size(), 1);
89         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
90                                    "Arial",
91                                    false,
92                                    libdcp::Color (255, 255, 255),
93                                    39,
94                                    libdcp::Time (0, 0, 11, 94, 250),
95                                    libdcp::Time (0, 0, 13, 63, 250),
96                                    15,
97                                    libdcp::VERTICAL_BOTTOM,
98                                    libdcp::HORIZONTAL_CENTER,
99                                    "Once belonged to the Shah",
100                                    libdcp::BORDER,
101                                    libdcp::Color (0, 0, 0),
102                                    libdcp::Time (0, 0, 0, 1, 250),
103                                    libdcp::Time (0, 0, 0, 1, 250)
104                                    ));
105
106         s = subs.subtitles_during (libdcp::Time (0, 0, 14, 42, 250), libdcp::Time (0, 0, 14, 43, 250));
107         BOOST_CHECK_EQUAL (s.size(), 1);
108         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
109                                    "Arial",
110                                    false,
111                                    libdcp::Color (255, 255, 255),
112                                    39,
113                                    libdcp::Time (0, 0, 13, 104, 250),
114                                    libdcp::Time (0, 0, 15, 177, 250),
115                                    15,
116                                    libdcp::VERTICAL_BOTTOM,
117                                    libdcp::HORIZONTAL_CENTER,
118                                    "And these are Roy Hattersley's jeans",
119                                    libdcp::BORDER,
120                                    libdcp::Color (0, 0, 0),
121                                    libdcp::Time (0, 0, 0, 1, 250),
122                                    libdcp::Time (0, 0, 0, 1, 250)
123                                    ));
124 }
125
126 /** And similarly for another one */
127 BOOST_AUTO_TEST_CASE (subtitles2)
128 {
129         libdcp::SubtitleAsset subs ("test/data", "subs2.xml");
130
131         list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_during (libdcp::Time (0, 0, 42, 100, 250), libdcp::Time (0, 0, 42, 101, 250));
132         BOOST_CHECK_EQUAL (s.size(), 2);
133         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
134                                    "Arial",
135                                    true,
136                                    libdcp::Color (255, 255, 255),
137                                    42,
138                                    libdcp::Time (0, 0, 41, 62, 250),
139                                    libdcp::Time (0, 0, 43, 52, 250),
140                                    89,
141                                    libdcp::VERTICAL_TOP,
142                                    libdcp::HORIZONTAL_CENTER,
143                                    "At afternoon tea with John Peel",
144                                    libdcp::BORDER,
145                                    libdcp::Color (0, 0, 0),
146                                    libdcp::Time (0, 0, 0, 0, 250),
147                                    libdcp::Time (0, 0, 0, 0, 250)
148                                    ));
149         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
150                                    "Arial",
151                                    true,
152                                    libdcp::Color (255, 255, 255),
153                                    42,
154                                    libdcp::Time (0, 0, 41, 62, 250),
155                                    libdcp::Time (0, 0, 43, 52, 250),
156                                    95,
157                                    libdcp::VERTICAL_TOP,
158                                    libdcp::HORIZONTAL_CENTER,
159                                    "I enquired if his accent was real",
160                                    libdcp::BORDER,
161                                    libdcp::Color (0, 0, 0),
162                                    libdcp::Time (0, 0, 0, 0, 250),
163                                    libdcp::Time (0, 0, 0, 0, 250)
164                                    ));
165
166         s = subs.subtitles_during (libdcp::Time (0, 0, 50, 50, 250), libdcp::Time (0, 0, 50, 51, 250));
167         BOOST_CHECK_EQUAL (s.size(), 2);
168         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
169                                    "Arial",
170                                    true,
171                                    libdcp::Color (255, 255, 255),
172                                    42,
173                                    libdcp::Time (0, 0, 50, 42, 250),
174                                    libdcp::Time (0, 0, 52, 21, 250),
175                                    89,
176                                    libdcp::VERTICAL_TOP,
177                                    libdcp::HORIZONTAL_CENTER,
178                                    "He said \"out of the house",
179                                    libdcp::BORDER,
180                                    libdcp::Color (0, 0, 0),
181                                    libdcp::Time (0, 0, 0, 0, 250),
182                                    libdcp::Time (0, 0, 0, 0, 250)
183                                    ));
184         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
185                                    "Arial",
186                                    true,
187                                    libdcp::Color (255, 255, 255),
188                                    42,
189                                    libdcp::Time (0, 0, 50, 42, 250),
190                                    libdcp::Time (0, 0, 52, 21, 250),
191                                    95,
192                                    libdcp::VERTICAL_TOP,
193                                    libdcp::HORIZONTAL_CENTER,
194                                    "I'm incredibly scouse",
195                                    libdcp::BORDER,
196                                    libdcp::Color (0, 0, 0),
197                                    libdcp::Time (0, 0, 0, 0, 250),
198                                    libdcp::Time (0, 0, 0, 0, 250)
199                                    ));
200
201         s = subs.subtitles_during (libdcp::Time (0, 1, 2, 300, 250), libdcp::Time (0, 1, 2, 301, 250));
202         BOOST_CHECK_EQUAL (s.size(), 2);
203         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
204                                    "Arial",
205                                    true,
206                                    libdcp::Color (255, 255, 255),
207                                    42,
208                                    libdcp::Time (0, 1, 2, 208, 250),
209                                    libdcp::Time (0, 1, 4, 10, 250),
210                                    89,
211                                    libdcp::VERTICAL_TOP,
212                                    libdcp::HORIZONTAL_CENTER,
213                                    "At home it depends how I feel.\"",
214                                    libdcp::BORDER,
215                                    libdcp::Color (0, 0, 0),
216                                    libdcp::Time (0, 0, 0, 0, 250),
217                                    libdcp::Time (0, 0, 0, 0, 250)
218                                    ));
219         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
220                                    "Arial",
221                                    true,
222                                    libdcp::Color (255, 255, 255),
223                                    42,
224                                    libdcp::Time (0, 1, 2, 208, 250),
225                                    libdcp::Time (0, 1, 4, 10, 250),
226                                    95,
227                                    libdcp::VERTICAL_TOP,
228                                    libdcp::HORIZONTAL_CENTER,
229                                    "I spent a long weekend in Brighton",
230                                    libdcp::BORDER,
231                                    libdcp::Color (0, 0, 0),
232                                    libdcp::Time (0, 0, 0, 0, 250),
233                                    libdcp::Time (0, 0, 0, 0, 250)
234                                    ));
235
236         s = subs.subtitles_during (libdcp::Time (0, 1, 15, 50, 250), libdcp::Time (0, 1, 15, 51, 250));
237         BOOST_CHECK_EQUAL (s.size(), 2);
238         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
239                                    "Arial",
240                                    true,
241                                    libdcp::Color (255, 255, 255),
242                                    42,
243                                    libdcp::Time (0, 1, 15, 42, 250),
244                                    libdcp::Time (0, 1, 16, 42, 250),
245                                    89,
246                                    libdcp::VERTICAL_TOP,
247                                    libdcp::HORIZONTAL_CENTER,
248                                    "With the legendary Miss Enid Blyton",
249                                    libdcp::BORDER,
250                                    libdcp::Color (0, 0, 0),
251                                    libdcp::Time (0, 0, 0, 0, 250),
252                                    libdcp::Time (0, 0, 0, 0, 250)
253                                    ));
254         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
255                                    "Arial",
256                                    true,
257                                    libdcp::Color (255, 255, 255),
258                                    42,
259                                    libdcp::Time (0, 1, 15, 42, 250),
260                                    libdcp::Time (0, 1, 16, 42, 250),
261                                    95,
262                                    libdcp::VERTICAL_TOP,
263                                    libdcp::HORIZONTAL_CENTER,
264                                    "She said \"you be Noddy",
265                                    libdcp::BORDER,
266                                    libdcp::Color (0, 0, 0),
267                                    libdcp::Time (0, 0, 0, 0, 250),
268                                    libdcp::Time (0, 0, 0, 0, 250)
269                                    ));
270
271         s = subs.subtitles_during (libdcp::Time (0, 1, 27, 200, 250), libdcp::Time (0, 1, 27, 201, 250));
272         BOOST_CHECK_EQUAL (s.size(), 2);
273         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
274                                    "Arial",
275                                    true,
276                                    libdcp::Color (255, 255, 255),
277                                    42,
278                                    libdcp::Time (0, 1, 27, 115, 250),
279                                    libdcp::Time (0, 1, 28, 208, 250),
280                                    89,
281                                    libdcp::VERTICAL_TOP,
282                                    libdcp::HORIZONTAL_CENTER,
283                                    "That curious creature the Sphinx",
284                                    libdcp::BORDER,
285                                    libdcp::Color (0, 0, 0),
286                                    libdcp::Time (0, 0, 0, 0, 250),
287                                    libdcp::Time (0, 0, 0, 0, 250)
288                                    ));
289         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
290                                    "Arial",
291                                    true,
292                                    libdcp::Color (255, 255, 255),
293                                    42,
294                                    libdcp::Time (0, 1, 27, 115, 250),
295                                    libdcp::Time (0, 1, 28, 208, 250),
296                                    95,
297                                    libdcp::VERTICAL_TOP,
298                                    libdcp::HORIZONTAL_CENTER,
299                                    "Is smarter than anyone thinks",
300                                    libdcp::BORDER,
301                                    libdcp::Color (0, 0, 0),
302                                    libdcp::Time (0, 0, 0, 0, 250),
303                                    libdcp::Time (0, 0, 0, 0, 250)
304                                    ));
305
306         s = subs.subtitles_during (libdcp::Time (0, 1, 42, 300, 250), libdcp::Time (0, 1, 42, 301, 250));
307         BOOST_CHECK_EQUAL (s.size(), 2);
308         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
309                                    "Arial",
310                                    false,
311                                    libdcp::Color (255, 255, 255),
312                                    42,
313                                    libdcp::Time (0, 1, 42, 229, 250),
314                                    libdcp::Time (0, 1, 45, 62, 250),
315                                    89,
316                                    libdcp::VERTICAL_TOP,
317                                    libdcp::HORIZONTAL_CENTER,
318                                    "It sits there and smirks",
319                                    libdcp::BORDER,
320                                    libdcp::Color (0, 0, 0),
321                                    libdcp::Time (0, 0, 0, 0, 250),
322                                    libdcp::Time (0, 0, 0, 0, 250)
323                                    ));
324         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
325                                    "Arial",
326                                    false,
327                                    libdcp::Color (255, 255, 255),
328                                    42,
329                                    libdcp::Time (0, 1, 42, 229, 250),
330                                    libdcp::Time (0, 1, 45, 62, 250),
331                                    95,
332                                    libdcp::VERTICAL_TOP,
333                                    libdcp::HORIZONTAL_CENTER,
334                                    "And you don't think it works",
335                                    libdcp::BORDER,
336                                    libdcp::Color (0, 0, 0),
337                                    libdcp::Time (0, 0, 0, 0, 250),
338                                    libdcp::Time (0, 0, 0, 0, 250)
339                                    ));
340
341         s = subs.subtitles_during (libdcp::Time (0, 1, 45, 200, 250), libdcp::Time (0, 1, 45, 201, 250));
342         BOOST_CHECK_EQUAL (s.size(), 2);
343         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
344                                    "Arial",
345                                    false,
346                                    libdcp::Color (255, 255, 255),
347                                    42,
348                                    libdcp::Time (0, 1, 45, 146, 250),
349                                    libdcp::Time (0, 1, 47, 94, 250),
350                                    89,
351                                    libdcp::VERTICAL_TOP,
352                                    libdcp::HORIZONTAL_CENTER,
353                                    "Then when you're not looking, it winks.",
354                                    libdcp::BORDER,
355                                    libdcp::Color (0, 0, 0),
356                                    libdcp::Time (0, 0, 0, 0, 250),
357                                    libdcp::Time (0, 0, 0, 0, 250)
358                                    ));
359         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
360                                    "Arial",
361                                    false,
362                                    libdcp::Color (255, 255, 255),
363                                    42,
364                                    libdcp::Time (0, 1, 45, 146, 250),
365                                    libdcp::Time (0, 1, 47, 94, 250),
366                                    95,
367                                    libdcp::VERTICAL_TOP,
368                                    libdcp::HORIZONTAL_CENTER,
369                                    "When it snows you will find Sister Sledge",
370                                    libdcp::BORDER,
371                                    libdcp::Color (0, 0, 0),
372                                    libdcp::Time (0, 0, 0, 0, 250),
373                                    libdcp::Time (0, 0, 0, 0, 250)
374                                    ));
375
376         s = subs.subtitles_during (libdcp::Time (0, 1, 47, 249, 250), libdcp::Time (0, 1, 47, 250, 250));
377         BOOST_CHECK_EQUAL (s.size(), 2);
378         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
379                                    "Arial",
380                                    false,
381                                    libdcp::Color (255, 255, 255),
382                                    42,
383                                    libdcp::Time (0, 1, 47, 146, 250),
384                                    libdcp::Time (0, 1, 48, 167, 250),
385                                    89,
386                                    libdcp::VERTICAL_TOP,
387                                    libdcp::HORIZONTAL_CENTER,
388                                    "Out mooning, at night, on the ledge",
389                                    libdcp::BORDER,
390                                    libdcp::Color (0, 0, 0),
391                                    libdcp::Time (0, 0, 0, 0, 250),
392                                    libdcp::Time (0, 0, 0, 0, 250)
393                                    ));
394         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
395                                    "Arial",
396                                    false,
397                                    libdcp::Color (255, 255, 255),
398                                    42,
399                                    libdcp::Time (0, 1, 47, 146, 250),
400                                    libdcp::Time (0, 1, 48, 167, 250),
401                                    95,
402                                    libdcp::VERTICAL_TOP,
403                                    libdcp::HORIZONTAL_CENTER,
404                                    "One storey down",
405                                    libdcp::BORDER,
406                                    libdcp::Color (0, 0, 0),
407                                    libdcp::Time (0, 0, 0, 0, 250),
408                                    libdcp::Time (0, 0, 0, 0, 250)
409                                    ));
410
411         s = subs.subtitles_during (libdcp::Time (0, 2, 6, 210, 250), libdcp::Time (0, 2, 6, 211, 250));
412         BOOST_CHECK_EQUAL (s.size(), 2);
413         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
414                                    "Arial",
415                                    true,
416                                    libdcp::Color (255, 255, 255),
417                                    42,
418                                    libdcp::Time (0, 2, 5, 208, 250),
419                                    libdcp::Time (0, 2, 7, 31, 250),
420                                    89,
421                                    libdcp::VERTICAL_TOP,
422                                    libdcp::HORIZONTAL_CENTER,
423                                    "HELLO",
424                                    libdcp::BORDER,
425                                    libdcp::Color (0, 0, 0),
426                                    libdcp::Time (0, 0, 0, 0, 250),
427                                    libdcp::Time (0, 0, 0, 0, 250)
428                                    ));
429         BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
430                                    "Arial",
431                                    true,
432                                    libdcp::Color (255, 255, 255),
433                                    42,
434                                    libdcp::Time (0, 2, 5, 208, 250),
435                                    libdcp::Time (0, 2, 7, 31, 250),
436                                    95,
437                                    libdcp::VERTICAL_TOP,
438                                    libdcp::HORIZONTAL_CENTER,
439                                    "WORLD",
440                                    libdcp::BORDER,
441                                    libdcp::Color (0, 0, 0),
442                                    libdcp::Time (0, 0, 0, 0, 250),
443                                    libdcp::Time (0, 0, 0, 0, 250)
444                                    ));
445 }
446
447 /* A very simple SMPTE one */
448 BOOST_AUTO_TEST_CASE (subtitles3)
449 {
450         libdcp::SubtitleAsset subs ("test/data", "subs3.xml");
451
452         list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_during (libdcp::Time (0, 0, 0, 0, 25), libdcp::Time (0, 0, 7, 0, 25));
453
454         BOOST_REQUIRE_EQUAL (s.size(), 1);
455         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
456                                    "",
457                                    false,
458                                    libdcp::Color (255, 255, 255),
459                                    42,
460                                    libdcp::Time (0, 0, 4, 21, 25),
461                                    libdcp::Time (0, 0, 6, 5, 25),
462                                    8,
463                                    libdcp::VERTICAL_BOTTOM,
464                                    libdcp::HORIZONTAL_CENTER,
465                                    "Hello world",
466                                    libdcp::BORDER,
467                                    libdcp::Color (0, 0, 0),
468                                    libdcp::Time (0, 0, 0, 0, 25),
469                                    libdcp::Time (0, 0, 0, 0, 25)
470                                    ));
471 }
472
473 /* <Font italic="yes"> in the middle of a string */
474 BOOST_AUTO_TEST_CASE (subtitles4)
475 {
476         libdcp::SubtitleAsset subs ("test/data", "subs4.xml");
477
478         list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_during (libdcp::Time (0, 0, 0, 0, 25), libdcp::Time (0, 0, 7, 0, 25));
479
480         BOOST_REQUIRE_EQUAL (s.size(), 1);
481         BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
482                                    "",
483                                    false,
484                                    libdcp::Color (255, 255, 255),
485                                    42,
486                                    libdcp::Time (0, 0, 4, 21, 25),
487                                    libdcp::Time (0, 0, 6, 5, 25),
488                                    8,
489                                    libdcp::VERTICAL_BOTTOM,
490                                    libdcp::HORIZONTAL_CENTER,
491                                    "Hello <i>there</i> world",
492                                    libdcp::BORDER,
493                                    libdcp::Color (0, 0, 0),
494                                    libdcp::Time (0, 0, 0, 0, 25),
495                                    libdcp::Time (0, 0, 0, 0, 25)
496                                    ));
497 }