2 Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
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.
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.
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.
21 #include <boost/filesystem.hpp>
27 #include "exceptions.h"
28 #include "subtitle_asset.h"
29 #include "picture_asset.h"
30 #include "sound_asset.h"
33 #define BOOST_TEST_DYN_LINK
34 #define BOOST_TEST_MODULE libdcp_test
35 #include <boost/test/unit_test.hpp>
38 using namespace boost;
43 return "test/data/32x32_red_square.j2c";
49 return "test/data/1s_24-bit_48k_silence.wav";
53 BOOST_AUTO_TEST_CASE (dcp_test)
55 Kumu::libdcp_test = true;
57 libdcp::Metadata* t = libdcp::Metadata::instance ();
58 t->issuer = "OpenDCP 0.0.25";
59 t->creator = "OpenDCP 0.0.25";
60 t->company_name = "OpenDCP";
61 t->product_name = "OpenDCP";
62 t->product_version = "0.0.25";
63 t->issue_date = "2012-07-17T04:45:18+00:00";
64 filesystem::remove_all ("build/test/foo");
65 filesystem::create_directories ("build/test/foo");
66 libdcp::DCP d ("build/test/foo");
67 shared_ptr<libdcp::CPL> cpl (new libdcp::CPL ("build/test/foo", "A Test DCP", libdcp::FEATURE, 24, 24));
69 shared_ptr<libdcp::MonoPictureAsset> mp (new libdcp::MonoPictureAsset (
80 shared_ptr<libdcp::SoundAsset> ms (new libdcp::SoundAsset (
90 cpl->add_reel (shared_ptr<libdcp::Reel> (new libdcp::Reel (mp, ms, shared_ptr<libdcp::SubtitleAsset> ())));
96 BOOST_AUTO_TEST_CASE (error_test)
98 libdcp::DCP d ("build/test/bar");
100 p.push_back ("frobozz");
102 BOOST_CHECK_THROW (new libdcp::MonoPictureAsset (p, "build/test/bar", "video.mxf", &d.Progress, 24, 24, 32, 32), libdcp::FileError);
103 BOOST_CHECK_THROW (new libdcp::SoundAsset (p, "build/test/bar", "audio.mxf", &d.Progress, 24, 24), libdcp::FileError);
106 BOOST_AUTO_TEST_CASE (read_dcp)
108 libdcp::DCP d ("test/ref/DCP");
111 list<shared_ptr<const libdcp::CPL> > cpls = d.cpls ();
112 BOOST_CHECK_EQUAL (cpls.size(), 1);
114 BOOST_CHECK_EQUAL (cpls.front()->name(), "A Test DCP");
115 BOOST_CHECK_EQUAL (cpls.front()->content_kind(), libdcp::FEATURE);
116 BOOST_CHECK_EQUAL (cpls.front()->frames_per_second(), 24);
117 BOOST_CHECK_EQUAL (cpls.front()->length(), 24);
120 BOOST_AUTO_TEST_CASE (subtitles1)
122 libdcp::SubtitleAsset subs ("test/data", "subs1.xml");
124 BOOST_CHECK_EQUAL (subs.language(), "French");
126 list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_at (libdcp::Time (0, 0, 6, 1));
127 BOOST_CHECK_EQUAL (s.size(), 1);
128 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
131 libdcp::Color (255, 255, 255),
133 libdcp::Time (0, 0, 5, 198),
134 libdcp::Time (0, 0, 7, 115),
137 "My jacket was Idi Amin's",
139 libdcp::Color (0, 0, 0),
140 libdcp::Time (0, 0, 0, 1),
141 libdcp::Time (0, 0, 0, 1)
144 s = subs.subtitles_at (libdcp::Time (0, 0, 7, 190));
145 BOOST_CHECK_EQUAL (s.size(), 2);
146 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
149 libdcp::Color (255, 255, 255),
151 libdcp::Time (0, 0, 7, 177),
152 libdcp::Time (0, 0, 11, 31),
155 "My corset was H.M. The Queen's",
157 libdcp::Color (0, 0, 0),
158 libdcp::Time (0, 0, 0, 1),
159 libdcp::Time (0, 0, 0, 1)
161 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
164 libdcp::Color (255, 255, 255),
166 libdcp::Time (0, 0, 7, 177),
167 libdcp::Time (0, 0, 11, 31),
170 "My large wonderbra",
172 libdcp::Color (0, 0, 0),
173 libdcp::Time (0, 0, 0, 1),
174 libdcp::Time (0, 0, 0, 1)
177 s = subs.subtitles_at (libdcp::Time (0, 0, 11, 95));
178 BOOST_CHECK_EQUAL (s.size(), 1);
179 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
182 libdcp::Color (255, 255, 255),
184 libdcp::Time (0, 0, 11, 94),
185 libdcp::Time (0, 0, 13, 63),
188 "Once belonged to the Shah",
190 libdcp::Color (0, 0, 0),
191 libdcp::Time (0, 0, 0, 1),
192 libdcp::Time (0, 0, 0, 1)
195 s = subs.subtitles_at (libdcp::Time (0, 0, 14, 42));
196 BOOST_CHECK_EQUAL (s.size(), 1);
197 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
200 libdcp::Color (255, 255, 255),
202 libdcp::Time (0, 0, 13, 104),
203 libdcp::Time (0, 0, 15, 177),
206 "And these are Roy Hattersley's jeans",
208 libdcp::Color (0, 0, 0),
209 libdcp::Time (0, 0, 0, 1),
210 libdcp::Time (0, 0, 0, 1)
214 BOOST_AUTO_TEST_CASE (subtitles2)
216 libdcp::SubtitleAsset subs ("test/data", "subs2.xml");
218 list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_at (libdcp::Time (0, 0, 42, 100));
219 BOOST_CHECK_EQUAL (s.size(), 2);
220 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
223 libdcp::Color (255, 255, 255),
225 libdcp::Time (0, 0, 41, 62),
226 libdcp::Time (0, 0, 43, 52),
229 "At afternoon tea with John Peel",
231 libdcp::Color (0, 0, 0),
232 libdcp::Time (0, 0, 0, 0),
233 libdcp::Time (0, 0, 0, 0)
235 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
238 libdcp::Color (255, 255, 255),
240 libdcp::Time (0, 0, 41, 62),
241 libdcp::Time (0, 0, 43, 52),
244 "I enquired if his accent was real",
246 libdcp::Color (0, 0, 0),
247 libdcp::Time (0, 0, 0, 0),
248 libdcp::Time (0, 0, 0, 0)
251 s = subs.subtitles_at (libdcp::Time (0, 0, 50, 50));
252 BOOST_CHECK_EQUAL (s.size(), 2);
253 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
256 libdcp::Color (255, 255, 255),
258 libdcp::Time (0, 0, 50, 42),
259 libdcp::Time (0, 0, 52, 21),
262 "He said \"out of the house",
264 libdcp::Color (0, 0, 0),
265 libdcp::Time (0, 0, 0, 0),
266 libdcp::Time (0, 0, 0, 0)
268 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
271 libdcp::Color (255, 255, 255),
273 libdcp::Time (0, 0, 50, 42),
274 libdcp::Time (0, 0, 52, 21),
277 "I'm incredibly scouse",
279 libdcp::Color (0, 0, 0),
280 libdcp::Time (0, 0, 0, 0),
281 libdcp::Time (0, 0, 0, 0)
284 s = subs.subtitles_at (libdcp::Time (0, 1, 2, 300));
285 BOOST_CHECK_EQUAL (s.size(), 2);
286 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
289 libdcp::Color (255, 255, 255),
291 libdcp::Time (0, 1, 2, 208),
292 libdcp::Time (0, 1, 4, 10),
295 "At home it depends how I feel.\"",
297 libdcp::Color (0, 0, 0),
298 libdcp::Time (0, 0, 0, 0),
299 libdcp::Time (0, 0, 0, 0)
301 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
304 libdcp::Color (255, 255, 255),
306 libdcp::Time (0, 1, 2, 208),
307 libdcp::Time (0, 1, 4, 10),
310 "I spent a long weekend in Brighton",
312 libdcp::Color (0, 0, 0),
313 libdcp::Time (0, 0, 0, 0),
314 libdcp::Time (0, 0, 0, 0)
317 s = subs.subtitles_at (libdcp::Time (0, 1, 15, 50));
318 BOOST_CHECK_EQUAL (s.size(), 2);
319 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
322 libdcp::Color (255, 255, 255),
324 libdcp::Time (0, 1, 15, 42),
325 libdcp::Time (0, 1, 16, 42),
328 "With the legendary Miss Enid Blyton",
330 libdcp::Color (0, 0, 0),
331 libdcp::Time (0, 0, 0, 0),
332 libdcp::Time (0, 0, 0, 0)
334 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
337 libdcp::Color (255, 255, 255),
339 libdcp::Time (0, 1, 15, 42),
340 libdcp::Time (0, 1, 16, 42),
343 "She said \"you be Noddy",
345 libdcp::Color (0, 0, 0),
346 libdcp::Time (0, 0, 0, 0),
347 libdcp::Time (0, 0, 0, 0)
350 s = subs.subtitles_at (libdcp::Time (0, 1, 27, 200));
351 BOOST_CHECK_EQUAL (s.size(), 2);
352 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
355 libdcp::Color (255, 255, 255),
357 libdcp::Time (0, 1, 27, 115),
358 libdcp::Time (0, 1, 28, 208),
361 "That curious creature the Sphinx",
363 libdcp::Color (0, 0, 0),
364 libdcp::Time (0, 0, 0, 0),
365 libdcp::Time (0, 0, 0, 0)
367 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
370 libdcp::Color (255, 255, 255),
372 libdcp::Time (0, 1, 27, 115),
373 libdcp::Time (0, 1, 28, 208),
376 "Is smarter than anyone thinks",
378 libdcp::Color (0, 0, 0),
379 libdcp::Time (0, 0, 0, 0),
380 libdcp::Time (0, 0, 0, 0)
383 s = subs.subtitles_at (libdcp::Time (0, 1, 42, 300));
384 BOOST_CHECK_EQUAL (s.size(), 2);
385 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
388 libdcp::Color (255, 255, 255),
390 libdcp::Time (0, 1, 42, 229),
391 libdcp::Time (0, 1, 45, 62),
394 "It sits there and smirks",
396 libdcp::Color (0, 0, 0),
397 libdcp::Time (0, 0, 0, 0),
398 libdcp::Time (0, 0, 0, 0)
400 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
403 libdcp::Color (255, 255, 255),
405 libdcp::Time (0, 1, 42, 229),
406 libdcp::Time (0, 1, 45, 62),
409 "And you don't think it works",
411 libdcp::Color (0, 0, 0),
412 libdcp::Time (0, 0, 0, 0),
413 libdcp::Time (0, 0, 0, 0)
416 s = subs.subtitles_at (libdcp::Time (0, 1, 45, 200));
417 BOOST_CHECK_EQUAL (s.size(), 2);
418 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
421 libdcp::Color (255, 255, 255),
423 libdcp::Time (0, 1, 45, 146),
424 libdcp::Time (0, 1, 47, 94),
427 "Then when you're not looking, it winks.",
429 libdcp::Color (0, 0, 0),
430 libdcp::Time (0, 0, 0, 0),
431 libdcp::Time (0, 0, 0, 0)
433 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
436 libdcp::Color (255, 255, 255),
438 libdcp::Time (0, 1, 45, 146),
439 libdcp::Time (0, 1, 47, 94),
442 "When it snows you will find Sister Sledge",
444 libdcp::Color (0, 0, 0),
445 libdcp::Time (0, 0, 0, 0),
446 libdcp::Time (0, 0, 0, 0)
449 s = subs.subtitles_at (libdcp::Time (0, 1, 47, 249));
450 BOOST_CHECK_EQUAL (s.size(), 2);
451 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
454 libdcp::Color (255, 255, 255),
456 libdcp::Time (0, 1, 47, 146),
457 libdcp::Time (0, 1, 48, 167),
460 "Out mooning, at night, on the ledge",
462 libdcp::Color (0, 0, 0),
463 libdcp::Time (0, 0, 0, 0),
464 libdcp::Time (0, 0, 0, 0)
466 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
469 libdcp::Color (255, 255, 255),
471 libdcp::Time (0, 1, 47, 146),
472 libdcp::Time (0, 1, 48, 167),
477 libdcp::Color (0, 0, 0),
478 libdcp::Time (0, 0, 0, 0),
479 libdcp::Time (0, 0, 0, 0)
482 s = subs.subtitles_at (libdcp::Time (0, 2, 6, 210));
483 BOOST_CHECK_EQUAL (s.size(), 2);
484 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
487 libdcp::Color (255, 255, 255),
489 libdcp::Time (0, 2, 5, 208),
490 libdcp::Time (0, 2, 7, 31),
495 libdcp::Color (0, 0, 0),
496 libdcp::Time (0, 0, 0, 0),
497 libdcp::Time (0, 0, 0, 0)
499 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
502 libdcp::Color (255, 255, 255),
504 libdcp::Time (0, 2, 5, 208),
505 libdcp::Time (0, 2, 7, 31),
510 libdcp::Color (0, 0, 0),
511 libdcp::Time (0, 0, 0, 0),
512 libdcp::Time (0, 0, 0, 0)
519 BOOST_AUTO_TEST_CASE (dcp_time)
521 libdcp::Time t (977143, 24);
523 BOOST_CHECK_EQUAL (t.t, 73);
524 BOOST_CHECK_EQUAL (t.s, 34);
525 BOOST_CHECK_EQUAL (t.m, 18);
526 BOOST_CHECK_EQUAL (t.h, 11);
528 libdcp::Time a (3, 2, 3, 4);
529 libdcp::Time b (2, 3, 4, 5);
531 libdcp::Time r = a - b;
532 BOOST_CHECK_EQUAL (r.h, 0);
533 BOOST_CHECK_EQUAL (r.m, 58);
534 BOOST_CHECK_EQUAL (r.s, 58);
535 BOOST_CHECK_EQUAL (r.t, 249);
537 a = libdcp::Time (1, 58, 56, 240);
538 b = libdcp::Time (1, 7, 12, 120);
540 BOOST_CHECK_EQUAL (r.h, 3);
541 BOOST_CHECK_EQUAL (r.m, 6);
542 BOOST_CHECK_EQUAL (r.s, 9);
543 BOOST_CHECK_EQUAL (r.t, 110);
545 a = libdcp::Time (24, 12, 6, 3);
546 b = libdcp::Time (16, 8, 4, 2);
547 BOOST_CHECK_CLOSE (a / b, 1.5, 1e-5);
550 BOOST_AUTO_TEST_CASE (color)
552 libdcp::Color c ("FFFF0000");
554 BOOST_CHECK_EQUAL (c.r, 255);
555 BOOST_CHECK_EQUAL (c.g, 0);
556 BOOST_CHECK_EQUAL (c.b, 0);
558 c = libdcp::Color ("FF00FF00");
560 BOOST_CHECK_EQUAL (c.r, 0);
561 BOOST_CHECK_EQUAL (c.g, 255);
562 BOOST_CHECK_EQUAL (c.b, 0);
564 c = libdcp::Color ("FF0000FF");
566 BOOST_CHECK_EQUAL (c.r, 0);
567 BOOST_CHECK_EQUAL (c.g, 0);
568 BOOST_CHECK_EQUAL (c.b, 255);