/*
- Copyright (C) 2014-2020 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2014-2022 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
#include "atmos_content.h"
-#include "dcp_content.h"
-#include "video_content.h"
#include "audio_content.h"
-#include "dcp_examiner.h"
-#include "job.h"
-#include "film.h"
-#include "config.h"
-#include "overlaps.h"
#include "compose.hpp"
+#include "config.h"
+#include "dcp_content.h"
#include "dcp_decoder.h"
-#include "log.h"
+#include "dcp_examiner.h"
#include "dcpomatic_log.h"
+#include "film.h"
+#include "job.h"
+#include "log.h"
+#include "overlaps.h"
#include "text_content.h"
+#include "video_content.h"
#include <dcp/dcp.h>
#include <dcp/raw_convert.h>
#include <dcp/exceptions.h>
DCPContent::DCPContent (cxml::ConstNodePtr node, int version)
: Content (node)
{
- video = VideoContent::from_xml (this, node, version);
+ video = VideoContent::from_xml (this, node, version, VideoRange::FULL);
audio = AudioContent::from_xml (this, node, version);
list<string> notes;
text = TextContent::from_xml (this, node, version, notes);
bool have_assetmap = false;
bool have_metadata = false;
- for (directory_iterator i(p); i != directory_iterator(); ++i) {
- if (i->path().filename() == "ASSETMAP" || i->path().filename() == "ASSETMAP.xml") {
+ for (auto i: directory_iterator(p)) {
+ if (i.path().filename() == "ASSETMAP" || i.path().filename() == "ASSETMAP.xml") {
have_assetmap = true;
- } else if (i->path().filename() == "metadata.xml") {
+ } else if (i.path().filename() == "metadata.xml") {
have_metadata = true;
}
}
} else if (boost::filesystem::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()));
}
}
}
for (int i = 0; i < examiner->text_count(TextType::OPEN_SUBTITLE); ++i) {
auto c = make_shared<TextContent>(this, TextType::OPEN_SUBTITLE, TextType::OPEN_SUBTITLE);
c->set_language (examiner->open_subtitle_language());
+ add_fonts_from_examiner(c, examiner->fonts());
new_text.push_back (c);
}
{
shared_ptr<DCPDecoder> decoder;
try {
- decoder.reset (new DCPDecoder (film, shared_from_this(), false, film->tolerant(), shared_ptr<DCPDecoder>()));
+ decoder = make_shared<DCPDecoder>(film, shared_from_this(), false, film->tolerant(), shared_ptr<DCPDecoder>());
} catch (dcp::ReadError &) {
/* We couldn't read the DCP, so it's probably missing */
return false;
{
shared_ptr<DCPDecoder> decoder;
try {
- decoder.reset (new DCPDecoder (film, shared_from_this(), false, film->tolerant(), shared_ptr<DCPDecoder>()));
+ decoder = make_shared<DCPDecoder>(film, shared_from_this(), false, film->tolerant(), shared_ptr<DCPDecoder>());
} catch (dcp::ReadError &) {
/* We couldn't read the DCP, so it's probably missing */
return false;
return Resolution::TWO_K;
}
+
+void
+add_fonts_from_examiner(shared_ptr<TextContent> text, vector<vector<shared_ptr<Font>>> const & all_fonts)
+{
+ int reel_number = 0;
+ for (auto reel_fonts: all_fonts) {
+ for (auto font: reel_fonts) {
+ /* Each reel could have its own font with the same ID, so we disambiguate them here
+ * 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);
+ }
+ ++reel_number;
+ }
+
+}
+
+
+string
+id_for_font_in_reel(string id, int reel)
+{
+ return String::compose("%1_%2", reel, id);
+}
+
+
+void
+DCPContent::check_font_ids()
+{
+ if (text.empty()) {
+ return;
+ }
+
+ DCPExaminer examiner(shared_from_this(), true);
+ add_fonts_from_examiner(text.front(), examiner.fonts());
+}
+