2 Copyright (C) 2018-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.
35 #include "smpte_load_font_node.h"
36 #include "smpte_subtitle_asset.h"
37 #include "stream_operators.h"
38 #include "subtitle_image.h"
41 #include <boost/optional/optional_io.hpp>
42 #include <boost/test/unit_test.hpp>
45 using std::dynamic_pointer_cast;
46 using std::shared_ptr;
49 using boost::optional;
52 BOOST_AUTO_TEST_CASE (smpte_subtitle_id_test)
54 dcp::SMPTESubtitleAsset subs;
56 std::make_shared<dcp::SubtitleString>(
62 dcp::Time(0, 1, 2, 3, 24),
63 dcp::Time(0, 2, 2, 3, 24),
73 dcp::Time(0, 0, 0, 0, 24),
74 dcp::Time(0, 0, 0, 0, 24),
76 std::vector<dcp::Ruby>()
79 subs.write("build/test/smpte_subtitle_id_test.mxf");
81 dcp::SMPTESubtitleAsset check("build/test/smpte_subtitle_id_test.mxf");
82 BOOST_CHECK(check.id() != check.xml_id());
86 /** Check reading of a SMPTE subtitle file */
87 BOOST_AUTO_TEST_CASE (read_smpte_subtitle_test)
89 dcp::SMPTESubtitleAsset sc (
92 "JourneyToJah_TLR-1_F_EN-DE-FR_CH_51_2K_LOK_20140225_DGL_SMPTE_OV" /
93 "8b48f6ae-c74b-4b80-b994-a8236bbbad74_sub.mxf"
96 BOOST_CHECK_EQUAL (sc.id(), "8b48f6ae-c74b-4b80-b994-a8236bbbad74");
97 BOOST_CHECK_EQUAL (sc.content_title_text(), "Journey to Jah");
98 BOOST_REQUIRE (sc.annotation_text());
99 BOOST_CHECK_EQUAL (sc.annotation_text().get(), "Journey to Jah");
100 BOOST_CHECK_EQUAL (sc.issue_date(), dcp::LocalTime ("2014-02-25T11:22:48.000-00:00"));
101 BOOST_REQUIRE (sc.reel_number());
102 BOOST_CHECK_EQUAL (sc.reel_number().get(), 1);
103 BOOST_REQUIRE (sc.language ());
104 BOOST_CHECK_EQUAL (sc.language().get (), "de");
105 BOOST_CHECK_EQUAL (sc.edit_rate(), dcp::Fraction (25, 1));
106 BOOST_CHECK_EQUAL (sc.time_code_rate(), 25);
107 BOOST_CHECK_EQUAL (sc.start_time(), dcp::Time (0, 0, 0, 0, 25));
108 auto lfn = sc.load_font_nodes ();
109 BOOST_REQUIRE_EQUAL (lfn.size(), 1U);
110 shared_ptr<dcp::SMPTELoadFontNode> smpte_lfn = dynamic_pointer_cast<dcp::SMPTELoadFontNode> (lfn.front ());
111 BOOST_REQUIRE (smpte_lfn);
112 BOOST_CHECK_EQUAL (smpte_lfn->id, "theFontId");
113 BOOST_CHECK_EQUAL (smpte_lfn->urn, "9118bbce-4105-4a05-b37c-a5a6f75e1fea");
114 BOOST_REQUIRE_EQUAL (sc.subtitles().size(), 63U);
115 BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().front()));
116 BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().front())->text(), "Noch mal.");
117 BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().front())->space_before(), 0.0f);
118 BOOST_CHECK_EQUAL (sc.subtitles().front()->in(), dcp::Time (0, 0, 25, 12, 25));
119 BOOST_CHECK_EQUAL (sc.subtitles().front()->out(), dcp::Time (0, 0, 26, 4, 25));
120 BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().back()));
121 BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().back())->text(), "Prochainement");
122 BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().back())->space_before(), 0.0f);
123 BOOST_CHECK_EQUAL (sc.subtitles().back()->in(), dcp::Time (0, 1, 57, 17, 25));
124 BOOST_CHECK_EQUAL (sc.subtitles().back()->out(), dcp::Time (0, 1, 58, 12, 25));
128 /** And another one featuring <Font> within <Text> and some <Space> */
129 BOOST_AUTO_TEST_CASE (read_smpte_subtitle_test2)
131 dcp::SMPTESubtitleAsset sc (private_test / "olsson.xml");
133 auto subs = sc.subtitles();
134 BOOST_REQUIRE_EQUAL (subs.size(), 6U);
136 auto is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
138 BOOST_CHECK_EQUAL (is->text(), "Testing is ");
139 BOOST_CHECK (!is->italic());
140 BOOST_CHECK_CLOSE (is->space_before(), 0, 0.1);
142 is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
144 BOOST_CHECK_EQUAL (is->text(), "really");
145 BOOST_CHECK (is->italic());
146 BOOST_CHECK_CLOSE (is->space_before(), 0, 0.1);
148 is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
150 BOOST_CHECK_EQUAL (is->text(), " fun!");
151 BOOST_CHECK (!is->italic());
152 BOOST_CHECK_CLOSE (is->space_before(), 5, 0.1);
154 is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
156 BOOST_CHECK_EQUAL (is->text(), "This is the ");
157 BOOST_CHECK (!is->italic());
158 BOOST_CHECK_CLOSE (is->space_before(), 0, 0.1);
160 is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
162 BOOST_CHECK_EQUAL (is->text(), "second");
163 BOOST_CHECK (is->italic());
164 BOOST_CHECK_CLOSE (is->space_before(), 0, 0.1);
166 is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
168 BOOST_CHECK_EQUAL (is->text(), " line!");
169 BOOST_CHECK (!is->italic());
170 BOOST_CHECK_CLOSE (is->space_before(), 0, 0.1);
174 /* Write some subtitle content as SMPTE XML and check that it is right */
175 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
177 dcp::SMPTESubtitleAsset c;
178 c.set_reel_number (1);
179 c.set_language (dcp::LanguageTag("en"));
180 c.set_content_title_text ("Test");
181 c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
184 std::make_shared<dcp::SubtitleString> (
189 dcp::Colour (255, 255, 255),
192 dcp::Time (0, 4, 9, 22, 24),
193 dcp::Time (0, 4, 11, 22, 24),
202 dcp::Colour (0, 0, 0),
203 dcp::Time (0, 0, 0, 0, 24),
204 dcp::Time (0, 0, 0, 0, 24),
206 std::vector<dcp::Ruby>()
211 std::make_shared<dcp::SubtitleString>(
212 boost::optional<string> (),
216 dcp::Colour (128, 0, 64),
219 dcp::Time (5, 41, 0, 21, 24),
220 dcp::Time (6, 12, 15, 21, 24),
229 dcp::Colour (1, 2, 3),
230 dcp::Time (1, 2, 3, 4, 24),
231 dcp::Time (5, 6, 7, 8, 24),
233 std::vector<dcp::Ruby>()
238 std::make_shared<dcp::SubtitleString>(
239 boost::optional<string> (),
243 dcp::Colour (128, 0, 64),
246 dcp::Time (5, 41, 0, 21, 24),
247 dcp::Time (6, 12, 15, 21, 24),
256 dcp::Colour (1, 2, 3),
257 dcp::Time (1, 2, 3, 4, 24),
258 dcp::Time (5, 6, 7, 8, 24),
260 std::vector<dcp::Ruby>()
264 c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
267 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
268 "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
269 " <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
270 " <ContentTitleText>Test</ContentTitleText>\n"
271 " <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
272 " <ReelNumber>1</ReelNumber>\n"
273 " <Language>en</Language>\n"
274 " <EditRate>24 1</EditRate>\n"
275 " <TimeCodeRate>24</TimeCodeRate>\n"
277 " <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
278 " <Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:22\" TimeOut=\"00:04:11:22\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
279 " <Text Valign=\"top\" Vposition=\"80\" Zposition=\"30\">Hello world</Text>\n"
282 " <Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underline=\"yes\" Weight=\"bold\">\n"
283 " <Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:21\" TimeOut=\"06:12:15:21\" FadeUpTime=\"01:02:03:04\" FadeDownTime=\"05:06:07:08\">\n"
284 " <Text Valign=\"bottom\" Vposition=\"40\" Direction=\"rtl\">What's going <Space Size=\"4.2\"/>on</Text>\n"
294 /* Write some subtitle content as SMPTE XML and check that it is right.
295 This includes in-line font changes.
297 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
299 dcp::SMPTESubtitleAsset c;
300 c.set_reel_number (1);
301 c.set_language (dcp::LanguageTag("en"));
302 c.set_content_title_text ("Test");
303 c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
306 std::make_shared<dcp::SubtitleString>(
311 dcp::Colour (255, 255, 255),
314 dcp::Time (0, 0, 1, 0, 24),
315 dcp::Time (0, 0, 9, 0, 24),
324 dcp::Colour (0, 0, 0),
325 dcp::Time (0, 0, 0, 0, 24),
326 dcp::Time (0, 0, 0, 0, 24),
328 std::vector<dcp::Ruby>()
333 std::make_shared<dcp::SubtitleString>(
338 dcp::Colour (255, 255, 255),
341 dcp::Time (0, 0, 1, 0, 24),
342 dcp::Time (0, 0, 9, 0, 24),
351 dcp::Colour (0, 0, 0),
352 dcp::Time (0, 0, 0, 0, 24),
353 dcp::Time (0, 0, 0, 0, 24),
355 std::vector<dcp::Ruby>()
360 std::make_shared<dcp::SubtitleString>(
365 dcp::Colour (255, 255, 255),
368 dcp::Time (0, 0, 1, 0, 24),
369 dcp::Time (0, 0, 9, 0, 24),
378 dcp::Colour (0, 0, 0),
379 dcp::Time (0, 0, 0, 0, 24),
380 dcp::Time (0, 0, 0, 0, 24),
382 std::vector<dcp::Ruby>()
387 std::make_shared<dcp::SubtitleString>(
392 dcp::Colour (255, 255, 255),
395 dcp::Time (0, 0, 1, 0, 24),
396 dcp::Time (0, 0, 9, 0, 24),
405 dcp::Colour (0, 0, 0),
406 dcp::Time (0, 0, 0, 0, 24),
407 dcp::Time (0, 0, 0, 0, 24),
409 std::vector<dcp::Ruby>()
414 std::make_shared<dcp::SubtitleString>(
419 dcp::Colour (255, 255, 255),
422 dcp::Time (0, 0, 1, 0, 24),
423 dcp::Time (0, 0, 9, 0, 24),
432 dcp::Colour (0, 0, 0),
433 dcp::Time (0, 0, 0, 0, 24),
434 dcp::Time (0, 0, 0, 0, 24),
436 std::vector<dcp::Ruby>()
441 std::make_shared<dcp::SubtitleString>(
446 dcp::Colour (255, 255, 255),
449 dcp::Time (0, 0, 1, 0, 24),
450 dcp::Time (0, 0, 9, 0, 24),
459 dcp::Colour (0, 0, 0),
460 dcp::Time (0, 0, 0, 0, 24),
461 dcp::Time (0, 0, 0, 0, 24),
463 std::vector<dcp::Ruby>()
467 c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
471 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
472 "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
473 " <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
474 " <ContentTitleText>Test</ContentTitleText>\n"
475 " <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
476 " <ReelNumber>1</ReelNumber>\n"
477 " <Language>en</Language>\n"
478 " <EditRate>24 1</EditRate>\n"
479 " <TimeCodeRate>24</TimeCodeRate>\n"
481 " <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
482 " <Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
483 " <Text Valign=\"top\" Vposition=\"80\"><Font Italic=\"no\">Testing is </Font><Font Italic=\"yes\">really</Font><Font Italic=\"no\"> fun</Font></Text>\n"
484 " <Text Valign=\"top\" Vposition=\"90\"><Font Italic=\"no\">This is the </Font><Font Italic=\"yes\">second</Font><Font Italic=\"no\"> line</Font></Text>\n"
493 /* Write some subtitle content as SMPTE using bitmaps and check that it is right */
494 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
496 dcp::SMPTESubtitleAsset c;
497 c.set_reel_number (1);
498 c.set_language (dcp::LanguageTag("en"));
499 c.set_content_title_text ("Test");
500 c.set_start_time (dcp::Time());
502 boost::filesystem::path const sub_image = "test/data/sub.png";
505 std::make_shared<dcp::SubtitleImage>(
506 dcp::ArrayData(sub_image),
507 dcp::Time (0, 4, 9, 22, 24),
508 dcp::Time (0, 4, 11, 22, 24),
514 dcp::Time (0, 0, 0, 0, 24),
515 dcp::Time (0, 0, 0, 0, 24)
519 c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
521 boost::filesystem::path path = "build/test/write_smpte_subtitle_test3";
522 boost::filesystem::create_directories (path);
523 c.write (path / "subs.mxf");
525 dcp::SMPTESubtitleAsset read_back (path / "subs.mxf");
526 auto subs = read_back.subtitles ();
527 BOOST_REQUIRE_EQUAL (subs.size(), 1U);
528 auto image = dynamic_pointer_cast<const dcp::SubtitleImage>(subs[0]);
529 BOOST_REQUIRE (image);
531 BOOST_CHECK (image->png_image() == dcp::ArrayData(sub_image));
532 BOOST_CHECK (image->in() == dcp::Time(0, 4, 9, 22, 24));
533 BOOST_CHECK (image->out() == dcp::Time(0, 4, 11, 22, 24));
534 BOOST_CHECK_CLOSE (image->h_position(), 0.0, 1);
535 BOOST_CHECK (image->h_align() == dcp::HAlign::CENTER);
536 BOOST_CHECK_CLOSE (image->v_position(), 0.8, 1);
537 BOOST_CHECK (image->v_align() == dcp::VAlign::TOP);
538 BOOST_CHECK_EQUAL(image->z_position(), -88);
539 BOOST_CHECK (image->fade_up_time() == dcp::Time(0, 0, 0, 0, 24));
540 BOOST_CHECK (image->fade_down_time() == dcp::Time(0, 0, 0, 0, 24));
544 /* Some closed caption systems require the <Text> elements to be written in order of their
545 * vertical position (see DoM bug #2106).
547 BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_top_alignment)
549 dcp::SMPTESubtitleAsset c;
550 c.set_reel_number (1);
551 c.set_language (dcp::LanguageTag("en"));
552 c.set_content_title_text ("Test");
553 c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
556 std::make_shared<dcp::SubtitleString>(
561 dcp::Colour (255, 255, 255),
564 dcp::Time (0, 0, 1, 0, 24),
565 dcp::Time (0, 0, 9, 0, 24),
574 dcp::Colour (0, 0, 0),
575 dcp::Time (0, 0, 0, 0, 24),
576 dcp::Time (0, 0, 0, 0, 24),
578 std::vector<dcp::Ruby>()
583 std::make_shared<dcp::SubtitleString>(
588 dcp::Colour (255, 255, 255),
591 dcp::Time (0, 0, 1, 0, 24),
592 dcp::Time (0, 0, 9, 0, 24),
601 dcp::Colour (0, 0, 0),
602 dcp::Time (0, 0, 0, 0, 24),
603 dcp::Time (0, 0, 0, 0, 24),
605 std::vector<dcp::Ruby>()
609 c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
613 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
614 "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
615 " <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
616 " <ContentTitleText>Test</ContentTitleText>\n"
617 " <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
618 " <ReelNumber>1</ReelNumber>\n"
619 " <Language>en</Language>\n"
620 " <EditRate>24 1</EditRate>\n"
621 " <TimeCodeRate>24</TimeCodeRate>\n"
623 " <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
624 " <Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
625 " <Text Valign=\"top\" Vposition=\"80\">Top line</Text>\n"
626 " <Text Valign=\"top\" Vposition=\"90\">Bottom line</Text>\n"
636 /* See the test above */
637 BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_bottom_alignment)
639 dcp::SMPTESubtitleAsset c;
640 c.set_reel_number (1);
641 c.set_language (dcp::LanguageTag("en"));
642 c.set_content_title_text ("Test");
643 c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
646 std::make_shared<dcp::SubtitleString>(
651 dcp::Colour (255, 255, 255),
654 dcp::Time (0, 0, 1, 0, 24),
655 dcp::Time (0, 0, 9, 0, 24),
664 dcp::Colour (0, 0, 0),
665 dcp::Time (0, 0, 0, 0, 24),
666 dcp::Time (0, 0, 0, 0, 24),
668 std::vector<dcp::Ruby>()
673 std::make_shared<dcp::SubtitleString>(
678 dcp::Colour (255, 255, 255),
681 dcp::Time (0, 0, 1, 0, 24),
682 dcp::Time (0, 0, 9, 0, 24),
691 dcp::Colour (0, 0, 0),
692 dcp::Time (0, 0, 0, 0, 24),
693 dcp::Time (0, 0, 0, 0, 24),
695 std::vector<dcp::Ruby>()
699 c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
703 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
704 "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
705 " <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
706 " <ContentTitleText>Test</ContentTitleText>\n"
707 " <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
708 " <ReelNumber>1</ReelNumber>\n"
709 " <Language>en</Language>\n"
710 " <EditRate>24 1</EditRate>\n"
711 " <TimeCodeRate>24</TimeCodeRate>\n"
713 " <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
714 " <Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
715 " <Text Valign=\"bottom\" Vposition=\"80\">Top line</Text>\n"
716 " <Text Valign=\"bottom\" Vposition=\"70\">Bottom line</Text>\n"
726 BOOST_AUTO_TEST_CASE(smpte_subtitle_standard_written_correctly)
730 boost::filesystem::path const ref = "test/data";
731 boost::filesystem::path const out = "build/test/smpte_subtitle_standard_written_correctly";
733 boost::filesystem::remove_all(out);
734 boost::filesystem::create_directories(out);
736 dcp::SMPTESubtitleAsset test_2014;
737 test_2014.set_issue_date(dcp::LocalTime("2020-01-01T14:00:00"));
738 test_2014.write(out / "2014.mxf");
739 BOOST_CHECK_EQUAL(dcp::SMPTESubtitleAsset(ref / "2014.mxf").raw_xml(), dcp::SMPTESubtitleAsset(out / "2014.mxf").raw_xml());
741 dcp::SMPTESubtitleAsset test_2010(dcp::SubtitleStandard::SMPTE_2010);
742 test_2010.set_issue_date(dcp::LocalTime("2020-01-01T14:00:00"));
743 test_2010.write(out / "2010.mxf");
744 BOOST_CHECK_EQUAL(dcp::SMPTESubtitleAsset(ref / "2010.mxf").raw_xml(), dcp::SMPTESubtitleAsset(out / "2010.mxf").raw_xml());
746 dcp::SMPTESubtitleAsset test_2007(dcp::SubtitleStandard::SMPTE_2007);
747 test_2007.set_issue_date(dcp::LocalTime("2020-01-01T14:00:00"));
748 test_2007.write(out / "2007.mxf");
749 BOOST_CHECK_EQUAL(dcp::SMPTESubtitleAsset(ref / "2007.mxf").raw_xml(), dcp::SMPTESubtitleAsset(out / "2007.mxf").raw_xml());
753 BOOST_AUTO_TEST_CASE(smpte_subtitle_standard_read_correctly)
755 dcp::SMPTESubtitleAsset test_2007("test/data/2007.mxf");
756 BOOST_CHECK(test_2007.subtitle_standard() == dcp::SubtitleStandard::SMPTE_2007);
758 dcp::SMPTESubtitleAsset test_2010("test/data/2010.mxf");
759 BOOST_CHECK(test_2010.subtitle_standard() == dcp::SubtitleStandard::SMPTE_2010);
761 dcp::SMPTESubtitleAsset test_2014("test/data/2014.mxf");
762 BOOST_CHECK(test_2014.subtitle_standard() == dcp::SubtitleStandard::SMPTE_2014);
766 BOOST_AUTO_TEST_CASE(smpte_subtitle_intrinsic_duration_read_correctly)
768 dcp::SMPTESubtitleAsset ref("test/data/verify_incorrect_closed_caption_ordering3.xml");
773 auto constexpr duration = 480U;
775 ref.set_intrinsic_duration(duration);
777 auto const path = boost::filesystem::path("build/test/smpte_subtitle_instrinsic_duration_read_correctly.mxf");
780 auto check = dcp::SMPTESubtitleAsset(path);
782 BOOST_CHECK_EQUAL(check.intrinsic_duration(), duration);