summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-06-17 01:08:48 +0200
committerCarl Hetherington <cth@carlh.net>2020-06-17 01:08:48 +0200
commit54ca5a01f0648d2a5101fab0f50b41d8c90612e4 (patch)
treed792cc132ab51f102883d737ac26788427abac19 /src/lib
parent30e262f486c8390b7c9a1a797471082f90adf61b (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.cc12
-rw-r--r--src/lib/config.h36
-rw-r--r--src/lib/dcp_video.cc5
-rw-r--r--src/lib/reel_writer.cc24
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 {