summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2021-11-03 18:19:58 +0100
committerCarl Hetherington <cth@carlh.net>2022-04-20 21:23:54 +0200
commit2034cf8a82be21d4d07de81ae40c8255da1ed21e (patch)
tree631f10769840228b1cf8ec591b02274369f4d218 /src/lib
parent86eb90b563efb7ef093d5b17a5d6db0fc330e301 (diff)
Support DCP digest files (#2109).
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/dcp_digest_file.cc89
-rw-r--r--src/lib/dcp_digest_file.h27
-rw-r--r--src/lib/dcp_transcode_job.cc14
-rw-r--r--src/lib/wscript1
4 files changed, 130 insertions, 1 deletions
diff --git a/src/lib/dcp_digest_file.cc b/src/lib/dcp_digest_file.cc
new file mode 100644
index 000000000..b178e3da7
--- /dev/null
+++ b/src/lib/dcp_digest_file.cc
@@ -0,0 +1,89 @@
+/*
+ Copyright (C) 2021 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include "dcp_digest_file.h"
+#include "warnings.h"
+#include <dcp/cpl.h>
+#include <dcp/mxf.h>
+#include <dcp/reel.h>
+#include <dcp/reel_picture_asset.h>
+#include <dcp/reel_sound_asset.h>
+#include <dcp/reel_subtitle_asset.h>
+#include <dcp/reel_smpte_subtitle_asset.h>
+DCPOMATIC_DISABLE_WARNINGS
+#include <libxml++/libxml++.h>
+DCPOMATIC_ENABLE_WARNINGS
+
+
+using std::dynamic_pointer_cast;
+using std::shared_ptr;
+using std::string;
+
+
+template <class R, class A>
+void add_asset(string key, shared_ptr<R> reel_asset, shared_ptr<A> asset, xmlpp::Element* reel, string name)
+{
+ if (asset) {
+ auto out = reel->add_child(name);
+ out->add_child("Id")->add_child_text("urn:uuid:" + asset->id());
+ if (reel_asset->annotation_text()) {
+ out->add_child("AnnotationText")->add_child_text(reel_asset->annotation_text().get());
+ }
+ if (asset->key_id()) {
+ out->add_child("KeyId")->add_child_text("urn:uuid:" + asset->key_id().get());
+ out->add_child("Key")->add_child_text(key);
+ }
+ }
+};
+
+
+void
+write_dcp_digest_file (
+ boost::filesystem::path path,
+ shared_ptr<dcp::CPL> cpl,
+ string key
+ )
+{
+ xmlpp::Document doc;
+ auto root = doc.create_root_node("FHG_DCP_DIGEST", "http://www.fhg.de/2009/04/02/dcpdig");
+ root->add_child("InteropMode")->add_child_text(cpl->standard() == dcp::Standard::INTEROP ? "true" : "false");
+ auto composition = root->add_child("CompositionList")->add_child("Composition");
+ composition->add_child("Id")->add_child_text("urn:uuid:" + cpl->id());
+ composition->add_child("AnnotationText")->add_child_text(cpl->annotation_text().get_value_or(""));
+ composition->add_child("ContentTitleText")->add_child_text(cpl->content_title_text());
+ auto reel_list = composition->add_child("ReelList");
+ for (auto in_reel: cpl->reels()) {
+ auto out_reel = reel_list->add_child("Reel");
+ out_reel->add_child("Id")->add_child_text("urn:uuid:" + in_reel->id());
+ out_reel->add_child("AnnotationText");
+ if (in_reel->main_picture()) {
+ add_asset(key, in_reel->main_picture(), in_reel->main_picture()->asset(), out_reel, "MainPicture");
+ }
+ if (in_reel->main_sound()) {
+ add_asset(key, in_reel->main_sound(), in_reel->main_sound()->asset(), out_reel, "MainSound");
+ }
+ if (auto smpte_sub = dynamic_pointer_cast<dcp::ReelSMPTESubtitleAsset>(in_reel->main_subtitle())) {
+ add_asset(key, smpte_sub, smpte_sub->smpte_asset(), out_reel, "MainSubtitle");
+ }
+ }
+ doc.write_to_file_formatted(path.string());
+}
+
diff --git a/src/lib/dcp_digest_file.h b/src/lib/dcp_digest_file.h
new file mode 100644
index 000000000..2a3b16587
--- /dev/null
+++ b/src/lib/dcp_digest_file.h
@@ -0,0 +1,27 @@
+/*
+ Copyright (C) 2021 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include <dcp/dcp.h>
+#include <boost/filesystem.hpp>
+
+
+extern void write_dcp_digest_file (boost::filesystem::path filename, std::shared_ptr<dcp::CPL> cpl, std::string key);
+
diff --git a/src/lib/dcp_transcode_job.cc b/src/lib/dcp_transcode_job.cc
index e9ff4f4e0..ae3f3f837 100644
--- a/src/lib/dcp_transcode_job.cc
+++ b/src/lib/dcp_transcode_job.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2021 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2021-2022 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -20,10 +20,14 @@
#include "config.h"
+#include "dcp_content.h"
+#include "dcp_digest_file.h"
#include "dcp_transcode_job.h"
#include "film.h"
#include "job_manager.h"
#include "upload_job.h"
+#include <dcp/cpl.h>
+#include <dcp/search.h>
using std::make_shared;
@@ -43,4 +47,12 @@ DCPTranscodeJob::post_transcode ()
if (Config::instance()->upload_after_make_dcp()) {
JobManager::instance()->add(make_shared<UploadJob>(_film));
}
+
+ dcp::DCP dcp(_film->dir(_film->dcp_name()));
+ dcp.read();
+
+ for (auto cpl: dcp.cpls()) {
+ write_dcp_digest_file (_film->file(cpl->annotation_text().get_value_or(cpl->id()) + ".dcpdig"), cpl, _film->key().hex());
+ }
}
+
diff --git a/src/lib/wscript b/src/lib/wscript
index 86b7561be..b3428f20b 100644
--- a/src/lib/wscript
+++ b/src/lib/wscript
@@ -67,6 +67,7 @@ sources = """
dcp_decoder.cc
dcp_encoder.cc
dcp_examiner.cc
+ dcp_digest_file.cc
dcp_subtitle.cc
dcp_subtitle_content.cc
dcp_subtitle_decoder.cc