From bc24aef12d04bcd4bfb775aeef6ee256fc4f34ef Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 3 Nov 2021 18:19:58 +0100 Subject: Support DCP digest files (#2109). --- src/lib/dcp_digest_file.cc | 87 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/lib/dcp_digest_file.cc (limited to 'src/lib/dcp_digest_file.cc') diff --git a/src/lib/dcp_digest_file.cc b/src/lib/dcp_digest_file.cc new file mode 100644 index 000000000..739cc2b75 --- /dev/null +++ b/src/lib/dcp_digest_file.cc @@ -0,0 +1,87 @@ +/* + Copyright (C) 2021 Carl Hetherington + + 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 . + +*/ + + +#include "dcp_digest_file.h" +#include "warnings.h" +#include +#include +#include +#include +#include +#include +#include +DCPOMATIC_DISABLE_WARNINGS +#include +DCPOMATIC_ENABLE_WARNINGS + + +using std::dynamic_pointer_cast; +using std::shared_ptr; +using std::string; + + +template +void add_asset(string key, shared_ptr reel_asset, shared_ptr 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()); + out->add_child("AnnotationText")->add_child_text(reel_asset->annotation_text()); + 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 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(in_reel->main_subtitle())) { + add_asset(key, smpte_sub, smpte_sub->smpte_asset(), out_reel, "MainSubtitle"); + } + } + doc.write_to_file_formatted(path.string()); +} + -- cgit v1.2.3