X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fdcp_subtitle_test.cc;h=837362e84127e6e6abd2009aa89506620edecfb9;hb=HEAD;hp=fb8888d0c6859edccdec7e665c1d97a49c9a5710;hpb=7647290fbaa81e25875758597f7cbbeca19f80bc;p=dcpomatic.git diff --git a/test/dcp_subtitle_test.cc b/test/dcp_subtitle_test.cc index fb8888d0c..837362e84 100644 --- a/test/dcp_subtitle_test.cc +++ b/test/dcp_subtitle_test.cc @@ -25,19 +25,22 @@ */ -#include -#include "lib/film.h" -#include "lib/dcp_subtitle_content.h" +#include "lib/content_text.h" #include "lib/dcp_content.h" -#include "lib/ratio.h" -#include "lib/dcp_decoder.h" #include "lib/dcp_content_type.h" +#include "lib/dcp_decoder.h" +#include "lib/dcp_subtitle_content.h" #include "lib/dcp_subtitle_decoder.h" -#include "lib/text_content.h" -#include "lib/content_text.h" +#include "lib/film.h" #include "lib/font.h" +#include "lib/ratio.h" +#include "lib/text_content.h" #include "lib/text_decoder.h" #include "test.h" +#include +#include +#include +#include #include @@ -93,7 +96,11 @@ BOOST_AUTO_TEST_CASE (dcp_subtitle_test) dcp::VerificationNote::Code::MISSING_CPL_METADATA }); - check_dcp ("test/data/dcp_subtitle_test", film->dir(film->dcp_name())); + /* This test is concerned with the subtitles, so we'll ignore any + * differences in sound between the DCP and the reference to avoid test + * failures for unrelated reasons. + */ + check_dcp("test/data/dcp_subtitle_test", film->dir(film->dcp_name()), true); } @@ -108,7 +115,7 @@ BOOST_AUTO_TEST_CASE (dcp_subtitle_within_dcp_test) film->examine_and_add_content (content); BOOST_REQUIRE (!wait_for_jobs ()); - shared_ptr decoder (new DCPDecoder (film, content, false, false, shared_ptr())); + auto decoder = make_shared(film, content, false, false, shared_ptr()); decoder->only_text()->PlainStart.connect (bind (store, _1)); stored = optional (); @@ -137,7 +144,8 @@ BOOST_AUTO_TEST_CASE (dcp_subtitle_test2) stored = optional (); while (!decoder->pass()) { if (stored && stored->from() == ContentTime(0)) { - BOOST_CHECK_EQUAL (stored->subs.front().text(), "<b>Hello world!</b>"); + /* Text passed around by the player should be unescaped */ + BOOST_CHECK_EQUAL(stored->subs.front().text(), "Hello world!"); } } } @@ -153,6 +161,7 @@ BOOST_AUTO_TEST_CASE (dcp_subtitle_test3) film->set_interop (true); auto content = make_shared("test/data/dcp_sub3.xml"); film->examine_and_add_content (content); + content->only_text()->set_language(dcp::LanguageTag("de")); BOOST_REQUIRE (!wait_for_jobs ()); make_and_verify_dcp (film, { dcp::VerificationNote::Code::INVALID_STANDARD }); @@ -186,8 +195,10 @@ BOOST_AUTO_TEST_CASE (dcp_subtitle_test4) auto film = new_test_film2 ("dcp_subtitle_test4", {content, content2}); film->set_interop (true); - content->only_text()->add_font (shared_ptr (new Font ("font1"))); - content2->only_text()->add_font (shared_ptr (new Font ("font2"))); + content->only_text()->add_font(make_shared("font1")); + content2->only_text()->add_font(make_shared("font2")); + content->only_text()->set_language(dcp::LanguageTag("de")); + content2->only_text()->set_language(dcp::LanguageTag("de")); make_and_verify_dcp (film, { dcp::VerificationNote::Code::INVALID_STANDARD }); @@ -218,6 +229,7 @@ BOOST_AUTO_TEST_CASE (dcp_subtitle_test5) auto content = make_shared("test/data/dcp_sub6.xml"); auto film = new_test_film2 ("dcp_subtitle_test5", {content}); film->set_interop (true); + content->only_text()->set_language(dcp::LanguageTag("de")); make_and_verify_dcp (film, { dcp::VerificationNote::Code::INVALID_STANDARD }); @@ -236,11 +248,98 @@ BOOST_AUTO_TEST_CASE (test_font_override) auto content = make_shared("test/data/dcp_sub4.xml"); auto film = new_test_film2("test_font_override", {content}); film->set_interop(true); + content->only_text()->set_language(dcp::LanguageTag("de")); BOOST_REQUIRE_EQUAL(content->text.size(), 1U); - content->text.front()->add_font(make_shared("theFontId", "test/data/Inconsolata-VF.ttf")); + auto font = content->text.front()->get_font("0_theFontId"); + BOOST_REQUIRE(font); + font->set_file("test/data/Inconsolata-VF.ttf"); make_and_verify_dcp (film, { dcp::VerificationNote::Code::INVALID_STANDARD }); check_file (subtitle_file(film).parent_path() / "font_0.ttf", "test/data/Inconsolata-VF.ttf"); } + +BOOST_AUTO_TEST_CASE(entity_from_dcp_source) +{ + std::ofstream source_xml("build/test/entity_from_dcp_source.xml"); + source_xml + << "\n" + << "\n" + << "urn:uuid:9c0a0a67-ffd8-4c65-8b5a-c6be3ef182c5\n" + << "DCP\n" + << "2022-11-30T18:13:56.000+01:00\n" + << "1\n" + << "24 1\n" + << "24\n" + << "00:00:00:00\n" + << "urn:uuid:899e5c59-50f6-467b-985b-8282c020e1ee\n" + << "\n" + << "\n" + << "\n" + << "Hello & world\n" + << "\n" + << "\n" + << "\n" + << "\n"; + source_xml.close(); + + auto content = make_shared("build/test/entity_from_dcp_source.xml"); + auto film = new_test_film2("entity_from_dcp_source", { content }); + film->set_interop(false); + content->only_text()->set_use(true); + content->only_text()->set_burn(false); + make_and_verify_dcp ( + film, + { + dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, + dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME, + dcp::VerificationNote::Code::MISSING_CPL_METADATA, + dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION, + dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING, + }); + + dcp::SMPTESubtitleAsset check(dcp_file(film, "sub_")); + auto subs = check.subtitles(); + BOOST_REQUIRE_EQUAL(subs.size(), 1U); + auto sub = std::dynamic_pointer_cast(subs[0]); + BOOST_REQUIRE(sub); + /* libdcp::SubtitleAsset gets the text from the XML with get_content(), which + * resolves the 5 predefined entities & " < > ' so we shouldn't see any + * entity here. + */ + BOOST_CHECK_EQUAL(sub->text(), "Hello & world"); + + /* It should be escaped in the raw XML though */ + BOOST_REQUIRE(static_cast(check.raw_xml())); + BOOST_CHECK(check.raw_xml()->find("Hello & world") != std::string::npos); + + /* Remake with burn */ + content->only_text()->set_burn(true); + boost::filesystem::remove_all(film->dir(film->dcp_name())); + make_and_verify_dcp ( + film, + { + dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, + dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME, + dcp::VerificationNote::Code::MISSING_CPL_METADATA, + dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION, + dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING, + }); + + dcp::MonoPictureAsset burnt(dcp_file(film, "j2c_")); + auto frame = burnt.start_read()->get_frame(12)->xyz_image(); + auto const size = frame->size(); + int max_X = 0; + for (auto y = 0; y < size.height; ++y) { + for (auto x = 0; x < size.width; ++x) { + max_X = std::max(frame->data(0)[x + y * size.width], max_X); + } + } + + /* Check that the subtitle got rendered to the image; if the escaping of the & is wrong Pango + * will throw errors and nothing will be rendered. + */ + BOOST_CHECK(max_X > 100); +} +