X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=test%2Fdcp_subtitle_test.cc;h=20fbe5f1a243b7ad034d1013e14b844ed8675603;hp=679325a91ef158462549309abedfd2dbaa69a654;hb=efb1172f51bbe15cd1f90b25a032bbe858453f5f;hpb=c8a60139112207c6620b1ccdfe4094728ae7ae67 diff --git a/test/dcp_subtitle_test.cc b/test/dcp_subtitle_test.cc index 679325a91..20fbe5f1a 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 @@ -244,3 +247,86 @@ BOOST_AUTO_TEST_CASE (test_font_override) 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); + 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); +} +