diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/copy_dcp_details_to_film.cc | 8 | ||||
| -rw-r--r-- | src/lib/film.cc | 139 | ||||
| -rw-r--r-- | src/lib/film.h | 68 | ||||
| -rw-r--r-- | src/lib/util.cc | 1 | ||||
| -rw-r--r-- | src/lib/writer.cc | 38 |
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 (); |
