X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fburnt_subtitle_test.cc;h=8d7dcd143f872357fec0f542aceb3a7289e9e9cb;hb=HEAD;hp=054eddb31228eb86ecc8a7152e4a64d73eebd422;hpb=67a68bd971ebe1b35daa3f75873b4ccb53c00ba0;p=dcpomatic.git diff --git a/test/burnt_subtitle_test.cc b/test/burnt_subtitle_test.cc index 054eddb31..8d7dcd143 100644 --- a/test/burnt_subtitle_test.cc +++ b/test/burnt_subtitle_test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2014-2016 Carl Hetherington + Copyright (C) 2014-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,23 +18,27 @@ */ + /** @file test/burnt_subtitle_test.cc * @brief Test the burning of subtitles into the DCP. - * @ingroup specific + * @ingroup feature */ -#include "lib/text_subtitle_content.h" -#include "lib/dcp_subtitle_content.h" + +#include "lib/config.h" +#include "lib/content_factory.h" +#include "lib/dcp_content.h" +#include "lib/dcp_content_type.h" #include "lib/film.h" +#include "lib/ffmpeg_encoder.h" +#include "lib/log_entry.h" #include "lib/ratio.h" -#include "lib/dcp_content_type.h" -#include "lib/subtitle_content.h" -#include "lib/content_factory.h" +#include "lib/text_content.h" #include "test.h" #include #include #include -#include +#include #include #include #include @@ -42,90 +46,163 @@ #include #include #include -#include -using std::cout; + +using std::dynamic_pointer_cast; +using std::make_shared; using std::map; -using boost::shared_ptr; -using boost::dynamic_pointer_cast; +using std::string; +using namespace dcpomatic; + /** Build a small DCP with no picture and a single subtitle overlaid onto it from a SubRip file */ BOOST_AUTO_TEST_CASE (burnt_subtitle_test_subrip) { - shared_ptr film = new_test_film ("burnt_subtitle_test_subrip"); + auto film = new_test_film ("burnt_subtitle_test_subrip"); film->set_container (Ratio::from_id ("185")); film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR")); film->set_name ("frobozz"); - shared_ptr content (new TextSubtitleContent (film, "test/data/subrip2.srt")); - content->set_use_subtitles (true); - content->set_burn_subtitles (true); - film->examine_and_add_content (content, true); - wait_for_jobs (); - film->make_dcp (); - wait_for_jobs (); - - check_dcp ("test/data/burnt_subtitle_test_subrip", film->dir (film->dcp_name ())); + auto content = content_factory("test/data/subrip2.srt")[0]; + content->text[0]->set_use(true); + content->text[0]->set_burn(true); + film->examine_and_add_content (content); + BOOST_REQUIRE (!wait_for_jobs()); + make_and_verify_dcp( + film, + { dcp::VerificationNote::Code::MISSING_CPL_METADATA } + ); + +#ifdef DCPOMATIC_WINDOWS + check_dcp("test/data/windows/burnt_subtitle_test_subrip", film); +#else + check_dcp("test/data/burnt_subtitle_test_subrip", film); +#endif } /** Build a small DCP with no picture and a single subtitle overlaid onto it from a DCP XML file */ BOOST_AUTO_TEST_CASE (burnt_subtitle_test_dcp) { - shared_ptr film = new_test_film ("burnt_subtitle_test_dcp"); + auto film = new_test_film ("burnt_subtitle_test_dcp"); film->set_container (Ratio::from_id ("185")); film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR")); film->set_name ("frobozz"); - film->set_burn_subtitles (true); - shared_ptr content (new DCPSubtitleContent (film, "test/data/dcp_sub.xml")); - content->set_use_subtitles (true); - film->examine_and_add_content (content, true); - wait_for_jobs (); - film->make_dcp (); - wait_for_jobs (); - - check_dcp ("test/data/burnt_subtitle_test_dcp", film->dir (film->dcp_name ())); + auto content = content_factory("test/data/dcp_sub.xml")[0]; + content->text[0]->set_use(true); + film->examine_and_add_content (content); + BOOST_REQUIRE (!wait_for_jobs()); + 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 + }); + + check_dcp("test/data/burnt_subtitle_test_dcp", film); } /** Burn some subtitles into an existing DCP to check the colour conversion */ BOOST_AUTO_TEST_CASE (burnt_subtitle_test_onto_dcp) { - shared_ptr film = new_test_film ("burnt_subtitle_test_onto_dcp"); + auto film = new_test_film ("burnt_subtitle_test_onto_dcp"); film->set_container (Ratio::from_id ("185")); film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR")); film->set_name ("frobozz"); - film->examine_and_add_content (content_factory(film, "test/data/flat_white.png").front()); - wait_for_jobs (); - film->make_dcp (); - wait_for_jobs (); + film->examine_and_add_content(content_factory("test/data/flat_black.png")[0]); + BOOST_REQUIRE (!wait_for_jobs()); + make_and_verify_dcp (film); - shared_ptr film2 = new_test_film ("burnt_subtitle_test_onto_dcp2"); + Config::instance()->set_log_types (Config::instance()->log_types() | LogEntry::TYPE_DEBUG_ENCODE); + auto film2 = new_test_film ("burnt_subtitle_test_onto_dcp2"); film2->set_container (Ratio::from_id ("185")); film2->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR")); film2->set_name ("frobozz"); - film2->examine_and_add_content (content_factory(film2, film->dir (film->dcp_name ())).front()); - shared_ptr sub = dynamic_pointer_cast ( - content_factory (film2, "test/data/subrip2.srt") - ); - sub->subtitle->set_burn (true); - sub->subtitle->set_outline (true); + auto background_dcp = make_shared(film->dir(film->dcp_name())); + film2->examine_and_add_content (background_dcp); + auto sub = content_factory("test/data/subrip2.srt")[0]; + sub->text[0]->set_burn(true); + sub->text[0]->set_effect(dcp::Effect::BORDER); film2->examine_and_add_content (sub); - wait_for_jobs (); - film2->make_dcp (); - wait_for_jobs (); + BOOST_REQUIRE (!wait_for_jobs()); + make_and_verify_dcp (film2); + + BOOST_CHECK (background_dcp->position() == DCPTime()); + BOOST_CHECK (sub->position() == DCPTime()); dcp::DCP dcp (film2->dir (film2->dcp_name ())); dcp.read (); - BOOST_REQUIRE_EQUAL (dcp.cpls().size(), 1); - BOOST_REQUIRE_EQUAL (dcp.cpls().front()->reels().size(), 1); + BOOST_REQUIRE_EQUAL(dcp.cpls().size(), 1U); + BOOST_REQUIRE_EQUAL(dcp.cpls().front()->reels().size(), 1U); BOOST_REQUIRE (dcp.cpls().front()->reels().front()->main_picture()); BOOST_REQUIRE (dcp.cpls().front()->reels().front()->main_picture()->asset()); - shared_ptr pic = dynamic_pointer_cast ( + auto pic = dynamic_pointer_cast ( dcp.cpls().front()->reels().front()->main_picture() )->mono_asset(); BOOST_REQUIRE (pic); - shared_ptr frame = pic->start_read()->get_frame (12); - shared_ptr xyz = frame->xyz_image (); + auto frame = pic->start_read()->get_frame(12); + auto xyz = frame->xyz_image (); BOOST_CHECK_EQUAL (xyz->size().width, 1998); BOOST_CHECK_EQUAL (xyz->size().height, 1080); - /* XXX: check the output ... */ +#ifdef DCPOMATIC_WINDOWS + check_dcp("test/data/windows/burnt_subtitle_test_onto_dcp2", film2); +#else + check_dcp("test/data/burnt_subtitle_test_onto_dcp2", film2); +#endif +} + + + +/** Check positioning of some burnt subtitles from XML files */ +BOOST_AUTO_TEST_CASE(burnt_subtitle_test_position) +{ + auto check = [](string alignment) + { + auto const name = String::compose("burnt_subtitle_test_position_%1", alignment); + auto subs = content_factory(String::compose("test/data/burn_%1.xml", alignment)); + auto film = new_test_film2(name, subs); + subs[0]->text[0]->set_use(true); + subs[0]->text[0]->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 + }); + +#ifdef DCPOMATIC_WINDOWS + check_dcp(String::compose("test/data/windows/%1", name), film); +#else + check_dcp(String::compose("test/data/%1", name), film); +#endif + }; + + /* Should have a baseline 216 pixels from the top (0.2 * 1080) */ + check("top"); + /* Should have a baseline 756 pixels from the top ((0.5 + 0.2) * 1080) */ + check("center"); + /* Should have a baseline 864 pixels from the top ((1 - 0.2) * 1080) */ + check("bottom"); } + + +/* Bug #2743 */ +BOOST_AUTO_TEST_CASE(burn_empty_subtitle_test) +{ + Cleanup cl; + + auto content = content_factory("test/data/empty_sub.xml")[0]; + auto film = new_test_film2("burnt_empty_subtitle_test", { content }); + content->text[0]->set_use(true); + + auto job = make_shared(film, TranscodeJob::ChangedBehaviour::IGNORE); + auto file = boost::filesystem::path("build") / "test" / "burnt_empty_subtitle_test.mov"; + cl.add(file); + FFmpegEncoder encoder(film, job, file, ExportFormat::PRORES_4444, false, false, false, 23); + encoder.go(); + + cl.run(); +} + +