Cleanup: use a namespace.
[dcpomatic.git] / src / lib / dcp_content.cc
index 2bbeba8c78c11dd03cae3028f773db72854cec32..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>
@@ -105,7 +106,8 @@ DCPContent::DCPContent (cxml::ConstNodePtr node, int version)
                                node->optional_number_child<Frame>("AudioLength").get_value_or (
                                        video->length() * node->number_child<int>("AudioFrameRate") / video_frame_rate().get()
                                        ),
-                               AudioMapping (node->node_child ("AudioMapping"), version)
+                               AudioMapping(node->node_child("AudioMapping"), version),
+                               24
                                )
                        );
        }
@@ -190,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()));
                }
        }
 }
@@ -212,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);
@@ -229,7 +238,7 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                        boost::mutex::scoped_lock lm (_mutex);
                        video = make_shared<VideoContent>(this);
                }
-               video->take_from_examiner (examiner);
+               video->take_from_examiner(film, examiner);
                set_default_colour_conversion ();
        }
 
@@ -238,7 +247,7 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                        boost::mutex::scoped_lock lm (_mutex);
                        audio = make_shared<AudioContent>(this);
                }
-               auto as = make_shared<AudioStream>(examiner->audio_frame_rate(), examiner->audio_length(), examiner->audio_channels());
+               auto as = make_shared<AudioStream>(examiner->audio_frame_rate(), examiner->audio_length(), examiner->audio_channels(), 24);
                audio->set_stream (as);
                auto m = as->mapping ();
                m.make_default (film ? film->audio_processor() : 0);
@@ -257,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);
@@ -269,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);
        }
 
@@ -824,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;
        }