From 83d63bb331190db4372de4d0aaf8413c51f1eee4 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 11 May 2023 13:50:57 +0200 Subject: [PATCH] Handle fonts for ccaps coming from DCP content (#2525). Not dealing with them calls all sort of chaos as described in the bug report. --- cscript | 2 +- src/lib/dcp_content.cc | 1 + src/lib/dcp_examiner.cc | 3 +++ src/lib/reel_writer.cc | 25 +++++++++++-------------- src/wx/verify_dcp_dialog.cc | 6 ++++++ test/torture_test.cc | 26 ++++++++++++++++++++++++++ wscript | 2 +- 7 files changed, 49 insertions(+), 16 deletions(-) diff --git a/cscript b/cscript index c3bfeda04..a85cc7369 100644 --- a/cscript +++ b/cscript @@ -479,7 +479,7 @@ def dependencies(target, options): # Use distro-provided FFmpeg on Arch deps = [] - deps.append(('libdcp', 'v1.8.67')) + deps.append(('libdcp', 'v1.8.68')) deps.append(('libsub', 'v1.6.44')) deps.append(('leqm-nrt', '4560105773c66ac9216b62313a24093bb0a027ae')) deps.append(('rtaudio', 'f619b76')) diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index 7d835e618..e7bef573b 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -276,6 +276,7 @@ DCPContent::examine (shared_ptr film, shared_ptr job) for (int i = 0; i < examiner->text_count(TextType::CLOSED_CAPTION); ++i) { auto c = make_shared(this, TextType::CLOSED_CAPTION, TextType::CLOSED_CAPTION); c->set_dcp_track (examiner->dcp_text_track(i)); + add_fonts_from_examiner(c, examiner->fonts()); new_text.push_back (c); } diff --git a/src/lib/dcp_examiner.cc b/src/lib/dcp_examiner.cc index 6586e6e81..9c4f899c6 100644 --- a/src/lib/dcp_examiner.cc +++ b/src/lib/dcp_examiner.cc @@ -230,6 +230,9 @@ DCPExaminer::DCPExaminer (shared_ptr content, bool tolerant) LOG_GENERAL("Closed caption %1 of reel %2 found", ccap->id(), reel->id()); + for (auto const& font: ccap->asset()->font_data()) { + reel_fonts.push_back(make_shared(font.first, font.second)); + } } if (reel->main_markers ()) { diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 5d9f4dae0..139c5aed4 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -491,18 +491,17 @@ maybe_add_text ( shared_ptr reel_asset; if (asset) { - if (!std::is_same::value) { - if (film->interop()) { - if (chosen_interop_font) { - /* We only add one font, as Interop will ignore subsequent ones (and some validators will - * complain if they are even present) - */ - asset->add_font(fonts.get(chosen_interop_font), chosen_interop_font->data().get_value_or(default_font)); - } + if (film->interop()) { + if (chosen_interop_font) { + /* We only add one font, as Interop will ignore subsequent ones (and some validators will + * complain if they are even present) + */ + asset->add_font(fonts.get(chosen_interop_font), chosen_interop_font->data().get_value_or(default_font)); } else { - for (auto const& font: fonts.map()) { - asset->add_font(font.second, font.first->data().get_value_or(default_font)); - } + } + } else { + for (auto const& font: fonts.map()) { + asset->add_font(font.second, font.first->data().get_value_or(default_font)); } } @@ -979,9 +978,7 @@ ReelWriter::write (PlayerText subs, TextType type, optional track, i.set_out (dcp::Time(period.to.seconds() - _period.from.seconds(), tcr)); i.set_v_position(convert_vertical_position(i, film()->interop() ? dcp::SubtitleStandard::INTEROP : dcp::SubtitleStandard::SMPTE_2014)); auto sub = make_shared(i); - if (type == TextType::OPEN_SUBTITLE) { - sub->set_font(fonts.get(i.font)); - } + sub->set_font(fonts.get(i.font)); asset->add(sub); } diff --git a/src/wx/verify_dcp_dialog.cc b/src/wx/verify_dcp_dialog.cc index 07e3589e5..b3e229087 100644 --- a/src/wx/verify_dcp_dialog.cc +++ b/src/wx/verify_dcp_dialog.cc @@ -106,6 +106,9 @@ VerifyDCPDialog::VerifyDCPDialog (wxWindow* parent, shared_ptr job if (note.size()) { message.Replace("%size", std_to_wx(dcp::raw_convert(note.size().get()))); } + if (note.id()) { + message.Replace("%id", std_to_wx(note.id().get())); + } add_bullet (note.type(), message); counts[note.type()]++; }; @@ -419,6 +422,9 @@ VerifyDCPDialog::VerifyDCPDialog (wxWindow* parent, shared_ptr job case dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT: add(i, _("The XML in the subtitle asset %n has more than one namespace declaration.")); break; + case dcp::VerificationNote::Code::MISSING_LOAD_FONT: + add(i, _("A subtitle or closed caption refers to a font with ID %id that does not have a corresponding node.")); + break; } } diff --git a/test/torture_test.cc b/test/torture_test.cc index bc03c93d8..0c781fdb1 100644 --- a/test/torture_test.cc +++ b/test/torture_test.cc @@ -299,3 +299,29 @@ BOOST_AUTO_TEST_CASE (torture_test1) } } + + +BOOST_AUTO_TEST_CASE(multi_reel_interop_ccap_test) +{ + auto pic1 = content_factory("test/data/flat_red.png").front(); + auto ccap1 = content_factory("test/data/15s.srt").front(); + auto pic2 = content_factory("test/data/flat_red.png").front(); + auto ccap2 = content_factory("test/data/15s.srt").front(); + auto film1 = new_test_film2("multi_reel_interop_ccap_test1", { pic1, ccap1, pic2, ccap2 }); + film1->set_interop(true); + film1->set_reel_type(ReelType::BY_VIDEO_CONTENT); + ccap1->text[0]->set_type(TextType::CLOSED_CAPTION); + pic1->video->set_length(15 * 24); + ccap2->text[0]->set_type(TextType::CLOSED_CAPTION); + pic2->video->set_length(15 * 24); + make_and_verify_dcp(film1, { dcp::VerificationNote::Code::INVALID_STANDARD, dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING }); + + auto reload = make_shared(film1->dir(film1->dcp_name())); + auto film2 = new_test_film2("multi_reel_interop_ccap_test2", { reload }); + for (auto i: reload->text) { + i->set_use(true); + } + film2->set_interop(true); + make_and_verify_dcp(film2, { dcp::VerificationNote::Code::INVALID_STANDARD, dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING }); +} + diff --git a/wscript b/wscript index 9662359a1..94ab1fd70 100644 --- a/wscript +++ b/wscript @@ -35,7 +35,7 @@ except ImportError: from waflib import Logs, Context APPNAME = 'dcpomatic' -libdcp_version = '1.8.67' +libdcp_version = '1.8.68' libsub_version = '1.6.42' this_version = subprocess.Popen(shlex.split('git tag -l --points-at HEAD'), stdout=subprocess.PIPE).communicate()[0] -- 2.30.2