Supporters update.
[dcpomatic.git] / test / burnt_subtitle_test.cc
index e8c3f359763027a2526582565a90c56cc3ff0016..8d7dcd143f872357fec0f542aceb3a7289e9e9cb 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 
 */
 
+
 /** @file  test/burnt_subtitle_test.cc
  *  @brief Test the burning of subtitles into the DCP.
+ *  @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 <dcp/dcp.h>
 #include <dcp/cpl.h>
 #include <dcp/reel.h>
-#include <dcp/j2k.h>
+#include <dcp/j2k_transcode.h>
 #include <dcp/mono_picture_asset.h>
 #include <dcp/mono_picture_asset_reader.h>
 #include <dcp/mono_picture_frame.h>
 #include <dcp/reel_picture_asset.h>
 #include <dcp/reel_mono_picture_asset.h>
 #include <boost/test/unit_test.hpp>
-#include <iostream>
 
-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> 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<TextSubtitleContent> 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> 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<DCPSubtitleContent> 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> 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<Film> 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<TextSubtitleContent> sub = dynamic_pointer_cast<TextSubtitleContent> (
-               content_factory (film2, "test/data/subrip2.srt")
-               );
-       sub->subtitle->set_burn (true);
-       sub->subtitle->set_outline (true);
+       auto background_dcp = make_shared<DCPContent>(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<const dcp::MonoPictureAsset> pic = dynamic_pointer_cast<dcp::ReelMonoPictureAsset> (
+       auto pic = dynamic_pointer_cast<dcp::ReelMonoPictureAsset> (
                dcp.cpls().front()->reels().front()->main_picture()
                )->mono_asset();
        BOOST_REQUIRE (pic);
-       shared_ptr<const dcp::MonoPictureFrame> frame = pic->start_read()->get_frame (12);
-       shared_ptr<dcp::OpenJPEGImage> 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<TranscodeJob>(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();
+}
+
+