summaryrefslogtreecommitdiff
path: root/src/lib/content_factory.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2024-09-16 10:10:46 +0200
committerCarl Hetherington <cth@carlh.net>2024-09-18 10:41:19 +0200
commita9cb7313f7846f8b2bf9f96d19cf28abd7caf7fc (patch)
tree020b1ed7922e97c9711641209efdab845cdf65fc /src/lib/content_factory.cc
parent5c5da23c412e9b922154f8934e16f3a51ff48bdc (diff)
Fix thinko in relative path change.
We have to canonicalise relative paths with respect to the film's directory on load, otherwise we try to use the relative path and it's interpreted against the current working directory. This unfortunately requires the film's directory to be piped into quite a lot of new places.
Diffstat (limited to 'src/lib/content_factory.cc')
-rw-r--r--src/lib/content_factory.cc40
1 files changed, 20 insertions, 20 deletions
diff --git a/src/lib/content_factory.cc b/src/lib/content_factory.cc
index bac41f940..5d36c2aea 100644
--- a/src/lib/content_factory.cc
+++ b/src/lib/content_factory.cc
@@ -48,7 +48,6 @@
using std::list;
-using std::make_shared;
using std::shared_ptr;
using std::string;
using std::vector;
@@ -56,29 +55,30 @@ using std::vector;
/** Create a Content object from an XML node.
* @param node XML description.
+ * @param directory "Current" directory for any relative file paths mentioned in the XML.
* @param version XML state version.
* @param notes A list to which is added descriptions of any non-critial warnings / messages.
* @return Content object, or 0 if no content was recognised in the XML.
*/
shared_ptr<Content>
-content_factory (cxml::ConstNodePtr node, int version, list<string>& notes)
+content_factory(cxml::ConstNodePtr node, boost::optional<boost::filesystem::path> film_directory, int version, list<string>& notes)
{
auto const type = node->string_child ("Type");
std::shared_ptr<Content> content;
if (type == "FFmpeg") {
- content = make_shared<FFmpegContent>(node, version, notes);
+ content = std::make_shared<FFmpegContent>(node, film_directory, version, notes);
} else if (type == "Image") {
- content = make_shared<ImageContent>(node, version);
+ content = std::make_shared<ImageContent>(node, film_directory, version);
} else if (type == "Sndfile") {
/* SndfileContent is now handled by the FFmpeg code rather than by
separate libsndfile-based code.
*/
- content = make_shared<FFmpegContent>(node, version, notes);
+ content = std::make_shared<FFmpegContent>(node, film_directory, version, notes);
content->audio->set_stream (
- make_shared<FFmpegAudioStream>(
+ std::make_shared<FFmpegAudioStream>(
"Stream", 0,
node->number_child<int> ("AudioFrameRate"),
node->number_child<Frame> ("AudioLength"),
@@ -88,15 +88,15 @@ content_factory (cxml::ConstNodePtr node, int version, list<string>& notes)
);
} else if (type == "SubRip" || type == "TextSubtitle") {
- content = make_shared<StringTextFileContent>(node, version, notes);
+ content = std::make_shared<StringTextFileContent>(node, film_directory, version, notes);
} else if (type == "DCP") {
- content = make_shared<DCPContent>(node, version);
+ content = std::make_shared<DCPContent>(node, film_directory, version);
} else if (type == "DCPSubtitle") {
- content = make_shared<DCPSubtitleContent>(node, version);
+ content = std::make_shared<DCPSubtitleContent>(node, film_directory, version);
} else if (type == "VideoMXF") {
- content = make_shared<VideoMXFContent>(node, version);
+ content = std::make_shared<VideoMXFContent>(node, film_directory, version);
} else if (type == "AtmosMXF") {
- content = make_shared<AtmosMXFContent>(node, version);
+ content = std::make_shared<AtmosMXFContent>(node, film_directory, version);
}
return content;
@@ -153,10 +153,10 @@ content_factory (boost::filesystem::path path)
}
if (image_files > 0 && sound_files == 0) {
- content.push_back (make_shared<ImageContent>(path));
+ content.push_back(std::make_shared<ImageContent>(path));
} else if (image_files == 0 && sound_files > 0) {
for (auto i: dcp::filesystem::directory_iterator(path)) {
- content.push_back (make_shared<FFmpegContent>(i.path()));
+ content.push_back(std::make_shared<FFmpegContent>(i.path()));
}
}
@@ -168,26 +168,26 @@ content_factory (boost::filesystem::path path)
transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
if (valid_image_file (path)) {
- single = make_shared<ImageContent>(path);
+ single = std::make_shared<ImageContent>(path);
} else if (ext == ".srt" || ext == ".ssa" || ext == ".ass" || ext == ".stl" || ext == ".vtt") {
- single = make_shared<StringTextFileContent>(path);
+ single = std::make_shared<StringTextFileContent>(path);
} else if (ext == ".xml") {
cxml::Document doc;
doc.read_file(dcp::filesystem::fix_long_path(path));
if (doc.root_name() == "DCinemaSecurityMessage") {
throw KDMAsContentError ();
}
- single = make_shared<DCPSubtitleContent>(path);
+ single = std::make_shared<DCPSubtitleContent>(path);
} else if (ext == ".mxf" && dcp::SMPTETextAsset::valid_mxf(path)) {
- single = make_shared<DCPSubtitleContent>(path);
+ single = std::make_shared<DCPSubtitleContent>(path);
} else if (ext == ".mxf" && VideoMXFContent::valid_mxf(path)) {
- single = make_shared<VideoMXFContent>(path);
+ single = std::make_shared<VideoMXFContent>(path);
} else if (ext == ".mxf" && AtmosMXFContent::valid_mxf(path)) {
- single = make_shared<AtmosMXFContent>(path);
+ single = std::make_shared<AtmosMXFContent>(path);
}
if (!single) {
- single = make_shared<FFmpegContent>(path);
+ single = std::make_shared<FFmpegContent>(path);
}
content.push_back (single);