From: Carl Hetherington Date: Sun, 12 Nov 2023 23:30:48 +0000 (+0100) Subject: Copy Interop PNG subtitle files correctly (#2640). X-Git-Tag: v2.16.67~22 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;ds=sidebyside;h=b5abb07ea62e5f4708c57b6f888101d3d3434aa8;p=dcpomatic.git Copy Interop PNG subtitle files correctly (#2640). --- diff --git a/src/lib/map_cli.cc b/src/lib/map_cli.cc index cf07bac83..e38af69cf 100644 --- a/src/lib/map_cli.cc +++ b/src/lib/map_cli.cc @@ -277,7 +277,7 @@ map_cli(int argc, char* argv[], std::function out) } }; - auto maybe_copy_font = [&maybe_copy](shared_ptr asset, bool rename, bool hard_link, bool soft_link) { + auto maybe_copy_font_and_images = [&maybe_copy, output_dir, copy](shared_ptr asset, bool rename, bool hard_link, bool soft_link) { auto interop = dynamic_pointer_cast(asset); boost::optional extra; if (interop) { @@ -285,6 +285,12 @@ map_cli(int argc, char* argv[], std::function out) for (auto font_asset: interop->font_assets()) { maybe_copy(font_asset->id(), rename, hard_link, soft_link, extra); } + for (auto subtitle: interop->subtitles()) { + if (auto image = dynamic_pointer_cast(subtitle)) { + auto const output_path = *output_dir / asset->id() / image->file()->filename(); + copy(*image->file(), output_path, hard_link, soft_link); + } + } } return extra; }; @@ -296,11 +302,11 @@ map_cli(int argc, char* argv[], std::function out) maybe_copy_from_reel(reel->main_picture(), rename, hard_link, soft_link); maybe_copy_from_reel(reel->main_sound(), rename, hard_link, soft_link); if (reel->main_subtitle()) { - auto extra = maybe_copy_font(reel->main_subtitle()->asset(), rename, hard_link, soft_link); + auto extra = maybe_copy_font_and_images(reel->main_subtitle()->asset(), rename, hard_link, soft_link); maybe_copy_from_reel(reel->main_subtitle(), rename, hard_link, soft_link, extra); } for (auto ccap: reel->closed_captions()) { - auto extra = maybe_copy_font(ccap->asset(), rename, hard_link, soft_link); + auto extra = maybe_copy_font_and_images(ccap->asset(), rename, hard_link, soft_link); maybe_copy_from_reel(ccap, rename, hard_link, soft_link, extra); } maybe_copy_from_reel(reel->atmos(), rename, hard_link, soft_link); diff --git a/test/map_cli_test.cc b/test/map_cli_test.cc index a4056dc46..5505a197b 100644 --- a/test/map_cli_test.cc +++ b/test/map_cli_test.cc @@ -542,3 +542,38 @@ BOOST_AUTO_TEST_CASE(map_uses_config_for_issuer_and_creator) BOOST_CHECK(pkl.string_child("Creator") == "Fred"); } + +BOOST_AUTO_TEST_CASE(map_handles_interop_png_subs) +{ + string const name = "map_handles_interop_png_subs"; + auto arrietty = content_factory(TestPaths::private_data() / "arrietty_JP-EN.mkv")[0]; + auto film = new_test_film2(name + "_input", { arrietty }); + film->set_interop(true); + arrietty->set_trim_end(dcpomatic::ContentTime::from_seconds(110)); + arrietty->text[0]->set_use(true); + make_and_verify_dcp( + film, + { + dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME, + dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, + dcp::VerificationNote::Code::INVALID_STANDARD + }); + + auto const out = boost::filesystem::path("build") / "test" / (name + "_output"); + + vector const args = { + "map_cli", + "-o", out.string(), + "-d", film->dir(film->dcp_name()).string(), + find_cpl(film->dir(film->dcp_name())).string() + }; + + boost::filesystem::remove_all(out); + + vector output_messages; + auto error = run(args, output_messages); + BOOST_CHECK(!error); + + verify_dcp(out, { dcp::VerificationNote::Code::INVALID_STANDARD }); +} +