Cleanup: use a namespace.
[dcpomatic.git] / src / lib / dcp_content.cc
index cdf104f0377ba3b2aee4d714effb0b2f2f1b7e24..87e59de50bc7ca27a14bfcde1d39b109b4e45429 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014-2022 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2023 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -31,6 +31,7 @@
 #include "job.h"
 #include "log.h"
 #include "overlaps.h"
+#include "scope_guard.h"
 #include "text_content.h"
 #include "video_content.h"
 #include <dcp/dcp.h>
@@ -191,16 +192,18 @@ DCPContent::read_directory (boost::filesystem::path p)
 void
 DCPContent::read_sub_directory (boost::filesystem::path p)
 {
+       using namespace boost::filesystem;
+
        LOG_GENERAL ("DCPContent::read_sub_directory reads %1", p.string());
-       for (auto i: boost::filesystem::directory_iterator(p)) {
-               if (boost::filesystem::is_regular_file(i.path())) {
+       for (auto i: directory_iterator(p)) {
+               if (is_regular_file(i.path())) {
                        LOG_GENERAL ("Inside there's regular file %1", i.path().string());
                        add_path (i.path());
-               } else if (boost::filesystem::is_directory(i.path()) && i.path().filename() != ".AppleDouble") {
+               } else if (is_directory(i.path()) && i.path().filename() != ".AppleDouble") {
                        LOG_GENERAL ("Inside there's directory %1", i.path().string());
                        read_sub_directory (i.path());
                } else {
-                       LOG_GENERAL("Ignoring %1 from inside: status is %2", i.path().string(), static_cast<int>(boost::filesystem::status(i.path()).type()));
+                       LOG_GENERAL("Ignoring %1 from inside: status is %2", i.path().string(), static_cast<int>(status(i.path()).type()));
                }
        }
 }
@@ -213,6 +216,11 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
        bool const needed_kdm = needs_kdm ();
        string const old_name = name ();
 
+       ContentChangeSignalDespatcher::instance()->suspend();
+       ScopeGuard sg = []() {
+               ContentChangeSignalDespatcher::instance()->resume();
+       };
+
        ContentChangeSignaller cc_texts (this, DCPContentProperty::TEXTS);
        ContentChangeSignaller cc_assets (this, DCPContentProperty::NEEDS_ASSETS);
        ContentChangeSignaller cc_kdm (this, DCPContentProperty::NEEDS_KDM);
@@ -258,7 +266,7 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                atmos->set_length (examiner->atmos_length());
        }
 
-       list<shared_ptr<TextContent>> new_text;
+       vector<shared_ptr<TextContent>> new_text;
 
        for (int i = 0; i < examiner->text_count(TextType::OPEN_SUBTITLE); ++i) {
                auto c = make_shared<TextContent>(this, TextType::OPEN_SUBTITLE, TextType::OPEN_SUBTITLE);
@@ -270,6 +278,7 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
        for (int i = 0; i < examiner->text_count(TextType::CLOSED_CAPTION); ++i) {
                auto c = make_shared<TextContent>(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);
        }
 
@@ -825,8 +834,9 @@ add_fonts_from_examiner(shared_ptr<TextContent> text, vector<vector<shared_ptr<F
                         * by prepending the reel number.  We do the same disambiguation when emitting the
                         * subtitles in the DCP decoder.
                         */
-                       font->set_id(id_for_font_in_reel(font->id(), reel_number));
-                       text->add_font(font);
+                       auto font_copy = make_shared<dcpomatic::Font>(*font);
+                       font_copy->set_id(id_for_font_in_reel(font->id(), reel_number));
+                       text->add_font(font_copy);
                }
                ++reel_number;
        }