diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-06-17 01:08:48 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-06-17 01:08:48 +0200 |
| commit | 54ca5a01f0648d2a5101fab0f50b41d8c90612e4 (patch) | |
| tree | d792cc132ab51f102883d737ac26788427abac19 /src/lib | |
| parent | 30e262f486c8390b7c9a1a797471082f90adf61b (diff) | |
Allow more complete control over the libdcp/DCP-o-matic metadata written to various places.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/config.cc | 12 | ||||
| -rw-r--r-- | src/lib/config.h | 36 | ||||
| -rw-r--r-- | src/lib/dcp_video.cc | 5 | ||||
| -rw-r--r-- | src/lib/reel_writer.cc | 24 |
4 files changed, 75 insertions, 2 deletions
diff --git a/src/lib/config.cc b/src/lib/config.cc index b1f2a4f18..7b381e33b 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -323,6 +323,10 @@ try } _upload_after_make_dcp = up.get_value_or (false); _dcp_creator = f.optional_string_child ("DCPCreator").get_value_or (""); + _dcp_company_name = f.optional_string_child("DCPCompanyName").get_value_or(""); + _dcp_product_name = f.optional_string_child("DCPProductName").get_value_or(""); + _dcp_product_version = f.optional_string_child("DCPProductVersion").get_value_or(""); + _dcp_j2k_comment = f.optional_string_child("DCPJ2KComment").get_value_or(""); if (version && version.get() >= 2) { _default_isdcf_metadata = ISDCFMetadata (f.node_child ("ISDCFMetadata")); @@ -729,6 +733,14 @@ Config::write_config () const root->add_child("DCPIssuer")->add_child_text (_dcp_issuer); /* [XML] DCPIssuer Creator text to write into CPL files. */ root->add_child("DCPCreator")->add_child_text (_dcp_creator); + /* [XML] Company name to write into MXF files. */ + root->add_child("DCPCompanyName")->add_child_text (_dcp_company_name); + /* [XML] Product name to write into MXF files. */ + root->add_child("DCPProductName")->add_child_text (_dcp_product_name); + /* [XML] Product version to write into MXF files. */ + root->add_child("DCPProductVersion")->add_child_text (_dcp_product_version); + /* [XML] Comment to write into JPEG2000 data. */ + root->add_child("DCPJ2KComment")->add_child_text (_dcp_j2k_comment); /* [XML] UploadAfterMakeDCP 1 to upload to a TMS after making a DCP, 0 for no upload. */ root->add_child("UploadAfterMakeDCP")->add_child_text (_upload_after_make_dcp ? "1" : "0"); diff --git a/src/lib/config.h b/src/lib/config.h index 4b7488d15..74a44bc2f 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -202,6 +202,22 @@ public: return _dcp_creator; } + std::string dcp_company_name () const { + return _dcp_company_name; + } + + std::string dcp_product_name () const { + return _dcp_product_name; + } + + std::string dcp_product_version () const { + return _dcp_product_version; + } + + std::string dcp_j2k_comment () const { + return _dcp_j2k_comment; + } + int default_j2k_bandwidth () const { return _default_j2k_bandwidth; } @@ -698,6 +714,22 @@ public: maybe_set (_dcp_creator, c); } + void set_dcp_company_name (std::string c) { + maybe_set (_dcp_company_name, c); + } + + void set_dcp_product_name (std::string c) { + maybe_set (_dcp_product_name, c); + } + + void set_dcp_product_version (std::string c) { + maybe_set (_dcp_product_version, c); + } + + void set_dcp_j2k_comment (std::string c) { + maybe_set (_dcp_j2k_comment, c); + } + void set_default_j2k_bandwidth (int b) { maybe_set (_default_j2k_bandwidth, b); } @@ -1229,6 +1261,10 @@ private: int _default_dcp_audio_channels; std::string _dcp_issuer; std::string _dcp_creator; + std::string _dcp_company_name; + std::string _dcp_product_name; + std::string _dcp_product_version; + std::string _dcp_j2k_comment; int _default_j2k_bandwidth; int _default_audio_delay; bool _default_interop; diff --git a/src/lib/dcp_video.cc b/src/lib/dcp_video.cc index 5416f2ae7..7b06f8cfc 100644 --- a/src/lib/dcp_video.cc +++ b/src/lib/dcp_video.cc @@ -115,12 +115,15 @@ DCPVideo::convert_to_xyz (shared_ptr<const PlayerVideo> frame, dcp::NoteHandler Data DCPVideo::encode_locally () { + string const comment = Config::instance()->dcp_j2k_comment(); + Data enc = compress_j2k ( convert_to_xyz (_frame, boost::bind(&Log::dcp_log, dcpomatic_log.get(), _1, _2)), _j2k_bandwidth, _frames_per_second, _frame->eyes() == EYES_LEFT || _frame->eyes() == EYES_RIGHT, - _resolution == RESOLUTION_4K + _resolution == RESOLUTION_4K, + comment.empty() ? "libdcp" : comment ); switch (_frame->eyes()) { diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 06d20e7c8..3697fc7b1 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net> + Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net> This file is part of DCP-o-matic. @@ -27,6 +27,7 @@ #include "digester.h" #include "font.h" #include "compose.hpp" +#include "config.h" #include "audio_buffers.h" #include "image.h" #include <dcp/mono_picture_asset.h> @@ -65,6 +66,23 @@ using namespace dcpomatic; int const ReelWriter::_info_size = 48; +static dcp::MXFMetadata +mxf_metadata () +{ + dcp::MXFMetadata meta; + Config* config = Config::instance(); + if (!config->dcp_company_name().empty()) { + meta.company_name = config->dcp_company_name (); + } + if (!config->dcp_product_name().empty()) { + meta.product_name = config->dcp_product_name (); + } + if (!config->dcp_product_version().empty()) { + meta.product_version = config->dcp_product_version (); + } + return meta; +} + /** @param job Related job, or 0 */ ReelWriter::ReelWriter ( shared_ptr<const Film> film, DCPTimePeriod period, shared_ptr<Job> job, int reel_index, int reel_count, optional<string> content_summary @@ -113,6 +131,7 @@ ReelWriter::ReelWriter ( } _picture_asset->set_size (_film->frame_size()); + _picture_asset->set_metadata (mxf_metadata()); if (_film->encrypted ()) { _picture_asset->set_key (_film->key()); @@ -136,6 +155,8 @@ ReelWriter::ReelWriter ( new dcp::SoundAsset (dcp::Fraction (_film->video_frame_rate(), 1), _film->audio_frame_rate (), _film->audio_channels (), standard) ); + _sound_asset->set_metadata (mxf_metadata()); + if (_film->encrypted ()) { _sound_asset->set_key (_film->key ()); } @@ -634,6 +655,7 @@ ReelWriter::write (PlayerText subs, TextType type, optional<DCPTextTrack> track, } else { shared_ptr<dcp::SMPTESubtitleAsset> s (new dcp::SMPTESubtitleAsset ()); s->set_content_title_text (_film->name ()); + s->set_metadata (mxf_metadata()); if (type == TEXT_OPEN_SUBTITLE && !lang.empty()) { s->set_language (lang); } else { |
