Add Dolby EDR metadata support (GH #12).
[libdcp.git] / test / smpte_subtitle_test.cc
index 2b8491a35443b36ae9a005210dbca94b965b2c12..3bf9dc5207a2cec205ca71ab1170fd055529d38b 100644 (file)
 #include <boost/test/unit_test.hpp>
 
 
-using std::make_shared;
-using std::string;
-using std::shared_ptr;
 using std::dynamic_pointer_cast;
+using std::shared_ptr;
+using std::string;
 using std::vector;
 using boost::optional;
 
@@ -54,7 +53,7 @@ BOOST_AUTO_TEST_CASE (smpte_subtitle_id_test)
 {
        dcp::SMPTESubtitleAsset subs;
        subs.add(
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        optional<string>(),
                        false, false, false,
                        dcp::Colour(),
@@ -66,13 +65,15 @@ BOOST_AUTO_TEST_CASE (smpte_subtitle_id_test)
                        dcp::HAlign::CENTER,
                        0.5,
                        dcp::VAlign::CENTER,
+                       0,
                        dcp::Direction::LTR,
                        "Hello",
                        dcp::Effect::NONE,
                        dcp::Colour(),
                        dcp::Time(0, 0, 0, 0, 24),
                        dcp::Time(0, 0, 0, 0, 24),
-                       0
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
        subs.write("build/test/smpte_subtitle_id_test.mxf");
@@ -105,12 +106,12 @@ BOOST_AUTO_TEST_CASE (read_smpte_subtitle_test)
        BOOST_CHECK_EQUAL (sc.time_code_rate(), 25);
        BOOST_CHECK_EQUAL (sc.start_time(), dcp::Time (0, 0, 0, 0, 25));
        auto lfn = sc.load_font_nodes ();
-       BOOST_REQUIRE_EQUAL (lfn.size(), 1);
+       BOOST_REQUIRE_EQUAL (lfn.size(), 1U);
        shared_ptr<dcp::SMPTELoadFontNode> smpte_lfn = dynamic_pointer_cast<dcp::SMPTELoadFontNode> (lfn.front ());
        BOOST_REQUIRE (smpte_lfn);
        BOOST_CHECK_EQUAL (smpte_lfn->id, "theFontId");
        BOOST_CHECK_EQUAL (smpte_lfn->urn, "9118bbce-4105-4a05-b37c-a5a6f75e1fea");
-       BOOST_REQUIRE_EQUAL (sc.subtitles().size(), 63);
+       BOOST_REQUIRE_EQUAL (sc.subtitles().size(), 63U);
        BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().front()));
        BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().front())->text(), "Noch mal.");
        BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().front())->space_before(), 0.0f);
@@ -130,7 +131,7 @@ BOOST_AUTO_TEST_CASE (read_smpte_subtitle_test2)
        dcp::SMPTESubtitleAsset sc (private_test / "olsson.xml");
 
        auto subs = sc.subtitles();
-       BOOST_REQUIRE_EQUAL (subs.size(), 6);
+       BOOST_REQUIRE_EQUAL (subs.size(), 6U);
        auto i = 0;
        auto is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
        BOOST_REQUIRE (is);
@@ -180,7 +181,7 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
        c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
 
        c.add (
-               make_shared<dcp::SubtitleString> (
+               std::make_shared<dcp::SubtitleString> (
                        string ("Frutiger"),
                        false,
                        false,
@@ -194,18 +195,20 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::TOP,
+                       0.3,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        boost::optional<string> (),
                        true,
                        true,
@@ -219,18 +222,20 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
                        dcp::HAlign::CENTER,
                        0.4,
                        dcp::VAlign::BOTTOM,
+                       0,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        boost::optional<string> (),
                        true,
                        true,
@@ -244,40 +249,42 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
                        dcp::HAlign::CENTER,
                        0.4,
                        dcp::VAlign::BOTTOM,
+                       0,
                        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
+                       4.2,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
        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>"
+               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+               "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
+               "  <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
+               "  <ContentTitleText>Test</ContentTitleText>\n"
+               "  <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
+               "  <ReelNumber>1</ReelNumber>\n"
+               "  <Language>en</Language>\n"
+               "  <EditRate>24 1</EditRate>\n"
+               "  <TimeCodeRate>24</TimeCodeRate>\n"
+               "  <SubtitleList>\n"
+               "    <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
+               "      <Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:22\" TimeOut=\"00:04:11:22\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
+               "        <Text Valign=\"top\" Vposition=\"80\" Zposition=\"30\">Hello world</Text>\n"
+               "      </Subtitle>\n"
+               "    </Font>\n"
+               "    <Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underline=\"yes\" Weight=\"bold\">\n"
+               "      <Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:21\" TimeOut=\"06:12:15:21\" FadeUpTime=\"01:02:03:04\" FadeDownTime=\"05:06:07:08\">\n"
+               "        <Text Valign=\"bottom\" Vposition=\"40\" Direction=\"rtl\">What's going <Space Size=\"4.2\"/>on</Text>\n"
+               "      </Subtitle>\n"
+               "    </Font>\n"
+               "  </SubtitleList>\n"
                "</SubtitleReel>",
                c.xml_as_string (),
                vector<string>()
@@ -296,7 +303,7 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
        c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -310,18 +317,20 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::TOP,
+                       0,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        true,
                        false,
@@ -335,18 +344,20 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::TOP,
+                       0,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -360,18 +371,20 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::TOP,
+                       0,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -385,18 +398,20 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.9,
                        dcp::VAlign::TOP,
+                       0,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        true,
                        false,
@@ -410,18 +425,20 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.9,
                        dcp::VAlign::TOP,
+                       0,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -435,13 +452,15 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.9,
                        dcp::VAlign::TOP,
+                       0,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
@@ -449,31 +468,23 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
 
        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>"
+               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+               "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
+               "  <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
+               "  <ContentTitleText>Test</ContentTitleText>\n"
+               "  <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
+               "  <ReelNumber>1</ReelNumber>\n"
+               "  <Language>en</Language>\n"
+               "  <EditRate>24 1</EditRate>\n"
+               "  <TimeCodeRate>24</TimeCodeRate>\n"
+               "  <SubtitleList>\n"
+               "    <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
+               "      <Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
+               "        <Text Valign=\"top\" Vposition=\"80\"><Font Italic=\"no\">Testing is </Font><Font Italic=\"yes\">really</Font><Font Italic=\"no\"> fun</Font></Text>\n"
+               "        <Text Valign=\"top\" Vposition=\"90\"><Font Italic=\"no\">This is the </Font><Font Italic=\"yes\">second</Font><Font Italic=\"no\"> line</Font></Text>\n"
+               "      </Subtitle>\n"
+               "    </Font>\n"
+               "  </SubtitleList>\n"
                "</SubtitleReel>",
                vector<string>()
                );
@@ -491,7 +502,7 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
        boost::filesystem::path const sub_image = "test/data/sub.png";
 
        c.add (
-               make_shared<dcp::SubtitleImage>(
+               std::make_shared<dcp::SubtitleImage>(
                        dcp::ArrayData(sub_image),
                        dcp::Time (0, 4,  9, 22, 24),
                        dcp::Time (0, 4, 11, 22, 24),
@@ -499,6 +510,7 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::TOP,
+                       -88,
                        dcp::Time (0, 0, 0, 0, 24),
                        dcp::Time (0, 0, 0, 0, 24)
                        )
@@ -523,6 +535,7 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
        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_EQUAL(image->z_position(), -88);
        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));
 }
@@ -540,7 +553,7 @@ BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_top_alignment)
        c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -554,18 +567,20 @@ BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_top_alignment)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::TOP,
+                       0,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -579,13 +594,15 @@ BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_top_alignment)
                        dcp::HAlign::CENTER,
                        0.9,
                        dcp::VAlign::TOP,
+                       0,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
@@ -593,23 +610,23 @@ BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_top_alignment)
 
        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>"
+               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+               "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
+               "  <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
+               "  <ContentTitleText>Test</ContentTitleText>\n"
+               "  <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
+               "  <ReelNumber>1</ReelNumber>\n"
+               "  <Language>en</Language>\n"
+               "  <EditRate>24 1</EditRate>\n"
+               "  <TimeCodeRate>24</TimeCodeRate>\n"
+               "  <SubtitleList>\n"
+               "    <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
+               "      <Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
+               "        <Text Valign=\"top\" Vposition=\"80\">Top line</Text>\n"
+               "        <Text Valign=\"top\" Vposition=\"90\">Bottom line</Text>\n"
+               "      </Subtitle>\n"
+               "    </Font>\n"
+               "  </SubtitleList>\n"
                "</SubtitleReel>",
                {}
                );
@@ -626,7 +643,7 @@ BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_bottom_alignment)
        c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -640,18 +657,20 @@ BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_bottom_alignment)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::BOTTOM,
+                       0,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -665,13 +684,15 @@ BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_bottom_alignment)
                        dcp::HAlign::CENTER,
                        0.7,
                        dcp::VAlign::BOTTOM,
+                       0,
                        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
+                       0,
+                       std::vector<dcp::Ruby>()
                        )
                );
 
@@ -679,25 +700,85 @@ BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_bottom_alignment)
 
        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>"
+               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+               "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
+               "  <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
+               "  <ContentTitleText>Test</ContentTitleText>\n"
+               "  <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
+               "  <ReelNumber>1</ReelNumber>\n"
+               "  <Language>en</Language>\n"
+               "  <EditRate>24 1</EditRate>\n"
+               "  <TimeCodeRate>24</TimeCodeRate>\n"
+               "  <SubtitleList>\n"
+               "    <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
+               "      <Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
+               "        <Text Valign=\"bottom\" Vposition=\"80\">Top line</Text>\n"
+               "        <Text Valign=\"bottom\" Vposition=\"70\">Bottom line</Text>\n"
+               "      </Subtitle>\n"
+               "    </Font>\n"
+               "  </SubtitleList>\n"
                "</SubtitleReel>",
                {}
                );
 }
 
+
+BOOST_AUTO_TEST_CASE(smpte_subtitle_standard_written_correctly)
+{
+       RNGFixer fixer;
+
+       boost::filesystem::path const ref = "test/data";
+       boost::filesystem::path const out = "build/test/smpte_subtitle_standard_written_correctly";
+
+       boost::filesystem::remove_all(out);
+       boost::filesystem::create_directories(out);
+
+       dcp::SMPTESubtitleAsset test_2014;
+       test_2014.set_issue_date(dcp::LocalTime("2020-01-01T14:00:00"));
+       test_2014.write(out / "2014.mxf");
+       BOOST_CHECK_EQUAL(dcp::SMPTESubtitleAsset(ref / "2014.mxf").raw_xml(), dcp::SMPTESubtitleAsset(out / "2014.mxf").raw_xml());
+
+       dcp::SMPTESubtitleAsset test_2010(dcp::SubtitleStandard::SMPTE_2010);
+       test_2010.set_issue_date(dcp::LocalTime("2020-01-01T14:00:00"));
+       test_2010.write(out / "2010.mxf");
+       BOOST_CHECK_EQUAL(dcp::SMPTESubtitleAsset(ref / "2010.mxf").raw_xml(), dcp::SMPTESubtitleAsset(out / "2010.mxf").raw_xml());
+
+       dcp::SMPTESubtitleAsset test_2007(dcp::SubtitleStandard::SMPTE_2007);
+       test_2007.set_issue_date(dcp::LocalTime("2020-01-01T14:00:00"));
+       test_2007.write(out / "2007.mxf");
+       BOOST_CHECK_EQUAL(dcp::SMPTESubtitleAsset(ref / "2007.mxf").raw_xml(), dcp::SMPTESubtitleAsset(out / "2007.mxf").raw_xml());
+}
+
+
+BOOST_AUTO_TEST_CASE(smpte_subtitle_standard_read_correctly)
+{
+       dcp::SMPTESubtitleAsset test_2007("test/data/2007.mxf");
+       BOOST_CHECK(test_2007.subtitle_standard() == dcp::SubtitleStandard::SMPTE_2007);
+
+       dcp::SMPTESubtitleAsset test_2010("test/data/2010.mxf");
+       BOOST_CHECK(test_2010.subtitle_standard() == dcp::SubtitleStandard::SMPTE_2010);
+
+       dcp::SMPTESubtitleAsset test_2014("test/data/2014.mxf");
+       BOOST_CHECK(test_2014.subtitle_standard() == dcp::SubtitleStandard::SMPTE_2014);
+}
+
+
+BOOST_AUTO_TEST_CASE(smpte_subtitle_intrinsic_duration_read_correctly)
+{
+       dcp::SMPTESubtitleAsset ref("test/data/verify_incorrect_closed_caption_ordering3.xml");
+
+       dcp::Key key;
+       ref.set_key(key);
+
+       auto constexpr duration = 480U;
+
+       ref.set_intrinsic_duration(duration);
+
+       auto const path = boost::filesystem::path("build/test/smpte_subtitle_instrinsic_duration_read_correctly.mxf");
+       ref.write(path);
+
+       auto check = dcp::SMPTESubtitleAsset(path);
+       check.set_key(key);
+       BOOST_CHECK_EQUAL(check.intrinsic_duration(), duration);
+}
+