+
+
+/* Write some subtitle content as SMPTE XML and check that it is right */
+BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
+{
+ dcp::SMPTESubtitleAsset c;
+ c.set_reel_number (1);
+ c.set_language (dcp::LanguageTag("en"));
+ c.set_content_title_text ("Test");
+ c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
+
+ c.add (
+ make_shared<dcp::SubtitleString> (
+ string ("Frutiger"),
+ false,
+ false,
+ false,
+ dcp::Colour (255, 255, 255),
+ 48,
+ 1.0,
+ dcp::Time (0, 4, 9, 22, 24),
+ dcp::Time (0, 4, 11, 22, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.8,
+ dcp::VAlign::TOP,
+ dcp::Direction::LTR,
+ "Hello world",
+ dcp::Effect::NONE,
+ dcp::Colour (0, 0, 0),
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24),
+ 0
+ )
+ );
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ boost::optional<string> (),
+ true,
+ true,
+ true,
+ dcp::Colour (128, 0, 64),
+ 91,
+ 1.0,
+ dcp::Time (5, 41, 0, 21, 24),
+ dcp::Time (6, 12, 15, 21, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.4,
+ dcp::VAlign::BOTTOM,
+ dcp::Direction::RTL,
+ "What's going ",
+ dcp::Effect::BORDER,
+ dcp::Colour (1, 2, 3),
+ dcp::Time (1, 2, 3, 4, 24),
+ dcp::Time (5, 6, 7, 8, 24),
+ 0
+ )
+ );
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ boost::optional<string> (),
+ true,
+ true,
+ true,
+ dcp::Colour (128, 0, 64),
+ 91,
+ 1.0,
+ dcp::Time (5, 41, 0, 21, 24),
+ dcp::Time (6, 12, 15, 21, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.4,
+ dcp::VAlign::BOTTOM,
+ dcp::Direction::RTL,
+ "on",
+ dcp::Effect::BORDER,
+ dcp::Colour (1, 2, 3),
+ dcp::Time (1, 2, 3, 4, 24),
+ dcp::Time (5, 6, 7, 8, 24),
+ 4.2
+ )
+ );
+
+ c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
+
+ check_xml (
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
+ "<Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>"
+ "<ContentTitleText>Test</ContentTitleText>"
+ "<IssueDate>2016-04-01T03:52:00.000+00:00</IssueDate>"
+ "<ReelNumber>1</ReelNumber>"
+ "<Language>en</Language>"
+ "<EditRate>24 1</EditRate>"
+ "<TimeCodeRate>24</TimeCodeRate>"
+ "<SubtitleList>"
+ "<Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
+ "<Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:22\" TimeOut=\"00:04:11:22\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
+ "<Text Valign=\"top\" Vposition=\"80\">Hello world</Text>"
+ "</Subtitle>"
+ "</Font>"
+ "<Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underline=\"yes\" Weight=\"bold\">"
+ "<Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:21\" TimeOut=\"06:12:15:21\" FadeUpTime=\"01:02:03:04\" FadeDownTime=\"05:06:07:08\">"
+ "<Text Valign=\"bottom\" Vposition=\"40\" Direction=\"rtl\">What's going <Space Size=\"4.2\"/>on</Text>"
+ "</Subtitle>"
+ "</Font>"
+ "</SubtitleList>"
+ "</SubtitleReel>",
+ c.xml_as_string (),
+ vector<string>()
+ );
+}
+
+/* Write some subtitle content as SMPTE XML and check that it is right.
+ This includes in-line font changes.
+*/
+BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
+{
+ dcp::SMPTESubtitleAsset c;
+ c.set_reel_number (1);
+ c.set_language (dcp::LanguageTag("en"));
+ c.set_content_title_text ("Test");
+ c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ string ("Arial"),
+ false,
+ false,
+ false,
+ dcp::Colour (255, 255, 255),
+ 48,
+ 1.0,
+ dcp::Time (0, 0, 1, 0, 24),
+ dcp::Time (0, 0, 9, 0, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.8,
+ dcp::VAlign::TOP,
+ dcp::Direction::LTR,
+ "Testing is ",
+ dcp::Effect::NONE,
+ dcp::Colour (0, 0, 0),
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24),
+ 0
+ )
+ );
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ string ("Arial"),
+ true,
+ false,
+ false,
+ dcp::Colour (255, 255, 255),
+ 48,
+ 1.0,
+ dcp::Time (0, 0, 1, 0, 24),
+ dcp::Time (0, 0, 9, 0, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.8,
+ dcp::VAlign::TOP,
+ dcp::Direction::LTR,
+ "really",
+ dcp::Effect::NONE,
+ dcp::Colour (0, 0, 0),
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24),
+ 0
+ )
+ );
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ string ("Arial"),
+ false,
+ false,
+ false,
+ dcp::Colour (255, 255, 255),
+ 48,
+ 1.0,
+ dcp::Time (0, 0, 1, 0, 24),
+ dcp::Time (0, 0, 9, 0, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.8,
+ dcp::VAlign::TOP,
+ dcp::Direction::LTR,
+ " fun",
+ dcp::Effect::NONE,
+ dcp::Colour (0, 0, 0),
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24),
+ 0
+ )
+ );
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ string ("Arial"),
+ false,
+ false,
+ false,
+ dcp::Colour (255, 255, 255),
+ 48,
+ 1.0,
+ dcp::Time (0, 0, 1, 0, 24),
+ dcp::Time (0, 0, 9, 0, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.9,
+ dcp::VAlign::TOP,
+ dcp::Direction::LTR,
+ "This is the ",
+ dcp::Effect::NONE,
+ dcp::Colour (0, 0, 0),
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24),
+ 0
+ )
+ );
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ string ("Arial"),
+ true,
+ false,
+ false,
+ dcp::Colour (255, 255, 255),
+ 48,
+ 1.0,
+ dcp::Time (0, 0, 1, 0, 24),
+ dcp::Time (0, 0, 9, 0, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.9,
+ dcp::VAlign::TOP,
+ dcp::Direction::LTR,
+ "second",
+ dcp::Effect::NONE,
+ dcp::Colour (0, 0, 0),
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24),
+ 0
+ )
+ );
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ string ("Arial"),
+ false,
+ false,
+ false,
+ dcp::Colour (255, 255, 255),
+ 48,
+ 1.0,
+ dcp::Time (0, 0, 1, 0, 24),
+ dcp::Time (0, 0, 9, 0, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.9,
+ dcp::VAlign::TOP,
+ dcp::Direction::LTR,
+ " line",
+ dcp::Effect::NONE,
+ dcp::Colour (0, 0, 0),
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24),
+ 0
+ )
+ );
+
+ c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
+
+ check_xml (
+ c.xml_as_string(),
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
+ "<Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>"
+ "<ContentTitleText>Test</ContentTitleText>"
+ "<IssueDate>2016-04-01T03:52:00.000+00:00</IssueDate>"
+ "<ReelNumber>1</ReelNumber>"
+ "<Language>en</Language>"
+ "<EditRate>24 1</EditRate>"
+ "<TimeCodeRate>24</TimeCodeRate>"
+ "<SubtitleList>"
+ "<Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
+ "<Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
+ "<Text Valign=\"top\" Vposition=\"80\">"
+ "<Font Italic=\"no\">Testing is </Font>"
+ "<Font Italic=\"yes\">really</Font>"
+ "<Font Italic=\"no\"> fun</Font>"
+ "</Text>"
+ "<Text Valign=\"top\" Vposition=\"90\">"
+ "<Font Italic=\"no\">This is the </Font>"
+ "<Font Italic=\"yes\">second</Font>"
+ "<Font Italic=\"no\"> line</Font>"
+ "</Text>"
+ "</Subtitle>"
+ "</Font>"
+ "</SubtitleList>"
+ "</SubtitleReel>",
+ vector<string>()
+ );
+}
+
+/* Write some subtitle content as SMPTE using bitmaps and check that it is right */
+BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
+{
+ dcp::SMPTESubtitleAsset c;
+ c.set_reel_number (1);
+ c.set_language (dcp::LanguageTag("en"));
+ c.set_content_title_text ("Test");
+ c.set_start_time (dcp::Time());
+
+ boost::filesystem::path const sub_image = "test/data/sub.png";
+
+ c.add (
+ make_shared<dcp::SubtitleImage>(
+ dcp::ArrayData(sub_image),
+ dcp::Time (0, 4, 9, 22, 24),
+ dcp::Time (0, 4, 11, 22, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.8,
+ dcp::VAlign::TOP,
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24)
+ )
+ );
+
+ c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
+
+ boost::filesystem::path path = "build/test/write_smpte_subtitle_test3";
+ boost::filesystem::create_directories (path);
+ c.write (path / "subs.mxf");
+
+ dcp::SMPTESubtitleAsset read_back (path / "subs.mxf");
+ auto subs = read_back.subtitles ();
+ BOOST_REQUIRE_EQUAL (subs.size(), 1U);
+ auto image = dynamic_pointer_cast<const dcp::SubtitleImage>(subs[0]);
+ BOOST_REQUIRE (image);
+
+ BOOST_CHECK (image->png_image() == dcp::ArrayData(sub_image));
+ BOOST_CHECK (image->in() == dcp::Time(0, 4, 9, 22, 24));
+ BOOST_CHECK (image->out() == dcp::Time(0, 4, 11, 22, 24));
+ BOOST_CHECK_CLOSE (image->h_position(), 0.0, 1);
+ BOOST_CHECK (image->h_align() == dcp::HAlign::CENTER);
+ BOOST_CHECK_CLOSE (image->v_position(), 0.8, 1);
+ BOOST_CHECK (image->v_align() == dcp::VAlign::TOP);
+ BOOST_CHECK (image->fade_up_time() == dcp::Time(0, 0, 0, 0, 24));
+ BOOST_CHECK (image->fade_down_time() == dcp::Time(0, 0, 0, 0, 24));
+}
+
+
+/* Some closed caption systems require the <Text> elements to be written in order of their
+ * vertical position (see DoM bug #2106).
+ */
+BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_top_alignment)
+{
+ dcp::SMPTESubtitleAsset c;
+ c.set_reel_number (1);
+ c.set_language (dcp::LanguageTag("en"));
+ c.set_content_title_text ("Test");
+ c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ string ("Arial"),
+ false,
+ false,
+ false,
+ dcp::Colour (255, 255, 255),
+ 48,
+ 1.0,
+ dcp::Time (0, 0, 1, 0, 24),
+ dcp::Time (0, 0, 9, 0, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.8,
+ dcp::VAlign::TOP,
+ dcp::Direction::LTR,
+ "Top line",
+ dcp::Effect::NONE,
+ dcp::Colour (0, 0, 0),
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24),
+ 0
+ )
+ );
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ string ("Arial"),
+ false,
+ false,
+ false,
+ dcp::Colour (255, 255, 255),
+ 48,
+ 1.0,
+ dcp::Time (0, 0, 1, 0, 24),
+ dcp::Time (0, 0, 9, 0, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.9,
+ dcp::VAlign::TOP,
+ dcp::Direction::LTR,
+ "Bottom line",
+ dcp::Effect::NONE,
+ dcp::Colour (0, 0, 0),
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24),
+ 0
+ )
+ );
+
+ c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
+
+ check_xml (
+ c.xml_as_string(),
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
+ "<Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>"
+ "<ContentTitleText>Test</ContentTitleText>"
+ "<IssueDate>2016-04-01T03:52:00.000+00:00</IssueDate>"
+ "<ReelNumber>1</ReelNumber>"
+ "<Language>en</Language>"
+ "<EditRate>24 1</EditRate>"
+ "<TimeCodeRate>24</TimeCodeRate>"
+ "<SubtitleList>"
+ "<Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
+ "<Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
+ "<Text Valign=\"top\" Vposition=\"80\">Top line</Text>"
+ "<Text Valign=\"top\" Vposition=\"90\">Bottom line</Text>"
+ "</Subtitle>"
+ "</Font>"
+ "</SubtitleList>"
+ "</SubtitleReel>",
+ {}
+ );
+}
+
+
+/* See the test above */
+BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_bottom_alignment)
+{
+ dcp::SMPTESubtitleAsset c;
+ c.set_reel_number (1);
+ c.set_language (dcp::LanguageTag("en"));
+ c.set_content_title_text ("Test");
+ c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ string ("Arial"),
+ false,
+ false,
+ false,
+ dcp::Colour (255, 255, 255),
+ 48,
+ 1.0,
+ dcp::Time (0, 0, 1, 0, 24),
+ dcp::Time (0, 0, 9, 0, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.8,
+ dcp::VAlign::BOTTOM,
+ dcp::Direction::LTR,
+ "Top line",
+ dcp::Effect::NONE,
+ dcp::Colour (0, 0, 0),
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24),
+ 0
+ )
+ );
+
+ c.add (
+ make_shared<dcp::SubtitleString>(
+ string ("Arial"),
+ false,
+ false,
+ false,
+ dcp::Colour (255, 255, 255),
+ 48,
+ 1.0,
+ dcp::Time (0, 0, 1, 0, 24),
+ dcp::Time (0, 0, 9, 0, 24),
+ 0,
+ dcp::HAlign::CENTER,
+ 0.7,
+ dcp::VAlign::BOTTOM,
+ dcp::Direction::LTR,
+ "Bottom line",
+ dcp::Effect::NONE,
+ dcp::Colour (0, 0, 0),
+ dcp::Time (0, 0, 0, 0, 24),
+ dcp::Time (0, 0, 0, 0, 24),
+ 0
+ )
+ );
+
+ c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
+
+ check_xml (
+ c.xml_as_string(),
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
+ "<Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>"
+ "<ContentTitleText>Test</ContentTitleText>"
+ "<IssueDate>2016-04-01T03:52:00.000+00:00</IssueDate>"
+ "<ReelNumber>1</ReelNumber>"
+ "<Language>en</Language>"
+ "<EditRate>24 1</EditRate>"
+ "<TimeCodeRate>24</TimeCodeRate>"
+ "<SubtitleList>"
+ "<Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
+ "<Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
+ "<Text Valign=\"bottom\" Vposition=\"80\">Top line</Text>"
+ "<Text Valign=\"bottom\" Vposition=\"70\">Bottom line</Text>"
+ "</Subtitle>"
+ "</Font>"
+ "</SubtitleList>"
+ "</SubtitleReel>",
+ {}
+ );
+}
+