*/
+
/** @file src/film.cc
* @brief A representation of some audio, video and subtitle content, and details of
* how they should be presented in a DCP.
*/
+
#include "atmos_content.h"
+#include "audio_content.h"
+#include "audio_processor.h"
+#include "change_signaller.h"
+#include "check_content_change_job.h"
+#include "cinema.h"
+#include "compose.hpp"
+#include "config.h"
+#include "cross.h"
+#include "dcp_content.h"
+#include "dcp_content_type.h"
+#include "dcp_encoder.h"
+#include "dcpomatic_log.h"
+#include "digester.h"
+#include "environment_info.h"
+#include "examine_content_job.h"
+#include "exceptions.h"
+#include "ffmpeg_content.h"
+#include "ffmpeg_subtitle_stream.h"
+#include "file_log.h"
#include "film.h"
+#include "font.h"
#include "job.h"
-#include "util.h"
#include "job_manager.h"
-#include "dcp_encoder.h"
-#include "transcode_job.h"
-#include "upload_job.h"
+#include "kdm_with_metadata.h"
#include "null_log.h"
-#include "file_log.h"
-#include "dcpomatic_log.h"
-#include "exceptions.h"
-#include "examine_content_job.h"
-#include "config.h"
#include "playlist.h"
-#include "dcp_content_type.h"
#include "ratio.h"
-#include "cross.h"
-#include "environment_info.h"
-#include "audio_processor.h"
-#include "digester.h"
-#include "compose.hpp"
#include "screen.h"
-#include "audio_content.h"
-#include "video_content.h"
#include "text_content.h"
-#include "ffmpeg_content.h"
-#include "dcp_content.h"
-#include "kdm_with_metadata.h"
-#include "cinema.h"
-#include "change_signaller.h"
-#include "check_content_change_job.h"
-#include "ffmpeg_subtitle_stream.h"
-#include "font.h"
+#include "transcode_job.h"
+#include "upload_job.h"
+#include "util.h"
+#include "video_content.h"
+#include "version.h"
#include <libcxml/cxml.h>
-#include <dcp/cpl.h>
#include <dcp/certificate_chain.h>
-#include <dcp/util.h>
-#include <dcp/local_time.h>
+#include <dcp/cpl.h>
#include <dcp/decrypted_kdm.h>
+#include <dcp/local_time.h>
#include <dcp/raw_convert.h>
-#include <dcp/reel_file_asset.h>
#include <dcp/reel_asset.h>
+#include <dcp/reel_file_asset.h>
+#include <dcp/util.h>
#include <libxml++/libxml++.h>
-#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>
+#include <boost/filesystem.hpp>
#include <boost/regex.hpp>
#include <unistd.h>
#include <stdexcept>
#include "i18n.h"
-using std::string;
-using std::pair;
-using std::vector;
-using std::setfill;
-using std::min;
-using std::max;
-using std::make_pair;
-using std::cout;
-using std::list;
-using std::set;
-using std::runtime_error;
-using std::copy;
+
using std::back_inserter;
-using std::map;
+using std::copy;
+using std::cout;
+using std::dynamic_pointer_cast;
using std::exception;
using std::find;
+using std::list;
+using std::make_pair;
+using std::make_shared;
+using std::map;
+using std::max;
+using std::min;
+using std::pair;
+using std::runtime_error;
+using std::set;
+using std::setfill;
using std::shared_ptr;
+using std::string;
+using std::vector;
using std::weak_ptr;
-using std::make_shared;
-using std::dynamic_pointer_cast;
using boost::optional;
using boost::is_any_of;
#if BOOST_VERSION >= 106100
using dcp::raw_convert;
using namespace dcpomatic;
-string const Film::metadata_file = "metadata.xml";
+
+static constexpr char metadata_file[] = "metadata.xml";
+
/* 5 -> 6
* AudioMapping XML changed.
*/
int const Film::current_state_version = 38;
+
/** Construct a Film object in a given directory.
*
* @param dir Film directory.
{
set_isdcf_date_today ();
+ auto metadata = Config::instance()->default_metadata();
+ if (metadata.find("chain") != metadata.end()) {
+ _chain = metadata["chain"];
+ }
+ if (metadata.find("distributor") != metadata.end()) {
+ _distributor = metadata["distributor"];
+ }
+ if (metadata.find("facility") != metadata.end()) {
+ _facility = metadata["facility"];
+ }
+ if (metadata.find("studio") != metadata.end()) {
+ _studio = metadata["studio"];
+ }
+
_playlist_change_connection = _playlist->Change.connect (bind (&Film::playlist_change, this, _1));
_playlist_order_changed_connection = _playlist->OrderChange.connect (bind (&Film::playlist_order_changed, this));
_playlist_content_change_connection = _playlist->ContentChange.connect (bind (&Film::playlist_content_change, this, _1, _2, _3, _4));
s += "_3D";
}
+ if (_reencode_j2k) {
+ s += "_R";
+ }
+
return s;
}
auto root = doc->create_root_node ("Metadata");
root->add_child("Version")->add_child_text (raw_convert<string> (current_state_version));
+ auto last_write = root->add_child("LastWrittenBy");
+ last_write->add_child_text (dcpomatic_version);
+ last_write->set_attribute("git", dcpomatic_git_commit);
root->add_child("Name")->add_child_text (_name);
root->add_child("UseISDCFName")->add_child_text (_use_isdcf_name ? "1" : "0");
_audio_language = dcp::LanguageTag(*audio_language);
}
+ /* Read the old ISDCFMetadata tag from 2.14.x metadata */
+ auto isdcf = f.optional_node_child("ISDCFMetadata");
+ if (isdcf) {
+ if (auto territory = isdcf->optional_string_child("Territory")) {
+ try {
+ _release_territory = dcp::LanguageTag::RegionSubtag(*territory);
+ } catch (...) {
+ /* Invalid region subtag; just ignore it */
+ }
+ }
+ if (auto audio_language = isdcf->optional_string_child("AudioLanguage")) {
+ try {
+ _audio_language = dcp::LanguageTag(*audio_language);
+ } catch (...) {
+ /* Invalid language tag; just ignore it */
+ }
+ }
+ if (auto content_version = isdcf->optional_string_child("ContentVersion")) {
+ _content_versions.push_back (*content_version);
+ }
+ if (auto rating = isdcf->optional_string_child("Rating")) {
+ _ratings.push_back (dcp::Rating("", *rating));
+ }
+ if (auto mastered_luminance = isdcf->optional_number_child<float>("MasteredLuminance")) {
+ _luminance = dcp::Luminance(*mastered_luminance, dcp::Luminance::Unit::FOOT_LAMBERT);
+ }
+ _studio = isdcf->optional_string_child("Studio");
+ _facility = isdcf->optional_string_child("Facility");
+ _temp_version = isdcf->optional_bool_child("TempVersion").get_value_or("false");
+ _pre_release = isdcf->optional_bool_child("PreRelease").get_value_or("false");
+ _red_band = isdcf->optional_bool_child("RedBand").get_value_or("false");
+ _two_d_version_of_three_d = isdcf->optional_bool_child("TwoDVersionOfThreeD").get_value_or("false");
+ _chain = isdcf->optional_string_child("Chain");
+ }
+
list<string> notes;
_playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"), _state_version, notes);
Film::use_template (string name)
{
_template_film.reset (new Film (optional<boost::filesystem::path>()));
- _template_film->read_metadata (Config::instance()->template_path (name));
+ _template_film->read_metadata (Config::instance()->template_read_path(name));
_use_isdcf_name = _template_film->_use_isdcf_name;
_dcp_content_type = _template_film->_dcp_content_type;
_container = _template_film->_container;