summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/copy_dcp_details_to_film.cc8
-rw-r--r--src/lib/film.cc139
-rw-r--r--src/lib/film.h68
-rw-r--r--src/lib/util.cc1
-rw-r--r--src/lib/writer.cc38
5 files changed, 239 insertions, 15 deletions
diff --git a/src/lib/copy_dcp_details_to_film.cc b/src/lib/copy_dcp_details_to_film.cc
index a009735fb..d73ee8792 100644
--- a/src/lib/copy_dcp_details_to_film.cc
+++ b/src/lib/copy_dcp_details_to_film.cc
@@ -29,10 +29,13 @@
#include <boost/shared_ptr.hpp>
#include <map>
+
using std::map;
using std::string;
+using std::vector;
using boost::shared_ptr;
+
void
copy_dcp_details_to_film (shared_ptr<const DCPContent> dcp, shared_ptr<Film> film)
{
@@ -67,7 +70,10 @@ copy_dcp_details_to_film (shared_ptr<const DCPContent> dcp, shared_ptr<Film> fil
}
film->set_ratings (dcp->ratings());
- film->set_content_version (dcp->content_version());
+
+ vector<string> cv;
+ cv.push_back (dcp->content_version());
+ film->set_content_versions (cv);
}
diff --git a/src/lib/film.cc b/src/lib/film.cc
index 867944689..79ee20cfb 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -165,6 +165,11 @@ Film::Film (optional<boost::filesystem::path> dir)
, _user_explicit_video_frame_rate (false)
, _user_explicit_container (false)
, _user_explicit_resolution (false)
+ , _name_language (dcp::LanguageTag("en-US"))
+ , _release_territory (dcp::LanguageTag::RegionSubtag("US"))
+ , _version_number (1)
+ , _status (dcp::FINAL)
+ , _luminance (dcp::Luminance(4.5, dcp::Luminance::FOOT_LAMBERT))
, _state_version (current_state_version)
, _dirty (false)
, _tolerant (false)
@@ -464,7 +469,18 @@ Film::metadata (bool with_content_paths) const
BOOST_FOREACH (dcp::Rating i, _ratings) {
i.as_xml (root->add_child("Rating"));
}
- root->add_child("ContentVersion")->add_child_text(_content_version);
+ BOOST_FOREACH (string i, _content_versions) {
+ root->add_child("ContentVersion")->add_child_text(i);
+ }
+ root->add_child("NameLanguage")->add_child_text(_name_language.to_string());
+ root->add_child("ReleaseTerritory")->add_child_text(_release_territory.subtag());
+ root->add_child("VersionNumber")->add_child_text(raw_convert<string>(_version_number));
+ root->add_child("Status")->add_child_text(dcp::status_to_string(_status));
+ root->add_child("Chain")->add_child_text(_chain);
+ root->add_child("Distributor")->add_child_text(_distributor);
+ root->add_child("Facility")->add_child_text(_facility);
+ root->add_child("LuminanceValue")->add_child_text(raw_convert<string>(_luminance.value()));
+ root->add_child("LuminanceUnit")->add_child_text(dcp::Luminance::unit_to_string(_luminance.unit()));
root->add_child("UserExplicitContainer")->add_child_text(_user_explicit_container ? "1" : "0");
root->add_child("UserExplicitResolution")->add_child_text(_user_explicit_resolution ? "1" : "0");
_playlist->as_xml (root->add_child ("Playlist"), with_content_paths);
@@ -612,7 +628,35 @@ Film::read_metadata (optional<boost::filesystem::path> path)
_ratings.push_back (dcp::Rating(i));
}
- _content_version = f.optional_string_child("ContentVersion").get_value_or("");
+ BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("ContentVersion")) {
+ _content_versions.push_back (i->content());
+ }
+
+ optional<string> name_language = f.optional_string_child("NameLanguage");
+ if (name_language) {
+ _name_language = dcp::LanguageTag (*name_language);
+ }
+ optional<string> release_territory = f.optional_string_child("ReleaseTerritory");
+ if (release_territory) {
+ _release_territory = dcp::LanguageTag::RegionSubtag (*release_territory);
+ }
+
+ _version_number = f.optional_number_child<int>("VersionNumber").get_value_or(0);
+
+ optional<string> status = f.optional_string_child("Status");
+ if (status) {
+ _status = dcp::string_to_status (*status);
+ }
+
+ _chain = f.optional_string_child("Chain").get_value_or("");
+ _distributor = f.optional_string_child("Distributor").get_value_or("");
+ _facility = f.optional_string_child("Facility").get_value_or("");
+
+ float value = f.optional_number_child<float>("LuminanceValue").get_value_or(4.5);
+ optional<string> unit = f.optional_string_child("LuminanceUnit");
+ if (unit) {
+ _luminance = dcp::Luminance (value, dcp::Luminance::string_to_unit(*unit));
+ }
/* Disable guessing for files made in previous DCP-o-matic versions */
_user_explicit_container = f.optional_bool_child("UserExplicitContainer").get_value_or(true);
@@ -1494,6 +1538,26 @@ Film::frame_size () const
return fit_ratio_within (container()->ratio(), full_frame ());
}
+
+/** @return Area of Film::frame_size() that contains picture rather than pillar/letterboxing */
+dcp::Size
+Film::active_area () const
+{
+ dcp::Size const frame = frame_size ();
+ dcp::Size active;
+
+ BOOST_FOREACH (shared_ptr<Content> i, content()) {
+ if (i->video) {
+ dcp::Size s = i->video->scaled_size (frame);
+ active.width = max(active.width, s.width);
+ active.height = max(active.height, s.height);
+ }
+ }
+
+ return active;
+}
+
+
/** @param recipient KDM recipient certificate.
* @param trusted_devices Certificate thumbprints of other trusted devices (can be empty).
* @param cpl_file CPL filename.
@@ -1865,12 +1929,77 @@ Film::set_ratings (vector<dcp::Rating> r)
}
void
-Film::set_content_version (string v)
+Film::set_content_versions (vector<string> v)
+{
+ ChangeSignaller<Film> ch (this, CONTENT_VERSIONS);
+ _content_versions = v;
+}
+
+
+void
+Film::set_name_language (dcp::LanguageTag lang)
+{
+ ChangeSignaller<Film> ch (this, NAME_LANGUAGE);
+ _name_language = lang;
+}
+
+
+void
+Film::set_release_territory (dcp::LanguageTag::RegionSubtag region)
{
- ChangeSignaller<Film> ch (this, CONTENT_VERSION);
- _content_version = v;
+ ChangeSignaller<Film> ch (this, RELEASE_TERRITORY);
+ _release_territory = region;
}
+
+void
+Film::set_status (dcp::Status s)
+{
+ ChangeSignaller<Film> ch (this, STATUS);
+ _status = s;
+}
+
+
+void
+Film::set_version_number (int v)
+{
+ ChangeSignaller<Film> ch (this, VERSION_NUMBER);
+ _version_number = v;
+}
+
+
+void
+Film::set_chain (string c)
+{
+ ChangeSignaller<Film> ch (this, CHAIN);
+ _chain = c;
+}
+
+
+void
+Film::set_distributor (string d)
+{
+ ChangeSignaller<Film> ch (this, DISTRIBUTOR);
+ _distributor = d;
+}
+
+
+void
+Film::set_luminance (dcp::Luminance l)
+{
+ ChangeSignaller<Film> ch (this, LUMINANCE);
+ _luminance = l;
+}
+
+
+void
+Film::set_facility (string f)
+{
+ ChangeSignaller<Film> ch (this, FACILITY);
+ _facility = f;
+}
+
+
optional<DCPTime>
Film::marker (dcp::Marker type) const
{
diff --git a/src/lib/film.h b/src/lib/film.h
index f5c20bccd..174805713 100644
--- a/src/lib/film.h
+++ b/src/lib/film.h
@@ -32,6 +32,7 @@
#include "frame_rate_change.h"
#include "signaller.h"
#include "dcp_text_track.h"
+#include <dcp/language_tag.h>
#include <dcp/key.h>
#include <dcp/encrypted_kdm.h>
#include <boost/signals2.hpp>
@@ -140,6 +141,7 @@ public:
dcp::Size full_frame () const;
dcp::Size frame_size () const;
+ dcp::Size active_area () const;
std::vector<CPLSummary> cpls () const;
@@ -229,7 +231,15 @@ public:
REENCODE_J2K,
MARKERS,
RATINGS,
- CONTENT_VERSION
+ CONTENT_VERSIONS,
+ NAME_LANGUAGE,
+ RELEASE_TERRITORY,
+ VERSION_NUMBER,
+ STATUS,
+ CHAIN,
+ DISTRIBUTOR,
+ FACILITY,
+ LUMINANCE
};
@@ -325,8 +335,40 @@ public:
return _ratings;
}
- std::string content_version () const {
- return _content_version;
+ std::vector<std::string> content_versions () const {
+ return _content_versions;
+ }
+
+ dcp::LanguageTag name_language () const {
+ return _name_language;
+ }
+
+ dcp::LanguageTag::RegionSubtag release_territory () const {
+ return _release_territory;
+ }
+
+ int version_number () const {
+ return _version_number;
+ }
+
+ dcp::Status status () const {
+ return _status;
+ }
+
+ std::string chain () const {
+ return _chain;
+ }
+
+ std::string distributor () const {
+ return _distributor;
+ }
+
+ std::string facility () const {
+ return _facility;
+ }
+
+ dcp::Luminance luminance () const {
+ return _luminance;
}
/* SET */
@@ -360,7 +402,15 @@ public:
void unset_marker (dcp::Marker type);
void clear_markers ();
void set_ratings (std::vector<dcp::Rating> r);
- void set_content_version (std::string v);
+ void set_content_versions (std::vector<std::string> v);
+ void set_name_language (dcp::LanguageTag lang);
+ void set_release_territory (dcp::LanguageTag::RegionSubtag region);
+ void set_version_number (int v);
+ void set_status (dcp::Status s);
+ void set_chain (std::string c);
+ void set_facility (std::string f);
+ void set_distributor (std::string d);
+ void set_luminance (dcp::Luminance l);
/** Emitted when some property has of the Film is about to change or has changed */
mutable boost::signals2::signal<void (ChangeType, Property)> Change;
@@ -454,7 +504,15 @@ private:
bool _user_explicit_resolution;
std::map<dcp::Marker, dcpomatic::DCPTime> _markers;
std::vector<dcp::Rating> _ratings;
- std::string _content_version;
+ std::vector<std::string> _content_versions;
+ dcp::LanguageTag _name_language;
+ dcp::LanguageTag::RegionSubtag _release_territory;
+ int _version_number;
+ dcp::Status _status;
+ std::string _chain;
+ std::string _distributor;
+ std::string _facility;
+ dcp::Luminance _luminance;
int _state_version;
diff --git a/src/lib/util.cc b/src/lib/util.cc
index 7824e7fed..32deac2e8 100644
--- a/src/lib/util.cc
+++ b/src/lib/util.cc
@@ -833,6 +833,7 @@ audio_channel_types (list<int> mapped, int channels)
break;
case dcp::HI:
case dcp::VI:
+ case dcp::MOTION_DATA:
case dcp::SYNC_SIGNAL:
case dcp::SIGN_LANGUAGE:
case dcp::UNUSED:
diff --git a/src/lib/writer.cc b/src/lib/writer.cc
index 8cfd712a0..0b1d8e06d 100644
--- a/src/lib/writer.cc
+++ b/src/lib/writer.cc
@@ -562,12 +562,14 @@ Writer::finish ()
pool.join_all ();
service.stop ();
- /* Add reels to CPL */
+ /* Add reels */
BOOST_FOREACH (ReelWriter& i, _reels) {
cpl->add (i.create_reel (_reel_assets, _fonts));
}
+ /* Add metadata */
+
string creator = Config::instance()->dcp_creator();
if (creator.empty()) {
creator = String::compose("DCP-o-matic %1 %2", dcpomatic_version, dcpomatic_git_commit);
@@ -580,11 +582,39 @@ Writer::finish ()
cpl->set_ratings (_film->ratings());
- dcp::ContentVersion cv = cpl->content_version ();
- cv.label_text = _film->content_version();
- cpl->set_content_version (cv);
+ vector<dcp::ContentVersion> cv;
+ BOOST_FOREACH (string i, _film->content_versions()) {
+ cv.push_back (dcp::ContentVersion(i));
+ }
+ cpl->set_content_versions (cv);
cpl->set_full_content_title_text (_film->name());
+ cpl->set_full_content_title_text_language (_film->name_language());
+ cpl->set_release_territory (_film->release_territory());
+ cpl->set_version_number (_film->version_number());
+ cpl->set_status (_film->status());
+ cpl->set_chain (_film->chain());
+ cpl->set_distributor (_film->distributor());
+ cpl->set_facility (_film->facility());
+ cpl->set_luminance (_film->luminance());
+
+ list<int> ac = _film->mapped_audio_channels ();
+ dcp::MainSoundConfiguration::Field field = (
+ find(ac.begin(), ac.end(), static_cast<int>(dcp::BSL)) != ac.end() ||
+ find(ac.begin(), ac.end(), static_cast<int>(dcp::BSR)) != ac.end()
+ ) ? dcp::MainSoundConfiguration::SEVEN_POINT_ONE : dcp::MainSoundConfiguration::FIVE_POINT_ONE;
+
+ dcp::MainSoundConfiguration msc (field, _film->audio_channels());
+ BOOST_FOREACH (int i, ac) {
+ if (i < _film->audio_channels()) {
+ msc.set_mapping (i, static_cast<dcp::Channel>(i));
+ }
+ }
+
+ cpl->set_main_sound_configuration (msc.to_string());
+ cpl->set_main_sound_sample_rate (_film->audio_frame_rate());
+ cpl->set_main_picture_stored_area (_film->frame_size());
+ cpl->set_main_picture_active_area (_film->active_area());
shared_ptr<const dcp::CertificateChain> signer;
signer = Config::instance()->signer_chain ();