X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fsubtitle_position_test.cc;h=d9dd0c61a7ee33df1f17649660e05a470f439250;hb=HEAD;hp=0237a417c49699c3af85c826c32c9888c4c5948a;hpb=323b8cbb0b95297fbd027ffdc4ea5003b59ef25f;p=dcpomatic.git diff --git a/test/subtitle_position_test.cc b/test/subtitle_position_test.cc index 0237a417c..d9dd0c61a 100644 --- a/test/subtitle_position_test.cc +++ b/test/subtitle_position_test.cc @@ -26,22 +26,23 @@ #include "lib/text_content.h" #include "test.h" #include -#include #include +#include #include #include +using std::shared_ptr; using std::string; using std::vector; -using std::shared_ptr; -BOOST_AUTO_TEST_CASE(interop_correctly_placed_in_interop) +BOOST_AUTO_TEST_CASE(srt_correctly_placed_in_interop) { - string const name = "interop_in_interop_position_test"; - auto fr = content_factory("test/data/dcp_sub.xml"); + string const name = "srt_in_interop_position_test"; + auto fr = content_factory("test/data/short.srt"); auto film = new_test_film2(name, fr); + fr[0]->only_text()->set_language(dcp::LanguageTag("de")); film->set_interop(true); @@ -50,78 +51,67 @@ BOOST_AUTO_TEST_CASE(interop_correctly_placed_in_interop) { dcp::VerificationNote::Code::INVALID_STANDARD, dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING, - dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION + dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }); auto output = subtitle_file(film); + dcp::InteropSubtitleAsset asset(output); auto output_subs = asset.subtitles(); BOOST_REQUIRE_EQUAL(output_subs.size(), 1U); - /* The input subtitle should have been left alone */ BOOST_CHECK(output_subs[0]->v_align() == dcp::VAlign::BOTTOM); - BOOST_CHECK_CLOSE(output_subs[0]->v_position(), 0.08, 1e-3); + BOOST_CHECK_CLOSE(output_subs[0]->v_position(), 0.172726989, 1e-3); } -BOOST_AUTO_TEST_CASE(interop_correctly_placed_in_smpte) +BOOST_AUTO_TEST_CASE(srt_correctly_placed_in_smpte) { - string const name = "interop_in_smpte_position_test"; - auto fr = content_factory("test/data/dcp_sub.xml"); + string const name = "srt_in_smpte_position_test"; + auto fr = content_factory("test/data/short.srt"); auto film = new_test_film2(name, fr); + fr[0]->text[0]->set_language(dcp::LanguageTag("en")); film->set_interop(false); make_and_verify_dcp ( film, { - dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING, - dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, dcp::VerificationNote::Code::MISSING_CPL_METADATA, + dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }); auto output = subtitle_file(film); + dcp::SMPTESubtitleAsset asset(output); auto output_subs = asset.subtitles(); BOOST_REQUIRE_EQUAL(output_subs.size(), 1U); BOOST_CHECK(output_subs[0]->v_align() == dcp::VAlign::BOTTOM); - BOOST_CHECK_CLOSE(output_subs[0]->v_position(), 0.07074, 1e-3); -} - - -BOOST_AUTO_TEST_CASE(smpte_correctly_placed_in_interop) -{ - string const name = "smpte_in_interop_position_test"; - auto fr = content_factory("test/data/short.srt"); - auto film = new_test_film2(name, fr); - - film->set_interop(true); - - make_and_verify_dcp ( - film, - { - dcp::VerificationNote::Code::INVALID_STANDARD, - dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING, - dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME - }); - - auto output = subtitle_file(film); - dcp::InteropSubtitleAsset asset(output); - auto output_subs = asset.subtitles(); - BOOST_REQUIRE_EQUAL(output_subs.size(), 1U); - - BOOST_CHECK(output_subs[0]->v_align() == dcp::VAlign::TOP); - BOOST_CHECK_CLOSE(output_subs[0]->v_position(), 0.87079, 1e-3); + BOOST_CHECK_CLOSE(output_subs[0]->v_position(), 0.172726989, 1e-3); } +/** Make a DCP from some DCP subtitles and check the vertical alignment */ static void -vpos_test(dcp::VAlign reference, float position, dcp::Standard from, dcp::Standard to) +vpos_test(dcp::VAlign reference, float position, dcp::SubtitleStandard from, dcp::Standard to) { - string standard = from == dcp::Standard::INTEROP ? "interop" : "smpte"; + string standard; + switch (from) { + case dcp::SubtitleStandard::SMPTE_2007: + case dcp::SubtitleStandard::SMPTE_2010: + standard = "smpte_2010"; + break; + case dcp::SubtitleStandard::INTEROP: + standard = "interop"; + break; + case dcp::SubtitleStandard::SMPTE_2014: + standard = "smpte_2014"; + break; + } + auto name = String::compose("vpos_test_%1_%2", standard, valign_to_string(reference)); auto in = content_factory(String::compose("test/data/%1.xml", name)); auto film = new_test_film2(name, in); @@ -145,7 +135,7 @@ vpos_test(dcp::VAlign reference, float position, dcp::Standard from, dcp::Standa BOOST_REQUIRE_EQUAL(subtitles.size(), 1U); BOOST_CHECK(subtitles[0]->v_align() == reference); - BOOST_CHECK_CLOSE(subtitles[0]->v_position(), position, 1e-3); + BOOST_CHECK_CLOSE(subtitles[0]->v_position(), position, 2); } @@ -154,11 +144,43 @@ BOOST_AUTO_TEST_CASE(subtitles_correctly_placed_with_all_references) constexpr auto baseline_to_bottom = 0.00925926; constexpr auto height = 0.0462963; - vpos_test(dcp::VAlign::TOP, 0.2 - height + baseline_to_bottom, dcp::Standard::INTEROP, dcp::Standard::SMPTE); - vpos_test(dcp::VAlign::CENTER, 0.11 - (height / 2) + baseline_to_bottom, dcp::Standard::INTEROP, dcp::Standard::SMPTE); - vpos_test(dcp::VAlign::BOTTOM, 0.08 - baseline_to_bottom, dcp::Standard::INTEROP, dcp::Standard::SMPTE); - vpos_test(dcp::VAlign::TOP, 0.1 + height - baseline_to_bottom, dcp::Standard::SMPTE, dcp::Standard::INTEROP); - vpos_test(dcp::VAlign::CENTER, 0.15 + (height / 2) - baseline_to_bottom, dcp::Standard::SMPTE, dcp::Standard::INTEROP); - vpos_test(dcp::VAlign::BOTTOM, 0.10 + baseline_to_bottom, dcp::Standard::SMPTE, dcp::Standard::INTEROP); + /* Interop source */ + auto from = dcp::SubtitleStandard::INTEROP; + + // -> Interop + vpos_test(dcp::VAlign::TOP, 0.2, from, dcp::Standard::INTEROP); + vpos_test(dcp::VAlign::CENTER, 0.11, from, dcp::Standard::INTEROP); + vpos_test(dcp::VAlign::BOTTOM, 0.08, from, dcp::Standard::INTEROP); + + // -> SMPTE (2014) + vpos_test(dcp::VAlign::TOP, 0.2, from, dcp::Standard::SMPTE); + vpos_test(dcp::VAlign::CENTER, 0.11, from, dcp::Standard::SMPTE); + vpos_test(dcp::VAlign::BOTTOM, 0.08, from, dcp::Standard::SMPTE); + + /* SMPTE 2010 source */ + from = dcp::SubtitleStandard::SMPTE_2010; + + // -> Interop + vpos_test(dcp::VAlign::TOP, 0.1 + height - baseline_to_bottom, from, dcp::Standard::INTEROP); + vpos_test(dcp::VAlign::CENTER, 0.15 + (height / 2) - baseline_to_bottom, from, dcp::Standard::INTEROP); + vpos_test(dcp::VAlign::BOTTOM, 0.10 + baseline_to_bottom, from, dcp::Standard::INTEROP); + + // -> SMPTE (2014) + vpos_test(dcp::VAlign::TOP, 0.1 + height - baseline_to_bottom, from, dcp::Standard::SMPTE); + vpos_test(dcp::VAlign::CENTER, 0.15 + (height / 2) - baseline_to_bottom, from, dcp::Standard::SMPTE); + vpos_test(dcp::VAlign::BOTTOM, 0.10 + baseline_to_bottom, from, dcp::Standard::SMPTE); + + /* SMPTE 2014 source */ + from = dcp::SubtitleStandard::SMPTE_2014; + + // -> Interop + vpos_test(dcp::VAlign::TOP, 0.2, from, dcp::Standard::INTEROP); + vpos_test(dcp::VAlign::CENTER, 0.11, from, dcp::Standard::INTEROP); + vpos_test(dcp::VAlign::BOTTOM, 0.08, from, dcp::Standard::INTEROP); + + // -> SMPTE (2014) + vpos_test(dcp::VAlign::TOP, 0.2, from, dcp::Standard::SMPTE); + vpos_test(dcp::VAlign::CENTER, 0.11, from, dcp::Standard::SMPTE); + vpos_test(dcp::VAlign::BOTTOM, 0.08, from, dcp::Standard::SMPTE); }