X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=98c6c061061504a72c3821873f4d3a095c76d994;hb=f861018389acd9d277fe34d7621182b9b54f977f;hp=35a07b399e3432716f61f64e7d892abf98f056de;hpb=9bdd8cc51942a13e360dde4efc04b3ca417c8b94;p=dcpomatic.git diff --git a/src/lib/film.cc b/src/lib/film.cc index 35a07b399..98c6c0610 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -98,6 +98,7 @@ Film::Film (string d, bool must_exist) , _scaler (Scaler::from_id ("bicubic")) , _trim_start (0) , _trim_end (0) + , _trim_type (CPL) , _ab (false) , _audio_gain (0) , _audio_delay (0) @@ -144,6 +145,8 @@ Film::Film (string d, bool must_exist) if (must_exist) { read_metadata (); + } else { + write_metadata (); } _log.reset (new FileLog (file ("log"))); @@ -165,6 +168,7 @@ Film::Film (Film const & o) , _scaler (o._scaler) , _trim_start (o._trim_start) , _trim_end (o._trim_end) + , _trim_type (o._trim_type) , _ab (o._ab) , _audio_gain (o._audio_gain) , _audio_delay (o._audio_delay) @@ -191,16 +195,13 @@ string Film::video_state_identifier () const { assert (format ()); - - return "XXX"; - -#if 0 + LocaleGuard lg; pair f = Filter::ffmpeg_strings (filters()); stringstream s; s << format()->id() - << "_" << content_digest() + << "_" << _playlist->video_digest() << "_" << crop().left << "_" << crop().right << "_" << crop().top << "_" << crop().bottom << "_" << _dcp_frame_rate << "_" << f.first << "_" << f.second @@ -214,7 +215,6 @@ Film::video_state_identifier () const } return s.str (); -#endif } /** @return The path to the directory to write video frame info files to */ @@ -228,24 +228,52 @@ Film::info_dir () const } string -Film::video_mxf_dir () const +Film::internal_video_mxf_dir () const { boost::filesystem::path p; return dir ("video"); } string -Film::video_mxf_filename () const +Film::internal_video_mxf_filename () const { return video_state_identifier() + ".mxf"; } +string +Film::dcp_video_mxf_filename () const +{ + return filename_safe_name() + "_video.mxf"; +} + +string +Film::dcp_audio_mxf_filename () const +{ + return filename_safe_name() + "_audio.mxf"; +} + +string +Film::filename_safe_name () const +{ + string const n = name (); + string o; + for (size_t i = 0; i < n.length(); ++i) { + if (isalnum (n[i])) { + o += n[i]; + } else { + o += "_"; + } + } + + return o; +} + string Film::audio_analysis_path () const { boost::filesystem::path p; p /= "analysis"; - p /= "XXX";//content_digest(); + p /= _playlist->audio_digest(); return file (p.string ()); } @@ -259,7 +287,7 @@ Film::make_dcp () throw BadSettingError (_("name"), _("cannot contain slashes")); } - log()->log (String::compose ("DVD-o-matic %1 git %2 using %3", dvdomatic_version, dvdomatic_git_commit, dependency_version_summary())); + log()->log (String::compose ("DCP-o-matic %1 git %2 using %3", dcpomatic_version, dcpomatic_git_commit, dependency_version_summary())); { char buffer[128]; @@ -275,10 +303,10 @@ Film::make_dcp () // log()->log (String::compose ("Content at %1 fps, DCP at %2 fps", source_frame_rate(), dcp_frame_rate())); log()->log (String::compose ("%1 threads", Config::instance()->num_local_encoding_threads())); log()->log (String::compose ("J2K bandwidth %1", j2k_bandwidth())); -#ifdef DVDOMATIC_DEBUG - log()->log ("DVD-o-matic built in debug mode."); +#ifdef DCPOMATIC_DEBUG + log()->log ("DCP-o-matic built in debug mode."); #else - log()->log ("DVD-o-matic built in optimised mode."); + log()->log ("DCP-o-matic built in optimised mode."); #endif #ifdef LIBDCP_DEBUG log()->log ("libdcp built in debug mode."); @@ -380,6 +408,7 @@ Film::write_metadata () const ContentList the_content = content (); boost::mutex::scoped_lock lm (_state_mutex); + LocaleGuard lg; boost::filesystem::create_directories (directory()); @@ -390,12 +419,23 @@ Film::write_metadata () const root->add_child("Name")->add_child_text (_name); root->add_child("UseDCIName")->add_child_text (_use_dci_name ? "1" : "0"); root->add_child("TrustContentHeaders")->add_child_text (_trust_content_headers ? "1" : "0"); + if (_dcp_content_type) { root->add_child("DCPContentType")->add_child_text (_dcp_content_type->dci_name ()); } + if (_format) { root->add_child("Format")->add_child_text (_format->id ()); } + + switch (_trim_type) { + case CPL: + root->add_child("TrimType")->add_child_text ("CPL"); + break; + case ENCODE: + root->add_child("TrimType")->add_child_text ("Encode"); + } + root->add_child("LeftCrop")->add_child_text (boost::lexical_cast (_crop.left)); root->add_child("RightCrop")->add_child_text (boost::lexical_cast (_crop.right)); root->add_child("TopCrop")->add_child_text (boost::lexical_cast (_crop.top)); @@ -435,9 +475,10 @@ void Film::read_metadata () { boost::mutex::scoped_lock lm (_state_mutex); + LocaleGuard lg; if (boost::filesystem::exists (file ("metadata")) && !boost::filesystem::exists (file ("metadata.xml"))) { - throw StringError (_("This film was created with an older version of DVD-o-matic, and unfortunately it cannot be loaded into this version. You will need to create a new Film, re-add your content and set it up again. Sorry!")); + throw StringError (_("This film was created with an older version of DCP-o-matic, and unfortunately it cannot be loaded into this version. You will need to create a new Film, re-add your content and set it up again. Sorry!")); } cxml::File f (file ("metadata.xml"), "Metadata"); @@ -460,6 +501,15 @@ Film::read_metadata () } } + { + optional c = f.optional_string_child ("TrimType"); + if (!c || c.get() == "CPL") { + _trim_type = CPL; + } else if (c && c.get() == "Encode") { + _trim_type = ENCODE; + } + } + _crop.left = f.number_child ("LeftCrop"); _crop.right = f.number_child ("RightCrop"); _crop.top = f.number_child ("TopCrop"); @@ -852,6 +902,16 @@ Film::set_trim_end (int t) signal_changed (TRIM_END); } +void +Film::set_trim_type (TrimType t) +{ + { + boost::mutex::scoped_lock lm (_state_mutex); + _trim_type = t; + } + signal_changed (TRIM_TYPE); +} + void Film::set_ab (bool a) { @@ -1131,12 +1191,6 @@ Film::audio_frame_rate () const return _playlist->audio_frame_rate (); } -int64_t -Film::audio_channel_layout () const -{ - return _playlist->audio_channel_layout (); -} - bool Film::has_audio () const { @@ -1161,6 +1215,12 @@ Film::video_length () const return _playlist->video_length (); } +ContentVideoFrame +Film::content_length () const +{ + return _playlist->content_length (); +} + /** Unfortunately this is needed as the GUI has FFmpeg-specific controls */ shared_ptr Film::ffmpeg () const @@ -1257,7 +1317,7 @@ Film::content_changed (boost::weak_ptr c, int p) set_dcp_frame_rate (best_dcp_frame_rate (video_frame_rate ())); } else if (p == AudioContentProperty::AUDIO_CHANNELS) { set_audio_mapping (_playlist->default_audio_mapping ()); - } + } if (ui_signaller) { ui_signaller->emit (boost::bind (boost::ref (ContentChanged), c, p));