Only add fonts to assets when they are required.
authorCarl Hetherington <cth@carlh.net>
Fri, 12 May 2023 00:19:36 +0000 (02:19 +0200)
committerCarl Hetherington <cth@carlh.net>
Fri, 12 May 2023 20:11:06 +0000 (22:11 +0200)
cscript
src/lib/reel_writer.cc
src/lib/reel_writer.h
src/lib/writer.cc
wscript

diff --git a/cscript b/cscript
index a85cc736914a303e57d3b30663eb242c1aa9f056..60c4a512850b17994aa7526415c0f6ad70cb30d0 100644 (file)
--- 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'))
index 139c5aed431ce51a8ecf51aee988958f083815da..062d3ca812441a984fbd79eeca912f3f58f89366 100644 (file)
@@ -477,9 +477,6 @@ maybe_add_text (
        int reel_count,
        optional<string> content_summary,
        list<ReferencedReelAsset> const & refs,
-       FontIdMap const& fonts,
-       shared_ptr<dcpomatic::Font> chosen_interop_font,
-       dcp::ArrayData default_font,
        shared_ptr<const Film> film,
        DCPTimePeriod period,
        boost::filesystem::path output_dcp,
@@ -491,20 +488,6 @@ maybe_add_text (
        shared_ptr<Result> 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<dcp::InteropSubtitleAsset>(asset)) {
                        auto directory = output_dcp / interop->id ();
                        boost::filesystem::create_directories (directory);
@@ -662,8 +645,6 @@ void
 ReelWriter::create_reel_text (
        shared_ptr<dcp::Reel> reel,
        list<ReferencedReelAsset> const & refs,
-       FontIdMap const& fonts,
-       shared_ptr<dcpomatic::Font> 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<dcp::ReelInteropSubtitleAsset, dcp::ReelSMPTESubtitleAsset, dcp::ReelSubtitleAsset> (
-               _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<dcp::ReelInteropClosedCaptionAsset, dcp::ReelSMPTEClosedCaptionAsset, dcp::ReelClosedCaptionAsset> (
-                       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<dcp::Reel> reel) const
 shared_ptr<dcp::Reel>
 ReelWriter::create_reel (
        list<ReferencedReelAsset> const & refs,
-       FontIdMap const & fonts,
-       shared_ptr<dcpomatic::Font> chosen_interop_font,
        boost::filesystem::path output_dcp,
        bool ensure_subtitles,
        set<DCPTextTrack> 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<dcp::ReelAtmosAsset>(_atmos_asset, 0));
@@ -938,7 +911,7 @@ ReelWriter::convert_vertical_position(StringText const& subtitle, dcp::SubtitleS
 
 
 void
-ReelWriter::write (PlayerText subs, TextType type, optional<DCPTextTrack> track, DCPTimePeriod period, FontIdMap const& fonts)
+ReelWriter::write(PlayerText subs, TextType type, optional<DCPTextTrack> track, DCPTimePeriod period, FontIdMap const& fonts, shared_ptr<dcpomatic::Font> chosen_interop_font)
 {
        shared_ptr<dcp::SubtitleAsset> asset;
 
@@ -978,8 +951,18 @@ ReelWriter::write (PlayerText subs, TextType type, optional<DCPTextTrack> 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<dcp::SubtitleString>(i);
-               sub->set_font(fonts.get(i.font));
+               /* i.font is a shared_ptr<Font> 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) {
index 892d803a502f11458fc77308c52365469249c530..fff298cb7be6d0512b36902ba53aed138067bc99 100644 (file)
@@ -72,14 +72,12 @@ public:
        void fake_write (int size);
        void repeat_write (Frame frame, Eyes eyes);
        void write (std::shared_ptr<const AudioBuffers> audio);
-       void write (PlayerText text, TextType type, boost::optional<DCPTextTrack> track, dcpomatic::DCPTimePeriod period, FontIdMap const& fonts);
+       void write(PlayerText text, TextType type, boost::optional<DCPTextTrack> track, dcpomatic::DCPTimePeriod period, FontIdMap const& fonts, std::shared_ptr<dcpomatic::Font> chosen_interop_font);
        void write (std::shared_ptr<const dcp::AtmosFrame> atmos, AtmosMetadata metadata);
 
        void finish (boost::filesystem::path output_dcp);
        std::shared_ptr<dcp::Reel> create_reel (
                std::list<ReferencedReelAsset> const & refs,
-               FontIdMap const & fonts,
-               std::shared_ptr<dcpomatic::Font> chosen_interop_font,
                boost::filesystem::path output_dcp,
                bool ensure_subtitles,
                std::set<DCPTextTrack> ensure_closed_captions
@@ -113,8 +111,6 @@ private:
        void create_reel_text (
                std::shared_ptr<dcp::Reel> reel,
                std::list<ReferencedReelAsset> const & refs,
-               FontIdMap const& fonts,
-               std::shared_ptr<dcpomatic::Font> chosen_interop_font,
                int64_t duration,
                boost::filesystem::path output_dcp,
                bool ensure_subtitles,
index 53b1eec5e69ea8d8d66c73c28ce927f239a2a3bf..d42b23478f469e68e4c650f03b5606c918e2ec57 100644 (file)
@@ -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<DCPTextTrack> 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<HangingText> 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 94ab1fd7047b5ac790588408171d16cd0fd31d34..7773157471d3b48409186e5302b1cf48ef8200e4 100644 (file)
--- 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]