From e0935244e27bcc5e87588900e1010b291ee631bc Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 12 May 2023 02:19:36 +0200 Subject: [PATCH] Only add fonts to assets when they are required. --- cscript | 2 +- src/lib/reel_writer.cc | 47 ++++++++++++++---------------------------- src/lib/reel_writer.h | 6 +----- src/lib/writer.cc | 6 +++--- wscript | 2 +- 5 files changed, 21 insertions(+), 42 deletions(-) diff --git a/cscript b/cscript index a85cc7369..60c4a5128 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.68')) + deps.append(('libdcp', 'v1.8.69')) deps.append(('libsub', 'v1.6.44')) deps.append(('leqm-nrt', '4560105773c66ac9216b62313a24093bb0a027ae')) deps.append(('rtaudio', 'f619b76')) diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 139c5aed4..062d3ca81 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -477,9 +477,6 @@ maybe_add_text ( int reel_count, optional content_summary, list const & refs, - FontIdMap const& fonts, - shared_ptr chosen_interop_font, - dcp::ArrayData default_font, shared_ptr film, DCPTimePeriod period, boost::filesystem::path output_dcp, @@ -491,20 +488,6 @@ maybe_add_text ( shared_ptr reel_asset; if (asset) { - 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 { - } - } else { - for (auto const& font: fonts.map()) { - asset->add_font(font.second, font.first->data().get_value_or(default_font)); - } - } - if (auto interop = dynamic_pointer_cast(asset)) { auto directory = output_dcp / interop->id (); boost::filesystem::create_directories (directory); @@ -662,8 +645,6 @@ void ReelWriter::create_reel_text ( shared_ptr reel, list const & refs, - FontIdMap const& fonts, - shared_ptr chosen_interop_font, int64_t duration, boost::filesystem::path output_dcp, bool ensure_subtitles, @@ -671,7 +652,7 @@ ReelWriter::create_reel_text ( ) const { auto subtitle = maybe_add_text ( - _subtitle_asset, duration, reel, _reel_index, _reel_count, _content_summary, refs, fonts, chosen_interop_font, _default_font, film(), _period, output_dcp, _text_only + _subtitle_asset, duration, reel, _reel_index, _reel_count, _content_summary, refs, film(), _period, output_dcp, _text_only ); if (subtitle) { @@ -689,9 +670,6 @@ ReelWriter::create_reel_text ( _reel_count, _content_summary, refs, - fonts, - chosen_interop_font, - _default_font, film(), _period, output_dcp, @@ -701,7 +679,7 @@ ReelWriter::create_reel_text ( for (auto const& i: _closed_caption_assets) { auto a = maybe_add_text ( - i.second, duration, reel, _reel_index, _reel_count, _content_summary, refs, fonts, chosen_interop_font, _default_font, film(), _period, output_dcp, _text_only + i.second, duration, reel, _reel_index, _reel_count, _content_summary, refs, film(), _period, output_dcp, _text_only ); DCPOMATIC_ASSERT (a); a->set_annotation_text (i.first.name); @@ -722,9 +700,6 @@ ReelWriter::create_reel_text ( _reel_count, _content_summary, refs, - fonts, - chosen_interop_font, - _default_font, film(), _period, output_dcp, @@ -769,8 +744,6 @@ ReelWriter::create_reel_markers (shared_ptr reel) const shared_ptr ReelWriter::create_reel ( list const & refs, - FontIdMap const & fonts, - shared_ptr chosen_interop_font, boost::filesystem::path output_dcp, bool ensure_subtitles, set ensure_closed_captions @@ -792,7 +765,7 @@ ReelWriter::create_reel ( create_reel_markers (reel); } - create_reel_text (reel, refs, fonts, chosen_interop_font, duration, output_dcp, ensure_subtitles, ensure_closed_captions); + create_reel_text(reel, refs, duration, output_dcp, ensure_subtitles, ensure_closed_captions); if (_atmos_asset) { reel->add (make_shared(_atmos_asset, 0)); @@ -938,7 +911,7 @@ ReelWriter::convert_vertical_position(StringText const& subtitle, dcp::SubtitleS void -ReelWriter::write (PlayerText subs, TextType type, optional track, DCPTimePeriod period, FontIdMap const& fonts) +ReelWriter::write(PlayerText subs, TextType type, optional track, DCPTimePeriod period, FontIdMap const& fonts, shared_ptr chosen_interop_font) { shared_ptr asset; @@ -978,8 +951,18 @@ 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); - sub->set_font(fonts.get(i.font)); + /* i.font is a shared_ptr which uniquely identifies the font we want, + * though if we are Interop we can only have one font, so we'll use the chosen + * one instead. + */ + auto font = film()->interop() ? chosen_interop_font : i.font; + /* We can get the corresponding ID from fonts */ + auto const font_id_to_use = fonts.get(font); + /* Give this subtitle the correct font ID */ + sub->set_font(font_id_to_use); asset->add(sub); + /* Make sure the asset LoadFonts the font we just asked for */ + asset->ensure_font(font_id_to_use, font->data().get_value_or(_default_font)); } for (auto i: subs.bitmap) { diff --git a/src/lib/reel_writer.h b/src/lib/reel_writer.h index 892d803a5..fff298cb7 100644 --- a/src/lib/reel_writer.h +++ b/src/lib/reel_writer.h @@ -72,14 +72,12 @@ public: void fake_write (int size); void repeat_write (Frame frame, Eyes eyes); void write (std::shared_ptr audio); - void write (PlayerText text, TextType type, boost::optional track, dcpomatic::DCPTimePeriod period, FontIdMap const& fonts); + void write(PlayerText text, TextType type, boost::optional track, dcpomatic::DCPTimePeriod period, FontIdMap const& fonts, std::shared_ptr chosen_interop_font); void write (std::shared_ptr atmos, AtmosMetadata metadata); void finish (boost::filesystem::path output_dcp); std::shared_ptr create_reel ( std::list const & refs, - FontIdMap const & fonts, - std::shared_ptr chosen_interop_font, boost::filesystem::path output_dcp, bool ensure_subtitles, std::set ensure_closed_captions @@ -113,8 +111,6 @@ private: void create_reel_text ( std::shared_ptr reel, std::list const & refs, - FontIdMap const& fonts, - std::shared_ptr chosen_interop_font, int64_t duration, boost::filesystem::path output_dcp, bool ensure_subtitles, diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 53b1eec5e..d42b23478 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -593,7 +593,7 @@ Writer::finish (boost::filesystem::path output_dcp) /* Add reels */ for (auto& i: _reels) { - cpl->add (i.create_reel(_reel_assets, _fonts, _chosen_interop_font, output_dcp, _have_subtitles, _have_closed_captions)); + cpl->add(i.create_reel(_reel_assets, output_dcp, _have_subtitles, _have_closed_captions)); } /* Add metadata */ @@ -842,7 +842,7 @@ Writer::write (PlayerText text, TextType type, optional track, DCP period = back_off(period); } - (*reel)->write(text, type, track, period, _fonts); + (*reel)->write(text, type, track, period, _fonts, _chosen_interop_font); } @@ -1016,7 +1016,7 @@ Writer::write_hanging_text (ReelWriter& reel) vector new_hanging_texts; for (auto i: _hanging_texts) { if (i.period.from == reel.period().from) { - reel.write (i.text, i.type, i.track, i.period, _fonts); + reel.write(i.text, i.type, i.track, i.period, _fonts, _chosen_interop_font); } else { new_hanging_texts.push_back (i); } diff --git a/wscript b/wscript index 94ab1fd70..777315747 100644 --- a/wscript +++ b/wscript @@ -35,7 +35,7 @@ except ImportError: from waflib import Logs, Context APPNAME = 'dcpomatic' -libdcp_version = '1.8.68' +libdcp_version = '1.8.69' 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